diff options
-rw-r--r-- | include/mupdf/fitz/document.h | 46 | ||||
-rw-r--r-- | include/mupdf/fitz/separation.h | 9 | ||||
-rw-r--r-- | include/mupdf/pdf/page.h | 5 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 156 | ||||
-rw-r--r-- | platform/java/mupdf_native.h | 81 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/Page.java | 5 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/Separations.java | 27 | ||||
-rw-r--r-- | platform/win32/javaviewerlib.vcproj | 4 | ||||
-rw-r--r-- | source/fitz/document.c | 29 | ||||
-rw-r--r-- | source/fitz/separation.c | 14 | ||||
-rw-r--r-- | source/gprf/gprf-doc.c | 27 | ||||
-rw-r--r-- | source/pdf/pdf-page.c | 49 |
12 files changed, 303 insertions, 149 deletions
diff --git a/include/mupdf/fitz/document.h b/include/mupdf/fitz/document.h index 23fc4b1d..70529329 100644 --- a/include/mupdf/fitz/document.h +++ b/include/mupdf/fitz/document.h @@ -8,6 +8,7 @@ #include "mupdf/fitz/transition.h" #include "mupdf/fitz/link.h" #include "mupdf/fitz/outline.h" +#include "mupdf/fitz/separation.h" /* Document interface @@ -171,18 +172,11 @@ typedef void (fz_page_control_separation_fn)(fz_context *ctx, fz_page *page, int typedef int (fz_page_separation_disabled_fn)(fz_context *ctx, fz_page *page, int separation); /* - fz_page_count_separations_fn: Type for a function to count - the number of separations on a page. See fz_count_separations + fz_page_separations_fn: Type for a function to retrieve + details of separations on a page. See fz_get_separations for more information. */ -typedef int (fz_page_count_separations_fn)(fz_context *ctx, fz_page *page); - -/* - fz_page_get_separation_fn: Type for a function to retrieve - details of a separation on a page. See fz_get_separation - for more information. -*/ -typedef const char *(fz_page_get_separation_fn)(fz_context *ctx, fz_page *page, int separation, uint32_t *rgb, uint32_t *cmyk); +typedef fz_separations *(fz_page_separations_fn)(fz_context *ctx, fz_page *page); typedef void (fz_annot_drop_fn)(fz_context *ctx, fz_annot *annot); typedef fz_annot *(fz_annot_next_fn)(fz_context *ctx, fz_annot *annot); @@ -217,8 +211,7 @@ struct fz_page_s fz_page_page_presentation_fn *page_presentation; fz_page_control_separation_fn *control_separation; fz_page_separation_disabled_fn *separation_disabled; - fz_page_count_separations_fn *count_separations; - fz_page_get_separation_fn *get_separation; + fz_page_separations_fn *separations; }; /* @@ -620,31 +613,14 @@ int fz_lookup_metadata(fz_context *ctx, fz_document *doc, const char *key, char fz_colorspace *fz_document_output_intent(fz_context *ctx, fz_document *doc); /* - Get the number of separations on a page (including CMYK). This will - be 0, unless the format specifically supports separations (such as - gproof files). -*/ -int fz_count_separations_on_page(fz_context *ctx, fz_page *page); + fz_page_separations: Get the separations details for a page. + This will be NULL, unless the format specifically supports + separations (such as gproof, or PDF files). May be NULL even + so, if there are no separations on a page. -/* - Enable/Disable a given separation on a given page. This will only - affect future renderings of pages from a format that supports - separations (such as gproof files). -*/ -void fz_control_separation_on_page(fz_context *ctx, fz_page *page, int sep, int disable); - -/* - Returns whether a given separation on a given page is disabled. This will only - work from a format that supports separations (such as gproof files). - */ -int fz_separation_disabled_on_page (fz_context *ctx, fz_page *, int sep); - -/* - Get the name and equivalent RGBA, CMYK colors of a given separation - on a given page. This will only work for formats that support - gproof files. + Returns a reference that must be dropped. */ -const char *fz_get_separation_on_page(fz_context *ctx, fz_page *page, int sep, uint32_t *rgba, uint32_t *cmyk); +fz_separations *fz_page_separations(fz_context *ctx, fz_page *page); /* fz_save_gproof: Given a currently open document, create a diff --git a/include/mupdf/fitz/separation.h b/include/mupdf/fitz/separation.h index e62534e9..2f0ed596 100644 --- a/include/mupdf/fitz/separation.h +++ b/include/mupdf/fitz/separation.h @@ -20,16 +20,16 @@ enum typedef struct fz_separations_s fz_separations; /* Create a new separations structure (initially empty) */ -fz_separations *fz_new_separations(fz_context *ctx); +fz_separations *fz_new_separations(fz_context *ctx, int controllable); -/* Add a reference */ +/* Keep a reference */ fz_separations *fz_keep_separations(fz_context *ctx, fz_separations *sep); /* Drop a reference */ void fz_drop_separations(fz_context *ctx, fz_separations *sep); /* Add a separation (RGBA and CYMK equivalents, null terminated name) */ -void fz_add_separation(fz_context *ctx, fz_separations *sep, uint32_t rgba, uint32_t cmyk, char *name); +void fz_add_separation(fz_context *ctx, fz_separations *sep, uint32_t rgba, uint32_t cmyk, const char *name); /* Enable or disable a given separation */ void fz_control_separation(fz_context *ctx, fz_separations *sep, int separation, int disable); @@ -46,4 +46,7 @@ const char *fz_get_separation(fz_context *ctx, fz_separations *sep, int separati /* Count the number of separations */ int fz_count_separations(fz_context *ctx, fz_separations *sep); +/* Find out if separations are controllable. */ +int fz_separations_controllable(fz_context *ctx, fz_separations *seps); + #endif diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h index 4aae3481..a7f47cda 100644 --- a/include/mupdf/pdf/page.h +++ b/include/mupdf/pdf/page.h @@ -41,6 +41,11 @@ pdf_obj *pdf_page_resources(fz_context *ctx, pdf_page *page); pdf_obj *pdf_page_contents(fz_context *ctx, pdf_page *page); pdf_obj *pdf_page_group(fz_context *ctx, pdf_page *page); +/* + pdf_page_separations: Get the separation details for a page. +*/ +fz_separations *pdf_page_separations(fz_context *ctx, pdf_page *page); + fz_link *pdf_load_links(fz_context *ctx, pdf_page *page); /* diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 69208f56..7d068d85 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -85,6 +85,7 @@ static jclass cls_Point; static jclass cls_Rect; static jclass cls_RuntimeException; static jclass cls_Separation; +static jclass cls_Separations; static jclass cls_Shade; static jclass cls_StrokeState; static jclass cls_StructuredText; @@ -130,6 +131,7 @@ static jfieldID fid_Rect_x0; static jfieldID fid_Rect_x1; static jfieldID fid_Rect_y0; static jfieldID fid_Rect_y1; +static jfieldID fid_Separations_pointer; static jfieldID fid_Shade_pointer; static jfieldID fid_StrokeState_pointer; static jfieldID fid_StructuredText_pointer; @@ -191,6 +193,7 @@ static jmethodID mid_Point_init; static jmethodID mid_Rect_init; static jmethodID mid_Shade_init; static jmethodID mid_Separation_init; +static jmethodID mid_Separations_init; static jmethodID mid_StrokeState_init; static jmethodID mid_StructuredText_init; static jmethodID mid_TextBlock_init; @@ -556,6 +559,10 @@ static int find_fids(JNIEnv *env) cls_Separation = get_class(&err, env, PKG"Separation"); mid_Separation_init = get_method(&err, env, "<init>", "(Ljava/lang/String;II)V"); + cls_Separations = get_class(&err, env, PKG"Separations"); + fid_Separations_pointer = get_field(&err, env, "pointer", "J"); + mid_Separations_init = get_method(&err, env, "<init>", "(J)V"); + cls_StrokeState = get_class(&err, env, PKG"StrokeState"); fid_StrokeState_pointer = get_field(&err, env, "pointer", "J"); mid_StrokeState_init = get_method(&err, env, "<init>", "(J)V"); @@ -649,6 +656,7 @@ static void lose_fids(JNIEnv *env) (*env)->DeleteGlobalRef(env, cls_Rect); (*env)->DeleteGlobalRef(env, cls_RuntimeException); (*env)->DeleteGlobalRef(env, cls_Separation); + (*env)->DeleteGlobalRef(env, cls_Separations); (*env)->DeleteGlobalRef(env, cls_Shade); (*env)->DeleteGlobalRef(env, cls_StrokeState); (*env)->DeleteGlobalRef(env, cls_StructuredText); @@ -1428,6 +1436,19 @@ static inline jobject to_Pixmap_safe_own(fz_context *ctx, JNIEnv *env, fz_pixmap return jobj; } +static inline jobject to_Separations_safe_own(fz_context *ctx, JNIEnv *env, fz_separations *seps) +{ + jobject jseps; + + if (!ctx || !seps) return NULL; + + jseps = (*env)->NewObject(env, cls_Separations, mid_Separations_init, jlong_cast(seps)); + if (!jseps) + fz_drop_separations(ctx, seps); + + return jseps; +} + static inline jobject to_StructuredText_safe_own(fz_context *ctx, JNIEnv *env, fz_stext_page *text) { jobject jtext; @@ -1605,6 +1626,15 @@ static inline fz_pixmap *from_Pixmap(JNIEnv *env, jobject jobj) return pixmap; } +static inline fz_separations *from_Separations(JNIEnv *env, jobject jobj) +{ + fz_separations *seps; + if (!jobj) return NULL; + seps = CAST(fz_separations *, (*env)->GetLongField(env, jobj, fid_Separations_pointer)); + if (!seps) jni_throw_null(env, "cannot use already destroyed Separations"); + return seps; +} + static inline fz_shade *from_Shade(JNIEnv *env, jobject jobj) { fz_shade *shd; @@ -4718,63 +4748,18 @@ FUN(Page_finalize)(JNIEnv *env, jobject self) fz_drop_page(ctx, page); } -JNIEXPORT jint JNICALL -FUN(Page_countSeparations)(JNIEnv *env, jobject self) -{ - fz_context *ctx = get_context(env); - fz_page *page = from_Page(env, self); - int nSep; - - if (!ctx || !page) return 0; - - fz_try(ctx) - nSep = fz_count_separations_on_page(ctx, page); - fz_catch(ctx) - { - jni_rethrow(env, ctx); - return 0; - } - - return nSep; -} - -JNIEXPORT void JNICALL -FUN(Page_enableSeparation)(JNIEnv *env, jobject self, jint sep, jboolean enable) -{ - fz_context *ctx = get_context(env); - fz_page *page = from_Page(env, self); - - if (!ctx || !page) return; - - fz_try(ctx) - fz_control_separation_on_page(ctx, page, sep, !enable); - fz_catch(ctx) - jni_rethrow(env, ctx); -} - JNIEXPORT jobject JNICALL -FUN(Page_getSeparation)(JNIEnv *env, jobject self, jint sep) +FUN(Page_getSeparations)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_page *page = from_Page(env, self); - const char *name; - char rgba[4]; - unsigned int bgra; - unsigned int cmyk; - jobject jname = NULL; + fz_separations *seps; - if (!ctx || !page) return NULL; + if (!ctx || !page) return 0; - /* MuPDF returns RGBA as bytes. Android wants a packed BGRA int. */ - name = fz_get_separation_on_page(ctx, page, sep, (unsigned int *)(&rgba[0]), &cmyk); - bgra = (rgba[0] << 16) | (rgba[1]<<8) | rgba[2] | (rgba[3]<<24); - if (name) - { - jname = (*env)->NewStringUTF(env, name); - if (!jname) return NULL; - } + seps = fz_page_separations(ctx, page); - return (*env)->NewObject(env, cls_Separation, mid_Separation_init, jname, bgra, cmyk); + return to_Separations_safe_own(ctx, env, seps); } JNIEXPORT jobject JNICALL @@ -8849,3 +8834,74 @@ FUN(PDFAnnotation_setLineEndingStyles)(JNIEnv *env, jobject self, jint start_sty fz_catch(ctx) jni_rethrow(env, ctx); } + +/* Separations interface */ + +JNIEXPORT jint JNICALL +FUN(Separations_getNumberOfSeparations)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + fz_separations *seps = from_Separations(env, self); + int nSep; + + fz_try(ctx) + nSep = fz_count_separations(ctx, seps); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return 0; + } + + return nSep; +} + +JNIEXPORT void JNICALL +FUN(Separations_controlSeparation)(JNIEnv *env, jobject self, jint sep, jboolean disable) +{ + fz_context *ctx = get_context(env); + fz_separations *seps = from_Separations(env, self); + + if (!ctx || !seps) return; + + fz_try(ctx) + fz_control_separation(ctx, seps, sep, disable); + fz_catch(ctx) + jni_rethrow(env, ctx); +} + +JNIEXPORT jobject JNICALL +FUN(Separations_getSeparation)(JNIEnv *env, jobject self, jint sep) +{ + fz_context *ctx = get_context(env); + fz_separations *seps = from_Separations(env, self); + const char *name; + char rgba[4]; + unsigned int bgra; + unsigned int cmyk; + jobject jname = NULL; + + if (!ctx || !seps) return NULL; + + /* MuPDF returns RGBA as bytes. Android wants a packed BGRA int. */ + name = fz_get_separation(ctx, seps, sep, (unsigned int *)(&rgba[0]), &cmyk); + bgra = (rgba[0] << 16) | (rgba[1]<<8) | rgba[2] | (rgba[3]<<24); + if (name) + { + jname = (*env)->NewStringUTF(env, name); + if (!jname) return NULL; + } + + return (*env)->NewObject(env, cls_Separation, mid_Separation_init, jname, bgra, cmyk); +} + +JNIEXPORT jboolean JNICALL +FUN(Separations_areSeparationsControllable)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + fz_separations *seps = from_Separations(env, self); + jobject jname = NULL; + + if (!ctx || !seps) return 0; + + return fz_separations_controllable(ctx, seps); +} diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index d7355376..991933c0 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -1418,28 +1418,12 @@ JNIEXPORT jbyteArray JNICALL Java_com_artifex_mupdf_fitz_Page_textAsHtml /* * Class: com_artifex_mupdf_fitz_Page - * Method: countSeparations - * Signature: ()I + * Method: getSeparations + * Signature: ()Lcom/artifex/mupdf/fitz/Separations; */ -JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Page_countSeparations +JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Page_getSeparations (JNIEnv *, jobject); -/* - * Class: com_artifex_mupdf_fitz_Page - * Method: getSeparation - * Signature: (I)Lcom/artifex/mupdf/fitz/Separation; - */ -JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Page_getSeparation - (JNIEnv *, jobject, jint); - -/* - * Class: com_artifex_mupdf_fitz_Page - * Method: enableSeparation - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Page_enableSeparation - (JNIEnv *, jobject, jint, jboolean); - #ifdef __cplusplus } #endif @@ -2840,6 +2824,65 @@ extern "C" { } #endif #endif +/* Header for class com_artifex_mupdf_fitz_Separations */ + +#ifndef _Included_com_artifex_mupdf_fitz_Separations +#define _Included_com_artifex_mupdf_fitz_Separations +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: finalize + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Separations_finalize + (JNIEnv *, jobject); + +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: getNumberOfSeparations + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Separations_getNumberOfSeparations + (JNIEnv *, jobject); + +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: getSeparation + * Signature: (I)Lcom/artifex/mupdf/fitz/Separation; + */ +JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Separations_getSeparation + (JNIEnv *, jobject, jint); + +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: areSeparationsControllable + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_fitz_Separations_areSeparationsControllable + (JNIEnv *, jobject); + +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: disableSeparation + * Signature: (IZ)Z + */ +JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_fitz_Separations_disableSeparation + (JNIEnv *, jobject, jint, jboolean); + +/* + * Class: com_artifex_mupdf_fitz_Separations + * Method: isSeparationDisabled + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_fitz_Separations_isSeparationDisabled + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif /* Header for class com_artifex_mupdf_fitz_Shade */ #ifndef _Included_com_artifex_mupdf_fitz_Shade diff --git a/platform/java/src/com/artifex/mupdf/fitz/Page.java b/platform/java/src/com/artifex/mupdf/fitz/Page.java index 60241355..5475e044 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/Page.java +++ b/platform/java/src/com/artifex/mupdf/fitz/Page.java @@ -43,8 +43,5 @@ public class Page public native byte[] textAsHtml(); - public native int countSeparations(); - public native Separation getSeparation(int index); - public native void enableSeparation(int index, boolean enabled); - + public native Separations getSeparations(); } diff --git a/platform/java/src/com/artifex/mupdf/fitz/Separations.java b/platform/java/src/com/artifex/mupdf/fitz/Separations.java new file mode 100644 index 00000000..6b86f3a4 --- /dev/null +++ b/platform/java/src/com/artifex/mupdf/fitz/Separations.java @@ -0,0 +1,27 @@ +package com.artifex.mupdf.fitz; + +public class Separations +{ + private long pointer; + + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; + } + + protected Separations(long p) { + pointer = p; + } + + public native int getNumberOfSeparations(); + + public native Separation getSeparation(int separation); + + public native boolean areSeparationsControllable(); + + public native boolean disableSeparation(int separation, boolean disable); + + public native boolean isSeparationDisabled(int separation); +} diff --git a/platform/win32/javaviewerlib.vcproj b/platform/win32/javaviewerlib.vcproj index 74749a25..36fa5463 100644 --- a/platform/win32/javaviewerlib.vcproj +++ b/platform/win32/javaviewerlib.vcproj @@ -460,6 +460,10 @@ > </File> <File + RelativePath="..\java\src\com\artifex\mupdf\fitz\Separations.java" + > + </File> + <File RelativePath="..\java\src\com\artifex\mupdf\fitz\Shade.java" > </File> diff --git a/source/fitz/document.c b/source/fitz/document.c index ceccd26d..c03012f2 100644 --- a/source/fitz/document.c +++ b/source/fitz/document.c @@ -483,31 +483,10 @@ fz_page_presentation(fz_context *ctx, fz_page *page, fz_transition *transition, return NULL; } -int fz_count_separations_on_page(fz_context *ctx, fz_page *page) +fz_separations * +fz_page_separations(fz_context *ctx, fz_page *page) { - if (page && page->count_separations) - return page->count_separations(ctx, page); - return 0; -} - -void fz_control_separation_on_page(fz_context *ctx, fz_page *page, int sep, int disable) -{ - if (page && page->control_separation) - page->control_separation(ctx, page, sep, disable); -} - -int fz_separation_disabled_on_page (fz_context *ctx, fz_page *page, int sep) -{ - if (page && page->separation_disabled) - return page->separation_disabled(ctx, page, sep); - return 0; -} - -const char *fz_get_separation_on_page(fz_context *ctx, fz_page *page, int sep, uint32_t *rgba, uint32_t *cmyk) -{ - if (page && page->get_separation) - return page->get_separation(ctx, page, sep, rgba, cmyk); - *rgba = 0; - *cmyk = 0; + if (page && page->separations) + return page->separations(ctx, page); return NULL; } diff --git a/source/fitz/separation.c b/source/fitz/separation.c index 3c6efc03..039223a9 100644 --- a/source/fitz/separation.c +++ b/source/fitz/separation.c @@ -4,18 +4,20 @@ struct fz_separations_s { int refs; int num_separations; + int controllable; uint32_t disabled[(FZ_MAX_SEPARATIONS + 31) / 32]; uint32_t equiv_rgb[FZ_MAX_SEPARATIONS]; uint32_t equiv_cmyk[FZ_MAX_SEPARATIONS]; char *name[FZ_MAX_SEPARATIONS]; }; -fz_separations *fz_new_separations(fz_context *ctx) +fz_separations *fz_new_separations(fz_context *ctx, int controllable) { fz_separations *sep; sep = fz_malloc_struct(ctx, fz_separations); sep->refs = 1; + sep->controllable = controllable; return sep; } @@ -36,7 +38,7 @@ void fz_drop_separations(fz_context *ctx, fz_separations *sep) } } -void fz_add_separation(fz_context *ctx, fz_separations *sep, uint32_t rgb, uint32_t cmyk, char *name) +void fz_add_separation(fz_context *ctx, fz_separations *sep, uint32_t rgb, uint32_t cmyk, const char *name) { int n; @@ -54,6 +56,11 @@ void fz_add_separation(fz_context *ctx, fz_separations *sep, uint32_t rgb, uint3 sep->num_separations++; } +int fz_separations_controllable(fz_context *ctx, fz_separations *sep) +{ + return (!sep || sep->controllable); +} + void fz_control_separation(fz_context *ctx, fz_separations *sep, int separation, int disable) { int bit; @@ -61,6 +68,9 @@ void fz_control_separation(fz_context *ctx, fz_separations *sep, int separation, if (!sep || separation < 0 || separation >= sep->num_separations) fz_throw(ctx, FZ_ERROR_GENERIC, "can't control non-existent separation"); + if (!sep->controllable) + fz_throw(ctx, FZ_ERROR_GENERIC, "can't control separations on this page"); + bit = 1<<(separation & 31); separation >>= 5; diff --git a/source/gprf/gprf-doc.c b/source/gprf/gprf-doc.c index 34a293bd..a7c46524 100644 --- a/source/gprf/gprf-doc.c +++ b/source/gprf/gprf-doc.c @@ -175,7 +175,7 @@ fz_drop_image_gprf_imp(fz_context *ctx, fz_storable *image_) fz_drop_gprf_file(ctx, image->file); fz_drop_separations(ctx, image->separations); - fz_drop_image_base(ctx, image->super); + fz_drop_image_base(ctx, &image->super); } static inline unsigned char *cmyk_to_rgba(unsigned char *out, uint32_t c, uint32_t m, uint32_t y, uint32_t k) @@ -511,8 +511,7 @@ fz_system(fz_context *ctx, const char *cmd) if (ret != 0) fz_throw(ctx, FZ_ERROR_GENERIC, "child process reported error %d", ret); } -#endif - +#else static int GSDLLCALL gsdll_stdout(void *instance, const char *str, int len) { @@ -556,6 +555,7 @@ gsdll_stderr(void *instance, const char *str, int len) #endif return len; } +#endif static void generate_page(fz_context *ctx, gprf_page *page) @@ -737,7 +737,7 @@ read_tiles(fz_context *ctx, gprf_page *page) /* Skip to the separations */ fz_seek(ctx, file, 64, SEEK_SET); - page->separations = fz_new_separations(ctx); + page->separations = fz_new_separations(ctx, 1); for (i = 0; i < num_seps; i++) { char blatter[4096]; @@ -861,24 +861,29 @@ static const char *gprf_get_separation(fz_context *ctx, fz_page *page_, int sep, return fz_get_separation(ctx, page->separations, sep, rgba, cmyk); } +static fz_separations * +gprf_separations(fz_context *ctx, fz_page *page_) +{ + gprf_page *page = (gprf_page *)page_; + + return fz_keep_separations(ctx, page->separations); +} + static fz_page * gprf_load_page(fz_context *ctx, fz_document *doc_, int number) { gprf_document *doc = (gprf_document*)doc_; - gprf_page *page = fz_new_page(ctx, gprf_page); + gprf_page *page = fz_new_derived_page(ctx, gprf_page); fz_try(ctx) { page->super.bound_page = gprf_bound_page; page->super.run_page_contents = gprf_run_page; page->super.drop_page = gprf_drop_page_imp; - page->super.count_separations = gprf_count_separations; - page->super.control_separation = gprf_control_separation; - page->super.separation_disabled = gprf_separation_disabled; - page->super.get_separation = gprf_get_separation; + page->super.separations = gprf_separations; page->doc = (gprf_document *)fz_keep_document(ctx, &doc->super); page->number = number; - page->separations = fz_new_separations(ctx); + page->separations = fz_new_separations(ctx, 1); page->width = doc->page_dims[number].w; page->height = doc->page_dims[number].h; page->tile_width = (page->width + GPRF_TILESIZE-1)/GPRF_TILESIZE; @@ -919,7 +924,7 @@ gprf_open_document_with_stream(fz_context *ctx, fz_stream *file) { gprf_document *doc; - doc = fz_new_document(ctx, gprf_document); + doc = fz_new_derived_document(ctx, gprf_document); doc->super.drop_document = gprf_close_document; doc->super.count_pages = gprf_count_pages; doc->super.load_page = gprf_load_page; diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c index 1830409a..cb60634c 100644 --- a/source/pdf/pdf-page.c +++ b/source/pdf/pdf-page.c @@ -638,6 +638,54 @@ pdf_page_transform(fz_context *ctx, pdf_page *page, fz_rect *page_mediabox, fz_m pdf_page_obj_transform(ctx, page->obj, page_mediabox, page_ctm); } +fz_separations * +pdf_page_separations(fz_context *ctx, pdf_page *page) +{ + pdf_obj *res = pdf_page_resources(ctx, page); + fz_separations *seps = NULL; + int i, len; + + res = pdf_dict_get(ctx, res, PDF_NAME_ColorSpace); + if (!res) + return NULL; + + fz_var(seps); + fz_var(i); + + len = pdf_dict_len(ctx, res); + + i = 0; + while (i < len) + { + fz_try(ctx) + { + do + { + pdf_obj *obj; + i++; + obj = pdf_dict_get_val(ctx, res, i-1); + + if (pdf_name_eq(ctx, pdf_array_get(ctx, obj, 0), PDF_NAME_Separation)) + { + uint32_t rgba = 0; /* FIXME */ + uint32_t cmyk = 0; /* FIXME */ + const char *name = pdf_to_name(ctx, pdf_array_get(ctx, obj, 1)); + if (!seps) + seps = fz_new_separations(ctx, 0); + fz_add_separation(ctx, seps, rgba, cmyk, name); + } + } + while (i < len); + } + fz_catch(ctx) + { + /* Don't die because a single separation failed to load */ + } + } + + return seps; +} + static void pdf_drop_page_imp(fz_context *ctx, pdf_page *page) { @@ -670,6 +718,7 @@ pdf_new_page(fz_context *ctx, pdf_document *doc) page->super.first_annot = (fz_page_first_annot_fn*)pdf_first_annot; page->super.run_page_contents = (fz_page_run_page_contents_fn*)pdf_run_page_contents; page->super.page_presentation = (fz_page_page_presentation_fn*)pdf_page_presentation; + page->super.separations = (fz_page_separations_fn *)pdf_page_separations; page->obj = NULL; |