summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2017-06-20 19:43:09 +0100
committerRobin Watts <robin.watts@artifex.com>2017-07-19 19:41:23 +0100
commit3d6cf4e4e543ce0d204db71ef8d0b9277219f250 (patch)
treef501d7bf12c00066bde1a4dc1bfc2e6bd6e0137b
parent041df2bd7029d436767ec5bfb4227dc1cdb30afc (diff)
downloadmupdf-3d6cf4e4e543ce0d204db71ef8d0b9277219f250.tar.xz
Rejig page separations interface.
Specifically this is aimed so we can efficiently get separation details for PDF files (which may require a lengthy search process).
-rw-r--r--include/mupdf/fitz/document.h46
-rw-r--r--include/mupdf/fitz/separation.h9
-rw-r--r--include/mupdf/pdf/page.h5
-rw-r--r--platform/java/mupdf_native.c156
-rw-r--r--platform/java/mupdf_native.h81
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Page.java5
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Separations.java27
-rw-r--r--platform/win32/javaviewerlib.vcproj4
-rw-r--r--source/fitz/document.c29
-rw-r--r--source/fitz/separation.c14
-rw-r--r--source/gprf/gprf-doc.c27
-rw-r--r--source/pdf/pdf-page.c49
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;