diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2021-04-08 16:29:55 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2021-04-20 15:03:02 +0100 |
commit | e1a3956f252404f07d93be47f7845b23e4a2c4de (patch) | |
tree | 9f702e5846dbeba82ccf4b65a28434a8b80de708 /base | |
parent | 8d83e9871f14d44c7120f0e170c43064c6a738ea (diff) | |
download | ghostpdl-e1a3956f252404f07d93be47f7845b23e4a2c4de.tar.gz |
Move devices away from static init of procs.
Diffstat (limited to 'base')
-rw-r--r-- | base/gdevbbox.c | 107 | ||||
-rw-r--r-- | base/gdevdevn.c | 88 | ||||
-rw-r--r-- | base/gdevdflt.c | 174 | ||||
-rw-r--r-- | base/gdevepo.c | 117 | ||||
-rw-r--r-- | base/gdevflp.c | 140 | ||||
-rw-r--r-- | base/gdevhit.c | 74 | ||||
-rw-r--r-- | base/gdevmem.c | 11 | ||||
-rw-r--r-- | base/gdevmplt.c | 90 | ||||
-rw-r--r-- | base/gdevnfwd.c | 199 | ||||
-rw-r--r-- | base/gdevnup.c | 95 | ||||
-rw-r--r-- | base/gdevoflt.c | 114 | ||||
-rw-r--r-- | base/gdevp14.c | 578 | ||||
-rw-r--r-- | base/gdevplnx.c | 131 | ||||
-rw-r--r-- | base/gdevprn.c | 221 | ||||
-rw-r--r-- | base/gdevprn.h | 100 | ||||
-rw-r--r-- | base/gdevrops.c | 119 | ||||
-rw-r--r-- | base/gdevsclass.c | 89 | ||||
-rw-r--r-- | base/gsdevice.c | 35 | ||||
-rw-r--r-- | base/gsovrc.c | 387 | ||||
-rw-r--r-- | base/gxacpath.c | 85 | ||||
-rw-r--r-- | base/gxclip.c | 162 | ||||
-rw-r--r-- | base/gxclip2.c | 144 | ||||
-rw-r--r-- | base/gxclipm.c | 150 | ||||
-rw-r--r-- | base/gxclist.c | 149 | ||||
-rw-r--r-- | base/gxclpage.c | 4 | ||||
-rw-r--r-- | base/gxdevcli.h | 54 | ||||
-rw-r--r-- | base/gxdevice.h | 4 | ||||
-rw-r--r-- | base/gxmclip.c | 7 | ||||
-rw-r--r-- | base/gxpcmap.c | 132 | ||||
-rw-r--r-- | base/gzspotan.c | 72 |
30 files changed, 1785 insertions, 2047 deletions
diff --git a/base/gdevbbox.c b/base/gdevbbox.c index 3e119faba..db0ddb6e2 100644 --- a/base/gdevbbox.c +++ b/base/gdevbbox.c @@ -63,6 +63,35 @@ static dev_proc_fillpage(bbox_fillpage); static int bbox_initialize(gx_device *dev) { + set_dev_proc(dev, open_device, bbox_open_device); + set_dev_proc(dev, get_initial_matrix, gx_upright_get_initial_matrix); + set_dev_proc(dev, output_page, bbox_output_page); + set_dev_proc(dev, close_device, bbox_close_device); + set_dev_proc(dev, map_rgb_color, gx_default_gray_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_gray_map_color_rgb); + set_dev_proc(dev, fill_rectangle, bbox_fill_rectangle); + set_dev_proc(dev, copy_mono, bbox_copy_mono); + set_dev_proc(dev, copy_color, bbox_copy_color); + set_dev_proc(dev, get_params, bbox_get_params); + set_dev_proc(dev, put_params, bbox_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, copy_alpha, bbox_copy_alpha); + set_dev_proc(dev, fill_path, bbox_fill_path); + set_dev_proc(dev, stroke_path, bbox_stroke_path); + set_dev_proc(dev, fill_mask, bbox_fill_mask); + set_dev_proc(dev, fill_trapezoid, bbox_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, bbox_fill_parallelogram); + set_dev_proc(dev, fill_triangle, bbox_fill_triangle); + set_dev_proc(dev, draw_thin_line, bbox_draw_thin_line); + set_dev_proc(dev, strip_tile_rectangle, bbox_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, bbox_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, bbox_begin_typed_image); + set_dev_proc(dev, create_compositor, bbox_create_compositor); + set_dev_proc(dev, text_begin, bbox_text_begin); + set_dev_proc(dev, fillpage, bbox_fillpage); + set_dev_proc(dev, strip_copy_rop2, bbox_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, bbox_strip_tile_rect_devn); + return 0; } @@ -95,78 +124,7 @@ gx_device_bbox gs_bbox_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {bbox_open_device, - gx_upright_get_initial_matrix, - NULL, /* sync_output */ - bbox_output_page, - bbox_close_device, - gx_default_gray_map_rgb_color, - gx_default_gray_map_color_rgb, - bbox_fill_rectangle, - NULL, /* tile_rectangle */ - bbox_copy_mono, - bbox_copy_color, - NULL, /* draw_line */ - NULL, /* get_bits */ - bbox_get_params, - bbox_put_params, - gx_default_map_cmyk_color, - NULL, /* get_xfont_procs */ - NULL, /* get_xfont_device */ - gx_default_map_rgb_alpha_color, - gx_page_device_get_page_device, - NULL, /* get_alpha_bits */ - bbox_copy_alpha, - NULL, /* get_band */ - NULL, /* copy_rop */ - bbox_fill_path, - bbox_stroke_path, - bbox_fill_mask, - bbox_fill_trapezoid, - bbox_fill_parallelogram, - bbox_fill_triangle, - bbox_draw_thin_line, - gx_default_begin_image, - NULL, /* image_data */ - NULL, /* end_image */ - bbox_strip_tile_rectangle, - bbox_strip_copy_rop, - NULL, /* get_clipping_box */ - bbox_begin_typed_image, - NULL, /* get_bits_rectangle */ - gx_default_map_color_rgb_alpha, - bbox_create_compositor, - NULL, /* get_hardware_params */ - bbox_text_begin, - bbox_initialize, /* initialize */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - NULL, /* get_color_mapping_procs */ - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern_manage */ - NULL, /* fill_rectangle_hl_color */ - NULL, /* include_color_space */ - NULL, /* fill_linear_color_scanline */ - NULL, /* fill_linear_color_trapezoid */ - NULL, /* fill_linear_color_triangle */ - NULL, /* update_spot_equivalent_colors */ - NULL, /* ret_devn_params */ - bbox_fillpage, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - NULL, /* dev_spec_op */ - NULL, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - bbox_strip_copy_rop2, - bbox_strip_tile_rect_devn - }, + devprocs_initialize(bbox_initialize), 0, /* target */ 1, /*true *//* free_standing */ 1 /*true *//* forward_open_close */ @@ -281,8 +239,9 @@ bbox_close_device(gx_device * dev) void gx_device_bbox_init(gx_device_bbox * dev, gx_device * target, gs_memory_t *mem) { - gx_device_init((gx_device *) dev, (const gx_device *)&gs_bbox_device, - (target ? target->memory : mem), true); + /* Can never fail */ + (void)gx_device_init((gx_device *) dev, (const gx_device *)&gs_bbox_device, + (target ? target->memory : mem), true); if (target) { gx_device_forward_fill_in_procs((gx_device_forward *) dev); set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); diff --git a/base/gdevdevn.c b/base/gdevdevn.c index 48d55b545..31851ae13 100644 --- a/base/gdevdevn.c +++ b/base/gdevdevn.c @@ -940,71 +940,23 @@ gs_public_st_composite_final(st_gx_devn_prn_device, gx_devn_prn_device, "gx_devn_prn_device", gx_devn_prn_device_enum_ptrs, gx_devn_prn_device_reloc_ptrs, static_gx_devn_prn_device_finalize); -/* - * Macro definition for DeviceN procedures - */ -#define device_procs()\ -{ spotcmyk_prn_open,\ - gx_default_get_initial_matrix,\ - NULL, /* sync_output */\ - gdev_prn_output_page, /* output_page */\ - gdev_prn_close, /* close */\ - NULL, /* map_rgb_color - not used */\ - NULL, /* map_color_rgb - not used */\ - NULL, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - gx_devn_prn_get_params, /* get_params */\ - gx_devn_prn_put_params, /* put_params */\ - NULL, /* map_cmyk_color - not used */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device, /* get_page_device */\ - NULL, /* get_alpha_bits */\ - NULL, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - NULL, /* fill_path */\ - NULL, /* stroke_path */\ - NULL, /* fill_mask */\ - NULL, /* fill_trapezoid */\ - NULL, /* fill_parallelogram */\ - NULL, /* fill_triangle */\ - NULL, /* draw_thin_line */\ - NULL, /* begin_image */\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop */\ - NULL, /* get_clipping_box */\ - NULL, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - NULL, /* create_compositor */\ - NULL, /* get_hardware_params */\ - NULL, /* text_begin */\ - NULL, /* initialize */\ - NULL, /* begin_transparency_group */\ - NULL, /* end_transparency_group */\ - NULL, /* begin_transparency_mask */\ - NULL, /* end_transparency_mask */\ - NULL, /* discard_transparency_layer */\ - gx_devn_prn_get_color_mapping_procs,/* get_color_mapping_procs */\ - gx_devn_prn_get_color_comp_index,/* get_color_comp_index */\ - gx_devn_prn_encode_color, /* encode_color */\ - gx_devn_prn_decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - NULL, /* fill_rectangle_hl_color */\ - NULL, /* include_color_space */\ - NULL, /* fill_linear_color_scanline */\ - NULL, /* fill_linear_color_trapezoid */\ - NULL, /* fill_linear_color_triangle */\ - gx_devn_prn_update_spot_equivalent_colors,/* update_spot_equivalent_colors */\ - gx_devn_prn_ret_devn_params /* ret_devn_params */\ +static int +devicen_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, spotcmyk_prn_open); + set_dev_proc(dev, output_page, gdev_prn_output_page); + set_dev_proc(dev, close_device, gdev_prn_close); + set_dev_proc(dev, get_params, gx_devn_prn_get_params); + set_dev_proc(dev, put_params, gx_devn_prn_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, get_color_mapping_procs, gx_devn_prn_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_devn_prn_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_devn_prn_encode_color); + set_dev_proc(dev, decode_color, gx_devn_prn_decode_color); + set_dev_proc(dev, update_spot_equivalent_colors, gx_devn_prn_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_devn_prn_ret_devn_params); + + return 0; } fixed_colorant_name DeviceGrayComponents[] = { @@ -1049,7 +1001,8 @@ fixed_colorant_name DeviceCMYKComponents[] = { /* * Example device with CMYK and spot color support */ -static const gx_device_procs spot_cmyk_procs = device_procs(); +static const gx_device_procs spot_cmyk_procs = + devprocs_initialize(devicen_initialize); const gx_devn_prn_device gs_spotcmyk_device = { @@ -1069,7 +1022,8 @@ const gx_devn_prn_device gs_spotcmyk_device = /* * Example DeviceN color device */ -static const gx_device_procs devicen_procs = device_procs(); +static const gx_device_procs devicen_procs = + devprocs_initialize(devicen_initialize); const gx_devn_prn_device gs_devicen_device = { diff --git a/base/gdevdflt.c b/base/gdevdflt.c index 65523f6d0..722805765 100644 --- a/base/gdevdflt.c +++ b/base/gdevdflt.c @@ -1234,7 +1234,7 @@ gx_default_set_graphics_type_tag(gx_device *dev, gs_graphics_type_tag_t graphics /* ---------------- Device subclassing procedures ---------------- */ /* Non-obvious code. The 'dest_procs' is the 'procs' memory occupied by the original device that we decided to subclass, - * 'src_procs' is the newly allocated piece of memory, to whch we have already copied the content of the + * 'src_procs' is the newly allocated piece of memory, to which we have already copied the content of the * original device (including the procs), prototype is the device structure prototype for the subclassing device. * Here we copy the methods from the prototype to the original device procs memory *but* if the original (src_procs) * device had a NULL method, we make the new device procs have a NULL method too. @@ -1251,83 +1251,100 @@ gx_default_set_graphics_type_tag(gx_device *dev, gs_graphics_type_tag_t graphics * prototype (subclass device) method if the original device had the default implementation. * I suspect a combination of forwarding and subclassing devices will not work properly for this reason. */ -int gx_copy_device_procs(gx_device *dest, gx_device *src, gx_device *prototype) -{ - set_dev_proc(dest, open_device, dev_proc(prototype, open_device)); - set_dev_proc(dest, get_initial_matrix, dev_proc(prototype, get_initial_matrix)); - set_dev_proc(dest, sync_output, dev_proc(prototype, sync_output)); - set_dev_proc(dest, output_page, dev_proc(prototype, output_page)); - set_dev_proc(dest, close_device, dev_proc(prototype, close_device)); - set_dev_proc(dest, map_rgb_color, dev_proc(prototype, map_rgb_color)); - set_dev_proc(dest, map_color_rgb, dev_proc(prototype, map_color_rgb)); - set_dev_proc(dest, fill_rectangle, dev_proc(prototype, fill_rectangle)); - set_dev_proc(dest, tile_rectangle, dev_proc(prototype, tile_rectangle)); - set_dev_proc(dest, copy_mono, dev_proc(prototype, copy_mono)); - set_dev_proc(dest, copy_color, dev_proc(prototype, copy_color)); - set_dev_proc(dest, obsolete_draw_line, dev_proc(prototype, obsolete_draw_line)); - set_dev_proc(dest, get_bits, dev_proc(prototype, get_bits)); - set_dev_proc(dest, get_params, dev_proc(prototype, get_params)); - set_dev_proc(dest, put_params, dev_proc(prototype, put_params)); - set_dev_proc(dest, map_cmyk_color, dev_proc(prototype, map_cmyk_color)); - set_dev_proc(dest, get_xfont_procs, dev_proc(prototype, get_xfont_procs)); - set_dev_proc(dest, get_xfont_device, dev_proc(prototype, get_xfont_device)); - set_dev_proc(dest, map_rgb_alpha_color, dev_proc(prototype, map_rgb_alpha_color)); - set_dev_proc(dest, get_page_device, dev_proc(prototype, get_page_device)); - set_dev_proc(dest, get_alpha_bits, dev_proc(prototype, get_alpha_bits)); - set_dev_proc(dest, copy_alpha, dev_proc(prototype, copy_alpha)); - set_dev_proc(dest, get_band, dev_proc(prototype, get_band)); - set_dev_proc(dest, copy_rop, dev_proc(prototype, copy_rop)); - set_dev_proc(dest, fill_path, dev_proc(prototype, fill_path)); - set_dev_proc(dest, stroke_path, dev_proc(prototype, stroke_path)); - set_dev_proc(dest, fill_trapezoid, dev_proc(prototype, fill_trapezoid)); - set_dev_proc(dest, fill_parallelogram, dev_proc(prototype, fill_parallelogram)); - set_dev_proc(dest, fill_triangle, dev_proc(prototype, fill_triangle)); - set_dev_proc(dest, draw_thin_line, dev_proc(prototype, draw_thin_line)); - set_dev_proc(dest, begin_image, dev_proc(prototype, begin_image)); - set_dev_proc(dest, image_data, dev_proc(prototype, image_data)); - set_dev_proc(dest, end_image, dev_proc(prototype, end_image)); - set_dev_proc(dest, strip_tile_rectangle, dev_proc(prototype, strip_tile_rectangle)); - set_dev_proc(dest, strip_copy_rop, dev_proc(prototype, strip_copy_rop)); - set_dev_proc(dest, get_clipping_box, dev_proc(prototype, get_clipping_box)); - set_dev_proc(dest, begin_typed_image, dev_proc(prototype, begin_typed_image)); - set_dev_proc(dest, get_bits_rectangle, dev_proc(prototype, get_bits_rectangle)); - set_dev_proc(dest, map_color_rgb_alpha, dev_proc(prototype, map_color_rgb_alpha)); - set_dev_proc(dest, create_compositor, dev_proc(prototype, create_compositor)); - set_dev_proc(dest, get_hardware_params, dev_proc(prototype, get_hardware_params)); - set_dev_proc(dest, text_begin, dev_proc(prototype, text_begin)); - set_dev_proc(dest, initialize, dev_proc(prototype, initialize)); - set_dev_proc(dest, discard_transparency_layer, dev_proc(prototype, discard_transparency_layer)); - set_dev_proc(dest, get_color_mapping_procs, dev_proc(prototype, get_color_mapping_procs)); - set_dev_proc(dest, get_color_comp_index, dev_proc(prototype, get_color_comp_index)); - set_dev_proc(dest, encode_color, dev_proc(prototype, encode_color)); - set_dev_proc(dest, decode_color, dev_proc(prototype, decode_color)); - set_dev_proc(dest, pattern_manage, dev_proc(prototype, pattern_manage)); - set_dev_proc(dest, fill_rectangle_hl_color, dev_proc(prototype, fill_rectangle_hl_color)); - set_dev_proc(dest, include_color_space, dev_proc(prototype, include_color_space)); - set_dev_proc(dest, fill_linear_color_scanline, dev_proc(prototype, fill_linear_color_scanline)); - set_dev_proc(dest, fill_linear_color_trapezoid, dev_proc(prototype, fill_linear_color_trapezoid)); - set_dev_proc(dest, fill_linear_color_triangle, dev_proc(prototype, fill_linear_color_triangle)); - set_dev_proc(dest, update_spot_equivalent_colors, dev_proc(prototype, update_spot_equivalent_colors)); - set_dev_proc(dest, ret_devn_params, dev_proc(prototype, ret_devn_params)); - set_dev_proc(dest, fillpage, dev_proc(prototype, fillpage)); - set_dev_proc(dest, push_transparency_state, dev_proc(prototype, push_transparency_state)); - set_dev_proc(dest, pop_transparency_state, dev_proc(prototype, pop_transparency_state)); - set_dev_proc(dest, dev_spec_op, dev_proc(prototype, dev_spec_op)); - set_dev_proc(dest, get_profile, dev_proc(prototype, get_profile)); - set_dev_proc(dest, strip_copy_rop2, dev_proc(prototype, strip_copy_rop2)); - set_dev_proc(dest, strip_tile_rect_devn, dev_proc(prototype, strip_tile_rect_devn)); - set_dev_proc(dest, process_page, dev_proc(prototype, process_page)); - set_dev_proc(dest, transform_pixel_region, dev_proc(prototype, transform_pixel_region)); - set_dev_proc(dest, fill_stroke_path, dev_proc(prototype, fill_stroke_path)); +int gx_copy_device_procs(gx_device *dest, const gx_device *src, const gx_device *pprototype) +{ + gx_device prototype = *pprototype; + + /* In the new "don't static initialize device procs" world, we expect + * the prototype to be mostly empty. We need to call the 'initialize' + * function to properly populate the procs array. We can't write + * to the const prototype pointer we are passed in, so copy it to a + * local block, and initialize that instead, */ + if (dev_proc(&prototype, initialize) != NULL) { + int code = dev_proc(&prototype, initialize)(&prototype); + + if (code < 0) + return code; + + /* Fill in missing entries with the global defaults */ + gx_device_fill_in_procs(&prototype); + } + + set_dev_proc(dest, open_device, dev_proc(&prototype, open_device)); + set_dev_proc(dest, get_initial_matrix, dev_proc(&prototype, get_initial_matrix)); + set_dev_proc(dest, sync_output, dev_proc(&prototype, sync_output)); + set_dev_proc(dest, output_page, dev_proc(&prototype, output_page)); + set_dev_proc(dest, close_device, dev_proc(&prototype, close_device)); + set_dev_proc(dest, map_rgb_color, dev_proc(&prototype, map_rgb_color)); + set_dev_proc(dest, map_color_rgb, dev_proc(&prototype, map_color_rgb)); + set_dev_proc(dest, fill_rectangle, dev_proc(&prototype, fill_rectangle)); + set_dev_proc(dest, tile_rectangle, dev_proc(&prototype, tile_rectangle)); + set_dev_proc(dest, copy_mono, dev_proc(&prototype, copy_mono)); + set_dev_proc(dest, copy_color, dev_proc(&prototype, copy_color)); + set_dev_proc(dest, obsolete_draw_line, dev_proc(&prototype, obsolete_draw_line)); + set_dev_proc(dest, get_bits, dev_proc(&prototype, get_bits)); + set_dev_proc(dest, get_params, dev_proc(&prototype, get_params)); + set_dev_proc(dest, put_params, dev_proc(&prototype, put_params)); + set_dev_proc(dest, map_cmyk_color, dev_proc(&prototype, map_cmyk_color)); + set_dev_proc(dest, get_xfont_procs, dev_proc(&prototype, get_xfont_procs)); + set_dev_proc(dest, get_xfont_device, dev_proc(&prototype, get_xfont_device)); + set_dev_proc(dest, map_rgb_alpha_color, dev_proc(&prototype, map_rgb_alpha_color)); + set_dev_proc(dest, get_page_device, dev_proc(&prototype, get_page_device)); + set_dev_proc(dest, get_alpha_bits, dev_proc(&prototype, get_alpha_bits)); + set_dev_proc(dest, copy_alpha, dev_proc(&prototype, copy_alpha)); + set_dev_proc(dest, get_band, dev_proc(&prototype, get_band)); + set_dev_proc(dest, copy_rop, dev_proc(&prototype, copy_rop)); + set_dev_proc(dest, fill_path, dev_proc(&prototype, fill_path)); + set_dev_proc(dest, stroke_path, dev_proc(&prototype, stroke_path)); + set_dev_proc(dest, fill_trapezoid, dev_proc(&prototype, fill_trapezoid)); + set_dev_proc(dest, fill_parallelogram, dev_proc(&prototype, fill_parallelogram)); + set_dev_proc(dest, fill_triangle, dev_proc(&prototype, fill_triangle)); + set_dev_proc(dest, draw_thin_line, dev_proc(&prototype, draw_thin_line)); + set_dev_proc(dest, begin_image, dev_proc(&prototype, begin_image)); + set_dev_proc(dest, image_data, dev_proc(&prototype, image_data)); + set_dev_proc(dest, end_image, dev_proc(&prototype, end_image)); + set_dev_proc(dest, strip_tile_rectangle, dev_proc(&prototype, strip_tile_rectangle)); + set_dev_proc(dest, strip_copy_rop, dev_proc(&prototype, strip_copy_rop)); + set_dev_proc(dest, get_clipping_box, dev_proc(&prototype, get_clipping_box)); + set_dev_proc(dest, begin_typed_image, dev_proc(&prototype, begin_typed_image)); + set_dev_proc(dest, get_bits_rectangle, dev_proc(&prototype, get_bits_rectangle)); + set_dev_proc(dest, map_color_rgb_alpha, dev_proc(&prototype, map_color_rgb_alpha)); + set_dev_proc(dest, create_compositor, dev_proc(&prototype, create_compositor)); + set_dev_proc(dest, get_hardware_params, dev_proc(&prototype, get_hardware_params)); + set_dev_proc(dest, text_begin, dev_proc(&prototype, text_begin)); + set_dev_proc(dest, initialize, dev_proc(&prototype, initialize)); + set_dev_proc(dest, discard_transparency_layer, dev_proc(&prototype, discard_transparency_layer)); + set_dev_proc(dest, get_color_mapping_procs, dev_proc(&prototype, get_color_mapping_procs)); + set_dev_proc(dest, get_color_comp_index, dev_proc(&prototype, get_color_comp_index)); + set_dev_proc(dest, encode_color, dev_proc(&prototype, encode_color)); + set_dev_proc(dest, decode_color, dev_proc(&prototype, decode_color)); + set_dev_proc(dest, pattern_manage, dev_proc(&prototype, pattern_manage)); + set_dev_proc(dest, fill_rectangle_hl_color, dev_proc(&prototype, fill_rectangle_hl_color)); + set_dev_proc(dest, include_color_space, dev_proc(&prototype, include_color_space)); + set_dev_proc(dest, fill_linear_color_scanline, dev_proc(&prototype, fill_linear_color_scanline)); + set_dev_proc(dest, fill_linear_color_trapezoid, dev_proc(&prototype, fill_linear_color_trapezoid)); + set_dev_proc(dest, fill_linear_color_triangle, dev_proc(&prototype, fill_linear_color_triangle)); + set_dev_proc(dest, update_spot_equivalent_colors, dev_proc(&prototype, update_spot_equivalent_colors)); + set_dev_proc(dest, ret_devn_params, dev_proc(&prototype, ret_devn_params)); + set_dev_proc(dest, fillpage, dev_proc(&prototype, fillpage)); + set_dev_proc(dest, push_transparency_state, dev_proc(&prototype, push_transparency_state)); + set_dev_proc(dest, pop_transparency_state, dev_proc(&prototype, pop_transparency_state)); + set_dev_proc(dest, dev_spec_op, dev_proc(&prototype, dev_spec_op)); + set_dev_proc(dest, get_profile, dev_proc(&prototype, get_profile)); + set_dev_proc(dest, strip_copy_rop2, dev_proc(&prototype, strip_copy_rop2)); + set_dev_proc(dest, strip_tile_rect_devn, dev_proc(&prototype, strip_tile_rect_devn)); + set_dev_proc(dest, process_page, dev_proc(&prototype, process_page)); + set_dev_proc(dest, transform_pixel_region, dev_proc(&prototype, transform_pixel_region)); + set_dev_proc(dest, fill_stroke_path, dev_proc(&prototype, fill_stroke_path)); /* * We absolutely must set the 'set_graphics_type_tag' to the default subclass one * even if the subclassed device is using the default. This is because the * default implementation sets a flag in the device structure, and if we - * copy the default method, we'lll end up setting the flag in the subclassing device + * copy the default method, we'll end up setting the flag in the subclassing device * instead of the subclassed device! */ - set_dev_proc(dest, set_graphics_type_tag, dev_proc(prototype, set_graphics_type_tag)); + set_dev_proc(dest, set_graphics_type_tag, dev_proc(&prototype, set_graphics_type_tag)); /* These are the routines whose existence is checked against the default at * some point in the code. The code path differs when the device implements a @@ -1336,17 +1353,18 @@ int gx_copy_device_procs(gx_device *dest, gx_device *src, gx_device *prototype) * do not overwrite the default method. */ if (dev_proc(src, fill_mask) != gx_default_fill_mask) - set_dev_proc(dest, fill_mask, dev_proc(prototype, fill_mask)); + set_dev_proc(dest, fill_mask, dev_proc(&prototype, fill_mask)); if (dev_proc(src, begin_transparency_group) != gx_default_begin_transparency_group) - set_dev_proc(dest, begin_transparency_group, dev_proc(prototype, begin_transparency_group)); + set_dev_proc(dest, begin_transparency_group, dev_proc(&prototype, begin_transparency_group)); if (dev_proc(src, end_transparency_group) != gx_default_end_transparency_group) - set_dev_proc(dest, end_transparency_group, dev_proc(prototype, end_transparency_group)); + set_dev_proc(dest, end_transparency_group, dev_proc(&prototype, end_transparency_group)); if (dev_proc(src, put_image) != gx_default_put_image) - set_dev_proc(dest, put_image, dev_proc(prototype, put_image)); + set_dev_proc(dest, put_image, dev_proc(&prototype, put_image)); if (dev_proc(src, copy_planes) != gx_default_copy_planes) - set_dev_proc(dest, copy_planes, dev_proc(prototype, copy_planes)); + set_dev_proc(dest, copy_planes, dev_proc(&prototype, copy_planes)); if (dev_proc(src, copy_alpha_hl_color) != gx_default_no_copy_alpha_hl_color) - set_dev_proc(dest, copy_alpha_hl_color, dev_proc(prototype, copy_alpha_hl_color)); + set_dev_proc(dest, copy_alpha_hl_color, dev_proc(&prototype, copy_alpha_hl_color)); + return 0; } @@ -1421,8 +1439,6 @@ int gx_device_subclass(gx_device *dev_to_subclass, gx_device *new_prototype, uns memset(psubclass_data, 0x00, private_data_size); gx_copy_device_procs(dev_to_subclass, child_dev, new_prototype); - set_dev_proc(dev_to_subclass, fill_rectangle, dev_proc(new_prototype, fill_rectangle)); - set_dev_proc(dev_to_subclass, copy_planes, dev_proc(new_prototype, copy_planes)); dev_to_subclass->finalize = new_prototype->finalize; dev_to_subclass->dname = new_prototype->dname; if (dev_to_subclass->icc_struct) diff --git a/base/gdevepo.c b/base/gdevepo.c index 1b773ed28..8a174f191 100644 --- a/base/gdevepo.c +++ b/base/gdevepo.c @@ -112,82 +112,7 @@ gx_device_epo gs_epo_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {default_subclass_open_device, - default_subclass_get_initial_matrix, - default_subclass_sync_output, /* sync_output */ - epo_output_page, - default_subclass_close_device, - default_subclass_map_rgb_color, - default_subclass_map_color_rgb, - epo_fill_rectangle, - epo_tile_rectangle, /* tile_rectangle */ - epo_copy_mono, - epo_copy_color, - epo_draw_line, /* draw_line */ - epo_get_bits, /* get_bits */ - default_subclass_get_params, - default_subclass_put_params, - default_subclass_map_cmyk_color, - default_subclass_get_xfont_procs, /* get_xfont_procs */ - default_subclass_get_xfont_device, /* get_xfont_device */ - default_subclass_map_rgb_alpha_color, - default_subclass_get_page_device, - default_subclass_get_alpha_bits, /* get_alpha_bits */ - epo_copy_alpha, - default_subclass_get_band, /* get_band */ - epo_copy_rop, /* copy_rop */ - epo_fill_path, - epo_stroke_path, - epo_fill_mask, - epo_fill_trapezoid, - epo_fill_parallelogram, - epo_fill_triangle, - epo_draw_thin_line, - epo_begin_image, - default_subclass_image_data, /* image_data */ - default_subclass_end_image, /* end_image */ - epo_strip_tile_rectangle, - epo_strip_copy_rop, - default_subclass_get_clipping_box, /* get_clipping_box */ - epo_begin_typed_image, - default_subclass_get_bits_rectangle, /* get_bits_rectangle */ - default_subclass_map_color_rgb_alpha, - epo_create_compositor, - default_subclass_get_hardware_params, /* get_hardware_params */ - epo_text_begin, - epo_initialize, /* initialize */ - default_subclass_begin_transparency_group, /* begin_transparency_group */ - default_subclass_end_transparency_group, /* end_transparency_group */ - default_subclass_begin_transparency_mask, /* begin_transparency_mask */ - default_subclass_end_transparency_mask, /* end_transparency_mask */ - default_subclass_discard_transparency_layer, /* discard_transparency_layer */ - default_subclass_get_color_mapping_procs, /* get_color_mapping_procs */ - default_subclass_get_color_comp_index, /* get_color_comp_index */ - default_subclass_encode_color, /* encode_color */ - default_subclass_decode_color, /* decode_color */ - default_subclass_pattern_manage, /* pattern_manage */ - epo_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - default_subclass_include_color_space, /* include_color_space */ - epo_fill_linear_color_scanline, /* fill_linear_color_scanline */ - epo_fill_linear_color_trapezoid, /* fill_linear_color_trapezoid */ - epo_fill_linear_color_triangle, /* fill_linear_color_triangle */ - default_subclass_update_spot_equivalent_colors, /* update_spot_equivalent_colors */ - default_subclass_ret_devn_params, /* ret_devn_params */ - epo_fillpage, /* fillpage */ - default_subclass_push_transparency_state, /* push_transparency_state */ - default_subclass_pop_transparency_state, /* pop_transparency_state */ - epo_put_image, /* put_image */ - default_subclass_dev_spec_op, /* dev_spec_op */ - epo_copy_planes, /* copy_planes */ - default_subclass_get_profile, /* get_profile */ - default_subclass_set_graphics_type_tag, /* set_graphics_type_tag */ - epo_strip_copy_rop2, - default_subclass_strip_tile_rect_devn, - epo_copy_alpha_hl_color, - epo_process_page, - epo_transform_pixel_region, - epo_fill_stroke_path, - } + devprocs_initialize(epo_initialize), }; #undef MAX_COORD @@ -514,6 +439,46 @@ int epo_text_begin(gx_device *dev, gs_gstate *pgs, const gs_text_params_t *text, int epo_initialize(gx_device *dev) { + int code = default_subclass_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, output_page, epo_output_page); + set_dev_proc(dev, fill_rectangle, epo_fill_rectangle); + set_dev_proc(dev, tile_rectangle, epo_tile_rectangle); + set_dev_proc(dev, copy_mono, epo_copy_mono); + set_dev_proc(dev, copy_color, epo_copy_color); + set_dev_proc(dev, obsolete_draw_line, epo_draw_line); + set_dev_proc(dev, get_bits, epo_get_bits); + set_dev_proc(dev, copy_alpha, epo_copy_alpha); + set_dev_proc(dev, copy_rop, epo_copy_rop); + set_dev_proc(dev, fill_path, epo_fill_path); + set_dev_proc(dev, stroke_path, epo_stroke_path); + set_dev_proc(dev, fill_mask, epo_fill_mask); + set_dev_proc(dev, fill_trapezoid, epo_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, epo_fill_parallelogram); + set_dev_proc(dev, fill_triangle, epo_fill_triangle); + set_dev_proc(dev, draw_thin_line, epo_draw_thin_line); + set_dev_proc(dev, begin_image, epo_begin_image); + set_dev_proc(dev, strip_tile_rectangle, epo_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, epo_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, epo_begin_typed_image); + set_dev_proc(dev, create_compositor, epo_create_compositor); + set_dev_proc(dev, text_begin, epo_text_begin); + set_dev_proc(dev, fill_rectangle_hl_color, epo_fill_rectangle_hl_color); + set_dev_proc(dev, fill_linear_color_scanline, epo_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, epo_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, epo_fill_linear_color_triangle); + set_dev_proc(dev, fillpage, epo_fillpage); + set_dev_proc(dev, put_image, epo_put_image); + set_dev_proc(dev, copy_planes, epo_copy_planes); + set_dev_proc(dev, strip_copy_rop2, epo_strip_copy_rop2); + set_dev_proc(dev, copy_alpha_hl_color, epo_copy_alpha_hl_color); + set_dev_proc(dev, process_page, epo_process_page); + set_dev_proc(dev, transform_pixel_region, epo_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, epo_fill_stroke_path); + /* We musn't allow the following pointers to remain shared with the from_dev because we're about to tell the caller it's only allowed to copy the prototype and free the attempted copy of a non-prototype. If from_dev is the prototype diff --git a/base/gdevflp.c b/base/gdevflp.c index f86aaf457..72985d9b2 100644 --- a/base/gdevflp.c +++ b/base/gdevflp.c @@ -107,6 +107,7 @@ static dev_proc_copy_alpha_hl_color(flp_copy_alpha_hl_color); static dev_proc_process_page(flp_process_page); static dev_proc_transform_pixel_region(flp_transform_pixel_region); static dev_proc_fill_stroke_path(flp_fill_stroke_path); +static dev_proc_initialize(flp_initialize); /* The device prototype */ #define MAX_COORD (max_int_in_fixed - 1000) @@ -137,82 +138,7 @@ gx_device_flp gs_flp_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {default_subclass_open_device, - default_subclass_get_initial_matrix, - default_subclass_sync_output, /* sync_output */ - flp_output_page, - flp_close_device, - default_subclass_map_rgb_color, - default_subclass_map_color_rgb, - flp_fill_rectangle, - flp_tile_rectangle, /* tile_rectangle */ - flp_copy_mono, - flp_copy_color, - flp_draw_line, /* draw_line */ - flp_get_bits, /* get_bits */ - default_subclass_get_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 */ - default_subclass_map_rgb_alpha_color, - default_subclass_get_page_device, - flp_get_alpha_bits, /* get_alpha_bits */ - flp_copy_alpha, - flp_get_band, /* get_band */ - flp_copy_rop, /* copy_rop */ - flp_fill_path, - flp_stroke_path, - flp_fill_mask, - flp_fill_trapezoid, - flp_fill_parallelogram, - flp_fill_triangle, - flp_draw_thin_line, - flp_begin_image, - flp_image_data, /* image_data */ - flp_end_image, /* end_image */ - flp_strip_tile_rectangle, - flp_strip_copy_rop, - default_subclass_get_clipping_box, /* get_clipping_box */ - flp_begin_typed_image, - flp_get_bits_rectangle, /* get_bits_rectangle */ - default_subclass_map_color_rgb_alpha, - flp_create_compositor, - default_subclass_get_hardware_params, /* get_hardware_params */ - flp_text_begin, - default_subclass_initialize, /* initialize */ - flp_begin_transparency_group, /* begin_transparency_group */ - flp_end_transparency_group, /* end_transparency_group */ - flp_begin_transparency_mask, /* begin_transparency_mask */ - flp_end_transparency_mask, /* end_transparency_mask */ - flp_discard_transparency_layer, /* discard_transparency_layer */ - default_subclass_get_color_mapping_procs, /* get_color_mapping_procs */ - default_subclass_get_color_comp_index, /* get_color_comp_index */ - default_subclass_encode_color, /* encode_color */ - default_subclass_decode_color, /* decode_color */ - flp_pattern_manage, /* pattern_manage */ - flp_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - default_subclass_include_color_space, /* include_color_space */ - flp_fill_linear_color_scanline, /* fill_linear_color_scanline */ - flp_fill_linear_color_trapezoid, /* fill_linear_color_trapezoid */ - flp_fill_linear_color_triangle, /* fill_linear_color_triangle */ - default_subclass_update_spot_equivalent_colors, /* update_spot_equivalent_colors */ - default_subclass_ret_devn_params, /* ret_devn_params */ - flp_fillpage, /* fillpage */ - flp_push_transparency_state, /* push_transparency_state */ - flp_pop_transparency_state, /* pop_transparency_state */ - flp_put_image, /* put_image */ - default_subclass_dev_spec_op, /* dev_spec_op */ - flp_copy_planes, /* copy_planes */ - default_subclass_get_profile, /* get_profile */ - default_subclass_set_graphics_type_tag, /* set_graphics_type_tag */ - flp_strip_copy_rop2, - flp_strip_tile_rect_devn, - flp_copy_alpha_hl_color, - flp_process_page, - flp_transform_pixel_region, - flp_fill_stroke_path, - } + devprocs_initialize(flp_initialize) }; #undef MAX_COORD @@ -1346,3 +1272,65 @@ int flp_transform_pixel_region(gx_device *dev, transform_pixel_region_reason rea return 0; } + +static int +flp_initialize(gx_device *dev) +{ + int code = default_subclass_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, output_page, flp_output_page); + set_dev_proc(dev, close_device, flp_close_device); + set_dev_proc(dev, fill_rectangle, flp_fill_rectangle); + set_dev_proc(dev, tile_rectangle, flp_tile_rectangle); + set_dev_proc(dev, copy_mono, flp_copy_mono); + set_dev_proc(dev, copy_color, flp_copy_color); + set_dev_proc(dev, obsolete_draw_line, flp_draw_line); + set_dev_proc(dev, get_bits, flp_get_bits); + set_dev_proc(dev, put_params, flp_put_params); + set_dev_proc(dev, get_alpha_bits, flp_get_alpha_bits); + set_dev_proc(dev, copy_alpha, flp_copy_alpha); + set_dev_proc(dev, get_band, flp_get_band); + set_dev_proc(dev, copy_rop, flp_copy_rop); + set_dev_proc(dev, fill_path, flp_fill_path); + set_dev_proc(dev, stroke_path, flp_stroke_path); + set_dev_proc(dev, fill_mask, flp_fill_mask); + set_dev_proc(dev, fill_trapezoid, flp_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, flp_fill_parallelogram); + set_dev_proc(dev, fill_triangle, flp_fill_triangle); + set_dev_proc(dev, draw_thin_line, flp_draw_thin_line); + set_dev_proc(dev, begin_image, flp_begin_image); + set_dev_proc(dev, image_data, flp_image_data); + set_dev_proc(dev, end_image, flp_end_image); + set_dev_proc(dev, strip_tile_rectangle, flp_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, flp_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, flp_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, flp_get_bits_rectangle); + set_dev_proc(dev, create_compositor, flp_create_compositor); + set_dev_proc(dev, text_begin, flp_text_begin); + set_dev_proc(dev, begin_transparency_group, flp_begin_transparency_group); + set_dev_proc(dev, end_transparency_group, flp_end_transparency_group); + set_dev_proc(dev, begin_transparency_mask, flp_begin_transparency_mask); + set_dev_proc(dev, end_transparency_mask, flp_end_transparency_mask); + set_dev_proc(dev, discard_transparency_layer, flp_discard_transparency_layer); + set_dev_proc(dev, pattern_manage, flp_pattern_manage); + set_dev_proc(dev, fill_rectangle_hl_color, flp_fill_rectangle_hl_color); + set_dev_proc(dev, fill_linear_color_scanline, flp_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, flp_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, flp_fill_linear_color_triangle); + set_dev_proc(dev, fillpage, flp_fillpage); + set_dev_proc(dev, push_transparency_state, flp_push_transparency_state); + set_dev_proc(dev, pop_transparency_state, flp_pop_transparency_state); + set_dev_proc(dev, put_image, flp_put_image); + set_dev_proc(dev, copy_planes, flp_copy_planes); + set_dev_proc(dev, strip_copy_rop2, flp_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, flp_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, flp_copy_alpha_hl_color); + set_dev_proc(dev, process_page, flp_process_page); + set_dev_proc(dev, transform_pixel_region, flp_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, flp_fill_stroke_path); + + return 0; +}
\ No newline at end of file diff --git a/base/gdevhit.c b/base/gdevhit.c index 0a804b4c7..0d20fea13 100644 --- a/base/gdevhit.c +++ b/base/gdevhit.c @@ -28,52 +28,40 @@ const int gs_hit_detected = gs_error_hit_detected; * It returns e_hit whenever it is asked to actually paint any pixels. */ static dev_proc_fill_rectangle(hit_fill_rectangle); +static int +hit_initialize(gx_device *dev) +{ + set_dev_proc(dev, fill_rectangle, hit_fill_rectangle); + set_dev_proc(dev, create_compositor, gx_non_imaging_create_compositor); + + set_dev_proc(dev, map_rgb_color, gx_default_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_map_color_rgb); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, map_cmyk_color, gx_default_map_cmyk_color); + set_dev_proc(dev, map_rgb_alpha_color, gx_default_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_default_get_page_device); + set_dev_proc(dev, get_alpha_bits, gx_default_get_alpha_bits); + set_dev_proc(dev, get_band, gx_default_get_band); + set_dev_proc(dev, fill_path, gx_default_fill_path); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, gx_default_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, gx_get_largest_clipping_box); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, map_color_rgb_alpha, gx_default_map_color_rgb_alpha); + + return 0; +} const gx_device gs_hit_device = { std_device_std_body(gx_device, 0, "hit detector", 0, 0, 1, 1), - {NULL, /* open_device */ - NULL, /* get_initial_matrix */ - NULL, /* sync_output */ - NULL, /* output_page */ - NULL, /* close_device */ - gx_default_map_rgb_color, - gx_default_map_color_rgb, - hit_fill_rectangle, - NULL, /* tile_rectangle */ - NULL, /* copy_mono */ - NULL, /* copy_color */ - gx_default_draw_line, - NULL, /* get_bits */ - NULL, /* get_params */ - NULL, /* put_params */ - gx_default_map_cmyk_color, - NULL, /* get_xfont_procs */ - NULL, /* get_xfont_device */ - gx_default_map_rgb_alpha_color, - gx_default_get_page_device, - gx_default_get_alpha_bits, - NULL, /* copy_alpha */ - gx_default_get_band, - NULL, /* copy_rop */ - gx_default_fill_path, - NULL, /* stroke_path */ - NULL, /* fill_mask */ - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - gx_default_strip_tile_rectangle, - gx_default_strip_copy_rop, - gx_get_largest_clipping_box, - gx_default_begin_typed_image, - NULL, /* get_bits_rectangle */ - gx_default_map_color_rgb_alpha, - gx_non_imaging_create_compositor, - NULL /* get_hardware_params */ - } + devprocs_initialize(hit_initialize) }; /* Test for a hit when filling a rectangle. */ diff --git a/base/gdevmem.c b/base/gdevmem.c index 68e7e857c..b8d9f7cd4 100644 --- a/base/gdevmem.c +++ b/base/gdevmem.c @@ -149,8 +149,9 @@ void gs_make_mem_device(gx_device_memory * dev, const gx_device_memory * mdproto, gs_memory_t * mem, int page_device, gx_device * target) { - gx_device_init((gx_device *) dev, (const gx_device *)mdproto, - mem, true); + /* Can never fail */ + (void)gx_device_init((gx_device *) dev, (const gx_device *)mdproto, + mem, true); dev->stype = &st_device_memory; switch (page_device) { case -1: @@ -297,8 +298,10 @@ void gs_make_mem_mono_device(gx_device_memory * dev, gs_memory_t * mem, gx_device * target) { - gx_device_init((gx_device *)dev, (const gx_device *)&mem_mono_device, - mem, true); + /* Can never fail */ + (void)gx_device_init((gx_device *)dev, + (const gx_device *)&mem_mono_device, + mem, true); set_dev_proc(dev, get_page_device, gx_default_get_page_device); gx_device_set_target((gx_device_forward *)dev, target); dev->raster = gx_device_raster((gx_device *)dev, 1); diff --git a/base/gdevmplt.c b/base/gdevmplt.c index c05307b7f..655f64ed4 100644 --- a/base/gdevmplt.c +++ b/base/gdevmplt.c @@ -69,6 +69,19 @@ RELOC_PTRS_END public_st_pcl_mono_palette_device(); +static int +pcl_mono_palette_initialize(gx_device *dev) +{ + int code = default_subclass_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, get_color_mapping_procs, pcl_mono_palette_get_color_mapping_procs); + + return 0; +} + const gx_device_mplt gs_pcl_mono_palette_device = { @@ -79,82 +92,7 @@ gx_device_mplt gs_pcl_mono_palette_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {default_subclass_open_device, - default_subclass_get_initial_matrix, - default_subclass_sync_output, /* sync_output */ - default_subclass_output_page, - default_subclass_close_device, - default_subclass_map_rgb_color, - default_subclass_map_color_rgb, - default_subclass_fill_rectangle, - default_subclass_tile_rectangle, /* tile_rectangle */ - default_subclass_copy_mono, - default_subclass_copy_color, - default_subclass_draw_line, /* draw_line */ - default_subclass_get_bits, /* get_bits */ - default_subclass_get_params, - default_subclass_put_params, - default_subclass_map_cmyk_color, - default_subclass_get_xfont_procs, /* get_xfont_procs */ - default_subclass_get_xfont_device, /* get_xfont_device */ - default_subclass_map_rgb_alpha_color, - default_subclass_get_page_device, - default_subclass_get_alpha_bits, /* get_alpha_bits */ - default_subclass_copy_alpha, - default_subclass_get_band, /* get_band */ - default_subclass_copy_rop, /* copy_rop */ - default_subclass_fill_path, - default_subclass_stroke_path, - default_subclass_fill_mask, - default_subclass_fill_trapezoid, - default_subclass_fill_parallelogram, - default_subclass_fill_triangle, - default_subclass_draw_thin_line, - default_subclass_begin_image, - default_subclass_image_data, /* image_data */ - default_subclass_end_image, /* end_image */ - default_subclass_strip_tile_rectangle, - default_subclass_strip_copy_rop, - default_subclass_get_clipping_box, /* get_clipping_box */ - default_subclass_begin_typed_image, - default_subclass_get_bits_rectangle, /* get_bits_rectangle */ - default_subclass_map_color_rgb_alpha, - default_subclass_create_compositor, - default_subclass_get_hardware_params, /* get_hardware_params */ - default_subclass_text_begin, - default_subclass_initialize, /* initialize */ - default_subclass_begin_transparency_group, /* begin_transparency_group */ - default_subclass_end_transparency_group, /* end_transparency_group */ - default_subclass_begin_transparency_mask, /* begin_transparency_mask */ - default_subclass_end_transparency_mask, /* end_transparency_mask */ - default_subclass_discard_transparency_layer, /* discard_transparency_layer */ - pcl_mono_palette_get_color_mapping_procs, /* get_color_mapping_procs */ - default_subclass_get_color_comp_index, /* get_color_comp_index */ - default_subclass_encode_color, /* encode_color */ - default_subclass_decode_color, /* decode_color */ - default_subclass_pattern_manage, /* pattern_manage */ - default_subclass_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - default_subclass_include_color_space, /* include_color_space */ - default_subclass_fill_linear_color_scanline, /* fill_linear_color_scanline */ - default_subclass_fill_linear_color_trapezoid, /* fill_linear_color_trapezoid */ - default_subclass_fill_linear_color_triangle, /* fill_linear_color_triangle */ - default_subclass_update_spot_equivalent_colors, /* update_spot_equivalent_colors */ - default_subclass_ret_devn_params, /* ret_devn_params */ - default_subclass_fillpage, /* fillpage */ - default_subclass_push_transparency_state, /* push_transparency_state */ - default_subclass_pop_transparency_state, /* pop_transparency_state */ - default_subclass_put_image, /* put_image */ - default_subclass_dev_spec_op, /* dev_spec_op */ - default_subclass_copy_planes, /* copy_planes */ - default_subclass_get_profile, /* get_profile */ - default_subclass_set_graphics_type_tag, /* set_graphics_type_tag */ - default_subclass_strip_copy_rop2, - default_subclass_strip_tile_rect_devn, - default_subclass_copy_alpha_hl_color, - default_subclass_process_page, - default_subclass_transform_pixel_region, - default_subclass_fill_stroke_path, - } + devprocs_initialize(pcl_mono_palette_initialize) }; #undef MAX_COORD diff --git a/base/gdevnfwd.c b/base/gdevnfwd.c index cae334243..3692cf32a 100644 --- a/base/gdevnfwd.c +++ b/base/gdevnfwd.c @@ -1096,78 +1096,59 @@ static dev_proc_strip_tile_rect_devn(null_strip_tile_rect_devn); static dev_proc_fill_rectangle_hl_color(null_fill_rectangle_hl_color); static dev_proc_dev_spec_op(null_spec_op); -#define null_procs(get_initial_matrix, get_page_device) {\ - gx_default_open_device,\ - get_initial_matrix, /* differs */\ - gx_default_sync_output,\ - gx_default_output_page,\ - gx_default_close_device,\ - gx_forward_map_rgb_color,\ - gx_forward_map_color_rgb,\ - null_fill_rectangle,\ - gx_default_tile_rectangle,\ - null_copy_mono,\ - null_copy_color,\ - gx_default_draw_line,\ - gx_default_get_bits,\ - gx_forward_get_params,\ - null_put_params,\ - gx_forward_map_cmyk_color,\ - gx_forward_get_xfont_procs,\ - gx_forward_get_xfont_device,\ - gx_forward_map_rgb_alpha_color,\ - get_page_device, /* differs */\ - gx_default_get_alpha_bits,\ - null_copy_alpha,\ - gx_forward_get_band,\ - null_copy_rop,\ - null_fill_path,\ - null_stroke_path,\ - gx_default_fill_mask,\ - null_fill_trapezoid,\ - null_fill_parallelogram,\ - null_fill_triangle,\ - null_draw_thin_line,\ - gx_default_begin_image,\ - gx_default_image_data,\ - gx_default_end_image,\ - gx_default_strip_tile_rectangle,\ - null_strip_copy_rop,\ - gx_default_get_clipping_box,\ - gx_default_begin_typed_image,\ - gx_default_get_bits_rectangle,\ - gx_forward_map_color_rgb_alpha,\ - gx_non_imaging_create_compositor,\ - gx_forward_get_hardware_params,\ - gx_default_text_begin,\ - NULL, /* initialise */\ - NULL, /* begin_transparency_group */\ - NULL, /* end_transparency_group */\ - NULL, /* begin_transparency_mask */\ - NULL, /* end_transparency_mask */\ - NULL, /* discard_transparency_layer */\ - gx_default_DevGray_get_color_mapping_procs, /* get_color_mapping_procs */\ - gx_default_DevGray_get_color_comp_index,/* get_color_comp_index */\ - gx_default_gray_fast_encode, /* encode_color */\ - null_decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - null_fill_rectangle_hl_color,\ - gx_default_include_color_space,\ - NULL, /* fill_line_sl */\ - NULL, /* fill_line_tr */\ - NULL, /* fill_line_tri */\ - NULL, /* up_spot_eq_col */\ - gx_default_ret_devn_params, /* ret_devn_params */\ - NULL, /* fillpage */\ - NULL, /* push_transparency_state */\ - NULL, /* pop_transparency_state */\ - NULL, /* put_image */\ - null_spec_op, /* dev_spec_op */\ - NULL, /* copy_planes */\ - NULL, /* get_profile */\ - NULL, /* set_graphics_type_tag */\ - null_strip_copy_rop2,\ - null_strip_tile_rect_devn\ +static int +null_initialize(gx_device *dev) +{ + set_dev_proc(dev, get_initial_matrix, gx_forward_upright_get_initial_matrix); + set_dev_proc(dev, get_page_device, gx_default_get_page_device); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, null_fill_rectangle); + set_dev_proc(dev, copy_mono, null_copy_mono); + set_dev_proc(dev, copy_color, null_copy_color); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, null_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, copy_alpha, null_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, copy_rop, null_copy_rop); + set_dev_proc(dev, fill_path, null_fill_path); + set_dev_proc(dev, stroke_path, null_stroke_path); + set_dev_proc(dev, fill_trapezoid, null_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, null_fill_parallelogram); + set_dev_proc(dev, fill_triangle, null_fill_triangle); + set_dev_proc(dev, draw_thin_line, null_draw_thin_line); + set_dev_proc(dev, strip_copy_rop, null_strip_copy_rop); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, gx_non_imaging_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_default_DevGray_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_default_DevGray_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_default_gray_fast_encode); + set_dev_proc(dev, decode_color, null_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, null_fill_rectangle_hl_color); + set_dev_proc(dev, dev_spec_op, null_spec_op); + set_dev_proc(dev, strip_copy_rop2, null_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, null_strip_tile_rect_devn); + + return 0; +} + +static int +nullpage_initialize(gx_device *dev) +{ + int code = null_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + + return 0; } #define NULLD_X_RES 72 @@ -1176,8 +1157,7 @@ static dev_proc_dev_spec_op(null_spec_op); const gx_device_null gs_null_device = { std_device_std_body_type_open(gx_device_null, 0, "null", &st_device_null, 0, 0, NULLD_X_RES, NULLD_Y_RES), - null_procs(gx_forward_upright_get_initial_matrix, /* upright matrix */ - gx_default_get_page_device /* not a page device */ ), + devprocs_initialize(null_initialize), 0 /* target */ }; @@ -1186,8 +1166,7 @@ std_device_std_body_type_open(gx_device_null, 0, "nullpage", &st_device_null, (int)((float)(DEFAULT_WIDTH_10THS * NULLD_X_RES) / 10), (int)((float)(DEFAULT_HEIGHT_10THS * NULLD_Y_RES) / 10), NULLD_X_RES, NULLD_Y_RES), - null_procs( gx_forward_get_initial_matrix, /* default matrix */ - gx_page_device_get_page_device /* a page device */ ), + devprocs_initialize(nullpage_initialize), 0 /* target */ }; @@ -1403,6 +1382,74 @@ fwd_get_target_cmap_procs(gx_device * dev) return pprocs; } +void gx_forward_device_initialize_procs(gx_device *dev) +{ + fill_dev_proc(dev, close_device, gx_forward_close_device); + fill_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + fill_dev_proc(dev, sync_output, gx_forward_sync_output); + fill_dev_proc(dev, output_page, gx_forward_output_page); + fill_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + fill_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + fill_dev_proc(dev, fill_rectangle, gx_forward_fill_rectangle); + fill_dev_proc(dev, tile_rectangle, gx_forward_tile_rectangle); + fill_dev_proc(dev, copy_mono, gx_forward_copy_mono); + fill_dev_proc(dev, copy_color, gx_forward_copy_color); + fill_dev_proc(dev, get_bits, gx_forward_get_bits); + fill_dev_proc(dev, get_params, gx_forward_get_params); + fill_dev_proc(dev, put_params, gx_forward_put_params); + fill_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + fill_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + fill_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + fill_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + fill_dev_proc(dev, get_page_device, gx_forward_get_page_device); + fill_dev_proc(dev, get_alpha_bits, gx_forward_get_alpha_bits); + fill_dev_proc(dev, copy_alpha, gx_forward_copy_alpha); + fill_dev_proc(dev, get_band, gx_forward_get_band); + fill_dev_proc(dev, copy_rop, gx_forward_copy_rop); + fill_dev_proc(dev, fill_path, gx_forward_fill_path); + fill_dev_proc(dev, stroke_path, gx_forward_stroke_path); + fill_dev_proc(dev, fill_mask, gx_forward_fill_mask); + fill_dev_proc(dev, fill_trapezoid, gx_forward_fill_trapezoid); + fill_dev_proc(dev, fill_parallelogram, gx_forward_fill_parallelogram); + fill_dev_proc(dev, fill_triangle, gx_forward_fill_triangle); + fill_dev_proc(dev, draw_thin_line, gx_forward_draw_thin_line); + fill_dev_proc(dev, begin_image, gx_forward_begin_image); + fill_dev_proc(dev, image_data, gx_forward_image_data); + fill_dev_proc(dev, end_image, gx_forward_end_image); + fill_dev_proc(dev, strip_tile_rectangle, gx_forward_strip_tile_rectangle); + fill_dev_proc(dev, strip_copy_rop, gx_forward_strip_copy_rop); + fill_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); + fill_dev_proc(dev, begin_typed_image, gx_forward_begin_typed_image); + fill_dev_proc(dev, get_bits_rectangle, gx_forward_get_bits_rectangle); + fill_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + /* There is no forward_create_compositor (see Drivers.htm). */ + fill_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + fill_dev_proc(dev, text_begin, gx_forward_text_begin); + fill_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + fill_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + fill_dev_proc(dev, encode_color, gx_forward_encode_color); + fill_dev_proc(dev, decode_color, gx_forward_decode_color); + fill_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); + fill_dev_proc(dev, fill_rectangle_hl_color, gx_forward_fill_rectangle_hl_color); + fill_dev_proc(dev, include_color_space, gx_forward_include_color_space); + fill_dev_proc(dev, fill_linear_color_scanline, gx_forward_fill_linear_color_scanline); + fill_dev_proc(dev, fill_linear_color_trapezoid, gx_forward_fill_linear_color_trapezoid); + fill_dev_proc(dev, fill_linear_color_triangle, gx_forward_fill_linear_color_triangle); + fill_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + fill_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + fill_dev_proc(dev, fillpage, gx_forward_fillpage); + fill_dev_proc(dev, put_image, gx_forward_put_image); + fill_dev_proc(dev, copy_planes, gx_forward_copy_planes); + fill_dev_proc(dev, create_compositor, gx_forward_create_compositor); + fill_dev_proc(dev, get_profile, gx_forward_get_profile); + fill_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + fill_dev_proc(dev, strip_copy_rop2, gx_forward_strip_copy_rop2); + fill_dev_proc(dev, strip_tile_rect_devn, gx_forward_strip_tile_rect_devn); + fill_dev_proc(dev, copy_alpha_hl_color, gx_forward_copy_alpha_hl_color); + fill_dev_proc(dev, transform_pixel_region, gx_forward_transform_pixel_region); + fill_dev_proc(dev, fill_stroke_path, gx_forward_fill_stroke_path); +} + #ifdef DEBUG static void do_device_dump(gx_device *dev, int n) { diff --git a/base/gdevnup.c b/base/gdevnup.c index 2dbe11a53..87616f50b 100644 --- a/base/gdevnup.c +++ b/base/gdevnup.c @@ -86,6 +86,24 @@ static dev_proc_dev_spec_op(nup_dev_spec_op); #define MAX_COORD (max_int_in_fixed - 1000) #define MAX_RESOLUTION 4000 +static int +nup_initialize(gx_device *dev) +{ + int code = default_subclass_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, get_initial_matrix, nup_get_initial_matrix); + set_dev_proc(dev, output_page, nup_output_page); + set_dev_proc(dev, close_device, nup_close_device); + set_dev_proc(dev, put_params, nup_put_params); /* to catch PageSize changes */ + set_dev_proc(dev, fillpage, nup_fillpage); + set_dev_proc(dev, dev_spec_op, nup_dev_spec_op); + + return 0; +} + const gx_device_nup gs_nup_device = { @@ -96,82 +114,7 @@ gx_device_nup gs_nup_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {default_subclass_open_device, - nup_get_initial_matrix, - default_subclass_sync_output, /* sync_output */ - nup_output_page, - nup_close_device, - default_subclass_map_rgb_color, - default_subclass_map_color_rgb, - default_subclass_fill_rectangle, - default_subclass_tile_rectangle, /* tile_rectangle */ - default_subclass_copy_mono, - default_subclass_copy_color, - default_subclass_draw_line, /* draw_line */ - default_subclass_get_bits, /* get_bits */ - default_subclass_get_params, - nup_put_params, /* to catch PageSize changes */ - default_subclass_map_cmyk_color, - default_subclass_get_xfont_procs, /* get_xfont_procs */ - default_subclass_get_xfont_device, /* get_xfont_device */ - default_subclass_map_rgb_alpha_color, - default_subclass_get_page_device, - default_subclass_get_alpha_bits, /* get_alpha_bits */ - default_subclass_copy_alpha, - default_subclass_get_band, /* get_band */ - default_subclass_copy_rop, /* copy_rop */ - default_subclass_fill_path, - default_subclass_stroke_path, - default_subclass_fill_mask, - default_subclass_fill_trapezoid, - default_subclass_fill_parallelogram, - default_subclass_fill_triangle, - default_subclass_draw_thin_line, - default_subclass_begin_image, - default_subclass_image_data, /* image_data */ - default_subclass_end_image, /* end_image */ - default_subclass_strip_tile_rectangle, - default_subclass_strip_copy_rop, - default_subclass_get_clipping_box, /* get_clipping_box */ - default_subclass_begin_typed_image, - default_subclass_get_bits_rectangle, /* get_bits_rectangle */ - default_subclass_map_color_rgb_alpha, - default_subclass_create_compositor, - default_subclass_get_hardware_params, /* get_hardware_params */ - default_subclass_text_begin, - default_subclass_initialize, /* initialize */ - default_subclass_begin_transparency_group, /* begin_transparency_group */ - default_subclass_end_transparency_group, /* end_transparency_group */ - default_subclass_begin_transparency_mask, /* begin_transparency_mask */ - default_subclass_end_transparency_mask, /* end_transparency_mask */ - default_subclass_discard_transparency_layer, /* discard_transparency_layer */ - default_subclass_get_color_mapping_procs, /* get_color_mapping_procs */ - default_subclass_get_color_comp_index, /* get_color_comp_index */ - default_subclass_encode_color, /* encode_color */ - default_subclass_decode_color, /* decode_color */ - default_subclass_pattern_manage, /* pattern_manage */ - default_subclass_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - default_subclass_include_color_space, /* include_color_space */ - default_subclass_fill_linear_color_scanline, /* fill_linear_color_scanline */ - default_subclass_fill_linear_color_trapezoid, /* fill_linear_color_trapezoid */ - default_subclass_fill_linear_color_triangle, /* fill_linear_color_triangle */ - default_subclass_update_spot_equivalent_colors, /* update_spot_equivalent_colors */ - default_subclass_ret_devn_params, /* ret_devn_params */ - nup_fillpage, /* fillpage */ - default_subclass_push_transparency_state, /* push_transparency_state */ - default_subclass_pop_transparency_state, /* pop_transparency_state */ - default_subclass_put_image, /* put_image */ - nup_dev_spec_op, /* for GetParam of PdfmarkCapable */ - default_subclass_copy_planes, /* copy_planes */ - default_subclass_get_profile, /* get_profile */ - default_subclass_set_graphics_type_tag, /* set_graphics_type_tag */ - default_subclass_strip_copy_rop2, - default_subclass_strip_tile_rect_devn, - default_subclass_copy_alpha_hl_color, - default_subclass_process_page, - default_subclass_transform_pixel_region, - default_subclass_fill_stroke_path, - } + devprocs_initialize(nup_initialize) }; #undef MAX_COORD diff --git a/base/gdevoflt.c b/base/gdevoflt.c index 59a79858e..6422d8424 100644 --- a/base/gdevoflt.c +++ b/base/gdevoflt.c @@ -92,6 +92,43 @@ RELOC_PTRS_END public_st_obj_filter_device(); +static int +obj_filter_initialize(gx_device *dev) +{ + int code = default_subclass_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, fill_rectangle, obj_filter_fill_rectangle); + set_dev_proc(dev, tile_rectangle, obj_filter_tile_rectangle); + set_dev_proc(dev, obsolete_draw_line, obj_filter_draw_line); + set_dev_proc(dev, fill_path, obj_filter_fill_path); + set_dev_proc(dev, stroke_path, obj_filter_stroke_path); + set_dev_proc(dev, fill_mask, obj_filter_fill_mask); + set_dev_proc(dev, fill_trapezoid, obj_filter_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, obj_filter_fill_parallelogram); + set_dev_proc(dev, fill_triangle, obj_filter_fill_triangle); + set_dev_proc(dev, draw_thin_line, obj_filter_draw_thin_line); + set_dev_proc(dev, begin_image, obj_filter_begin_image); + set_dev_proc(dev, image_data, obj_filter_image_data); + set_dev_proc(dev, end_image, obj_filter_end_image); + set_dev_proc(dev, strip_tile_rectangle, obj_filter_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, obj_filter_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, obj_filter_begin_typed_image); + set_dev_proc(dev, text_begin, obj_filter_text_begin); + set_dev_proc(dev, fill_rectangle_hl_color, obj_filter_fill_rectangle_hl_color); + set_dev_proc(dev, fill_linear_color_scanline, obj_filter_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, obj_filter_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, obj_filter_fill_linear_color_triangle); + set_dev_proc(dev, put_image, obj_filter_put_image); + set_dev_proc(dev, strip_copy_rop2, obj_filter_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, obj_filter_strip_tile_rect_devn); + set_dev_proc(dev, fill_stroke_path, obj_filter_fill_stroke_path); + + return 0; +} + const gx_device_obj_filter gs_obj_filter_device = { @@ -102,82 +139,7 @@ gx_device_obj_filter gs_obj_filter_device = MAX_COORD, MAX_COORD, MAX_RESOLUTION, MAX_RESOLUTION, 1, 8, 255, 0, 256, 1), - {default_subclass_open_device, - default_subclass_get_initial_matrix, - default_subclass_sync_output, /* sync_output */ - default_subclass_output_page, - default_subclass_close_device, - default_subclass_map_rgb_color, - default_subclass_map_color_rgb, - obj_filter_fill_rectangle, - obj_filter_tile_rectangle, /* tile_rectangle */ - default_subclass_copy_mono, - default_subclass_copy_color, - obj_filter_draw_line, /* draw_line */ - default_subclass_get_bits, /* get_bits */ - default_subclass_get_params, - default_subclass_put_params, - default_subclass_map_cmyk_color, - default_subclass_get_xfont_procs, /* get_xfont_procs */ - default_subclass_get_xfont_device, /* get_xfont_device */ - default_subclass_map_rgb_alpha_color, - default_subclass_get_page_device, - default_subclass_get_alpha_bits, /* get_alpha_bits */ - default_subclass_copy_alpha, - default_subclass_get_band, /* get_band */ - default_subclass_copy_rop, /* copy_rop */ - obj_filter_fill_path, - obj_filter_stroke_path, - obj_filter_fill_mask, - obj_filter_fill_trapezoid, - obj_filter_fill_parallelogram, - obj_filter_fill_triangle, - obj_filter_draw_thin_line, - obj_filter_begin_image, - obj_filter_image_data, /* image_data */ - obj_filter_end_image, /* end_image */ - obj_filter_strip_tile_rectangle, - obj_filter_strip_copy_rop, - default_subclass_get_clipping_box, /* get_clipping_box */ - obj_filter_begin_typed_image, - default_subclass_get_bits_rectangle, /* get_bits_rectangle */ - default_subclass_map_color_rgb_alpha, - default_subclass_create_compositor, - default_subclass_get_hardware_params, /* get_hardware_params */ - obj_filter_text_begin, - default_subclass_initialize, /* initialize */ - default_subclass_begin_transparency_group, /* begin_transparency_group */ - default_subclass_end_transparency_group, /* end_transparency_group */ - default_subclass_begin_transparency_mask, /* begin_transparency_mask */ - default_subclass_end_transparency_mask, /* end_transparency_mask */ - default_subclass_discard_transparency_layer, /* discard_transparency_layer */ - default_subclass_get_color_mapping_procs, /* get_color_mapping_procs */ - default_subclass_get_color_comp_index, /* get_color_comp_index */ - default_subclass_encode_color, /* encode_color */ - default_subclass_decode_color, /* decode_color */ - default_subclass_pattern_manage, /* pattern_manage */ - obj_filter_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - default_subclass_include_color_space, /* include_color_space */ - obj_filter_fill_linear_color_scanline, /* fill_linear_color_scanline */ - obj_filter_fill_linear_color_trapezoid, /* fill_linear_color_trapezoid */ - obj_filter_fill_linear_color_triangle, /* fill_linear_color_triangle */ - default_subclass_update_spot_equivalent_colors, /* update_spot_equivalent_colors */ - default_subclass_ret_devn_params, /* ret_devn_params */ - default_subclass_fillpage, /* fillpage */ - default_subclass_push_transparency_state, /* push_transparency_state */ - default_subclass_pop_transparency_state, /* pop_transparency_state */ - obj_filter_put_image, /* put_image */ - default_subclass_dev_spec_op, /* dev_spec_op */ - default_subclass_copy_planes, /* copy_planes */ - default_subclass_get_profile, /* get_profile */ - default_subclass_set_graphics_type_tag, /* set_graphics_type_tag */ - obj_filter_strip_copy_rop2, - obj_filter_strip_tile_rect_devn, - default_subclass_copy_alpha_hl_color, - default_subclass_process_page, - default_subclass_transform_pixel_region, - obj_filter_fill_stroke_path, - } + devprocs_initialize(obj_filter_initialize) }; #undef MAX_COORD diff --git a/base/gdevp14.c b/base/gdevp14.c index e428ce6f4..e1140b7e0 100644 --- a/base/gdevp14.c +++ b/base/gdevp14.c @@ -218,121 +218,143 @@ static const gx_color_map_procs * /* 24-bit color. */ -#define pdf14_dev_procs(get_color_mapping_procs, get_color_comp_index, encode_color, decode_color) \ -{\ - pdf14_open, /* open */\ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - pdf14_output_page, /* output_page */\ - pdf14_close, /* close */\ - encode_color, /* rgb_map_rgb_color */\ - decode_color, /* gx_default_rgb_map_color_rgb */\ - pdf14_fill_rectangle, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - pdf14_copy_mono, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - gx_forward_get_params, /* get_params */\ - pdf14_put_params, /* put_params */\ - NULL, /* map_cmyk_color */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - NULL, /* get_page_device */\ - NULL, /* get_alpha_bits */\ - pdf14_copy_alpha, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - pdf14_fill_path, /* fill_path */\ - pdf14_stroke_path, /* stroke_path */\ - pdf14_fill_mask, /* fill_mask */\ - NULL, /* fill_trapezoid */\ - NULL, /* fill_parallelogram */\ - NULL, /* fill_triangle */\ - NULL, /* draw_thin_line */\ - NULL, /* begin_image */\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop, */\ - NULL, /* get_clipping_box */\ - pdf14_begin_typed_image, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - pdf14_create_compositor, /* create_compositor */\ - NULL, /* get_hardware_params */\ - pdf14_text_begin, /* text_begin */\ - pdf14_initialize, /* initialize */\ - pdf14_begin_transparency_group,\ - pdf14_end_transparency_group,\ - pdf14_begin_transparency_mask,\ - pdf14_end_transparency_mask,\ - pdf14_discard_trans_layer,\ - get_color_mapping_procs, /* get_color_mapping_procs */\ - get_color_comp_index, /* get_color_comp_index */\ - encode_color, /* encode_color */\ - decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - pdf14_fill_rectangle_hl_color, /* fill_rectangle_hl_color */\ - NULL, /* include_color_space */\ - NULL, /* fill_linear_color_scanline */\ - NULL, /* fill_linear_color_trapezoid */\ - NULL, /* fill_linear_color_triangle */\ - gx_forward_update_spot_equivalent_colors, /* update spot */\ - pdf14_ret_devn_params, /* DevN params */\ - NULL, /* fill page */\ - pdf14_push_transparency_state, /* push_transparency_state */\ - pdf14_pop_transparency_state, /* pop_transparency_state */\ - NULL, /* put_image */\ - pdf14_dev_spec_op, /* dev_spec_op */\ - pdf14_copy_planes, /* copy_planes */\ - NULL, /* */\ - gx_forward_set_graphics_type_tag, /* set_graphics_type_tag */\ - NULL, /* strip_copy_rop2 */\ - pdf14_strip_tile_rect_devn, /* strip_tile_rect_devn */\ - pdf14_copy_alpha_hl_color, /* copy_alpha_hl_color */\ - NULL, /* process_page */\ - NULL, /* transform_pixel_region */\ - pdf14_fill_stroke_path, /* fill_stroke */\ +static int +pdf14_procs_initialize(gx_device *dev, + dev_proc_get_color_mapping_procs(get_color_mapping_procs), + dev_proc_get_color_comp_index(get_color_comp_index), + dev_proc_encode_color(encode_color), + dev_proc_decode_color(decode_color)) +{ + set_dev_proc(dev, open_device, pdf14_open); + set_dev_proc(dev, output_page, pdf14_output_page); + set_dev_proc(dev, close_device, pdf14_close); + set_dev_proc(dev, map_rgb_color, encode_color); + set_dev_proc(dev, map_color_rgb, decode_color); + set_dev_proc(dev, fill_rectangle, pdf14_fill_rectangle); + set_dev_proc(dev, copy_mono, pdf14_copy_mono); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, pdf14_put_params); + set_dev_proc(dev, copy_alpha, pdf14_copy_alpha); + set_dev_proc(dev, fill_path, pdf14_fill_path); + set_dev_proc(dev, stroke_path, pdf14_stroke_path); + set_dev_proc(dev, fill_mask, pdf14_fill_mask); + set_dev_proc(dev, begin_typed_image, pdf14_begin_typed_image); + set_dev_proc(dev, create_compositor, pdf14_create_compositor); + set_dev_proc(dev, text_begin, pdf14_text_begin); + set_dev_proc(dev, begin_transparency_group, pdf14_begin_transparency_group); + set_dev_proc(dev, end_transparency_group, pdf14_end_transparency_group); + set_dev_proc(dev, begin_transparency_mask, pdf14_begin_transparency_mask); + set_dev_proc(dev, end_transparency_mask, pdf14_end_transparency_mask); + set_dev_proc(dev, discard_transparency_layer, pdf14_discard_trans_layer); + set_dev_proc(dev, get_color_mapping_procs, get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, get_color_comp_index); + set_dev_proc(dev, encode_color, encode_color); + set_dev_proc(dev, decode_color, decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, pdf14_fill_rectangle_hl_color); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, pdf14_ret_devn_params); + set_dev_proc(dev, push_transparency_state, pdf14_push_transparency_state); + set_dev_proc(dev, pop_transparency_state, pdf14_pop_transparency_state); + set_dev_proc(dev, dev_spec_op, pdf14_dev_spec_op); + set_dev_proc(dev, copy_planes, pdf14_copy_planes); + set_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + set_dev_proc(dev, strip_tile_rect_devn, pdf14_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, pdf14_copy_alpha_hl_color); + set_dev_proc(dev, fill_stroke_path, pdf14_fill_stroke_path); + + return pdf14_initialize(dev); +} + +static int +pdf14_Gray_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + gx_default_DevGray_get_color_mapping_procs, + gx_default_DevGray_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); } static const gx_device_procs pdf14_Gray_procs = - pdf14_dev_procs(gx_default_DevGray_get_color_mapping_procs, - gx_default_DevGray_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_Gray_initialize); + +static int +pdf14_RGB_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + gx_default_DevRGB_get_color_mapping_procs, + gx_default_DevRGB_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); +} static const gx_device_procs pdf14_RGB_procs = - pdf14_dev_procs(gx_default_DevRGB_get_color_mapping_procs, - gx_default_DevRGB_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_RGB_initialize); + +static int +pdf14_CMYK_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + gx_default_DevCMYK_get_color_mapping_procs, + gx_default_DevCMYK_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); +} static const gx_device_procs pdf14_CMYK_procs = - pdf14_dev_procs(gx_default_DevCMYK_get_color_mapping_procs, - gx_default_DevCMYK_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_CMYK_initialize); + +static int +pdf14_CMYKspot_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + pdf14_cmykspot_get_color_mapping_procs, + pdf14_cmykspot_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); +} static const gx_device_procs pdf14_CMYKspot_procs = - pdf14_dev_procs(pdf14_cmykspot_get_color_mapping_procs, - pdf14_cmykspot_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_CMYKspot_initialize); + +static int +pdf14_RGBspot_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + pdf14_rgbspot_get_color_mapping_procs, + pdf14_rgbspot_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); +} static const gx_device_procs pdf14_RGBspot_procs = - pdf14_dev_procs(pdf14_rgbspot_get_color_mapping_procs, - pdf14_rgbspot_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_RGBspot_initialize); + +static int +pdf14_Grayspot_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + pdf14_grayspot_get_color_mapping_procs, + pdf14_grayspot_get_color_comp_index, + pdf14_encode_color, + pdf14_decode_color); +} static const gx_device_procs pdf14_Grayspot_procs = -pdf14_dev_procs(pdf14_grayspot_get_color_mapping_procs, - pdf14_grayspot_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_Grayspot_initialize); +static int +pdf14_custom_initialize(gx_device *dev) +{ + return pdf14_procs_initialize(dev, + gx_forward_get_color_mapping_procs, + gx_forward_get_color_comp_index, + gx_forward_encode_color, + gx_forward_decode_color); +} static const gx_device_procs pdf14_custom_procs = - pdf14_dev_procs(gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color); + devprocs_initialize(pdf14_custom_initialize); static struct_proc_finalize(pdf14_device_finalize); @@ -635,8 +657,7 @@ gs_private_st_suffix_add1_final(st_gx_devn_accum_device, gx_device_pdf14_accum, gx_devn_prn_device_finalize, st_gx_devn_prn_device, save_p14dev); static const gx_device_procs pdf14_accum_Gray_procs = - prn_color_procs(gdev_prn_open, NULL, gdev_prn_close, - gx_default_8bit_map_gray_color, gx_default_8bit_map_color_gray); + devprocs_initialize(gdev_prn_initialize_gray8); const gx_device_pdf14_accum pdf14_accum_Gray = { prn_device_stype_body(gx_device_pdf14_accum, pdf14_accum_Gray_procs, "pdf14-accum-Gray", @@ -652,8 +673,7 @@ const gx_device_pdf14_accum pdf14_accum_Gray = { }; static const gx_device_procs pdf14_accum_RGB_procs = - prn_color_procs(gdev_prn_open, NULL, gdev_prn_close, - gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb); + devprocs_initialize(gdev_prn_initialize_rgb); const gx_device_pdf14_accum pdf14_accum_RGB = { prn_device_stype_body(gx_device_pdf14_accum, pdf14_accum_RGB_procs, "pdf14-accum-RGB", @@ -669,8 +689,7 @@ const gx_device_pdf14_accum pdf14_accum_RGB = { }; static const gx_device_procs pdf14_accum_CMYK_procs = - prn_color_procs(gdev_prn_open, NULL, gdev_prn_close, - cmyk_8bit_map_cmyk_color, cmyk_8bit_map_color_cmyk); + devprocs_initialize(gdev_prn_initialize_cmyk8); const gx_device_pdf14_accum pdf14_accum_CMYK = { prn_device_stype_body(gx_device_pdf14_accum, pdf14_accum_CMYK_procs, "pdf14-accum-CMYK", @@ -685,81 +704,24 @@ const gx_device_pdf14_accum pdf14_accum_CMYK = { 0/*save_p14dev*/ }; +static int +pdf14_accum_initialize_cmykspot(gx_device *dev) +{ + int code = gdev_prn_initialize_cmyk8(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, get_color_mapping_procs, pdf14_accum_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, pdf14_accum_get_color_comp_index); + set_dev_proc(dev, update_spot_equivalent_colors, pdf14_accum_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, pdf14_accum_ret_devn_params); + + return code; +} + static const gx_device_procs pdf14_accum_CMYKspot_procs = -{\ - gdev_prn_open, /* open */\ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - NULL, /* output_page */\ - gdev_prn_close, /* close */\ - cmyk_8bit_map_cmyk_color, /* rgb_map_rgb_color */\ - cmyk_8bit_map_color_cmyk, /* gx_default_rgb_map_color_rgb */\ - NULL, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - NULL, /* get_params */\ - NULL, /* put_params */\ - NULL, /* map_cmyk_color */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - NULL, /* get_page_device */\ - NULL, /* get_alpha_bits */\ - NULL , /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - NULL, /* fill_path */\ - NULL, /* stroke_path */\ - NULL, /* fill_mask */\ - NULL, /* fill_trapezoid */\ - NULL, /* fill_parallelogram */\ - NULL, /* fill_triangle */\ - NULL, /* draw_thin_line */\ - NULL, /* begin_image */\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop, */\ - NULL, /* get_clipping_box */\ - NULL, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - NULL, /* create_compositor */\ - NULL, /* get_hardware_params */\ - NULL, /* text_begin */\ - NULL, /* initialize */\ - NULL, /* begin_transparency_group */\ - NULL, /* end_transparency_group */\ - NULL, /* begin_transparency_mask */\ - NULL, /* end_transparency_mask */\ - NULL, /* discard_trans_layer */\ - pdf14_accum_get_color_mapping_procs, /* get_color_mapping_procs */\ - pdf14_accum_get_color_comp_index, /* get_color_comp_index */\ - cmyk_8bit_map_cmyk_color, /* encode_color */\ - cmyk_8bit_map_color_cmyk, /* decode_color */\ - NULL, /* pattern_manage */\ - NULL, /* fill_rectangle_hl_color */\ - NULL, /* include_color_space */\ - NULL, /* fill_linear_color_scanline */\ - NULL, /* fill_linear_color_trapezoid */\ - NULL, /* fill_linear_color_triangle */\ - pdf14_accum_update_spot_equivalent_colors, /* update spot */\ - pdf14_accum_ret_devn_params, /* DevN params */\ - NULL, /* fill page */\ - NULL, /* push_transparency_state */\ - NULL, /* pop_transparency_state */\ - NULL, /* put_image */\ - NULL, /* dev_spec_op */\ - NULL, /* copy_planes */\ - NULL, /* */\ - NULL, /* set_graphics_type_tag */\ - NULL, /* strip_copy_rop2 */\ - NULL, /* strip_tile_rect_devn */\ - NULL /* copy_alpha_hl_color */\ -}; + devprocs_initialize(pdf14_accum_initialize_cmykspot); const gx_device_pdf14_accum pdf14_accum_CMYKspot = { prn_device_stype_body(gx_device_pdf14_accum, pdf14_accum_CMYKspot_procs, "pdf14-accum-CMYKspot", @@ -7023,8 +6985,15 @@ pdf14_push_color_model(gx_device *dev, gs_transparency_color_t group_color_type, if_debug2m('v', pdev->memory, "[v]pdf14_push_color_model, num_components_old = %d num_components_new = %d\n", pdev->color_info.num_components,new_num_comps); - set_dev_proc(pdev, get_color_mapping_procs, pdevproto->static_procs->get_color_mapping_procs); - set_dev_proc(pdev, get_color_comp_index, pdevproto->static_procs->get_color_comp_index); + { + gx_device local_device; + + local_device.procs.initialize = pdevproto->static_procs->initialize; + /* We know the initialize call can't fail! */ + (void)local_device.procs.initialize(&local_device); + set_dev_proc(pdev, get_color_mapping_procs, local_device.procs.get_color_mapping_procs); + set_dev_proc(pdev, get_color_comp_index, local_device.procs.get_color_comp_index); + } group_color->blend_procs = pdev->blend_procs = pdevproto->blend_procs; group_color->polarity = pdev->color_info.polarity = new_polarity; group_color->num_components = pdev->color_info.num_components = new_num_comps; @@ -7300,8 +7269,15 @@ pdf14_clist_push_color_model(gx_device *dev, gx_device* cdev, gs_gstate *pgs, "[v]pdf14_clist_push_color_model, num_components_old = %d num_components_new = %d\n", pdev->color_info.num_components, new_num_comps); /* Set new information in the device */ - set_dev_proc(pdev, get_color_mapping_procs, pdevproto->static_procs->get_color_mapping_procs); - set_dev_proc(pdev, get_color_comp_index, pdevproto->static_procs->get_color_comp_index); + { + gx_device local_device; + + local_device.procs.initialize = pdevproto->static_procs->initialize; + /* We know the initialize call can't fail! */ + (void)local_device.procs.initialize(&local_device); + set_dev_proc(pdev, get_color_mapping_procs, local_device.procs.get_color_mapping_procs); + set_dev_proc(pdev, get_color_comp_index, local_device.procs.get_color_comp_index); + } pdev->blend_procs = pdevproto->blend_procs; pdev->color_info.polarity = new_polarity; pdev->color_info.num_components = new_num_comps; @@ -9555,86 +9531,6 @@ send_pdf14trans(gs_gstate * pgs, gx_device * dev, * device. */ -#define pdf14_clist_procs(get_color_mapping_procs, get_color_comp_index,\ - encode_color, decode_color) \ -{\ - NULL, /* open */\ - gx_forward_get_initial_matrix, /* get_initial_matrix */\ - gx_forward_sync_output, /* sync_output */\ - gx_forward_output_page, /* output_page */\ - gx_forward_close_device, /* close_device */\ - encode_color, /* rgb_map_rgb_color */\ - decode_color, /* map_color_rgb */\ - gx_forward_fill_rectangle, /* fill_rectangle */\ - gx_forward_tile_rectangle, /* tile_rectangle */\ - gx_forward_copy_mono, /* copy_mono */\ - gx_forward_copy_color, /* copy_color */\ - NULL , /* draw_line - obsolete */\ - gx_forward_get_bits, /* get_bits */\ - gx_forward_get_params, /* get_params */\ - pdf14_put_params, /* put_params */\ - encode_color, /* map_cmyk_color */\ - gx_forward_get_xfont_procs, /* get_xfont_procs */\ - gx_forward_get_xfont_device, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_forward_get_page_device, /* get_page_device */\ - NULL, /* get_alpha_bits */\ - gx_forward_copy_alpha, /* copy_alpha */\ - gx_forward_get_band, /* get_band */\ - gx_forward_copy_rop, /* copy_rop */\ - pdf14_clist_fill_path, /* fill_path */\ - pdf14_clist_stroke_path, /* stroke_path */\ - gx_forward_fill_mask, /* fill_mask */\ - gx_forward_fill_trapezoid, /* fill_trapezoid */\ - gx_forward_fill_parallelogram, /* fill_parallelogram */\ - gx_forward_fill_triangle, /* fill_triangle */\ - gx_forward_draw_thin_line, /* draw_thin_line */\ - pdf14_clist_begin_image, /* begin_image */\ - gx_forward_image_data, /* image_data */\ - gx_forward_end_image, /* end_image */\ - gx_forward_strip_tile_rectangle, /* strip_tile_rectangle */\ - gx_forward_strip_copy_rop, /* strip_copy_rop, */\ - gx_forward_get_clipping_box, /* get_clipping_box */\ - pdf14_clist_begin_typed_image, /* begin_typed_image */\ - gx_forward_get_bits_rectangle, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - pdf14_clist_create_compositor, /* create_compositor */\ - gx_forward_get_hardware_params, /* get_hardware_params */\ - pdf14_clist_text_begin, /* text_begin */\ - NULL, /* initialize */\ - pdf14_begin_transparency_group,\ - pdf14_end_transparency_group,\ - pdf14_begin_transparency_mask,\ - pdf14_end_transparency_mask,\ - gx_default_discard_transparency_layer, /* discard_transparency_layer */\ - get_color_mapping_procs, /* get_color_mapping_procs */\ - get_color_comp_index, /* get_color_comp_index */\ - encode_color, /* encode_color */\ - decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - gx_forward_fill_rectangle_hl_color, /* fill_rectangle_hl_color */\ - NULL, /* include_color_space */\ - NULL, /* fill_linear_color_scanline */\ - NULL, /* fill_linear_color_trapezoid */\ - NULL, /* fill_linear_color_triangle */\ - gx_forward_update_spot_equivalent_colors, /* update spot */\ - gx_forward_ret_devn_params, /* gx_forward_ret_devn_params */\ - gx_forward_fillpage,\ - pdf14_push_transparency_state,\ - pdf14_pop_transparency_state,\ - NULL, /* put_image */\ - pdf14_dev_spec_op,\ - pdf14_clist_copy_planes, /* copy planes */\ - NULL, /* get_profile */\ - gx_forward_set_graphics_type_tag, /* set_graphics_type_tag */\ - NULL, /* strip_copy_rop2 */\ - NULL, /* strip_tile_rect_devn */\ - gx_forward_copy_alpha_hl_color,\ - NULL, /* process_page */\ - NULL, /* transform_pixel_region */\ - pdf14_clist_fill_stroke_path,\ -} - static dev_proc_create_compositor(pdf14_clist_create_compositor); static dev_proc_create_compositor(pdf14_clist_forward_create_compositor); static dev_proc_fill_path(pdf14_clist_fill_path); @@ -9645,41 +9541,139 @@ static dev_proc_begin_image(pdf14_clist_begin_image); static dev_proc_begin_typed_image(pdf14_clist_begin_typed_image); static dev_proc_copy_planes(pdf14_clist_copy_planes); -static const gx_device_procs pdf14_clist_Gray_procs = - pdf14_clist_procs(gx_default_DevGray_get_color_mapping_procs, - gx_default_DevGray_get_color_comp_index, - pdf14_encode_color, - pdf14_decode_color); +static int +pdf14_clist_initialize(gx_device *dev, + dev_proc_get_color_mapping_procs(get_color_mapping_procs), + dev_proc_get_color_comp_index(get_color_comp_index)) +{ + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, sync_output, gx_forward_sync_output); + set_dev_proc(dev, output_page, gx_forward_output_page); + set_dev_proc(dev, close_device, gx_forward_close_device); + set_dev_proc(dev, map_rgb_color, pdf14_encode_color); + set_dev_proc(dev, map_color_rgb, pdf14_decode_color); + set_dev_proc(dev, fill_rectangle, gx_forward_fill_rectangle); + set_dev_proc(dev, tile_rectangle, gx_forward_tile_rectangle); + set_dev_proc(dev, copy_mono, gx_forward_copy_mono); + set_dev_proc(dev, copy_color, gx_forward_copy_color); + set_dev_proc(dev, get_bits, gx_forward_get_bits); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, pdf14_put_params); + set_dev_proc(dev, map_cmyk_color, pdf14_encode_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, copy_alpha, gx_forward_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, copy_rop, gx_forward_copy_rop); + set_dev_proc(dev, fill_path, pdf14_clist_fill_path); + set_dev_proc(dev, stroke_path, pdf14_clist_stroke_path); + set_dev_proc(dev, fill_mask, gx_forward_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_forward_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_forward_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_forward_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_forward_draw_thin_line); + set_dev_proc(dev, begin_image, pdf14_clist_begin_image); + set_dev_proc(dev, image_data, gx_forward_image_data); + set_dev_proc(dev, end_image, gx_forward_end_image); + set_dev_proc(dev, strip_tile_rectangle, gx_forward_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, gx_forward_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); + set_dev_proc(dev, begin_typed_image, pdf14_clist_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, gx_forward_get_bits_rectangle); + set_dev_proc(dev, create_compositor, pdf14_clist_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, text_begin, pdf14_clist_text_begin); + set_dev_proc(dev, begin_transparency_group, pdf14_begin_transparency_group); + set_dev_proc(dev, end_transparency_group, pdf14_end_transparency_group); + set_dev_proc(dev, begin_transparency_mask, pdf14_begin_transparency_mask); + set_dev_proc(dev, end_transparency_mask, pdf14_end_transparency_mask); + set_dev_proc(dev, discard_transparency_layer, gx_default_discard_transparency_layer); + set_dev_proc(dev, get_color_mapping_procs, get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, get_color_comp_index); + set_dev_proc(dev, encode_color, pdf14_encode_color); + set_dev_proc(dev, decode_color, pdf14_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, gx_forward_fill_rectangle_hl_color); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, push_transparency_state, pdf14_push_transparency_state); + set_dev_proc(dev, pop_transparency_state, pdf14_pop_transparency_state); + set_dev_proc(dev, dev_spec_op, pdf14_dev_spec_op); + set_dev_proc(dev, copy_planes, pdf14_clist_copy_planes); + set_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + set_dev_proc(dev, copy_alpha_hl_color, gx_forward_copy_alpha_hl_color); + set_dev_proc(dev, fill_stroke_path, pdf14_clist_fill_stroke_path); + + return 0; +} + +static int +pdf14_clist_Gray_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + gx_default_DevGray_get_color_mapping_procs, + gx_default_DevGray_get_color_comp_index); +} -static const gx_device_procs pdf14_clist_RGB_procs = - pdf14_clist_procs(gx_default_DevRGB_get_color_mapping_procs, - gx_default_DevRGB_get_color_comp_index, - pdf14_encode_color, - pdf14_decode_color); +static const gx_device_procs pdf14_clist_Gray_procs = + devprocs_initialize(pdf14_clist_Gray_initialize); + +static int +pdf14_clist_RGB_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + gx_default_DevRGB_get_color_mapping_procs, + gx_default_DevRGB_get_color_comp_index); +} + +static const gx_device_procs pdf14_clist_RGB_procs = + devprocs_initialize(pdf14_clist_RGB_initialize); + +static int +pdf14_clist_CMYK_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + gx_default_DevCMYK_get_color_mapping_procs, + gx_default_DevCMYK_get_color_comp_index); +} static const gx_device_procs pdf14_clist_CMYK_procs = - pdf14_clist_procs(gx_default_DevCMYK_get_color_mapping_procs, - gx_default_DevCMYK_get_color_comp_index, - pdf14_encode_color, pdf14_decode_color); + devprocs_initialize(pdf14_clist_CMYK_initialize); + +static int +pdf14_clist_CMYKspot_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + pdf14_cmykspot_get_color_mapping_procs, + pdf14_cmykspot_get_color_comp_index); +} -static const gx_device_procs pdf14_clist_CMYKspot_procs = - pdf14_clist_procs(pdf14_cmykspot_get_color_mapping_procs, - pdf14_cmykspot_get_color_comp_index, - pdf14_encode_color, - pdf14_decode_color); +static const gx_device_procs pdf14_clist_CMYKspot_procs = + devprocs_initialize(pdf14_clist_CMYKspot_initialize); #if 0 /* NOT USED */ -static const gx_device_procs pdf14_clist_RGBspot_procs = - pdf14_clist_procs(pdf14_rgbspot_get_color_mapping_procs, - pdf14_rgbspot_get_color_comp_index, - pdf14_encode_color, - pdf14_decode_color); - -static const gx_device_procs pdf14_clist_Grayspot_procs = - pdf14_clist_procs(pdf14_grayspot_get_color_mapping_procs, - pdf14_grayspot_get_color_comp_index, - pdf14_encode_color, - pdf14_decode_color); +static int +pdf14_clist_RGBspot_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + pdf14_rgbspot_get_color_mapping_procs, + pdf14_rgbspot_get_color_comp_index); +} + +static const gx_device_procs pdf14_clist_RGBspot_procs = + devprocs_initialize(pdf14_clist_RGBspot_initialize); + +static int +pdf14_clist_Grayspot_initialize(gx_device *dev) +{ + return pdf14_clist_initialize(dev, + pdf14_grayspot_get_color_mapping_procs, + pdf14_grayspot_get_color_comp_index); +} + +static const gx_device_procs pdf14_clist_Grayspot_procs = + devprocs_initialize(pdf14_clist_Grayspot_initialize); #endif /* NOT USED */ const pdf14_clist_device pdf14_clist_Gray_device = { diff --git a/base/gdevplnx.c b/base/gdevplnx.c index 25719942e..4e23b9623 100644 --- a/base/gdevplnx.c +++ b/base/gdevplnx.c @@ -69,83 +69,57 @@ static dev_proc_begin_typed_image(plane_begin_typed_image); static dev_proc_get_bits_rectangle(plane_get_bits_rectangle); /* Device prototype */ +static int +plane_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, plane_open_device); + set_dev_proc(dev, fill_rectangle, plane_fill_rectangle); + set_dev_proc(dev, copy_mono, plane_copy_mono); + set_dev_proc(dev, copy_color, plane_copy_color); + set_dev_proc(dev, copy_alpha, plane_copy_alpha); + set_dev_proc(dev, fill_path, plane_fill_path); + set_dev_proc(dev, stroke_path, plane_stroke_path); + set_dev_proc(dev, fill_mask, plane_fill_mask); + set_dev_proc(dev, fill_parallelogram, plane_fill_parallelogram); + set_dev_proc(dev, fill_triangle, plane_fill_triangle); + set_dev_proc(dev, strip_tile_rectangle, plane_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, plane_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, plane_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, plane_get_bits_rectangle); + set_dev_proc(dev, create_compositor, gx_no_create_compositor); /* WRONG */ + + /* Ideally the following would be initialized to the defaults + * automatically, but this does not currently work. */ + set_dev_proc(dev, close_device, gx_default_close_device); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, get_bits, gx_default_get_bits); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, text_begin, gx_default_text_begin); + set_dev_proc(dev, fill_rectangle_hl_color, gx_default_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gx_default_include_color_space); + set_dev_proc(dev, fill_linear_color_scanline, gx_default_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, gx_default_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, gx_default_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, gx_default_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_default_ret_devn_params); + set_dev_proc(dev, fillpage, gx_default_fillpage); + set_dev_proc(dev, strip_copy_rop2, gx_default_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, gx_default_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, gx_default_copy_alpha_hl_color); + + return 0; +} + static const gx_device_plane_extract gs_plane_extract_device = { std_device_std_body(gx_device_plane_extract, 0, "plane_extract", 0, 0, 72, 72), - { - plane_open_device, - NULL, - NULL, - NULL, - gx_default_close_device, - NULL, - NULL, - plane_fill_rectangle, - gx_default_tile_rectangle, - plane_copy_mono, - plane_copy_color, - gx_default_draw_line, - gx_default_get_bits, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - plane_copy_alpha, - NULL, - gx_default_copy_rop, - plane_fill_path, - plane_stroke_path, - plane_fill_mask, - gx_default_fill_trapezoid, - plane_fill_parallelogram, - plane_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - plane_strip_tile_rectangle, - plane_strip_copy_rop, - NULL, - plane_begin_typed_image, - plane_get_bits_rectangle, - NULL, - gx_no_create_compositor, /* WRONG */ - NULL, - gx_default_text_begin, - NULL, /* initialize */ - NULL, /* deprecated and never implemented transparency procs */ - NULL, /* | */ - NULL, /* | */ - NULL, /* | */ - NULL, /* V */ - NULL, /* DeviceN support color mapping procs */ - NULL, /* | */ - NULL, /* | */ - NULL, /* | */ - NULL, /* pattern_manage */ - gx_default_fill_rectangle_hl_color, - gx_default_include_color_space, - gx_default_fill_linear_color_scanline, - gx_default_fill_linear_color_trapezoid, - gx_default_fill_linear_color_triangle, - gx_default_update_spot_equivalent_colors, - gx_default_ret_devn_params, - gx_default_fillpage, - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - NULL, /* dev_spec_op */ - NULL, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - gx_default_strip_copy_rop2, - gx_default_strip_tile_rect_devn, - gx_default_copy_alpha_hl_color - }, + devprocs_initialize(plane_initialize), /* device-specific members */ NULL, /* target */ NULL, /* plane_dev */ @@ -418,12 +392,15 @@ int plane_device_init(gx_device_plane_extract *edev, gx_device *target, gx_device *plane_dev, const gx_render_plane_t *render_plane, bool clear) { + int code; /* Check for compatibility of the plane specification. */ if (render_plane->depth > plane_dev->color_info.depth) return_error(gs_error_rangecheck); - gx_device_init((gx_device *)edev, - (const gx_device *)&gs_plane_extract_device, - edev->memory, true); + code = gx_device_init((gx_device *)edev, + (const gx_device *)&gs_plane_extract_device, + edev->memory, true); + if (code < 0) + return code; check_device_separable((gx_device *)edev); gx_device_forward_fill_in_procs((gx_device_forward *)edev); gx_device_set_target((gx_device_forward *)edev, target); diff --git a/base/gdevprn.c b/base/gdevprn.c index cb3fdf451..4e4cea67b 100644 --- a/base/gdevprn.c +++ b/base/gdevprn.c @@ -55,9 +55,9 @@ public_st_device_printer(); /* Define the standard printer procedure vector. */ const gx_device_procs prn_std_procs = - prn_procs(gdev_prn_open, gdev_prn_output_page, gdev_prn_close); + devprocs_initialize(gdev_prn_initialize_mono); const gx_device_procs prn_bg_procs = - prn_procs(gdev_prn_open, gdev_prn_bg_output_page, gdev_prn_close); + devprocs_initialize(gdev_prn_initialize_mono_bg); /* Forward references */ int gdev_prn_maybe_realloc_memory(gx_device_printer *pdev, @@ -70,6 +70,7 @@ gdev_prn_output_page_aux(gx_device * pdev, int num_copies, int flush, bool seeka extern dev_proc_open_device(pattern_clist_open_device); extern dev_proc_open_device(clist_open); +extern dev_proc_close_device(clist_close); /* The function run in a background thread */ static void prn_print_page_in_background(void *data); @@ -230,7 +231,7 @@ gdev_prn_tear_down(gx_device *pdev, byte **the_memory) if (PRINTER_IS_CLIST(ppdev)) { /* Close cmd list device & point to the storage */ - (*gs_clist_device_procs.close_device)( (gx_device *)pcldev ); + clist_close( (gx_device *)pcldev ); *the_memory = ppdev->buf; ppdev->buf = 0; ppdev->buffer_space = 0; @@ -435,8 +436,12 @@ gdev_prn_allocate(gx_device *pdev, gdev_space_params *new_space_params, if (ecode == 0) ecode = code; - if (code >= 0 || (reallocate && pass > 1)) + if (code >= 0 || (reallocate && pass > 1)) { ppdev->procs = gs_clist_device_procs; + /* Hacky - we know this can't fail. */ + (void)ppdev->procs.initialize((gx_device *)ppdev); + gx_device_fill_in_procs((gx_device *)ppdev); + } } else { /* Render entirely in memory. */ gx_device *bdev = (gx_device *)pmemdev; @@ -1707,3 +1712,211 @@ dmprintf4(pdev->memory, "w=%d/%d, h=%d/%d\n", old_width, new_width, old_height, } return code; } + +int +gdev_prn_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, gdev_prn_open); + set_dev_proc(dev, close_device, gdev_prn_close); + set_dev_proc(dev, output_page, gdev_prn_output_page); + set_dev_proc(dev, get_params, gdev_prn_get_params); + set_dev_proc(dev, put_params, gdev_prn_put_params); + set_dev_proc(dev, get_page_device, gx_page_device_get_page_device); + set_dev_proc(dev, dev_spec_op, gdev_prn_dev_spec_op); + + return 0; +} + +int gdev_prn_initialize_bg(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_mono(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_rgb_color, gdev_prn_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gdev_prn_map_color_rgb); + + return 0; +} + +int gdev_prn_initialize_mono_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_mono(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_gray(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_rgb_color, gx_default_gray_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_gray_map_color_rgb); + + return 0; +} + +int gdev_prn_initialize_gray_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_gray(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_rgb(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_rgb_color, gx_default_rgb_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_default_rgb_map_color_rgb); + + return 0; +} + +int gdev_prn_initialize_rgb_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_rgb(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_gray8(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_rgb_color, gx_default_8bit_map_gray_color); + set_dev_proc(dev, map_color_rgb, gx_default_8bit_map_color_gray); + + return 0; +} + +int gdev_prn_initialize_gray8_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_gray8(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_cmyk1(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_cmyk_color, cmyk_1bit_map_cmyk_color); + set_dev_proc(dev, map_color_rgb, cmyk_1bit_map_color_rgb); + + return 0; +} + +int gdev_prn_initialize_cmyk1_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_cmyk1(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_cmyk8(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_cmyk_color, cmyk_8bit_map_cmyk_color); + set_dev_proc(dev, map_color_rgb, cmyk_8bit_map_color_rgb); + + return 0; +} + +int gdev_prn_initialize_cmyk8_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_cmyk8(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} + +int +gdev_prn_initialize_cmyk16(gx_device *dev) +{ + int code = gdev_prn_initialize(dev); + + if (code < 0) + return code; + + set_dev_proc(dev, map_cmyk_color, cmyk_16bit_map_cmyk_color); + set_dev_proc(dev, map_color_rgb, cmyk_16bit_map_color_cmyk); + + return 0; +} + +int gdev_prn_initialize_cmyk16_bg(gx_device *dev) +{ + int code = gdev_prn_initialize_cmyk16(dev); + + if (code < 0) + return 0; + + set_dev_proc(dev, output_page, gdev_prn_bg_output_page); + + return 0; +} diff --git a/base/gdevprn.h b/base/gdevprn.h index e5803451d..38e74434a 100644 --- a/base/gdevprn.h +++ b/base/gdevprn.h @@ -187,90 +187,6 @@ prn_dev_proc_get_space_params(gx_default_get_space_params); /* BACKWARD COMPATIBILITY */ #define gdev_prn_default_get_space_params gx_default_get_space_params -/* Macro for generating procedure table */ -#define prn_procs(p_open, p_output_page, p_close)\ - prn_color_procs_enc_dec(p_open, p_output_page, p_close, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb) -#define prn_params_procs(p_open, p_output_page, p_close, p_get_params, p_put_params)\ - prn_color_params_procs_enc_dec(p_open, p_output_page, p_close, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb, p_get_params, p_put_params, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb) -#define prn_color_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb)\ - prn_color_params_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, gdev_prn_get_params, gdev_prn_put_params) -#define prn_color_procs_enc_dec(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, p_encode_color, p_decode_color)\ - prn_color_params_procs_enc_dec(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, gdev_prn_get_params, gdev_prn_put_params, p_encode_color, p_decode_color) -/* See gdev_prn_open for explanation of the NULLs below. */ -#define prn_color_params_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, p_get_params, p_put_params) \ - prn_color_params_procs_enc_dec(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, p_get_params, p_put_params, NULL, NULL) -#define prn_color_params_procs_enc_dec(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, p_get_params, p_put_params, p_encode_color, p_decode_color) {\ - p_open,\ - NULL, /* get_initial_matrix */\ - NULL, /* sync_output */\ - p_output_page,\ - p_close,\ - p_map_rgb_color,\ - p_map_color_rgb,\ - NULL, /* fill_rectangle */\ - NULL, /* tile_rectangle */\ - NULL, /* copy_mono */\ - NULL, /* copy_color */\ - NULL, /* draw_line */\ - NULL, /* get_bits */\ - p_get_params,\ - p_put_params,\ - NULL, /* map_cmyk_color */\ - NULL, /* get_xfont_procs */\ - NULL, /* get_xfont_device */\ - NULL, /* map_rgb_alpha_color */\ - gx_page_device_get_page_device,\ - NULL, /* get_alpha_bits */\ - NULL, /* copy_alpha */\ - NULL, /* get_band */\ - NULL, /* copy_rop */\ - NULL, /* fill_path */\ - NULL, /* stroke_path */\ - NULL, /* fill_mask */\ - NULL, /* fill_trapezoid */\ - NULL, /* fill_parallelogram */\ - NULL, /* fill_triangle */\ - NULL, /* draw_thin_line */\ - NULL, /* begin_image */\ - NULL, /* image_data */\ - NULL, /* end_image */\ - NULL, /* strip_tile_rectangle */\ - NULL, /* strip_copy_rop, */\ - NULL, /* get_clipping_box */\ - NULL, /* begin_typed_image */\ - NULL, /* get_bits_rectangle */\ - NULL, /* map_color_rgb_alpha */\ - NULL, /* create_compositor */\ - NULL, /* get_hardware_params */\ - NULL, /* text_begin */\ - NULL, /* initialize */\ - NULL, /* begin_transparency_group */\ - NULL, /* end_transparency_group */\ - NULL, /* begin_transparency_mask */\ - NULL, /* end_transparency_mask */\ - NULL, /* discard_transparency_layer */\ - NULL, /* get_color_mapping_procs */\ - NULL, /* get_color_comp_index */\ - p_encode_color, /* encode_color */\ - p_decode_color, /* decode_color */\ - NULL, /* pattern_manage */\ - NULL, /* fill_rectangle_hl_color */\ - NULL, /* include_color_space */\ - NULL, /* fill_linear_color_scanline */\ - NULL, /* fill_linear_color_trapezoid */\ - NULL, /* fill_linear_color_triangle */\ - NULL, /* update_spot_equivalent_colors */\ - NULL, /* ret_devn_params */\ - NULL, /* fillpage */\ - NULL, /* push_transparency_state */\ - NULL, /* pop_transparency_state */\ - NULL, /* put_image */\ - gdev_prn_dev_spec_op, /* dev_spec_op */\ - NULL, /* copy plane */\ - gx_default_get_profile, /* get_profile */\ - gx_default_set_graphics_type_tag /* set_graphics_type_tag */\ -} - /* The standard printer device procedures */ /* (using gdev_prn_open/output_page/close). */ extern const gx_device_procs prn_std_procs; @@ -593,5 +509,21 @@ int gdev_create_buf_device(create_buf_device_proc_t cbd_proc, #define gdev_prn_transpose_8x8(inp,ils,outp,ols)\ memflip8x8(inp,ils,outp,ols) +int gdev_prn_initialize(gx_device *dev); +int gdev_prn_initialize_bg(gx_device *dev); +int gdev_prn_initialize_mono(gx_device *dev); +int gdev_prn_initialize_mono_bg(gx_device *dev); +int gdev_prn_initialize_rgb(gx_device *dev); +int gdev_prn_initialize_rgb_bg(gx_device *dev); +int gdev_prn_initialize_gray(gx_device *dev); +int gdev_prn_initialize_gray_bg(gx_device *dev); +int gdev_prn_initialize_gray8(gx_device *dev); +int gdev_prn_initialize_gray8_bg(gx_device *dev); +int gdev_prn_initialize_cmyk1(gx_device *dev); +int gdev_prn_initialize_cmyk1_bg(gx_device *dev); +int gdev_prn_initialize_cmyk8(gx_device *dev); +int gdev_prn_initialize_cmyk8_bg(gx_device *dev); +int gdev_prn_initialize_cmyk16(gx_device *dev); +int gdev_prn_initialize_cmyk16_bg(gx_device *dev); #endif /* gdevprn_INCLUDED */ diff --git a/base/gdevrops.c b/base/gdevrops.c index 2601b52cb..32c3c1c12 100644 --- a/base/gdevrops.c +++ b/base/gdevrops.c @@ -46,79 +46,51 @@ static dev_proc_copy_color(rop_texture_copy_color); static dev_proc_copy_planes(rop_texture_copy_planes); /* The device descriptor. */ +static int +rop_texture_initialize(gx_device *dev) +{ + set_dev_proc(dev, get_initial_matrix,gx_forward_get_initial_matrix); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, rop_texture_fill_rectangle); + set_dev_proc(dev, copy_mono, rop_texture_copy_mono); + set_dev_proc(dev, copy_color, rop_texture_copy_color); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, gx_forward_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, copy_alpha, gx_no_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, copy_rop, gx_no_copy_rop); + set_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_forward_encode_color); + set_dev_proc(dev, decode_color, gx_forward_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, gx_forward_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gx_forward_include_color_space); + set_dev_proc(dev, fill_linear_color_scanline, gx_forward_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, gx_forward_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, gx_forward_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); + set_dev_proc(dev, copy_planes, rop_texture_copy_planes); + set_dev_proc(dev, get_profile, gx_forward_get_profile); + set_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + + return 0; +} static const gx_device_rop_texture gs_rop_texture_device = { std_device_std_body(gx_device_rop_texture, 0, "rop source", 0, 0, 1, 1), - {NULL, /* open_device */ - gx_forward_get_initial_matrix, - NULL, /* default_sync_output */ - NULL, /* output_page */ - NULL, /* close_device */ - gx_forward_map_rgb_color, - gx_forward_map_color_rgb, - rop_texture_fill_rectangle, - NULL, /* tile_rectangle */ - rop_texture_copy_mono, - rop_texture_copy_color, - NULL, /* draw_line */ - NULL, /* get_bits */ - gx_forward_get_params, - gx_forward_put_params, - gx_forward_map_cmyk_color, - gx_forward_get_xfont_procs, - gx_forward_get_xfont_device, - gx_forward_map_rgb_alpha_color, - gx_forward_get_page_device, - NULL, /* get_alpha_bits (no alpha) */ - gx_no_copy_alpha, /* shouldn't be called */ - gx_forward_get_band, - gx_no_copy_rop, /* shouldn't be called */ - NULL, /* fill_path */ - NULL, /* stroke_path */ - NULL, /* fill_mask */ - NULL, /* fill_trapezoid */ - NULL, /* fill_parallelogram */ - NULL, /* fill_triangle */ - NULL, /* draw_thin_line */ - NULL, /* begin_image */ - NULL, /* image_data */ - NULL, /* end_image */ - NULL, /* strip_tile_rectangle */ - NULL, /* strip_copy_rop */ - gx_forward_get_clipping_box, - NULL, /* begin_typed_image */ - NULL, /* get_bits_rectangle */ - gx_forward_map_color_rgb_alpha, - NULL, /* create_compositor */ - gx_forward_get_hardware_params, - NULL, /* text_begin */ - NULL, /* initialize */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color, - NULL, /* dev_spec_op */ - gx_forward_fill_rectangle_hl_color, - gx_forward_include_color_space, - gx_forward_fill_linear_color_scanline, - gx_forward_fill_linear_color_trapezoid, - gx_forward_fill_linear_color_triangle, - gx_forward_update_spot_equivalent_colors, - gx_forward_ret_devn_params, - gx_forward_fillpage, - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - gx_forward_dev_spec_op, - rop_texture_copy_planes, /* copy planes */ - gx_forward_get_profile, - gx_forward_set_graphics_type_tag - }, + devprocs_initialize(rop_texture_initialize), 0, /* target */ lop_default /* log_op */ /* */ /* texture */ @@ -140,9 +112,10 @@ void gx_make_rop_texture_device(gx_device_rop_texture * dev, gx_device * target, gs_logical_operation_t log_op, const gx_device_color * texture) { - gx_device_init((gx_device *) dev, - (const gx_device *)&gs_rop_texture_device, - target->memory, true); + /* Can never fail */ + (void)gx_device_init((gx_device *) dev, + (const gx_device *)&gs_rop_texture_device, + target->memory, true); gx_device_set_target((gx_device_forward *)dev, target); /* Drawing operations are defaulted, non-drawing are forwarded. */ check_device_separable((gx_device *) dev); diff --git a/base/gdevsclass.c b/base/gdevsclass.c index e42ae757b..acd54a900 100644 --- a/base/gdevsclass.c +++ b/base/gdevsclass.c @@ -584,15 +584,6 @@ int default_subclass_text_begin(gx_device *dev, gs_gstate *pgs, const gs_text_pa return gx_default_text_begin(dev, pgs, text, font, path, pdcolor, pcpath, memory, ppte); } -/* This method is intended to allow for - * devices to initialise data before being invoked. For our subclassed - * device this should already have been done. - */ -int default_subclass_initialize(gx_device *dev) -{ - return 0; -} - int default_subclass_begin_transparency_group(gx_device *dev, const gs_transparency_group_params_t *ptgp, const gs_rect *pbbox, gs_gstate *pgs, gs_memory_t *mem) { @@ -929,3 +920,83 @@ void default_subclass_finalize(const gs_memory_t *cmem, void *vptr) if (dev->NupControl) rc_decrement(dev->NupControl, "finalize subclass device"); } + +int default_subclass_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, default_subclass_open_device); + set_dev_proc(dev, get_initial_matrix, default_subclass_get_initial_matrix); + set_dev_proc(dev, sync_output, default_subclass_sync_output); + set_dev_proc(dev, output_page, default_subclass_output_page); + set_dev_proc(dev, close_device, default_subclass_close_device); + set_dev_proc(dev, map_rgb_color, default_subclass_map_rgb_color); + set_dev_proc(dev, map_color_rgb, default_subclass_map_color_rgb); + set_dev_proc(dev, fill_rectangle, default_subclass_fill_rectangle); + set_dev_proc(dev, tile_rectangle, default_subclass_tile_rectangle); + set_dev_proc(dev, copy_mono, default_subclass_copy_mono); + set_dev_proc(dev, copy_color, default_subclass_copy_color); + set_dev_proc(dev, obsolete_draw_line, default_subclass_draw_line); + set_dev_proc(dev, get_bits, default_subclass_get_bits); + set_dev_proc(dev, get_params, default_subclass_get_params); + set_dev_proc(dev, put_params, default_subclass_put_params); + set_dev_proc(dev, map_cmyk_color, default_subclass_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, default_subclass_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, default_subclass_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, default_subclass_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, default_subclass_get_page_device); + set_dev_proc(dev, get_alpha_bits, default_subclass_get_alpha_bits); + set_dev_proc(dev, copy_alpha, default_subclass_copy_alpha); + set_dev_proc(dev, get_band, default_subclass_get_band); + set_dev_proc(dev, copy_rop, default_subclass_copy_rop); + set_dev_proc(dev, fill_path, default_subclass_fill_path); + set_dev_proc(dev, stroke_path, default_subclass_stroke_path); + set_dev_proc(dev, fill_mask, default_subclass_fill_mask); + set_dev_proc(dev, fill_trapezoid, default_subclass_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, default_subclass_fill_parallelogram); + set_dev_proc(dev, fill_triangle, default_subclass_fill_triangle); + set_dev_proc(dev, draw_thin_line, default_subclass_draw_thin_line); + set_dev_proc(dev, begin_image, default_subclass_begin_image); + set_dev_proc(dev, image_data, default_subclass_image_data); + set_dev_proc(dev, end_image, default_subclass_end_image); + set_dev_proc(dev, strip_tile_rectangle, default_subclass_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, default_subclass_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, default_subclass_get_clipping_box); + set_dev_proc(dev, begin_typed_image, default_subclass_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, default_subclass_get_bits_rectangle); + set_dev_proc(dev, map_color_rgb_alpha, default_subclass_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, default_subclass_create_compositor); + set_dev_proc(dev, get_hardware_params, default_subclass_get_hardware_params); + set_dev_proc(dev, text_begin, default_subclass_text_begin); + set_dev_proc(dev, begin_transparency_group, default_subclass_begin_transparency_group); + set_dev_proc(dev, end_transparency_group, default_subclass_end_transparency_group); + set_dev_proc(dev, begin_transparency_mask, default_subclass_begin_transparency_mask); + set_dev_proc(dev, end_transparency_mask, default_subclass_end_transparency_mask); + set_dev_proc(dev, discard_transparency_layer, default_subclass_discard_transparency_layer); + set_dev_proc(dev, get_color_mapping_procs, default_subclass_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, default_subclass_get_color_comp_index); + set_dev_proc(dev, encode_color, default_subclass_encode_color); + set_dev_proc(dev, decode_color, default_subclass_decode_color); + set_dev_proc(dev, pattern_manage, default_subclass_pattern_manage); + set_dev_proc(dev, fill_rectangle_hl_color, default_subclass_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, default_subclass_include_color_space); + set_dev_proc(dev, fill_linear_color_scanline, default_subclass_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, default_subclass_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, default_subclass_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, default_subclass_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, default_subclass_ret_devn_params); + set_dev_proc(dev, fillpage, default_subclass_fillpage); + set_dev_proc(dev, push_transparency_state, default_subclass_push_transparency_state); + set_dev_proc(dev, pop_transparency_state, default_subclass_pop_transparency_state); + set_dev_proc(dev, put_image, default_subclass_put_image); + set_dev_proc(dev, dev_spec_op, default_subclass_dev_spec_op); + set_dev_proc(dev, copy_planes, default_subclass_copy_planes); + set_dev_proc(dev, get_profile, default_subclass_get_profile); + set_dev_proc(dev, set_graphics_type_tag, default_subclass_set_graphics_type_tag); + set_dev_proc(dev, strip_copy_rop2, default_subclass_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, default_subclass_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, default_subclass_copy_alpha_hl_color); + set_dev_proc(dev, process_page, default_subclass_process_page); + set_dev_proc(dev, transform_pixel_region, default_subclass_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, default_subclass_fill_stroke_path); + + return 0; +} diff --git a/base/gsdevice.c b/base/gsdevice.c index ecb71c6c0..7838e4fdc 100644 --- a/base/gsdevice.c +++ b/base/gsdevice.c @@ -398,11 +398,7 @@ gs_copydevice2(gx_device ** pnew_dev, const gx_device * dev, bool keep_open, gs_free_object(mem->non_gc_memory, a_std, "gs_copydevice(stype)"); return_error(gs_error_VMerror); } - gx_device_init(new_dev, dev, mem, false); - if (new_dev->static_procs != NULL) { /* 0 if already populated */ - new_dev->procs = *new_dev->static_procs; - new_dev->static_procs = 0; - } + code = gx_device_init(new_dev, dev, mem, false); new_dev->stype = new_std; new_dev->stype_is_dynamic = new_std != std; /* @@ -411,8 +407,6 @@ gs_copydevice2(gx_device ** pnew_dev, const gx_device * dev, bool keep_open, * (including self-pointers) that they may contain. */ new_dev->is_open = dev->is_open && keep_open; - fill_dev_proc(new_dev, initialize, gx_default_initialize); - code = dev_proc(new_dev, initialize)(new_dev); if (code < 0) { gs_free_object(mem, new_dev, "gs_copydevice(device)"); #if 0 /* gs_free_object above calls gx_device_finalize, @@ -609,15 +603,28 @@ gs_setdevice_no_init(gs_gstate * pgs, gx_device * dev) } /* Initialize a just-allocated device. */ -void +int gx_device_init(gx_device * dev, const gx_device * proto, gs_memory_t * mem, bool internal) { memcpy(dev, proto, proto->params_size); + if (dev->static_procs != NULL) { /* NULL if already populated */ + dev->procs = *dev->static_procs; + dev->static_procs = NULL; + } + if (dev->procs.initialize) { + /* A condition of devices inited in this way is that they can + * never fail to initialize! */ + int code = dev->procs.initialize(dev); + if (code < 0) + return code; + } dev->memory = mem; dev->retained = !internal; rc_init(dev, mem, (internal ? 0 : 1)); rc_increment(dev->icc_struct); + + return 0; } void @@ -625,6 +632,12 @@ gx_device_init_on_stack(gx_device * dev, const gx_device * proto, gs_memory_t * mem) { memcpy(dev, proto, proto->params_size); + if (dev->procs.initialize) { + /* A condition of devices inited on the stack is that they can + * never fail to initialize! */ + (void)dev->procs.initialize(dev); + } + gx_device_fill_in_procs(dev); dev->memory = mem; dev->retained = 0; dev->pad = proto->pad; @@ -638,8 +651,10 @@ void gs_make_null_device(gx_device_null *dev_null, gx_device *dev, gs_memory_t * mem) { - gx_device_init((gx_device *)dev_null, (const gx_device *)&gs_null_device, - mem, true); + /* Can never fail */ + (void)gx_device_init((gx_device *)dev_null, + (const gx_device *)&gs_null_device, + mem, true); gx_device_fill_in_procs((gx_device *)dev_null); gx_device_set_target((gx_device_forward *)dev_null, dev); if (dev) { diff --git a/base/gsovrc.c b/base/gsovrc.c index 33122069f..3e567993e 100644 --- a/base/gsovrc.c +++ b/base/gsovrc.c @@ -407,83 +407,27 @@ static dev_proc_stroke_path(overprint_stroke_path); static dev_proc_text_begin(overprint_text_begin); static dev_proc_dev_spec_op(overprint_dev_spec_op); -static const gx_device_procs no_overprint_procs = { - overprint_open_device, /* open_device */ - 0, /* get_initial_matrix */ - 0, /* sync_output */ - 0, /* output_page */ - 0, /* close_device */ - 0, /* map_rgb_color */ - 0, /* map_color_rgb */ - gx_forward_fill_rectangle, /* fill_rectangle */ - gx_forward_tile_rectangle, /* tile_rectangle */ - gx_forward_copy_mono, /* copy_mono */ - gx_forward_copy_color, /* copy_color */ - 0, /* draw_line (obsolete) */ - 0, /* get_bits */ - 0, /* get_params */ - overprint_put_params, /* put_params */ - 0, /* map_cmyk_color */ - 0, /* get_xfont_procs */ - 0, /* get_xfont_device */ - 0, /* map_rgb_alpha_color */ - overprint_get_page_device, /* get_page_device */ - 0, /* get_alpha_bits (obsolete) */ - 0, /* copy alpha */ - 0, /* get_band */ - 0, /* copy_rop */ - 0, /* fill_path */ - 0, /* stroke_path */ - 0, /* fill_mask */ - 0, /* fill_trapezoid */ - 0, /* fill_parallelogram */ - 0, /* fill_triangle */ - 0, /* draw_thin_line */ - 0, /* begin_image */ - 0, /* image_data (obsolete) */ - 0, /* end_image (obsolete) */ - gx_forward_strip_tile_rectangle, /* strip_tile_rectangle */ - 0, /* strip_copy_rop */ - 0, /* get_clipping_box */ - 0, /* begin_typed_image */ - 0, /* get_bits_rectangle */ - 0, /* map_color_rgb_alpha */ - overprint_create_compositor, /* create_compositor */ - 0, /* get_hardware_params */ - 0, /* text_begin */ - 0, /* initialize */ - 0, /* begin_transparency_group */ - 0, /* end_transparency_group */ - 0, /* being_transparency_mask */ - 0, /* end_transparency_mask */ - 0, /* discard_transparency_layer */ - 0, /* get_color_mapping_procs */ - overprint_get_color_comp_index, /* get_color_comp_index */ - 0, /* encode_color */ - 0, /* decode_color */ - 0, /* pattern_manage */ - 0, /* fill_rectangle_hl_color */ - 0, /* include_color_space */ - 0, /* fill_linear_color_scanline */ - 0, /* fill_linear_color_trapezoid */ - 0, /* fill_linear_color_triangle */ - 0, /* update_spot_equivalent_colors */ - 0, /* ret_devn_params */ - gx_forward_fillpage, - 0, /* push_transparency_state */ - 0, /* pop_transparency_state */ - 0, /* put_image */ - overprint_dev_spec_op, /* dev_spec_op */ - gx_forward_copy_planes, - 0, /* get profile */ - 0, /* set graphics type tag */ - 0, /* strip_copy_rop2 */ - 0, /* strip_tile_rect_devn */ - gx_forward_copy_alpha_hl_color, /* copy_alpha_hl_color */ - NULL, /* process_page */\ - NULL, /* transform_pixel_region */\ - gx_forward_fill_stroke_path, /* fill_stroke */\ -}; +static int +nooverprint_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, overprint_open_device); + set_dev_proc(dev, fill_rectangle, gx_forward_fill_rectangle); + set_dev_proc(dev, tile_rectangle, gx_forward_tile_rectangle); + set_dev_proc(dev, copy_mono, gx_forward_copy_mono); + set_dev_proc(dev, copy_color, gx_forward_copy_color); + set_dev_proc(dev, put_params, overprint_put_params); + set_dev_proc(dev, get_page_device, overprint_get_page_device); + set_dev_proc(dev, strip_tile_rectangle, gx_forward_strip_tile_rectangle); + set_dev_proc(dev, create_compositor, overprint_create_compositor); + set_dev_proc(dev, get_color_comp_index, overprint_get_color_comp_index); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, dev_spec_op, overprint_dev_spec_op); + set_dev_proc(dev, copy_planes, gx_forward_copy_planes); + set_dev_proc(dev, copy_alpha_hl_color, gx_forward_copy_alpha_hl_color); + set_dev_proc(dev, fill_stroke_path, gx_forward_fill_stroke_path); + + return 0; +} /* * If overprint is set, the high and mid-level rendering methods are @@ -519,161 +463,88 @@ static dev_proc_copy_alpha_hl_color(overprint_copy_alpha_hl_color); /* other low-level overprint_sep_* rendering methods prototypes go here */ -static const gx_device_procs generic_overprint_procs = { - overprint_open_device, /* open_device */ - 0, /* get_initial_matrix */ - 0, /* sync_output */ - 0, /* output_page */ - 0, /* close_device */ - 0, /* map_rgb_color */ - 0, /* map_color_rgb */ - overprint_generic_fill_rectangle, /* fill_rectangle */ - gx_default_tile_rectangle, /* tile_rectangle */ - gx_default_copy_mono, /* copy_mono */ - gx_default_copy_color, /* copy_color */ - gx_default_draw_line, /* draw_line (obsolete) */ - 0, /* get_bits */ - 0, /* get_params */ - overprint_put_params, /* put_params */ - 0, /* map_cmyk_color */ - 0, /* get_xfont_procs */ - gx_default_get_xfont_device, /* get_xfont_device */ - 0, /* map_rgb_alpha_color */ - overprint_get_page_device, /* get_page_device */ - 0, /* get_alpha_bits (obsolete) */ - gx_default_copy_alpha, /* copy alpha */ - 0, /* get_band */ - gx_default_copy_rop, /* copy_rop */ - overprint_fill_path, /* fill_path */ - overprint_stroke_path, /* stroke_path */ - gx_default_fill_mask, /* fill_mask */ - gx_default_fill_trapezoid, /* fill_trapezoid */ - gx_default_fill_parallelogram, /* fill_parallelogram */ - gx_default_fill_triangle, /* fill_triangle */ - gx_default_draw_thin_line, /* draw_thin_line */ - gx_default_begin_image, /* begin_image */ - 0, /* image_data (obsolete) */ - 0, /* end_image (obsolete) */ - gx_default_strip_tile_rectangle, /* strip_tile_rectangle */ - gx_default_strip_copy_rop, /* strip_copy_rop */ - 0, /* get_clipping_box */ - gx_default_begin_typed_image, /* begin_typed_image */ - 0, /* get_bits_rectangle */ - 0, /* map_color_rgb_alpha */ - overprint_create_compositor, /* create_compositor */ - 0, /* get_hardware_params */ - overprint_text_begin, /* text_begin */ - 0, /* initialize */ - 0, /* begin_transparency_group */ - 0, /* end_transparency_group */ - 0, /* begin_transparency_mask */ - 0, /* end_transparency_mask */ - 0, /* discard_transparency_layer */ - 0, /* get_color_mapping_procs */ - overprint_get_color_comp_index, /* get_color_comp_index */ - 0, /* encode_color */ - 0, /* decode_color */ - 0, /* pattern_manage */ - overprint_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - 0, /* include_color_space */ - 0, /* fill_linear_color_scanline */ - 0, /* fill_linear_color_trapezoid */ - 0, /* fill_linear_color_triangle */ - 0, /* update_spot_equivalent_colors */ - 0, /* ret_devn_params */ - 0, /* fillpage */ - 0, /* push_transparency_state */ - 0, /* pop_transparency_state */ - 0, /* put_image */ - overprint_dev_spec_op, /* dev_spec_op */ - gx_forward_copy_planes, - 0, /* get profile */ - 0, /* set graphics type tag */ - 0, /* strip_copy_rop2 */ - 0, /* strip_tile_rect_devn */ - gx_forward_copy_alpha_hl_color, /* copy_alpha_hl_color */ - NULL, /* process_page */\ - NULL, /* transform_pixel_region */\ - overprint_fill_stroke_path, /* fill_stroke */ -}; +static int +generic_overprint_initialize(gx_device *dev) +{ + /* Note that we set lots of things to 'default' here. You can't + * omit them, because the caller for this particular initialization + * proc fills them in with 'forward' ones, rather than 'default' + * ones, and that doesn't work. Maybe look into this in future. */ + set_dev_proc(dev, open_device, overprint_open_device); + set_dev_proc(dev, fill_rectangle, overprint_generic_fill_rectangle); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, copy_mono, gx_default_copy_mono); + set_dev_proc(dev, copy_color, gx_default_copy_color); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, put_params, overprint_put_params); + set_dev_proc(dev, get_xfont_device, gx_default_get_xfont_device); + set_dev_proc(dev, get_page_device, overprint_get_page_device); + set_dev_proc(dev, copy_alpha, gx_default_copy_alpha); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, overprint_fill_path); + set_dev_proc(dev, stroke_path, overprint_stroke_path); + set_dev_proc(dev, fill_mask, gx_default_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, gx_default_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, create_compositor, overprint_create_compositor); + set_dev_proc(dev, text_begin, overprint_text_begin); + set_dev_proc(dev, get_color_comp_index, overprint_get_color_comp_index); + set_dev_proc(dev, fill_rectangle_hl_color, overprint_fill_rectangle_hl_color); + set_dev_proc(dev, dev_spec_op, overprint_dev_spec_op); + set_dev_proc(dev, copy_planes, gx_forward_copy_planes); + set_dev_proc(dev, copy_alpha_hl_color, dev->is_planar ? + overprint_copy_alpha_hl_color : + gx_forward_copy_alpha_hl_color); + set_dev_proc(dev, fill_stroke_path, overprint_fill_stroke_path); -static const gx_device_procs sep_overprint_procs = { - overprint_open_device, /* open_device */ - 0, /* get_initial_matrix */ - 0, /* sync_output */ - 0, /* output_page */ - 0, /* close_device */ - 0, /* map_rgb_color */ - 0, /* map_color_rgb */ - overprint_sep_fill_rectangle, /* fill_rectangle */ - gx_default_tile_rectangle, /* tile_rectangle */ - gx_default_copy_mono, /* copy_mono */ - gx_default_copy_color, /* copy_color */ - gx_default_draw_line, /* draw_line (obsolete) */ - 0, /* get_bits */ - 0, /* get_params */ - overprint_put_params, /* put_params */ - 0, /* map_cmyk_color */ - 0, /* get_xfont_procs */ - gx_default_get_xfont_device, /* get_xfont_device */ - 0, /* map_rgb_alpha_color */ - overprint_get_page_device, /* get_page_device */ - 0, /* get_alpha_bits (obsolete) */ - gx_default_copy_alpha, /* copy alpha */ - 0, /* get_band */ - gx_default_copy_rop, /* copy_rop */ - overprint_fill_path, /* fill_path */ - overprint_stroke_path, /* stroke_path */ - gx_default_fill_mask, /* fill_mask */ - gx_default_fill_trapezoid, /* fill_trapezoid */ - gx_default_fill_parallelogram, /* fill_parallelogram */ - gx_default_fill_triangle, /* fill_triangle */ - gx_default_draw_thin_line, /* draw_thin_line */ - gx_default_begin_image, /* begin_image */ - 0, /* image_data (obsolete) */ - 0, /* end_image (obsolete) */ - gx_default_strip_tile_rectangle, /* strip_tile_rectangle */ - gx_default_strip_copy_rop, /* strip_copy_rop */ - 0, /* get_clipping_box */ - gx_default_begin_typed_image, /* begin_typed_image */ - 0, /* get_bits_rectangle */ - 0, /* map_color_rgb_alpha */ - overprint_create_compositor, /* create_compositor */ - 0, /* get_hardware_params */ - overprint_text_begin, /* text_begin */ - 0, /* initialize */ - 0, /* begin_transparency_group */ - 0, /* end_transparency_group */ - 0, /* begin_transparency_mask */ - 0, /* end_transparency_mask */ - 0, /* discard_transparency_layer */ - 0, /* get_color_mapping_procs */ - overprint_get_color_comp_index, /* get_color_comp_index */ - 0, /* encode_color */ - 0, /* decode_color */ - 0, /* pattern_manage */ - overprint_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - 0, /* include_color_space */ - 0, /* fill_linear_color_scanline */ - 0, /* fill_linear_color_trapezoid */ - 0, /* fill_linear_color_triangle */ - 0, /* update_spot_equivalent_colors */ - 0, /* ret_devn_params */ - 0, /* fillpage */ - 0, /* push_transparency_state */ - 0, /* pop_transparency_state */ - 0, /* put_image */ - overprint_dev_spec_op, /* dev_spec_op */ - overprint_copy_planes, /* copy planes */ - 0, /* get profile */ - 0, /* set graphics type tag */ - 0, /* strip_copy_rop2 */ - 0, /* strip_tile_rect_devn */ - overprint_copy_alpha_hl_color, /* copy_alpha_hl_color */ - NULL, /* process_page */\ - NULL, /* transform_pixel_region */\ - overprint_fill_stroke_path, /* fill_stroke */ -}; + return 0; +} + +static int +sep_overprint_initialize(gx_device *dev) +{ + /* Note that we set lots of things to 'default' here. You can't + * omit them, because the caller for this particular initialization + * proc fills them in with 'forward' ones, rather than 'default' + * ones, and that doesn't work. Maybe look into this in future. */ + set_dev_proc(dev, open_device, overprint_open_device); + set_dev_proc(dev, fill_rectangle, overprint_sep_fill_rectangle); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, copy_mono, gx_default_copy_mono); + set_dev_proc(dev, copy_color, gx_default_copy_color); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, put_params, overprint_put_params); + set_dev_proc(dev, get_page_device, overprint_get_page_device); + set_dev_proc(dev, copy_alpha, gx_default_copy_alpha); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, overprint_fill_path); + set_dev_proc(dev, stroke_path, overprint_stroke_path); + set_dev_proc(dev, fill_mask, gx_default_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, gx_default_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, create_compositor, overprint_create_compositor); + set_dev_proc(dev, text_begin, overprint_text_begin); + set_dev_proc(dev, get_color_comp_index, overprint_get_color_comp_index); + set_dev_proc(dev, fill_rectangle_hl_color, overprint_fill_rectangle_hl_color); + set_dev_proc(dev, dev_spec_op, overprint_dev_spec_op); + set_dev_proc(dev, copy_planes, overprint_copy_planes); + set_dev_proc(dev, copy_alpha_hl_color, overprint_copy_alpha_hl_color); + set_dev_proc(dev, fill_stroke_path, overprint_fill_stroke_path); + + return 0; +} /* * The prototype for the overprint device does not provide much @@ -1455,10 +1326,13 @@ overprint_dev_spec_op(gx_device* pdev, int dev_spec_op, } /* complete a procedure set */ -static void -fill_in_procs(gx_device_procs * pprocs) +static int +fill_in_procs(gx_device_procs * pprocs, + dev_proc_initialize(initialize), + int is_planar) { gx_device_forward tmpdev; + int code; /* * gx_device_forward_fill_in_procs calls gx_device_fill_in_procs, which @@ -1469,6 +1343,8 @@ fill_in_procs(gx_device_procs * pprocs) memcpy( &tmpdev.color_info, &gs_overprint_device.color_info, sizeof(tmpdev.color_info) ); + tmpdev.is_planar = is_planar; + /* * Prevent the check_device_separable routine from executing while we * fill in the procs. Our tmpdev is not complete enough for it. @@ -1476,8 +1352,14 @@ fill_in_procs(gx_device_procs * pprocs) tmpdev.color_info.separable_and_linear = GX_CINFO_SEP_LIN_NONE; tmpdev.static_procs = 0; memcpy(&tmpdev.procs, pprocs, sizeof(tmpdev.procs)); + tmpdev.procs.initialize = initialize; + code = initialize((gx_device *)&tmpdev); + if (code < 0) + return code; gx_device_forward_fill_in_procs(&tmpdev); memcpy(pprocs, &tmpdev.procs, sizeof(tmpdev.procs)); + + return 0; } /* @@ -1518,30 +1400,33 @@ c_overprint_create_default_compositor( *popdev = (gx_device *)opdev; if (opdev == NULL) return_error(gs_error_VMerror); - gx_device_init((gx_device *)opdev, - (const gx_device *)&gs_overprint_device, - mem, - false ); - memcpy(&opdev->no_overprint_procs, - &no_overprint_procs, - sizeof(no_overprint_procs)); - memcpy(&opdev->generic_overprint_procs, - &generic_overprint_procs, - sizeof(generic_overprint_procs)); - memcpy(&opdev->sep_overprint_procs, - &sep_overprint_procs, - sizeof(sep_overprint_procs)); - fill_in_procs(&opdev->no_overprint_procs); - fill_in_procs(&opdev->generic_overprint_procs); - fill_in_procs(&opdev->sep_overprint_procs); + code = gx_device_init((gx_device *)opdev, + (const gx_device *)&gs_overprint_device, + mem, + false); + if (code < 0) + return code; + code = fill_in_procs(&opdev->no_overprint_procs, + nooverprint_initialize, + tdev->is_planar); + if (code < 0) + return code; + code = fill_in_procs(&opdev->generic_overprint_procs, + generic_overprint_initialize, + tdev->is_planar); + if (code < 0) + return code; + code = fill_in_procs(&opdev->sep_overprint_procs, + sep_overprint_initialize, + tdev->is_planar); + if (code < 0) + return code; gx_device_copy_params((gx_device *)opdev, tdev); gx_device_set_target((gx_device_forward *)opdev, tdev); opdev->pad = tdev->pad; opdev->log2_align_mod = tdev->log2_align_mod; opdev->is_planar = tdev->is_planar; - if (opdev->is_planar) - opdev->generic_overprint_procs.copy_alpha_hl_color = overprint_copy_alpha_hl_color; params = ovrpct->params; params.idle = ovrpct->idle; diff --git a/base/gxacpath.c b/base/gxacpath.c index 9a87cfb71..5d91b6da8 100644 --- a/base/gxacpath.c +++ b/base/gxacpath.c @@ -55,80 +55,25 @@ RELOC_PTRS_WITH(device_cpath_accum_reloc_ptrs, gx_device_cpath_accum *pdev) public_st_device_cpath_accum(); /* The device descriptor */ +static int +cpath_accum_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, accum_open_device); + set_dev_proc(dev, close_device, accum_close); + set_dev_proc(dev, fill_rectangle, accum_fill_rectangle); + set_dev_proc(dev, get_clipping_box, accum_get_clipping_box); + set_dev_proc(dev, get_color_mapping_procs, gx_default_DevGray_get_color_mapping_procs); + set_dev_proc(dev, dev_spec_op, accum_dev_spec_op); + + return 0; +} + + /* Many of these procedures won't be called; they are set to NULL. */ static const gx_device_cpath_accum gs_cpath_accum_device = {std_device_std_body(gx_device_cpath_accum, 0, "clip list accumulator", 0, 0, 1, 1), - {accum_open_device, - NULL, - NULL, - NULL, - accum_close, - NULL, - NULL, - accum_fill_rectangle, - NULL, - gx_default_copy_mono, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - gx_default_fill_path, - gx_default_stroke_path, - gx_default_fill_mask, - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - NULL, - NULL, - accum_get_clipping_box, - gx_default_begin_typed_image, - NULL, - NULL, - NULL, - NULL, - gx_default_text_begin, - NULL, /* initialize */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - gx_default_DevGray_get_color_mapping_procs, - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern_manage */ - NULL, /* fill_rectangle_hl_color */ - NULL, /* ics */ - NULL, /* fill_lin_tri */ - NULL, /* fill_lin_tri */ - NULL, /* fill_lin_tri */ - NULL, /* up_spot_eq_col */ - NULL, /* ret_dev */ - NULL, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - accum_dev_spec_op, - NULL, /* copy_planes */ - NULL, /* get_profile */ - gx_default_set_graphics_type_tag - } + devprocs_initialize(cpath_accum_initialize) }; /* Start accumulating a clipping path. */ diff --git a/base/gxclip.c b/base/gxclip.c index 5998e418c..b2b794ab0 100644 --- a/base/gxclip.c +++ b/base/gxclip.c @@ -50,85 +50,82 @@ static dev_proc_transform_pixel_region(clip_transform_pixel_region); static dev_proc_fill_stroke_path(clip_fill_stroke_path); /* The device descriptor. */ +static int +clipper_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, clip_open); + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, clip_fill_rectangle); + set_dev_proc(dev, copy_mono, clip_copy_mono); + set_dev_proc(dev, copy_color, clip_copy_color); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, gx_forward_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, get_alpha_bits, gx_forward_get_alpha_bits); + set_dev_proc(dev, copy_alpha, clip_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, fill_path, clip_fill_path); + set_dev_proc(dev, fill_mask, clip_fill_mask); + set_dev_proc(dev, strip_tile_rectangle, clip_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, clip_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, clip_get_clipping_box); + set_dev_proc(dev, get_bits_rectangle, clip_get_bits_rectangle); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, gx_forward_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_forward_encode_color); + set_dev_proc(dev, decode_color, gx_forward_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, clip_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gx_forward_include_color_space); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); + set_dev_proc(dev, copy_planes, clip_copy_planes); + set_dev_proc(dev, get_profile, gx_forward_get_profile); + set_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + set_dev_proc(dev, strip_copy_rop2, clip_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, clip_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, clip_copy_alpha_hl_color); + set_dev_proc(dev, transform_pixel_region, clip_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, clip_fill_stroke_path); + /* Ideally the following defaults would be filled in for us, but that + * doesn't work at the moment. */ + set_dev_proc(dev, sync_output, gx_default_sync_output); + set_dev_proc(dev, output_page, gx_default_output_page); + set_dev_proc(dev, close_device, gx_default_close_device); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, get_bits, gx_default_get_bits); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, stroke_path, gx_default_stroke_path); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, text_begin, gx_default_text_begin); + set_dev_proc(dev, fill_linear_color_scanline, gx_default_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, gx_default_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, gx_default_fill_linear_color_triangle); + + return 0; +} static const gx_device_clip gs_clip_device = {std_device_std_body(gx_device_clip, 0, "clipper", 0, 0, 1, 1), - {clip_open, - gx_forward_get_initial_matrix, - gx_default_sync_output, - gx_default_output_page, - gx_default_close_device, - gx_forward_map_rgb_color, - gx_forward_map_color_rgb, - clip_fill_rectangle, - gx_default_tile_rectangle, - clip_copy_mono, - clip_copy_color, - gx_default_draw_line, - gx_default_get_bits, - gx_forward_get_params, - gx_forward_put_params, - gx_forward_map_cmyk_color, - gx_forward_get_xfont_procs, - gx_forward_get_xfont_device, - gx_forward_map_rgb_alpha_color, - gx_forward_get_page_device, - gx_forward_get_alpha_bits, - clip_copy_alpha, - gx_forward_get_band, - gx_default_copy_rop, - clip_fill_path, - gx_default_stroke_path, - clip_fill_mask, - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - clip_strip_tile_rectangle, - clip_strip_copy_rop, - clip_get_clipping_box, - gx_default_begin_typed_image, - clip_get_bits_rectangle, - gx_forward_map_color_rgb_alpha, - gx_forward_create_compositor, - gx_forward_get_hardware_params, - gx_default_text_begin, - NULL, /* initialise */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color, - NULL, - clip_fill_rectangle_hl_color, - gx_forward_include_color_space, - gx_default_fill_linear_color_scanline, - gx_default_fill_linear_color_trapezoid, - gx_default_fill_linear_color_triangle, - gx_forward_update_spot_equivalent_colors, - gx_forward_ret_devn_params, - gx_forward_fillpage, - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - gx_forward_dev_spec_op, - clip_copy_planes, /* copy planes */ - gx_forward_get_profile, - gx_forward_set_graphics_type_tag, - clip_strip_copy_rop2, - clip_strip_tile_rect_devn, - clip_copy_alpha_hl_color, - NULL, /* process_page */ - clip_transform_pixel_region, - clip_fill_stroke_path, - } + devprocs_initialize(clipper_initialize) }; /* Make a clipping device. */ @@ -197,10 +194,14 @@ gx_make_clip_device_on_stack_if_needed(gx_device_clip * dev, const gx_clip_path return (gx_device *)dev; } void -gx_make_clip_device_in_heap(gx_device_clip * dev, const gx_clip_path *pcpath, gx_device *target, - gs_memory_t *mem) +gx_make_clip_device_in_heap(gx_device_clip *dev, + const gx_clip_path *pcpath, + gx_device *target, + gs_memory_t *mem) { - gx_device_init((gx_device *)dev, (const gx_device *)&gs_clip_device, mem, true); + /* Can never fail */ + (void)gx_device_init((gx_device *)dev, + (const gx_device *)&gs_clip_device, mem, true); dev->list = *gx_cpath_list(pcpath); dev->translation.x = 0; dev->translation.y = 0; @@ -212,7 +213,8 @@ gx_make_clip_device_in_heap(gx_device_clip * dev, const gx_clip_path *pcpath, gx dev->is_planar = target->is_planar; gx_device_set_target((gx_device_forward *)dev, target); gx_device_retain((gx_device *)dev, true); /* will free explicitly */ - (*dev_proc(dev, open_device)) ((gx_device *)dev); + /* Can never fail */ + (void)(*dev_proc(dev, open_device)) ((gx_device *)dev); } /* Define debugging statistics for the clipping loops. */ #if defined(DEBUG) && !defined(GS_THREADSAFE) diff --git a/base/gxclip2.c b/base/gxclip2.c index 8afd8b3ec..fd859af02 100644 --- a/base/gxclip2.c +++ b/base/gxclip2.c @@ -40,82 +40,80 @@ static dev_proc_strip_copy_rop(tile_clip_strip_copy_rop); static dev_proc_strip_copy_rop2(tile_clip_strip_copy_rop2); /* The device descriptor. */ +static int +tile_clipper_initialize(gx_device *dev) +{ + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, tile_clip_fill_rectangle); + set_dev_proc(dev, copy_mono, tile_clip_copy_mono); + set_dev_proc(dev, copy_color, tile_clip_copy_color); + set_dev_proc(dev, get_bits, gx_forward_get_bits); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, gx_forward_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, get_alpha_bits, gx_forward_get_alpha_bits); + set_dev_proc(dev, copy_alpha, tile_clip_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, strip_copy_rop, tile_clip_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); + set_dev_proc(dev, get_bits_rectangle, gx_forward_get_bits_rectangle); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, gx_no_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_forward_encode_color); + set_dev_proc(dev, decode_color, gx_forward_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, tile_clip_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gx_forward_include_color_space); + set_dev_proc(dev, fill_linear_color_scanline, gx_forward_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, gx_forward_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, gx_forward_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); + set_dev_proc(dev, copy_planes, tile_clip_copy_planes); + set_dev_proc(dev, strip_copy_rop2, tile_clip_strip_copy_rop2); + set_dev_proc(dev, copy_alpha_hl_color, tile_clip_copy_alpha_hl_color); + + /* Ideally the following defaults would be set up for us, but this + * does not currently work. */ + set_dev_proc(dev, open_device, gx_default_open_device); + set_dev_proc(dev, sync_output, gx_default_sync_output); + set_dev_proc(dev, output_page, gx_default_output_page); + set_dev_proc(dev, close_device, gx_default_close_device); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, gx_default_fill_path); + set_dev_proc(dev, stroke_path, gx_default_stroke_path); + set_dev_proc(dev, fill_mask, gx_default_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, text_begin, gx_default_text_begin); + set_dev_proc(dev, strip_tile_rect_devn, gx_default_strip_tile_rect_devn); + + return 0; +} + static const gx_device_tile_clip gs_tile_clip_device = {std_device_std_body_open(gx_device_tile_clip, 0, "tile clipper", 0, 0, 1, 1), - {gx_default_open_device, - gx_forward_get_initial_matrix, - gx_default_sync_output, - gx_default_output_page, - gx_default_close_device, - gx_forward_map_rgb_color, - gx_forward_map_color_rgb, - tile_clip_fill_rectangle, - gx_default_tile_rectangle, - tile_clip_copy_mono, - tile_clip_copy_color, - gx_default_draw_line, - gx_forward_get_bits, - gx_forward_get_params, - gx_forward_put_params, - gx_forward_map_cmyk_color, - gx_forward_get_xfont_procs, - gx_forward_get_xfont_device, - gx_forward_map_rgb_alpha_color, - gx_forward_get_page_device, - gx_forward_get_alpha_bits, - tile_clip_copy_alpha, - gx_forward_get_band, - gx_default_copy_rop, - gx_default_fill_path, - gx_default_stroke_path, - gx_default_fill_mask, - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - gx_default_strip_tile_rectangle, - tile_clip_strip_copy_rop, - gx_forward_get_clipping_box, - gx_default_begin_typed_image, - gx_forward_get_bits_rectangle, - gx_forward_map_color_rgb_alpha, - gx_no_create_compositor, - gx_forward_get_hardware_params, - gx_default_text_begin, - NULL, /* initialize */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color, - NULL, /* pattern_manage */ - tile_clip_fill_rectangle_hl_color, - gx_forward_include_color_space, - gx_forward_fill_linear_color_scanline, - gx_forward_fill_linear_color_trapezoid, - gx_forward_fill_linear_color_triangle, - gx_forward_update_spot_equivalent_colors, - gx_forward_ret_devn_params, - gx_forward_fillpage, - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - gx_forward_dev_spec_op, - tile_clip_copy_planes, - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - tile_clip_strip_copy_rop2, - gx_default_strip_tile_rect_devn, - tile_clip_copy_alpha_hl_color - } + devprocs_initialize(tile_clipper_initialize) }; /* Initialize a tile clipping device from a mask. */ diff --git a/base/gxclipm.c b/base/gxclipm.c index 8d80c13ca..0f0ec5116 100644 --- a/base/gxclipm.c +++ b/base/gxclipm.c @@ -37,85 +37,83 @@ static dev_proc_strip_copy_rop2(mask_clip_strip_copy_rop2); static dev_proc_get_clipping_box(mask_clip_get_clipping_box); /* The device descriptor. */ + +static int +mask_clip_initialize(gx_device *dev) +{ + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, mask_clip_fill_rectangle); + set_dev_proc(dev, copy_mono, mask_clip_copy_mono); + set_dev_proc(dev, copy_color, mask_clip_copy_color); + set_dev_proc(dev, get_bits, gx_forward_get_bits); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, gx_forward_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, get_alpha_bits, gx_forward_get_alpha_bits); + set_dev_proc(dev, copy_alpha, mask_clip_copy_alpha); + set_dev_proc(dev, get_band, gx_forward_get_band); + set_dev_proc(dev, strip_tile_rectangle, mask_clip_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, mask_clip_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, mask_clip_get_clipping_box); + set_dev_proc(dev, get_bits_rectangle, gx_forward_get_bits_rectangle); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, gx_no_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_forward_encode_color); + set_dev_proc(dev, decode_color, gx_forward_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, mask_clip_fill_rectangle_hl_color); + set_dev_proc(dev, include_color_space, gx_forward_include_color_space); + set_dev_proc(dev, fill_linear_color_scanline, gx_forward_fill_linear_color_scanline); + set_dev_proc(dev, fill_linear_color_trapezoid, gx_forward_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, gx_forward_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, gx_forward_fillpage); + set_dev_proc(dev, dev_spec_op, gx_forward_dev_spec_op); + set_dev_proc(dev, get_profile, gx_forward_get_profile); + set_dev_proc(dev, set_graphics_type_tag, gx_forward_set_graphics_type_tag); + set_dev_proc(dev, strip_copy_rop2, mask_clip_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, mask_clip_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, mask_clip_copy_alpha_hl_color); + set_dev_proc(dev, transform_pixel_region, gx_default_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, gx_forward_fill_stroke_path); + + /* Ideally these defaults would be set up automatically for us. */ + set_dev_proc(dev, open_device, gx_default_open_device); + set_dev_proc(dev, sync_output, gx_default_sync_output); + set_dev_proc(dev, output_page, gx_default_output_page); + set_dev_proc(dev, close_device, gx_default_close_device); + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, obsolete_draw_line, gx_default_draw_line); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, gx_default_fill_path); + set_dev_proc(dev, stroke_path, gx_default_stroke_path); + set_dev_proc(dev, fill_mask, gx_default_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, text_begin, gx_default_text_begin); + + return 0; + } + const gx_device_mask_clip gs_mask_clip_device = {std_device_std_body_open(gx_device_mask_clip, 0, "mask clipper", 0, 0, 1, 1), - {gx_default_open_device, - gx_forward_get_initial_matrix, - gx_default_sync_output, - gx_default_output_page, - gx_default_close_device, - gx_forward_map_rgb_color, - gx_forward_map_color_rgb, - mask_clip_fill_rectangle, - gx_default_tile_rectangle, - mask_clip_copy_mono, - mask_clip_copy_color, - gx_default_draw_line, - gx_forward_get_bits, - gx_forward_get_params, - gx_forward_put_params, - gx_forward_map_cmyk_color, - gx_forward_get_xfont_procs, - gx_forward_get_xfont_device, - gx_forward_map_rgb_alpha_color, - gx_forward_get_page_device, - gx_forward_get_alpha_bits, - mask_clip_copy_alpha, - gx_forward_get_band, - gx_default_copy_rop, - gx_default_fill_path, - gx_default_stroke_path, - gx_default_fill_mask, - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - mask_clip_strip_tile_rectangle, - mask_clip_strip_copy_rop, - mask_clip_get_clipping_box, - gx_default_begin_typed_image, - gx_forward_get_bits_rectangle, - gx_forward_map_color_rgb_alpha, - gx_no_create_compositor, - gx_forward_get_hardware_params, - gx_default_text_begin, - NULL, /* initialize */ - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color, - NULL, /* pattern_manage */ - mask_clip_fill_rectangle_hl_color, - gx_forward_include_color_space, - gx_forward_fill_linear_color_scanline, - gx_forward_fill_linear_color_trapezoid, - gx_forward_fill_linear_color_triangle, - gx_forward_update_spot_equivalent_colors, - gx_forward_ret_devn_params, - gx_forward_fillpage, - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - gx_forward_dev_spec_op, - NULL, - gx_forward_get_profile, - gx_forward_set_graphics_type_tag, - mask_clip_strip_copy_rop2, - mask_clip_strip_tile_rect_devn, - mask_clip_copy_alpha_hl_color, - NULL, - gx_default_transform_pixel_region, - gx_forward_fill_stroke_path, - } + devprocs_initialize(mask_clip_initialize) }; /* Fill a rectangle with a hl color, painting through the mask */ diff --git a/base/gxclist.c b/base/gxclist.c index 21b1d870d..86565bd53 100644 --- a/base/gxclist.c +++ b/base/gxclist.c @@ -120,95 +120,79 @@ private_st_clist_icctable(); /* Forward declarations of driver procedures */ dev_proc_open_device(clist_open); dev_proc_output_page(clist_output_page); -static dev_proc_close_device(clist_close); +dev_proc_close_device(clist_close); static dev_proc_get_band(clist_get_band); /* Driver procedures defined in other files are declared in gxcldev.h. */ /* Other forward declarations */ static int clist_put_current_params(gx_device_clist_writer *cldev); +static int +clist_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, clist_open); + set_dev_proc(dev, get_initial_matrix, gx_forward_get_initial_matrix); + set_dev_proc(dev, sync_output, gx_default_sync_output); + set_dev_proc(dev, output_page, clist_output_page); + set_dev_proc(dev, close_device, clist_close); + set_dev_proc(dev, map_rgb_color, gx_forward_map_rgb_color); + set_dev_proc(dev, map_color_rgb, gx_forward_map_color_rgb); + set_dev_proc(dev, fill_rectangle, clist_fill_rectangle); + set_dev_proc(dev, copy_mono, clist_copy_mono); + set_dev_proc(dev, copy_color, clist_copy_color); + set_dev_proc(dev, get_params, gx_forward_get_params); + set_dev_proc(dev, put_params, gx_forward_put_params); + set_dev_proc(dev, map_cmyk_color, gx_forward_map_cmyk_color); + set_dev_proc(dev, get_xfont_procs, gx_forward_get_xfont_procs); + set_dev_proc(dev, get_xfont_device, gx_forward_get_xfont_device); + set_dev_proc(dev, map_rgb_alpha_color, gx_forward_map_rgb_alpha_color); + set_dev_proc(dev, get_page_device, gx_forward_get_page_device); + set_dev_proc(dev, get_alpha_bits, gx_forward_get_alpha_bits); + set_dev_proc(dev, copy_alpha, clist_copy_alpha); + set_dev_proc(dev, get_band, clist_get_band); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, clist_fill_path); + set_dev_proc(dev, stroke_path, clist_stroke_path); + set_dev_proc(dev, fill_mask, clist_fill_mask); + set_dev_proc(dev, fill_trapezoid, clist_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, clist_fill_parallelogram); + set_dev_proc(dev, fill_triangle, clist_fill_triangle); + set_dev_proc(dev, strip_tile_rectangle, clist_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, clist_strip_copy_rop); + set_dev_proc(dev, get_clipping_box, gx_forward_get_clipping_box); + set_dev_proc(dev, begin_typed_image, clist_begin_typed_image); + set_dev_proc(dev, get_bits_rectangle, clist_get_bits_rectangle); + set_dev_proc(dev, map_color_rgb_alpha, gx_forward_map_color_rgb_alpha); + set_dev_proc(dev, create_compositor, clist_create_compositor); + set_dev_proc(dev, get_hardware_params, gx_forward_get_hardware_params); + set_dev_proc(dev, get_color_mapping_procs, gx_forward_get_color_mapping_procs); + set_dev_proc(dev, get_color_comp_index, gx_forward_get_color_comp_index); + set_dev_proc(dev, encode_color, gx_forward_encode_color); + set_dev_proc(dev, decode_color, gx_forward_decode_color); + set_dev_proc(dev, fill_rectangle_hl_color, clist_fill_rectangle_hl_color); + set_dev_proc(dev, fill_linear_color_trapezoid, clist_fill_linear_color_trapezoid); + set_dev_proc(dev, fill_linear_color_triangle, clist_fill_linear_color_triangle); + set_dev_proc(dev, update_spot_equivalent_colors, gx_forward_update_spot_equivalent_colors); + set_dev_proc(dev, ret_devn_params, gx_forward_ret_devn_params); + set_dev_proc(dev, fillpage, clist_fillpage); + set_dev_proc(dev, dev_spec_op, clist_dev_spec_op); + set_dev_proc(dev, copy_planes, clist_copy_planes); + set_dev_proc(dev, strip_copy_rop2, clist_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, clist_strip_tile_rect_devn); + set_dev_proc(dev, copy_alpha_hl_color, clist_copy_alpha_hl_color); + set_dev_proc(dev, process_page, clist_process_page); + set_dev_proc(dev, fill_stroke_path, clist_fill_stroke_path); + + return 0; +} + /* The device procedures */ -const gx_device_procs gs_clist_device_procs = { - clist_open, - gx_forward_get_initial_matrix, - gx_default_sync_output, - clist_output_page, - clist_close, - gx_forward_map_rgb_color, - gx_forward_map_color_rgb, - clist_fill_rectangle, - gx_default_tile_rectangle, - clist_copy_mono, - clist_copy_color, - gx_default_draw_line, - gx_default_get_bits, - gx_forward_get_params, - gx_forward_put_params, - gx_forward_map_cmyk_color, - gx_forward_get_xfont_procs, - gx_forward_get_xfont_device, - gx_forward_map_rgb_alpha_color, - gx_forward_get_page_device, - gx_forward_get_alpha_bits, - clist_copy_alpha, - clist_get_band, - gx_default_copy_rop, - clist_fill_path, - clist_stroke_path, - clist_fill_mask, - clist_fill_trapezoid, - clist_fill_parallelogram, - clist_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - clist_strip_tile_rectangle, - clist_strip_copy_rop, - gx_forward_get_clipping_box, - clist_begin_typed_image, - clist_get_bits_rectangle, - gx_forward_map_color_rgb_alpha, - clist_create_compositor, - gx_forward_get_hardware_params, - gx_default_text_begin, - NULL, /* initialize */ - gx_default_begin_transparency_group, /* begin_transparency_group */ - gx_default_end_transparency_group, /* end_transparency_group */ - gx_default_begin_transparency_mask, /* begin_transparency_mask */ - gx_default_end_transparency_mask, /* end_transparency_mask */ - gx_default_discard_transparency_layer, /* discard_transparency_layer */ - gx_forward_get_color_mapping_procs, - gx_forward_get_color_comp_index, - gx_forward_encode_color, - gx_forward_decode_color, - gx_default_pattern_manage, /* pattern_manage */ - clist_fill_rectangle_hl_color, - gx_default_include_color_space, - gx_default_fill_linear_color_scanline, - clist_fill_linear_color_trapezoid, - clist_fill_linear_color_triangle, - gx_forward_update_spot_equivalent_colors, - gx_forward_ret_devn_params, - clist_fillpage, - gx_default_push_transparency_state, /* push_transparency_state */ - gx_default_pop_transparency_state, /* pop_transparency_state */ - gx_default_put_image, /* put_image */ - clist_dev_spec_op, - clist_copy_planes, /* copy planes */ - gx_default_get_profile, - gx_default_set_graphics_type_tag, - clist_strip_copy_rop2, - clist_strip_tile_rect_devn, - clist_copy_alpha_hl_color, - clist_process_page, - gx_default_transform_pixel_region, - clist_fill_stroke_path, -}; +const gx_device_procs gs_clist_device_procs = + devprocs_initialize(clist_initialize); /*------------------- Choose the implementation ----------------------- - For chossing the clist i/o implementation by makefile options + For choosing the clist i/o implementation by makefile options we define global variables, which are initialized with file/memory io procs when they are included into the build. */ @@ -741,7 +725,7 @@ errxit: return code; } -static int +int clist_close(gx_device *dev) { int i; @@ -1414,6 +1398,9 @@ clist_make_accum_device(gs_memory_t *mem, gx_device *target, const char *dname, cwdev->UseCIEColor = target->UseCIEColor; cwdev->LockSafetyParams = true; cwdev->procs = gs_clist_device_procs; + /* Hacky - we know this can't fail. */ + (void)cwdev->procs.initialize((gx_device *)cwdev); + gx_device_fill_in_procs((gx_device *)cwdev); gx_device_copy_color_params((gx_device *)cwdev, target); rc_assign(cwdev->target, target, "clist_make_accum_device"); clist_init_io_procs(cdev, use_memory_clist); @@ -1550,7 +1537,7 @@ open_c: pdev->clist_disable_mask, pdev->page_uses_transparency, pdev->page_uses_overprint); - code = (*gs_clist_device_procs.open_device)( (gx_device *)pcldev ); + code = clist_open( (gx_device *)pcldev ); if (code < 0) { /* If there wasn't enough room, and we haven't */ /* already shrunk the buffer, try enlarging it. */ diff --git a/base/gxclpage.c b/base/gxclpage.c index 18ff9b81c..0e358da3d 100644 --- a/base/gxclpage.c +++ b/base/gxclpage.c @@ -24,6 +24,8 @@ #include "string_.h" #include <ctype.h> /* for isalpha, etc. */ +extern dev_proc_open_device(clist_open); + /* Save the current clist state into a saved page structure, * and optionally stashes the files into the given save_files * pointers. @@ -106,7 +108,7 @@ params_out: } } /* Now re-open the clist device so that we get new files for the next page */ - return (*gs_clist_device_procs.open_device) ((gx_device *) pdev); + return clist_open((gx_device *) pdev); } /* Save a page. The elements are allocated by this function in non_gc_memory */ diff --git a/base/gxdevcli.h b/base/gxdevcli.h index a9aa6a74f..282e879b0 100644 --- a/base/gxdevcli.h +++ b/base/gxdevcli.h @@ -1669,6 +1669,53 @@ typedef struct { dev_t_proc_fill_stroke_path((*fill_stroke_path), dev_t);\ } +#define devprocs_initialize(p_init) {\ + NULL, /* open */\ + NULL, /* get_initial_matrix */\ + NULL, /* sync_output */\ + NULL, /* output_page */\ + NULL, /* close */\ + NULL, /* map_rgb_color */\ + NULL, /* map_color_rgb */\ + NULL, /* fill_rectangle */\ + NULL, /* tile_rectangle */\ + NULL, /* copy_mono */\ + NULL, /* copy_color */\ + NULL, /* draw_line */\ + NULL, /* get_bits */\ + NULL, /* get_params */\ + NULL, /* put_params */\ + NULL, /* map_cmyk_color */\ + NULL, /* get_xfont_procs */\ + NULL, /* get_xfont_device */\ + NULL, /* map_rgb_alpha_color */\ + NULL, /* gx_page_device_get_page_device */\ + NULL, /* get_alpha_bits */\ + NULL, /* copy_alpha */\ + NULL, /* get_band */\ + NULL, /* copy_rop */\ + NULL, /* fill_path */\ + NULL, /* stroke_path */\ + NULL, /* fill_mask */\ + NULL, /* fill_trapezoid */\ + NULL, /* fill_parallelogram */\ + NULL, /* fill_triangle */\ + NULL, /* draw_thin_line */\ + NULL, /* begin_image */\ + NULL, /* image_data */\ + NULL, /* end_image */\ + NULL, /* strip_tile_rectangle */\ + NULL, /* strip_copy_rop, */\ + NULL, /* get_clipping_box */\ + NULL, /* begin_typed_image */\ + NULL, /* get_bits_rectangle */\ + NULL, /* map_color_rgb_alpha */\ + NULL, /* create_compositor */\ + NULL, /* get_hardware_params */\ + NULL, /* text_begin */\ + p_init /* initialize */\ +} + /* * Provide procedures for passing image data. image_data and end_image * are the equivalents of the obsolete driver procedures. image_plane_data @@ -1885,13 +1932,16 @@ extern_st(st_device_null); * about what this means. Normally, devices created for temporary use have * internal = true (retained = false). */ -void gx_device_init(gx_device * dev, const gx_device * proto, - gs_memory_t * mem, bool internal); +int gx_device_init(gx_device * dev, const gx_device * proto, + gs_memory_t * mem, bool internal); /* * Identical to gx_device_init, except that the reference counting is set * up so that it doesn't attempt to free the device structure when the last * instance is removed, and the device is always internal (never retained). + * + * If the device uses an initialize proc (and it should!) it can never + * fail. */ void gx_device_init_on_stack(gx_device * dev, const gx_device * proto, gs_memory_t * mem); diff --git a/base/gxdevice.h b/base/gxdevice.h index 16686d346..1506004ee 100644 --- a/base/gxdevice.h +++ b/base/gxdevice.h @@ -358,6 +358,7 @@ dev_proc_encode_color(gx_default_8bit_map_gray_color); dev_proc_decode_color(gx_default_8bit_map_color_gray); /* Default implementations for forwarding devices */ +void gx_forward_initialize_procs(gx_device *dev); dev_proc_close_device(gx_forward_close_device); dev_proc_get_initial_matrix(gx_forward_get_initial_matrix); dev_proc_sync_output(gx_forward_sync_output); @@ -422,6 +423,7 @@ dev_proc_strip_tile_rect_devn(gx_forward_strip_tile_rect_devn); dev_proc_copy_alpha_hl_color(gx_forward_copy_alpha_hl_color); dev_proc_transform_pixel_region(gx_forward_transform_pixel_region); dev_proc_fill_stroke_path(gx_forward_fill_stroke_path); +void gx_forward_device_initialize_procs(gx_device *dev); /* ---------------- Implementation utilities ---------------- */ int gx_default_get_param(gx_device *dev, char *Param, void *list); @@ -677,7 +679,7 @@ typedef struct { } generic_subclass_data; -int gx_copy_device_procs(gx_device *dest, gx_device *src, gx_device *prototype); +int gx_copy_device_procs(gx_device *dest, const gx_device *src, const gx_device *prototype); int gx_device_subclass(gx_device *dev_to_subclass, gx_device *new_prototype, unsigned int private_data_size); int gx_device_unsubclass(gx_device *dev); int gx_update_from_subclass(gx_device *dev); diff --git a/base/gxmclip.c b/base/gxmclip.c index b2b59e354..02c909226 100644 --- a/base/gxmclip.c +++ b/base/gxmclip.c @@ -73,10 +73,13 @@ gx_mask_clip_initialize(gx_device_mask_clip * cdev, tile_clip_buffer_size / (bits->raster + sizeof(byte *)); if (mem == NULL) - gx_device_init_on_stack((gx_device *)cdev, (const gx_device *)proto, + gx_device_init_on_stack((gx_device *)cdev, + (const gx_device *)proto, tdev->memory); else - gx_device_init((gx_device *)cdev, (const gx_device *)proto, mem, true); + (void)gx_device_init((gx_device *)cdev, + (const gx_device *)proto, + mem, true); cdev->width = tdev->width; cdev->height = tdev->height; cdev->color_info = tdev->color_info; diff --git a/base/gxpcmap.c b/base/gxpcmap.c index c8b304cca..2cff86eac 100644 --- a/base/gxpcmap.c +++ b/base/gxpcmap.c @@ -101,97 +101,65 @@ static dev_proc_fill_rectangle_hl_color(pattern_accum_fill_rectangle_hl_color); dev_proc_dev_spec_op(pattern_accum_dev_spec_op); /* The device descriptor */ +static int +pattern_accum_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, pattern_accum_open); + set_dev_proc(dev, close_device, pattern_accum_close); + set_dev_proc(dev, fill_rectangle, pattern_accum_fill_rectangle); + set_dev_proc(dev, copy_mono, pattern_accum_copy_mono); + set_dev_proc(dev, copy_color, pattern_accum_copy_color); + set_dev_proc(dev, get_clipping_box, gx_get_largest_clipping_box); + set_dev_proc(dev, get_bits_rectangle, pattern_accum_get_bits_rectangle); + set_dev_proc(dev, fill_rectangle_hl_color, pattern_accum_fill_rectangle_hl_color); + set_dev_proc(dev, dev_spec_op, pattern_accum_dev_spec_op); + set_dev_proc(dev, copy_planes, pattern_accum_copy_planes); + + /* It would be much nicer if gx_device_init set the following + * defaults for us, but that doesn't work for some reason. */ + set_dev_proc(dev, tile_rectangle, gx_default_tile_rectangle); + set_dev_proc(dev, get_bits, gx_default_get_bits); + set_dev_proc(dev, copy_alpha, gx_default_copy_alpha); + set_dev_proc(dev, copy_rop, gx_default_copy_rop); + set_dev_proc(dev, fill_path, gx_default_fill_path); + set_dev_proc(dev, stroke_path, gx_default_stroke_path); + set_dev_proc(dev, fill_mask, gx_default_fill_mask); + set_dev_proc(dev, fill_trapezoid, gx_default_fill_trapezoid); + set_dev_proc(dev, fill_parallelogram, gx_default_fill_parallelogram); + set_dev_proc(dev, fill_triangle, gx_default_fill_triangle); + set_dev_proc(dev, draw_thin_line, gx_default_draw_thin_line); + set_dev_proc(dev, begin_image, gx_default_begin_image); + set_dev_proc(dev, image_data, gx_default_image_data); + set_dev_proc(dev, end_image, gx_default_end_image); + set_dev_proc(dev, strip_tile_rectangle, gx_default_strip_tile_rectangle); + set_dev_proc(dev, strip_copy_rop, gx_default_strip_copy_rop); + set_dev_proc(dev, begin_typed_image, gx_default_begin_typed_image); + set_dev_proc(dev, create_compositor, gx_default_create_compositor); + set_dev_proc(dev, text_begin, gx_default_text_begin); + set_dev_proc(dev, strip_copy_rop2, gx_default_strip_copy_rop2); + set_dev_proc(dev, strip_tile_rect_devn, gx_default_strip_tile_rect_devn); + set_dev_proc(dev, transform_pixel_region, gx_default_transform_pixel_region); + set_dev_proc(dev, fill_stroke_path, gx_default_fill_stroke_path); + + return 0; +} + static const gx_device_pattern_accum gs_pattern_accum_device = {std_device_std_body_type_open(gx_device_pattern_accum, 0, "pattern accumulator", &st_device_pattern_accum, 0, 0, 72, 72), - { - /* NOTE: all drawing procedures must be defaulted, not forwarded. */ - pattern_accum_open, - NULL, /* get_initial_matrix */ - NULL, /* sync_output */ - NULL, /* output_page */ - pattern_accum_close, - NULL, /* map_rgb_color */ - NULL, /* map_color_rgb */ - pattern_accum_fill_rectangle, - gx_default_tile_rectangle, - pattern_accum_copy_mono, - pattern_accum_copy_color, - NULL, /* obselete_draw_line */ - gx_default_get_bits, - NULL, /* get_params */ - NULL, /* put_params */ - NULL, /* map_cmyk_color */ - NULL, /* get_xfont_procs */ - NULL, /* get_xfont_device */ - NULL, /* map_rgb_alpha_color */ - NULL, /* get_page_device */ - NULL, /* get_alpha_bits */ - gx_default_copy_alpha, - NULL, /* get_band */ - gx_default_copy_rop, - gx_default_fill_path, - gx_default_stroke_path, - gx_default_fill_mask, - gx_default_fill_trapezoid, - gx_default_fill_parallelogram, - gx_default_fill_triangle, - gx_default_draw_thin_line, - gx_default_begin_image, - gx_default_image_data, - gx_default_end_image, - gx_default_strip_tile_rectangle, - gx_default_strip_copy_rop, - gx_get_largest_clipping_box, - gx_default_begin_typed_image, - pattern_accum_get_bits_rectangle, - NULL, /* map_color_rgb_alpha */ - gx_default_create_compositor, - NULL, /* create_compositor */ - gx_default_text_begin, - gx_default_initialize, - NULL, /* begin_transparency_group */ - NULL, /* end_transparency_group */ - NULL, /* begin_transparency_mask */ - NULL, /* end_transparency_mask */ - NULL, /* discard_transparency_layer */ - NULL, /* get_color_mapping_procs */ - NULL, /* get_color_comp_index */ - NULL, /* encode_color */ - NULL, /* decode_color */ - NULL, /* pattern_manage */ - pattern_accum_fill_rectangle_hl_color, /* fill_rectangle_hl_color */ - NULL, /* include_color_space */ - NULL, /* fill_linear_color_scanline */ - NULL, /* fill_linear_color_trapezoid */ - NULL, /* fill_linear_color_triangle */ - NULL, /* update_spot_equivalent_colors */ - NULL, /* ret_devn_params */ - NULL, /* fillpage */ - NULL, /* push_transparency_state */ - NULL, /* pop_transparency_state */ - NULL, /* put_image */ - pattern_accum_dev_spec_op, /* dev_spec_op */ - pattern_accum_copy_planes, /* copy_planes */ - NULL, /* get_profile */ - NULL, /* set_graphics_type_tag */ - gx_default_strip_copy_rop2, - gx_default_strip_tile_rect_devn, - NULL, /* alpha_hl_color */ - NULL, /* process_page */ - gx_default_transform_pixel_region, /* NOT the default forwarding one */ - gx_default_fill_stroke_path, -}, + devprocs_initialize(pattern_accum_initialize), 0, /* target */ 0, 0, 0, 0 /* bitmap_memory, bits, mask, instance */ }; +extern dev_proc_open_device(clist_open); + int pattern_clist_open_device(gx_device *dev) { /* This function is defiled only for clist_init_bands. */ - return gs_clist_device_procs.open_device(dev); + return clist_open(dev); } static dev_proc_create_buf_device(dummy_create_buf_device) @@ -296,9 +264,9 @@ gx_pattern_accum_alloc(gs_memory_t * mem, gs_memory_t * storage_memory, emprintf(mem, "not using clist even though clist is requested\n"); #endif pinst->is_clist = false; - gx_device_init((gx_device *)adev, - (const gx_device *)&gs_pattern_accum_device, - mem, true); + (void)gx_device_init((gx_device *)adev, + (const gx_device *)&gs_pattern_accum_device, + mem, true); adev->instance = pinst; adev->bitmap_memory = storage_memory; fdev = (gx_device_forward *)adev; diff --git a/base/gzspotan.c b/base/gzspotan.c index 897dc7e3a..345443943 100644 --- a/base/gzspotan.c +++ b/base/gzspotan.c @@ -205,63 +205,20 @@ trap_is_last(const gx_san_trap *list, const gx_san_trap *t) /* The device descriptor */ /* Many of these procedures won't be called; they are set to NULL. */ +static int +san_initialize(gx_device *dev) +{ + set_dev_proc(dev, open_device, san_open); + set_dev_proc(dev, close_device, san_close); + set_dev_proc(dev, fill_path, gx_default_fill_path); + set_dev_proc(dev, get_clipping_box, san_get_clipping_box); + + return 0; +} static const gx_device_spot_analyzer gx_spot_analyzer_device = {std_device_std_body(gx_device_spot_analyzer, 0, "spot analyzer", 0, 0, 1, 1), - {san_open, - NULL, - NULL, - NULL, - san_close, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - gx_default_fill_path, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - san_get_clipping_box, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - gx_default_initialize, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - } + devprocs_initialize(san_initialize) }; int @@ -419,8 +376,11 @@ gx_san__obtain(gs_memory_t *mem, gx_device_spot_analyzer **ppadev) &st_device_spot_analyzer, "gx_san__obtain"); if (padev == 0) return_error(gs_error_VMerror); - gx_device_init((gx_device *)padev, (const gx_device *)&gx_spot_analyzer_device, - mem, false); + code = gx_device_init((gx_device *)padev, + (const gx_device *)&gx_spot_analyzer_device, + mem, false); + if (code < 0) + return code; code = gs_opendevice((gx_device *)padev); if (code < 0) { gs_free_object(mem, padev, "gx_san__obtain"); |