summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2021-04-08 16:29:55 +0100
committerRobin Watts <Robin.Watts@artifex.com>2021-04-20 15:03:02 +0100
commite1a3956f252404f07d93be47f7845b23e4a2c4de (patch)
tree9f702e5846dbeba82ccf4b65a28434a8b80de708 /base
parent8d83e9871f14d44c7120f0e170c43064c6a738ea (diff)
downloadghostpdl-e1a3956f252404f07d93be47f7845b23e4a2c4de.tar.gz
Move devices away from static init of procs.
Diffstat (limited to 'base')
-rw-r--r--base/gdevbbox.c107
-rw-r--r--base/gdevdevn.c88
-rw-r--r--base/gdevdflt.c174
-rw-r--r--base/gdevepo.c117
-rw-r--r--base/gdevflp.c140
-rw-r--r--base/gdevhit.c74
-rw-r--r--base/gdevmem.c11
-rw-r--r--base/gdevmplt.c90
-rw-r--r--base/gdevnfwd.c199
-rw-r--r--base/gdevnup.c95
-rw-r--r--base/gdevoflt.c114
-rw-r--r--base/gdevp14.c578
-rw-r--r--base/gdevplnx.c131
-rw-r--r--base/gdevprn.c221
-rw-r--r--base/gdevprn.h100
-rw-r--r--base/gdevrops.c119
-rw-r--r--base/gdevsclass.c89
-rw-r--r--base/gsdevice.c35
-rw-r--r--base/gsovrc.c387
-rw-r--r--base/gxacpath.c85
-rw-r--r--base/gxclip.c162
-rw-r--r--base/gxclip2.c144
-rw-r--r--base/gxclipm.c150
-rw-r--r--base/gxclist.c149
-rw-r--r--base/gxclpage.c4
-rw-r--r--base/gxdevcli.h54
-rw-r--r--base/gxdevice.h4
-rw-r--r--base/gxmclip.c7
-rw-r--r--base/gxpcmap.c132
-rw-r--r--base/gzspotan.c72
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");