From ec640e5cc4aea236b9d8fdd170ab9164a35cf09c Mon Sep 17 00:00:00 2001 From: evrhel Date: Tue, 14 Jul 2020 15:52:22 -0700 Subject: Fixed how display_callback was being passed to Ghostscript The display_callback device did not have the correct values regarding its size, major version, and minor version. Furthermore, the display_device structure was not being dynamically allocated and ended up being freed too early. --- demos/java/gsjava/src/com/artifex/gsjava/Main.java | 2 +- .../artifex/gsjava/callbacks/IStdErrFunction.java | 8 +++++ .../artifex/gsjava/callbacks/IStdInFunction.java | 8 +++++ .../artifex/gsjava/callbacks/IStdOutFunction.java | 9 ++++++ demos/java/jni/gs_jni/callbacks.cpp | 2 +- demos/java/jni/gs_jni/com_artifex_gsjava_GSAPI.cpp | 36 +++++++++++----------- 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/demos/java/gsjava/src/com/artifex/gsjava/Main.java b/demos/java/gsjava/src/com/artifex/gsjava/Main.java index fae1c3ed4..4e2a81e58 100644 --- a/demos/java/gsjava/src/com/artifex/gsjava/Main.java +++ b/demos/java/gsjava/src/com/artifex/gsjava/Main.java @@ -66,7 +66,7 @@ public class Main { final File ofile = new File("image.tiff"); - String[] gargs = { "gs", "-dNOPAUSE", "-dSAFER", + final String[] gargs = { "gs", "-dNOPAUSE", "-dSAFER", "-I%rom%Resource%/Init/", "-dBATCH", "-r72", "-sDEVICE=display", "-dDisplayFormat=" + format, diff --git a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdErrFunction.java b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdErrFunction.java index 03140944b..5001b9c50 100644 --- a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdErrFunction.java +++ b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdErrFunction.java @@ -3,5 +3,13 @@ package com.artifex.gsjava.callbacks; @FunctionalInterface public interface IStdErrFunction { + /** + * Called when something should be written to the standard error stream. + * + * @param callerHandle The caller handle. + * @param str The string to write. + * @param len The length of bytes to be written. + * @return The amount of bytes written, must be len. + */ public int onStdErr(long callerHandle, byte[] str, int len); } diff --git a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdInFunction.java b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdInFunction.java index f14162efe..c6d97e940 100644 --- a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdInFunction.java +++ b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdInFunction.java @@ -3,5 +3,13 @@ package com.artifex.gsjava.callbacks; @FunctionalInterface public interface IStdInFunction { + /** + * + * + * @param callerHandle The caller handle. + * @param buf A string. + * @param len The number of bytes to read. + * @return The number of bytes read, must be len/ + */ public int onStdIn(long callerHandle, byte[] buf, int len); } diff --git a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdOutFunction.java b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdOutFunction.java index 17ab0fa39..c3635f544 100644 --- a/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdOutFunction.java +++ b/demos/java/gsjava/src/com/artifex/gsjava/callbacks/IStdOutFunction.java @@ -3,5 +3,14 @@ package com.artifex.gsjava.callbacks; @FunctionalInterface public interface IStdOutFunction { + /** + * Called when something should be written to the standard + * output stream. + * + * @param callerHandle The caller handle. + * @param str The string to write. + * @param len The number of bytes to write. + * @return The number of bytes written, must be len. + */ public int onStdOut(long callerHandle, byte[] str, int len); } diff --git a/demos/java/jni/gs_jni/callbacks.cpp b/demos/java/jni/gs_jni/callbacks.cpp index 95a181ae8..ea78128e9 100644 --- a/demos/java/jni/gs_jni/callbacks.cpp +++ b/demos/java/jni/gs_jni/callbacks.cpp @@ -197,7 +197,7 @@ int callbacks::display::displaySizeFunction(void *handle, void *device, int widt int code = 0; if (g_env && g_displayCallback) { - jsize len = width * height * format; + jsize len = height * raster; jbyteArray byteArray = g_env->NewByteArray(len); g_env->SetByteArrayRegion(byteArray, 0, len, (signed char *)pimage); code = callIntMethod(g_env, g_displayCallback, "onDisplaySize", DISPLAY_SIZE_SIG, (jlong)handle, diff --git a/demos/java/jni/gs_jni/com_artifex_gsjava_GSAPI.cpp b/demos/java/jni/gs_jni/com_artifex_gsjava_GSAPI.cpp index 122acea5c..f925af214 100644 --- a/demos/java/jni/gs_jni/com_artifex_gsjava_GSAPI.cpp +++ b/demos/java/jni/gs_jni/com_artifex_gsjava_GSAPI.cpp @@ -97,26 +97,26 @@ JNIEXPORT jint JNICALL Java_com_artifex_gsjava_GSAPI_gsapi_1set_1poll JNIEXPORT jint JNICALL Java_com_artifex_gsjava_GSAPI_gsapi_1set_1display_1callback (JNIEnv *env, jclass, jlong instance, jobject displayCallback) { - display_callback cb; - cb.size = sizeof(display_callback); - cb.version_major = 1; - cb.version_minor = 0; + display_callback *cb = new display_callback; + cb->size = sizeof(display_callback); + cb->version_major = DISPLAY_VERSION_MAJOR; + cb->version_minor = DISPLAY_VERSION_MINOR; - cb.display_open = callbacks::display::displayOpenFunction; - cb.display_preclose = callbacks::display::displayPrecloseFunction; - cb.display_close = callbacks::display::displayCloseFunction; - cb.display_presize = callbacks::display::displayPresizeFunction; - cb.display_size = callbacks::display::displaySizeFunction; - cb.display_sync = callbacks::display::displaySyncFunction; - cb.display_page = callbacks::display::displayPageFunction; - cb.display_update = callbacks::display::displayUpdateFunction; - cb.display_memalloc = NULL; - cb.display_memfree = NULL; - cb.display_separation = callbacks::display::displaySeparationFunction; - cb.display_adjust_band_height = callbacks::display::displayAdjustBandHeightFunction; - cb.display_rectangle_request = callbacks::display::displayRectangleRequestFunction; + cb->display_open = callbacks::display::displayOpenFunction; + cb->display_preclose = callbacks::display::displayPrecloseFunction; + cb->display_close = callbacks::display::displayCloseFunction; + cb->display_presize = callbacks::display::displayPresizeFunction; + cb->display_size = callbacks::display::displaySizeFunction; + cb->display_sync = callbacks::display::displaySyncFunction; + cb->display_page = callbacks::display::displayPageFunction; + cb->display_update = callbacks::display::displayUpdateFunction; + cb->display_memalloc = NULL; + cb->display_memfree = NULL; + cb->display_separation = callbacks::display::displaySeparationFunction; + cb->display_adjust_band_height = callbacks::display::displayAdjustBandHeightFunction; + cb->display_rectangle_request = callbacks::display::displayRectangleRequestFunction; - int code = gsapi_set_display_callback((void *)instance, &cb); + int code = gsapi_set_display_callback((void *)instance, cb); if (code == 0) { callbacks::setJNIEnv(env); -- cgit v1.2.1