summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/mutool/run.html3
-rw-r--r--include/mupdf/fitz/util.h12
-rw-r--r--platform/gl/gl-main.c4
-rw-r--r--platform/java/com/artifex/mupdf/fitz/Page.java2
-rw-r--r--platform/java/example/PageCanvas.java2
-rw-r--r--platform/java/mupdf_native.c10
-rw-r--r--platform/java/mupdf_native.h8
-rw-r--r--source/fitz/util.c31
-rw-r--r--source/tools/murun.c5
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);
}