diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-06-23 12:33:30 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2016-06-23 16:10:29 +0100 |
commit | cf7b2cbbfe6192fbf697237735ab45bc951304e4 (patch) | |
tree | eac1231a33e79e7f8afa99d63e203b8fededecc4 | |
parent | 38ffc7fefeadb87929c2006d1e91394a516c3c9d (diff) | |
download | mupdf-cf7b2cbbfe6192fbf697237735ab45bc951304e4.tar.xz |
Update JNI code. Take explicit alpha argument in toPixmap functions.
-rw-r--r-- | docs/mutool/run.html | 3 | ||||
-rw-r--r-- | include/mupdf/fitz/util.h | 12 | ||||
-rw-r--r-- | platform/gl/gl-main.c | 4 | ||||
-rw-r--r-- | platform/java/com/artifex/mupdf/fitz/Page.java | 2 | ||||
-rw-r--r-- | platform/java/example/PageCanvas.java | 2 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 10 | ||||
-rw-r--r-- | platform/java/mupdf_native.h | 8 | ||||
-rw-r--r-- | source/fitz/util.c | 31 | ||||
-rw-r--r-- | source/tools/murun.c | 5 |
9 files changed, 44 insertions, 33 deletions
diff --git a/docs/mutool/run.html b/docs/mutool/run.html index 71690708..ed1a9707 100644 --- a/docs/mutool/run.html +++ b/docs/mutool/run.html @@ -187,8 +187,9 @@ MuPDF can open many document types (PDF, XPS, CBZ, EPUB, FB2 and a handful of im <dd>Calls device functions for all the contents on the page, using the specified transform matrix. The device can be one of the built-in devices or a JavaScript object with methods for the device calls. The transform maps from user space points to device space pixels. -<dt>Page#toPixmap(transform, colorspace) +<dt>Page#toPixmap(transform, colorspace, alpha) <dd>Render the page into a Pixmap, using the transform and colorspace. +If alpha is true, the page will be drawn on a transparent background, otherwise white. <dt>Page#toDisplayList() <dd>Record the contents on the page into a DisplayList. <dt>Page#search(needle) diff --git a/include/mupdf/fitz/util.h b/include/mupdf/fitz/util.h index 186907a3..a4413665 100644 --- a/include/mupdf/fitz/util.h +++ b/include/mupdf/fitz/util.h @@ -18,20 +18,20 @@ fz_display_list *fz_new_display_list_from_page_number(fz_context *ctx, fz_docume /* fz_new_pixmap_from_page: Render the page to a pixmap using the transform and colorspace. */ -fz_pixmap *fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs); -fz_pixmap *fz_new_pixmap_from_page_number(fz_context *ctx, fz_document *doc, int number, const fz_matrix *ctm, fz_colorspace *cs); +fz_pixmap *fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs, int alpha); +fz_pixmap *fz_new_pixmap_from_page_number(fz_context *ctx, fz_document *doc, int number, const fz_matrix *ctm, fz_colorspace *cs, int alpha); fz_pixmap *fz_new_pixmap_from_display_list(fz_context *ctx, fz_display_list *list, const fz_matrix *ctm, fz_colorspace *cs, int alpha); /* - fz_new_pixmap_from_page_contents: Render the page contents without annotations to an opaque pixmap. + fz_new_pixmap_from_page_contents: Render the page contents without annotations. */ -fz_pixmap *fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs); +fz_pixmap *fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs, int alpha); /* - fz_new_pixmap_from_annot: Render an annotation to a transparent pixmap, + fz_new_pixmap_from_annot: Render an annotation. suitable for blending on top of the opaque pixmap returned by fz_new_pixmap_from_page_contents. */ -fz_pixmap *fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, fz_colorspace *cs); +fz_pixmap *fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, fz_colorspace *cs, int alpha); /* fz_new_stext_page_from_page: Extract structured text from a page. The sheet must not be NULL. diff --git a/platform/gl/gl-main.c b/platform/gl/gl-main.c index ff080d1b..e6a93680 100644 --- a/platform/gl/gl-main.c +++ b/platform/gl/gl-main.c @@ -263,14 +263,14 @@ void render_page(void) links = NULL; links = fz_load_links(ctx, page); - pix = fz_new_pixmap_from_page_contents(ctx, page, &page_ctm, fz_device_rgb(ctx)); + pix = fz_new_pixmap_from_page_contents(ctx, page, &page_ctm, fz_device_rgb(ctx), 0); texture_from_pixmap(&page_tex, pix); fz_drop_pixmap(ctx, pix); annot_count = 0; for (annot = fz_first_annot(ctx, page); annot; annot = fz_next_annot(ctx, annot)) { - pix = fz_new_pixmap_from_annot(ctx, annot, &page_ctm, fz_device_rgb(ctx)); + pix = fz_new_pixmap_from_annot(ctx, annot, &page_ctm, fz_device_rgb(ctx), 1); texture_from_pixmap(&annot_tex[annot_count++], pix); fz_drop_pixmap(ctx, pix); } diff --git a/platform/java/com/artifex/mupdf/fitz/Page.java b/platform/java/com/artifex/mupdf/fitz/Page.java index befbe1c7..44abc572 100644 --- a/platform/java/com/artifex/mupdf/fitz/Page.java +++ b/platform/java/com/artifex/mupdf/fitz/Page.java @@ -20,7 +20,7 @@ public class Page public native Rect getBounds(); - public native Pixmap toPixmap(Matrix ctm, ColorSpace colorspace); + public native Pixmap toPixmap(Matrix ctm, ColorSpace colorspace, boolean alpha); public native void run(Device dev, Matrix ctm, Cookie cookie); public native void runPageContents(Device dev, Matrix ctm, Cookie cookie); diff --git a/platform/java/example/PageCanvas.java b/platform/java/example/PageCanvas.java index 9de1abdb..11ed1877 100644 --- a/platform/java/example/PageCanvas.java +++ b/platform/java/example/PageCanvas.java @@ -30,7 +30,7 @@ public class PageCanvas extends java.awt.Canvas } public static BufferedImage imageFromPage(Page page, Matrix ctm) { - Pixmap pixmap = page.toPixmap(ctm, ColorSpace.DeviceBGR); + Pixmap pixmap = page.toPixmap(ctm, ColorSpace.DeviceBGR, true); BufferedImage image = imageFromPixmap(pixmap); pixmap.destroy(); return image; diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 0528a2fb..7530b041 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -2464,13 +2464,13 @@ FUN(Pixmap_getPixels)(JNIEnv *env, jobject self) if (ctx == NULL || pixmap == NULL) return NULL; - if (pixmap->n != 4) + if (pixmap->n != 4 || !pixmap->alpha) { - jni_throw(env, FZ_ERROR_GENERIC, "invalid colorspace for getPixels"); + jni_throw(env, FZ_ERROR_GENERIC, "invalid colorspace for getPixels (must be RGB/BGR with alpha)"); return NULL; } - if (size != pixmap->h * pixmap->stride) + if (size * 4 != pixmap->h * pixmap->stride) { jni_throw(env, FZ_ERROR_GENERIC, "invalid stride for getPixels"); return NULL; @@ -3461,7 +3461,7 @@ FUN(Page_finalize)(JNIEnv *env, jobject self) } JNIEXPORT jobject JNICALL -FUN(Page_toPixmap)(JNIEnv *env, jobject self, jobject ctm_, jobject colorspace_) +FUN(Page_toPixmap)(JNIEnv *env, jobject self, jobject ctm_, jobject colorspace_, jboolean alpha) { fz_context *ctx = get_context(env); fz_page *page = from_Page(env, self); @@ -3471,7 +3471,7 @@ FUN(Page_toPixmap)(JNIEnv *env, jobject self, jobject ctm_, jobject colorspace_) fz_pixmap *pixmap = NULL; fz_try(ctx) - pixmap = fz_new_pixmap_from_page(ctx, page, &ctm, colorspace); + pixmap = fz_new_pixmap_from_page(ctx, page, &ctm, colorspace, alpha); fz_catch(ctx) jni_rethrow(env, ctx); diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index a15501d2..08d389a1 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -1055,10 +1055,10 @@ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Page_getBounds /* * Class: com_artifex_mupdf_fitz_Page * Method: toPixmap - * Signature: (Lcom/artifex/mupdf/fitz/Matrix;Lcom/artifex/mupdf/fitz/ColorSpace;)Lcom/artifex/mupdf/fitz/Pixmap; + * Signature: (Lcom/artifex/mupdf/fitz/Matrix;Lcom/artifex/mupdf/fitz/ColorSpace;Z)Lcom/artifex/mupdf/fitz/Pixmap; */ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Page_toPixmap - (JNIEnv *, jobject, jobject, jobject); + (JNIEnv *, jobject, jobject, jobject, jboolean); /* * Class: com_artifex_mupdf_fitz_Page @@ -1264,10 +1264,10 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Pixmap_clearWithValue /* * Class: com_artifex_mupdf_fitz_Pixmap * Method: saveAsPNG - * Signature: (Ljava/lang/String;Z)V + * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Pixmap_saveAsPNG - (JNIEnv *, jobject, jstring, jboolean); + (JNIEnv *, jobject, jstring); /* * Class: com_artifex_mupdf_fitz_Pixmap diff --git a/source/fitz/util.c b/source/fitz/util.c index d17cb18c..e1e17c25 100644 --- a/source/fitz/util.c +++ b/source/fitz/util.c @@ -80,7 +80,7 @@ fz_new_pixmap_from_display_list(fz_context *ctx, fz_display_list *list, const fz } fz_pixmap * -fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs) +fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs, int alpha) { fz_rect rect; fz_irect irect; @@ -91,8 +91,11 @@ fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix fz_transform_rect(&rect, ctm); fz_round_rect(&irect, &rect); - pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, 0); - fz_clear_pixmap_with_value(ctx, pix, 0xFF); + pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, alpha); + if (alpha) + fz_clear_pixmap(ctx, pix); + else + fz_clear_pixmap_with_value(ctx, pix, 0xFF); fz_try(ctx) { @@ -113,7 +116,7 @@ fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix } fz_pixmap * -fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, fz_colorspace *cs) +fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, fz_colorspace *cs, int alpha) { fz_rect rect; fz_irect irect; @@ -124,8 +127,11 @@ fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, fz_transform_rect(&rect, ctm); fz_round_rect(&irect, &rect); - pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, 1); - fz_clear_pixmap(ctx, pix); + pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, alpha); + if (alpha) + fz_clear_pixmap(ctx, pix); + else + fz_clear_pixmap_with_value(ctx, pix, 0xFF); fz_try(ctx) { @@ -146,7 +152,7 @@ fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, } fz_pixmap * -fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs) +fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz_colorspace *cs, int alpha) { fz_rect rect; fz_irect irect; @@ -157,8 +163,11 @@ fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz fz_transform_rect(&rect, ctm); fz_round_rect(&irect, &rect); - pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, 0); - fz_clear_pixmap_with_value(ctx, pix, 0xFF); + pix = fz_new_pixmap_with_bbox(ctx, cs, &irect, alpha); + if (alpha) + fz_clear_pixmap(ctx, pix); + else + fz_clear_pixmap_with_value(ctx, pix, 0xFF); fz_try(ctx) { @@ -179,14 +188,14 @@ fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz } fz_pixmap * -fz_new_pixmap_from_page_number(fz_context *ctx, fz_document *doc, int number, const fz_matrix *ctm, fz_colorspace *cs) +fz_new_pixmap_from_page_number(fz_context *ctx, fz_document *doc, int number, const fz_matrix *ctm, fz_colorspace *cs, int alpha) { fz_page *page; fz_pixmap *pix; page = fz_load_page(ctx, doc, number); fz_try(ctx) - pix = fz_new_pixmap_from_page(ctx, page, ctm, cs); + pix = fz_new_pixmap_from_page(ctx, page, ctm, cs, alpha); fz_always(ctx) fz_drop_page(ctx, page); fz_catch(ctx) diff --git a/source/tools/murun.c b/source/tools/murun.c index 5315a4f3..1f2f5e5f 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -1457,10 +1457,11 @@ static void ffi_Page_toPixmap(js_State *J) fz_page *page = js_touserdata(J, 0, "fz_page"); fz_matrix ctm = ffi_tomatrix(J, 1); fz_colorspace *colorspace = js_touserdata(J, 2, "fz_colorspace"); + int alpha = js_toboolean(J, 3); fz_pixmap *pixmap; fz_try(ctx) - pixmap = fz_new_pixmap_from_page(ctx, page, &ctm, colorspace); + pixmap = fz_new_pixmap_from_page(ctx, page, &ctm, colorspace, alpha); fz_catch(ctx) rethrow(J); @@ -3100,7 +3101,7 @@ int murun_main(int argc, char **argv) { jsB_propfun(J, "Page.bound", ffi_Page_bound, 0); jsB_propfun(J, "Page.run", ffi_Page_run, 2); - jsB_propfun(J, "Page.toPixmap", ffi_Page_toPixmap, 1); + jsB_propfun(J, "Page.toPixmap", ffi_Page_toPixmap, 3); jsB_propfun(J, "Page.toDisplayList", ffi_Page_toDisplayList, 0); jsB_propfun(J, "Page.search", ffi_Page_search, 0); } |