diff options
author | Robin Watts <robin.watts@artifex.com> | 2017-06-20 19:43:09 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2017-07-19 19:41:23 +0100 |
commit | 3d6cf4e4e543ce0d204db71ef8d0b9277219f250 (patch) | |
tree | f501d7bf12c00066bde1a4dc1bfc2e6bd6e0137b /source/pdf | |
parent | 041df2bd7029d436767ec5bfb4227dc1cdb30afc (diff) | |
download | mupdf-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).
Diffstat (limited to 'source/pdf')
-rw-r--r-- | source/pdf/pdf-page.c | 49 |
1 files changed, 49 insertions, 0 deletions
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; |