diff options
author | Ken Sharp <ken.sharp@artifex.com> | 2015-06-26 10:25:07 +0100 |
---|---|---|
committer | Ken Sharp <ken.sharp@artifex.com> | 2015-07-03 09:57:50 +0100 |
commit | daec38c3771d420105f2f989490ac5774bdd01dc (patch) | |
tree | 7a4a6359f050165b2269f14af03dea33d7106ffd | |
parent | 910a5c6a06334f1d336013007ddde6123780a07f (diff) | |
download | ghostpdl-daec38c3771d420105f2f989490ac5774bdd01dc.tar.gz |
Modify FistPage/LastPage handling for PDF input
Restore the meaning of FirstPage and LastPage in the PDF interpreter so that
it only sends the requisite pages.
At the same time add a new 'DisablePageHandler' parameter which will prevent
the built-in device from applying FirstPage and LastPage.
-rw-r--r-- | gs/Resource/Init/pdf_main.ps | 20 | ||||
-rw-r--r-- | gs/base/gdevflp.c | 207 | ||||
-rw-r--r-- | gs/base/gsdparam.c | 14 | ||||
-rw-r--r-- | gs/base/gxdevcli.h | 1 | ||||
-rw-r--r-- | gs/base/gxdevice.h | 2 | ||||
-rw-r--r-- | gs/devices/gdevbit.c | 1 |
6 files changed, 142 insertions, 103 deletions
diff --git a/gs/Resource/Init/pdf_main.ps b/gs/Resource/Init/pdf_main.ps index c1c27a393..791c65a44 100644 --- a/gs/Resource/Init/pdf_main.ps +++ b/gs/Resource/Init/pdf_main.ps @@ -184,6 +184,7 @@ currentdict /runpdfstring .undef } bind def /runpdfpagerange { % - runpdfpagerange <firstpage#> <lastpage#> + <</DisablePageHandler true>> setpagedevice /PortfolioPage where { pop PortfolioPage cvi dup pdfpagecount add % a b+1 @@ -192,8 +193,8 @@ currentdict /runpdfstring .undef dup 3 index exch cvs pop % a b+1 /P (b+1) store 1 sub % a b - /FirstPDFPage where { pop FirstPDFPage } { 1 } ifelse - /LastPDFPage where { pop LastPDFPage } {2000000000} ifelse % a b fp lp + /FirstPage where { pop FirstPage <</DisablePageHandler true>> setpagedevice} { 1 } ifelse + /LastPage where { pop LastPage <</DisablePageHandler true>> setpagedevice} {2000000000} ifelse % a b fp lp 2 index 2 index lt { % b < fp 1e10 } { @@ -223,17 +224,18 @@ currentdict /runpdfstring .undef } ifelse } if } { - /FirstPDFPage where { - pop FirstPDFPage dup pdfpagecount gt { - (\nRequested FirstPDFPage is greater than the number of pages in the file: ) print + /FirstPage where { + <</DisablePageHandler true>> setpagedevice + pop FirstPage dup pdfpagecount gt { + (\nRequested FirstPage is greater than the number of pages in the file: ) print pdfpagecount = flush } if } { 1 } ifelse - /LastPDFPage where { pop LastPDFPage pdfpagecount .min } { pdfpagecount } ifelse + /LastPage where {<</DisablePageHandler true>> setpagedevice pop LastPage pdfpagecount .min } { pdfpagecount } ifelse 1 index 1 index gt { - ( No pages will be processed \(FirstPDFPage > LastPDFPage\).) = flush + ( No pages will be processed \(FirstPage > LastPage\).) = flush } { QUIET not { (Processing pages ) print 1 index =only ( through ) print dup =only @@ -1609,8 +1611,8 @@ end readonly def } bind def % <pagedict> mark ... -proc- <page#> <error> /namedactions 8 dict dup begin - /FirstPDFPage { 1 /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def - /LastPDFPage { pdfpagecount /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def + /FirstPage { 1 /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def + /LastPage { pdfpagecount /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def /NextPage { counttomark 2 add index pdfpagenumber 1 add dup pdfpagecount gt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind def /PrevPage { counttomark 2 add index pdfpagenumber 1 sub dup 1 lt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind def end readonly def diff --git a/gs/base/gdevflp.c b/gs/base/gdevflp.c index 2c00e675a..167b6c31b 100644 --- a/gs/base/gdevflp.c +++ b/gs/base/gdevflp.c @@ -62,6 +62,8 @@ static dev_proc_copy_mono(flp_copy_mono); static dev_proc_copy_color(flp_copy_color); static dev_proc_draw_line(flp_draw_line); static dev_proc_get_bits(flp_get_bits); +//static dev_proc_get_params(flp_get_params); +static dev_proc_get_params(flp_put_params); static dev_proc_get_alpha_bits(flp_get_alpha_bits); static dev_proc_copy_alpha(flp_copy_alpha); static dev_proc_get_band(flp_get_band); @@ -146,7 +148,7 @@ gx_device_flp gs_flp_device = flp_draw_line, /* draw_line */ flp_get_bits, /* get_bits */ default_subclass_get_params, - default_subclass_put_params, + flp_put_params, default_subclass_map_cmyk_color, default_subclass_get_xfont_procs, /* get_xfont_procs */ default_subclass_get_xfont_device, /* get_xfont_device */ @@ -217,8 +219,8 @@ int flp_output_page(gx_device *dev, int num_copies, int flush) psubclass_data->PageCount++; - if (psubclass_data->PageCount >= dev->FirstPage) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage) { + if (psubclass_data->PageCount >= dev->FirstPage || dev->DisablePageHandler) { + if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage || dev->DisablePageHandler) { return default_subclass_output_page(dev, num_copies, flush); } } @@ -230,8 +232,8 @@ int flp_fill_rectangle(gx_device *dev, int x, int y, int width, int height, gx_c { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_rectangle(dev, x, y, width, height, color); } @@ -244,8 +246,8 @@ int flp_tile_rectangle(gx_device *dev, const gx_tile_bitmap *tile, int x, int y, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_tile_rectangle(dev, tile, x, y, width, height, color0, color1, phase_x, phase_y); } @@ -258,8 +260,8 @@ int flp_copy_mono(gx_device *dev, const byte *data, int data_x, int raster, gx_b { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_mono(dev, data, data_x, raster, id, x, y, width, height, color0, color1); } @@ -271,8 +273,8 @@ int flp_copy_color(gx_device *dev, const byte *data, int data_x, int raster, gx_ { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_color(dev, data, data_x, raster, id, x, y, width, height); } @@ -283,8 +285,8 @@ int flp_draw_line(gx_device *dev, int x0, int y0, int x1, int y1, gx_color_index { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_draw_line(dev, x0, y0, x1, y1, color); } return 0; @@ -294,19 +296,39 @@ int flp_get_bits(gx_device *dev, int y, byte *data, byte **actual_data) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_get_bits(dev, y, data, actual_data); } return gx_default_get_bits(dev, y, data, actual_data); } +int +flp_put_params(gx_device * dev, gs_param_list * plist) +{ + bool temp_bool = false; + int code; + + code = param_read_bool(plist, "DisablePageHandler", &temp_bool); + if (code < 0) + return code; + if (code == 0) + dev->DisablePageHandler = temp_bool; + + code = default_subclass_put_params(dev, plist); + + if (code < 0) + return code; + + return code; +} + int flp_get_alpha_bits(gx_device *dev, graphics_object_type type) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_get_alpha_bits(dev, type); } return 0; @@ -318,8 +340,8 @@ int flp_copy_alpha(gx_device *dev, const byte *data, int data_x, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_alpha(dev, data, data_x, raster, id, x, y, width, height, color, depth); } return 0; @@ -329,8 +351,8 @@ int flp_get_band(gx_device *dev, int y, int *band_start) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_get_band(dev, y, band_start); } return gx_default_get_band(dev, y, band_start); @@ -344,8 +366,8 @@ int flp_copy_rop(gx_device *dev, const byte *sdata, int sourcex, uint sraster, g { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_rop(dev, sdata, sourcex, sraster, id, scolors, texture, tcolors, x, y, width, height, phase_x, phase_y, lop); } return 0; @@ -357,8 +379,8 @@ int flp_fill_path(gx_device *dev, const gs_imager_state *pis, gx_path *ppath, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_path(dev, pis, ppath, params, pdcolor, pcpath); } return 0; @@ -370,8 +392,8 @@ int flp_stroke_path(gx_device *dev, const gs_imager_state *pis, gx_path *ppath, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_stroke_path(dev, pis, ppath, params, pdcolor, pcpath); } return 0; @@ -384,8 +406,8 @@ int flp_fill_mask(gx_device *dev, const byte *data, int data_x, int raster, gx_b { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_mask(dev, data, data_x, raster, id, x, y, width, height, pdcolor, depth, lop, pcpath); } return 0; @@ -397,8 +419,8 @@ int flp_fill_trapezoid(gx_device *dev, const gs_fixed_edge *left, const gs_fixed { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_trapezoid(dev, left, right, ybot, ytop, swap_axes, pdcolor, lop); } return 0; @@ -409,8 +431,8 @@ int flp_fill_parallelogram(gx_device *dev, fixed px, fixed py, fixed ax, fixed a { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_parallelogram(dev, px, py, ax, ay, bx, by, pdcolor, lop); } return 0; @@ -421,8 +443,8 @@ int flp_fill_triangle(gx_device *dev, fixed px, fixed py, fixed ax, fixed ay, fi { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_triangle(dev, px, py, ax, ay, bx, by, pdcolor, lop); } return 0; @@ -434,8 +456,8 @@ int flp_draw_thin_line(gx_device *dev, fixed fx0, fixed fy0, fixed fx1, fixed fy { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_draw_thin_line(dev, fx0, fy0, fx1, fy1, pdcolor, lop, adjustx, adjusty); } return 0; @@ -448,8 +470,8 @@ int flp_begin_image(gx_device *dev, const gs_imager_state *pis, const gs_image_t { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_begin_image(dev, pis, pim, format, prect, pdcolor, pcpath, memory, pinfo); } return 0; @@ -460,8 +482,8 @@ int flp_image_data(gx_device *dev, gx_image_enum_common_t *info, const byte **pl { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_image_data(dev, info, planes, data_x, raster, height); } return 0; @@ -471,8 +493,8 @@ int flp_end_image(gx_device *dev, gx_image_enum_common_t *info, bool draw_last) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_end_image(dev, info, draw_last); } return 0; @@ -484,8 +506,8 @@ int flp_strip_tile_rectangle(gx_device *dev, const gx_strip_bitmap *tiles, int x { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_strip_tile_rectangle(dev, tiles, x, y, width, height, color0, color1, phase_x, phase_y); } return 0; @@ -499,8 +521,8 @@ int flp_strip_copy_rop(gx_device *dev, const byte *sdata, int sourcex, uint sras { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_strip_copy_rop(dev, sdata, sourcex, sraster, id, scolors, textures, tcolors, x, y, width, height, phase_x, phase_y, lop); } return 0; @@ -551,8 +573,8 @@ int flp_begin_typed_image(gx_device *dev, const gs_imager_state *pis, const gs_m int num_components; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_begin_typed_image(dev, pis, pmat, pic, prect, pdcolor, pcpath, memory, pinfo); } @@ -586,8 +608,8 @@ int flp_get_bits_rectangle(gx_device *dev, const gs_int_rect *prect, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_get_bits_rectangle(dev, prect, params, unread); } return gx_default_get_bits_rectangle(dev->child, prect, params, unread); @@ -598,10 +620,9 @@ int flp_create_compositor(gx_device *dev, gx_device **pcdev, const gs_composite_ { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) { + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_create_compositor(dev, pcdev, pcte, pis, memory, cdev); - } } return 0; @@ -683,7 +704,7 @@ int flp_text_begin(gx_device *dev, gs_imager_state *pis, const gs_text_params_t * secondly because op_show_restore executes an unconditional grestore, assuming * that a gsave has been done simply *because* its a tringwidth operation ! */ - if ((text->operation & TEXT_DO_NONE) && (text->operation & TEXT_RETURN_WIDTH) && pis->text_rendering_mode != 3) + if (dev->DisablePageHandler || ((text->operation & TEXT_DO_NONE) && (text->operation & TEXT_RETURN_WIDTH) && pis->text_rendering_mode != 3)) /* Note that the high level devices *must* be given the opportunity to 'see' the * stringwidth operation, or they won;t be able to cache the glyphs properly. * So always pass stringwidth operations to the child. @@ -723,8 +744,8 @@ int flp_end_transparency_group(gx_device *dev, gs_imager_state *pis) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_end_transparency_group(dev, pis); } return 0; @@ -735,8 +756,8 @@ int flp_begin_transparency_mask(gx_device *dev, const gx_transparency_mask_param { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_begin_transparency_mask(dev, ptmp, pbbox, pis, mem); } return 0; @@ -746,8 +767,8 @@ int flp_end_transparency_mask(gx_device *dev, gs_imager_state *pis) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_end_transparency_mask(dev, pis); } return 0; @@ -757,8 +778,8 @@ int flp_discard_transparency_layer(gx_device *dev, gs_imager_state *pis) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_discard_transparency_layer(dev, pis); } return 0; @@ -769,8 +790,8 @@ int flp_pattern_manage(gx_device *dev, gx_bitmap_id id, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_pattern_manage(dev, id, pinst, function); } return 0; @@ -781,8 +802,8 @@ int flp_fill_rectangle_hl_color(gx_device *dev, const gs_fixed_rect *rect, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_rectangle_hl_color(dev, rect, pis, pdcolor, pcpath); } return 0; @@ -794,8 +815,8 @@ int flp_fill_linear_color_scanline(gx_device *dev, const gs_fill_attributes *fa, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_linear_color_scanline(dev, fa, i, j, w, c0, c0_f, cg_num, cg_den); } return 0; @@ -809,8 +830,8 @@ int flp_fill_linear_color_trapezoid(gx_device *dev, const gs_fill_attributes *fa { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_linear_color_trapezoid(dev, fa, p0, p1, p2, p3, c0, c1, c2, c3); } return 0; @@ -822,8 +843,8 @@ int flp_fill_linear_color_triangle(gx_device *dev, const gs_fill_attributes *fa, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fill_linear_color_triangle(dev, fa, p0, p1, p2, c0, c1, c2); } return 0; @@ -833,8 +854,8 @@ int flp_fillpage(gx_device *dev, gs_imager_state * pis, gx_device_color *pdevc) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_fillpage(dev, pis, pdevc); } return 0; @@ -844,8 +865,8 @@ int flp_push_transparency_state(gx_device *dev, gs_imager_state *pis) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_push_transparency_state(dev, pis); } return 0; @@ -855,8 +876,8 @@ int flp_pop_transparency_state(gx_device *dev, gs_imager_state *pis) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_pop_transparency_state(dev, pis); } return 0; @@ -868,8 +889,8 @@ int flp_put_image(gx_device *dev, const byte *buffer, int num_chan, int x, int y { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_put_image(dev, buffer, num_chan, x, y, width, height, row_stride, plane_stride, alpha_plane_index, tag_plane_index); } return 0; @@ -880,8 +901,8 @@ int flp_copy_planes(gx_device *dev, const byte *data, int data_x, int raster, gx { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_planes(dev, data, data_x, raster, id, x, y, width, height, plane_height); } return 0; @@ -891,8 +912,8 @@ void flp_set_graphics_type_tag(gx_device *dev, gs_graphics_type_tag_t tag) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) default_subclass_set_graphics_type_tag(dev, tag); } return; @@ -904,8 +925,8 @@ int flp_strip_copy_rop2(gx_device *dev, const byte *sdata, int sourcex, uint sra { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_strip_copy_rop2(dev, sdata, sourcex, sraster, id, scolors, textures, tcolors, x, y, width, height, phase_x, phase_y, lop, planar_height); } return 0; @@ -916,8 +937,8 @@ int flp_strip_tile_rect_devn(gx_device *dev, const gx_strip_bitmap *tiles, int x { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_strip_tile_rect_devn(dev, tiles, x, y, width, height, pdcolor0, pdcolor1, phase_x, phase_y); } return 0; @@ -929,8 +950,8 @@ int flp_copy_alpha_hl_color(gx_device *dev, const byte *data, int data_x, { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_copy_alpha_hl_color(dev, data, data_x, raster, id, x, y, width, height, pdcolor, depth); } @@ -941,8 +962,8 @@ int flp_process_page(gx_device *dev, gx_process_page_options_t *options) { first_last_subclass_data *psubclass_data = dev->subclass_data; - if (psubclass_data->PageCount >= dev->FirstPage - 1) { - if (!dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) + if (dev->DisablePageHandler || psubclass_data->PageCount >= dev->FirstPage - 1) { + if (dev->DisablePageHandler || !dev->LastPage || psubclass_data->PageCount <= dev->LastPage - 1) return default_subclass_process_page(dev, options); } return 0; diff --git a/gs/base/gsdparam.c b/gs/base/gsdparam.c index fbcee1b79..54bb61580 100644 --- a/gs/base/gsdparam.c +++ b/gs/base/gsdparam.c @@ -419,6 +419,10 @@ int gx_default_get_param(gx_device *dev, char *Param, void *list) if (strcmp(Param, "LastPage") == 0) { return param_write_int(plist, "LastPage", &dev->LastPage); } + if (strcmp(Param, "DisablePageHandler") == 0) { + temp_bool = dev->DisablePageHandler; + return param_write_bool(plist, "DisablePageHandler", &temp_bool); + } if (strcmp(Param, "FILTERIMAGE") == 0) { temp_bool = dev->ObjectFilter & FILTERIMAGE; return param_write_bool(plist, "FILTERIMAGE", &temp_bool); @@ -659,6 +663,10 @@ gx_default_get_params(gx_device * dev, gs_param_list * plist) if ((code = param_write_int(plist, "LastPage", &dev->LastPage)) < 0) return code; + temp_bool = dev->DisablePageHandler; + if ((code = param_write_bool(plist, "DisablePageHandler", &temp_bool)) < 0) + return code; + temp_bool = dev->ObjectFilter & FILTERIMAGE; if ((code = param_write_bool(plist, "FILTERIMAGE", &temp_bool)) < 0) return code; @@ -1741,6 +1749,12 @@ label:\ if (code < 0) ecode = code; + code = param_read_bool(plist, "DisablePageHandler", &temp_bool); + if (code < 0) + ecode = code; + if (code == 0) + dev->DisablePageHandler = temp_bool; + code = param_read_bool(plist, "FILTERIMAGE", &temp_bool); if (code < 0) ecode = code; diff --git a/gs/base/gxdevcli.h b/gs/base/gxdevcli.h index 550af39ce..dc43684ea 100644 --- a/gs/base/gxdevcli.h +++ b/gs/base/gxdevcli.h @@ -761,6 +761,7 @@ typedef struct gdev_space_params_s { int FirstPage;\ int LastPage;\ bool PageHandlerPushed; /* Handles FirstPage and LastPage operations */\ + bool DisablePageHandler; /* Can be set by the interpreter if it will process FirstPage and LastPage itself */\ int ObjectFilter; /* Bit field for which object filters to apply */\ bool ObjectHandlerPushed; /* Handles filtering of objects to devices */\ long PageCount; /* number of pages written */\ diff --git a/gs/base/gxdevice.h b/gs/base/gxdevice.h index 7476f4400..3549dcf1a 100644 --- a/gs/base/gxdevice.h +++ b/gs/base/gxdevice.h @@ -118,7 +118,7 @@ /* offsets and margins go here */ #define std_device_part3_()\ - 0/*FirstPage*/, 0/*LastPage*/, 0/*PageHandlerPushed*/, 0/* Object Filter*/, 0/*ObjectHandlerPushed*/,\ + 0/*FirstPage*/, 0/*LastPage*/, 0/*PageHandlerPushed*/, 0/*DisablePageHandler*/, 0/* Object Filter*/, 0/*ObjectHandlerPushed*/,\ 0/*PageCount*/, 0/*ShowpageCount*/, 1/*NumCopies*/, 0/*NumCopies_set*/,\ 0/*IgnoreNumCopies*/, 0/*UseCIEColor*/, 0/*LockSafetyParams*/,\ 0/*band_offset_x*/, 0/*band_offset_y*/, {false}/* sgr */,\ diff --git a/gs/devices/gdevbit.c b/gs/devices/gdevbit.c index c9e44376e..9f6a5c06e 100644 --- a/gs/devices/gdevbit.c +++ b/gs/devices/gdevbit.c @@ -291,6 +291,7 @@ const gx_device_bit gs_bitrgbtags_device = 0 , /*FirstPage*/ 0 , /*LastPage*/ 0 , /*PageHandlerPushed*/ + 0 , /*DisablePageHandler*/ 0 , /*ObjectFilter*/ 0 , /*ObjectHandlerPushed*/ 0 , /*PageCount*/ |