summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Deutschmann <whissi@gentoo.org>2019-10-15 12:24:12 +0200
committerThomas Deutschmann <whissi@gentoo.org>2020-08-13 11:26:55 +0200
commite088156d5b620e5e639580dacf85c6dc13823c74 (patch)
tree57f5c025e203279944da512166c20bc0521d8ccd /base/gdevepo.c
downloadghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.gz
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.bz2
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.zip
Import Ghostscript 9.50ghostscript-9.50
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'base/gdevepo.c')
-rw-r--r--base/gdevepo.c689
1 files changed, 689 insertions, 0 deletions
diff --git a/base/gdevepo.c b/base/gdevepo.c
new file mode 100644
index 00000000..e57c1db9
--- /dev/null
+++ b/base/gdevepo.c
@@ -0,0 +1,689 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* Device for erasepage optimization subclass device */
+
+#include "math_.h"
+#include "memory_.h"
+#include "gx.h"
+#include "gserrors.h"
+#include "gsparam.h"
+#include "gxdevice.h"
+#include "gsdevice.h" /* requires gsmatrix.h */
+#include "gxdcolor.h" /* for gx_device_black/white */
+#include "gxiparam.h" /* for image source size */
+#include "gxgstate.h"
+#include "gxpaint.h"
+#include "gxpath.h"
+#include "gxcpath.h"
+#include "gxcmap.h" /* color mapping procs */
+#include "gsstype.h"
+#include "gdevprn.h"
+#include "gdevp14.h" /* Needed to patch up the procs after compositor creation */
+#include "gximage.h" /* For gx_image_enum */
+#include "gdevsclass.h"
+#include "gsstate.h"
+#include "gxdevsop.h"
+#include "gdevepo.h"
+#include <stdlib.h>
+
+/* Shorter macros for sanity's sake */
+#define DPRINTF(m,f) if_debug0m(gs_debug_flag_epo_details, m,f)
+#define DPRINTF1(m,f,a1) if_debug1m(gs_debug_flag_epo_details, m,f, a1)
+
+/* This is only called for debugging */
+extern void epo_disable(int flag);
+
+/* Device procedures, we need quite a lot of them */
+static dev_proc_output_page(epo_output_page);
+static dev_proc_fill_rectangle(epo_fill_rectangle);
+static dev_proc_draw_line(epo_draw_line);
+static dev_proc_fill_path(epo_fill_path);
+static dev_proc_fill_mask(epo_fill_mask);
+static dev_proc_fill_trapezoid(epo_fill_trapezoid);
+static dev_proc_fill_parallelogram(epo_fill_parallelogram);
+static dev_proc_fill_triangle(epo_fill_triangle);
+static dev_proc_draw_thin_line(epo_draw_thin_line);
+static dev_proc_fill_rectangle_hl_color(epo_fill_rectangle_hl_color);
+static dev_proc_fill_linear_color_scanline(epo_fill_linear_color_scanline);
+static dev_proc_fill_linear_color_trapezoid(epo_fill_linear_color_trapezoid);
+static dev_proc_fill_linear_color_triangle(epo_fill_linear_color_triangle);
+static dev_proc_put_image(epo_put_image);
+static dev_proc_fillpage(epo_fillpage);
+static dev_proc_create_compositor(epo_create_compositor);
+static dev_proc_text_begin(epo_text_begin);
+static dev_proc_finish_copydevice(epo_finish_copydevice);
+static dev_proc_begin_image(epo_begin_image);
+static dev_proc_begin_typed_image(epo_begin_typed_image);
+static dev_proc_stroke_path(epo_stroke_path);
+static dev_proc_tile_rectangle(epo_tile_rectangle);
+static dev_proc_copy_mono(epo_copy_mono);
+static dev_proc_copy_color(epo_copy_color);
+static dev_proc_get_bits(epo_get_bits);
+static dev_proc_copy_alpha(epo_copy_alpha);
+static dev_proc_copy_rop(epo_copy_rop);
+static dev_proc_strip_tile_rectangle(epo_strip_tile_rectangle);
+static dev_proc_strip_copy_rop(epo_strip_copy_rop);
+static dev_proc_strip_copy_rop2(epo_strip_copy_rop2);
+static dev_proc_copy_planes(epo_copy_planes);
+static dev_proc_copy_alpha_hl_color(epo_copy_alpha_hl_color);
+static dev_proc_process_page(epo_process_page);
+static dev_proc_transform_pixel_region(epo_transform_pixel_region);
+
+/* The device prototype */
+#define MAX_COORD (max_int_in_fixed - 1000)
+#define MAX_RESOLUTION 4000
+
+#define public_st_epo_device() /* in gsdevice.c */\
+ gs_public_st_complex_only(st_epo_device, gx_device, EPO_DEVICENAME,\
+ 0, epo_enum_ptrs, epo_reloc_ptrs, default_subclass_finalize)
+
+static
+ENUM_PTRS_WITH(epo_enum_ptrs, gx_device *dev);
+return 0; /* default case */
+case 0:ENUM_RETURN(gx_device_enum_ptr(dev->parent));
+case 1:ENUM_RETURN(gx_device_enum_ptr(dev->child));
+ENUM_PTRS_END
+static RELOC_PTRS_WITH(epo_reloc_ptrs, gx_device *dev)
+{
+ dev->parent = gx_device_reloc_ptr(dev->parent, gcst);
+ dev->child = gx_device_reloc_ptr(dev->child, gcst);
+}RELOC_PTRS_END
+
+public_st_epo_device();
+
+const
+gx_device_epo gs_epo_device =
+{
+ std_device_dci_type_body(gx_device_epo, 0, EPO_DEVICENAME, &st_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_finish_copydevice, /* finish_copydevice */
+ 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
+ }
+};
+
+#undef MAX_COORD
+#undef MAX_RESOLUTION
+
+static bool
+is_device_installed(gx_device *dev, const char *name)
+{
+ while (dev) {
+ if (!strcmp(dev->dname, name)) {
+ return true;
+ }
+ dev = dev->child;
+ }
+ return false;
+}
+
+/* See if this is a device we can optimize
+ * (currently only the ones that use gx_default_fillpage, which
+ * automatically excludes clist and pdfwrite, etc)
+ */
+static bool
+device_wants_optimization(gx_device *dev)
+{
+ return (!gs_is_null_device(dev) && dev_proc(dev, fillpage) == gx_default_fillpage);
+}
+
+/* Use this when debugging to enable/disable epo
+ * (1 - disable, 0 - enable)
+ */
+void
+epo_disable(int flag)
+{
+ gs_debug[gs_debug_flag_epo_disable] = flag;
+}
+
+int
+epo_check_and_install(gx_device *dev)
+{
+ int code = 0;
+ bool is_installed;
+ bool can_optimize = false;
+
+ /* Debugging mode to totally disable this */
+ if (gs_debug_c(gs_debug_flag_epo_disable)) {
+ return code;
+ }
+
+ DPRINTF1(dev->memory, "current device is %s\n", dev->dname);
+
+ is_installed = is_device_installed(dev, EPO_DEVICENAME);
+
+ if (is_installed) {
+ DPRINTF1(dev->memory, "device %s already installed\n", EPO_DEVICENAME);
+ /* This is looking for the case where the device
+ * changed into something we can't optimize, after it was already installed
+ * (could be clist or some other weird thing)
+ */
+ if (dev->child) {
+ can_optimize = device_wants_optimization(dev->child);
+ }
+ if (!can_optimize) {
+ DPRINTF1(dev->memory, "child %s can't be optimized, uninstalling\n", dev->child->dname);
+ /* Not doing any pending fillpages because we are about to do
+ * a fillpage anyway
+ */
+ gx_device_unsubclass(dev);
+ return code;
+ }
+ } else {
+ can_optimize = device_wants_optimization(dev);
+ }
+
+ /* Already installed, nothing to do */
+ if (is_installed) {
+ return code;
+ }
+
+ /* See if we can optimize */
+ if (!can_optimize) {
+ DPRINTF(dev->memory, "device doesn't want optimization, not installing\n");
+ return code;
+ }
+
+ /* Install subclass for optimization */
+ code = gx_device_subclass(dev, (gx_device *)&gs_epo_device, sizeof(erasepage_subclass_data));
+ if (code < 0) {
+ DPRINTF1(dev->memory, "ERROR installing device %s\n", EPO_DEVICENAME);
+ return code;
+ }
+
+ DPRINTF1(dev->memory, "SUCCESS installed device %s\n", dev->dname);
+ return code;
+}
+
+static int
+epo_handle_erase_page(gx_device *dev)
+{
+ erasepage_subclass_data *data = (erasepage_subclass_data *)dev->subclass_data;
+ int code = 0;
+
+ if (gs_debug_c(gs_debug_flag_epo_install_only)) {
+ gx_device_unsubclass(dev);
+ DPRINTF1(dev->memory, "Uninstall erasepage, device=%s\n", dev->dname);
+ return code;
+ }
+
+ DPRINTF1(dev->memory, "Do fillpage, Uninstall erasepage, device %s\n", dev->dname);
+
+ /* Just do a fill_rectangle (using saved color) */
+ if (dev->child) {
+ code = dev_proc(dev->child, fill_rectangle)(dev->child,
+ 0, 0,
+ dev->child->width,
+ dev->child->height,
+ data->last_color);
+ }
+ /* Remove the epo device */
+ gx_device_unsubclass(dev);
+
+ return code;
+}
+
+int epo_fillpage(gx_device *dev, gs_gstate * pgs, gx_device_color *pdevc)
+{
+ erasepage_subclass_data *data = (erasepage_subclass_data *)dev->subclass_data;
+
+ if (gs_debug_c(gs_debug_flag_epo_install_only)) {
+ return default_subclass_fillpage(dev, pgs, pdevc);
+ }
+
+ /* If color is not pure, don't defer this, uninstall and do it now */
+ if (!color_is_pure(pdevc)) {
+ DPRINTF(dev->memory, "epo_fillpage(), color is not pure, uninstalling\n");
+ gx_device_unsubclass(dev);
+ return dev_proc(dev, fillpage)(dev, pgs, pdevc);
+ }
+
+ /* Save the color being requested, and swallow the fillpage */
+ data->last_color = pdevc->colors.pure;
+
+ DPRINTF(dev->memory, "Swallowing fillpage\n");
+ return 0;
+}
+
+int epo_output_page(gx_device *dev, int num_copies, int flush)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, output_page)(dev, num_copies, flush);
+}
+
+int epo_fill_rectangle(gx_device *dev, int x, int y, int width, int height, gx_color_index color)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_rectangle)(dev, x, y, width, height, color);
+}
+
+int epo_draw_line(gx_device *dev, int x0, int y0, int x1, int y1, gx_color_index color)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, obsolete_draw_line)(dev, x0, y0, x1, y1, color);
+}
+
+int epo_fill_path(gx_device *dev, const gs_gstate *pgs, gx_path *ppath,
+ const gx_fill_params *params,
+ const gx_drawing_color *pdcolor, const gx_clip_path *pcpath)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_path)(dev, pgs, ppath, params, pdcolor, pcpath);
+}
+
+int epo_fill_mask(gx_device *dev, const byte *data, int data_x, int raster, gx_bitmap_id id,
+ int x, int y, int width, int height,
+ const gx_drawing_color *pdcolor, int depth,
+ gs_logical_operation_t lop, const gx_clip_path *pcpath)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_mask)(dev, data, data_x, raster, id, x, y, width, height, pdcolor, depth, lop, pcpath);
+}
+
+int epo_fill_trapezoid(gx_device *dev, const gs_fixed_edge *left, const gs_fixed_edge *right,
+ fixed ybot, fixed ytop, bool swap_axes,
+ const gx_drawing_color *pdcolor, gs_logical_operation_t lop)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_trapezoid)(dev, left, right, ybot, ytop, swap_axes, pdcolor, lop);
+}
+
+int epo_fill_parallelogram(gx_device *dev, fixed px, fixed py, fixed ax, fixed ay, fixed bx, fixed by,
+ const gx_drawing_color *pdcolor, gs_logical_operation_t lop)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_parallelogram)(dev, px, py, ax, ay, bx, by, pdcolor, lop);
+}
+
+int epo_fill_triangle(gx_device *dev, fixed px, fixed py, fixed ax, fixed ay, fixed bx, fixed by,
+ const gx_drawing_color *pdcolor, gs_logical_operation_t lop)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_triangle)(dev, px, py, ax, ay, bx, by, pdcolor, lop);
+}
+
+int epo_draw_thin_line(gx_device *dev, fixed fx0, fixed fy0, fixed fx1, fixed fy1,
+ const gx_drawing_color *pdcolor, gs_logical_operation_t lop,
+ fixed adjustx, fixed adjusty)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, draw_thin_line)(dev, fx0, fy0, fx1, fy1, pdcolor, lop, adjustx, adjusty);
+}
+
+int epo_fill_rectangle_hl_color(gx_device *dev, const gs_fixed_rect *rect,
+ const gs_gstate *pgs, const gx_drawing_color *pdcolor, const gx_clip_path *pcpath)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_rectangle_hl_color)(dev, rect, pgs, pdcolor, pcpath);
+}
+
+int epo_fill_linear_color_scanline(gx_device *dev, const gs_fill_attributes *fa,
+ int i, int j, int w, const frac31 *c0, const int32_t *c0_f, const int32_t *cg_num,
+ int32_t cg_den)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_linear_color_scanline)(dev, fa, i, j, w, c0, c0_f, cg_num, cg_den);
+}
+
+int epo_fill_linear_color_trapezoid(gx_device *dev, const gs_fill_attributes *fa,
+ const gs_fixed_point *p0, const gs_fixed_point *p1,
+ const gs_fixed_point *p2, const gs_fixed_point *p3,
+ const frac31 *c0, const frac31 *c1,
+ const frac31 *c2, const frac31 *c3)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_linear_color_trapezoid)(dev, fa, p0, p1, p2, p3, c0, c1, c2, c3);
+}
+
+int epo_fill_linear_color_triangle(gx_device *dev, const gs_fill_attributes *fa,
+ const gs_fixed_point *p0, const gs_fixed_point *p1,
+ const gs_fixed_point *p2, const frac31 *c0, const frac31 *c1, const frac31 *c2)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, fill_linear_color_triangle)(dev, fa, p0, p1, p2, c0, c1, c2);
+}
+
+int epo_put_image(gx_device *dev, gx_device *mdev, const byte **buffers, int num_chan, int x, int y,
+ int width, int height, int row_stride,
+ int alpha_plane_index, int tag_plane_index)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, put_image)(dev, mdev, buffers, num_chan, x, y, width, height, row_stride, alpha_plane_index, tag_plane_index);
+}
+
+int epo_create_compositor(gx_device *dev, gx_device **pcdev, const gs_composite_t *pcte,
+ gs_gstate *pgs, gs_memory_t *memory, gx_device *cdev)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, create_compositor)(dev, pcdev, pcte, pgs, memory, cdev);
+}
+
+int epo_text_begin(gx_device *dev, gs_gstate *pgs, const gs_text_params_t *text,
+ gs_font *font, gx_path *path, const gx_device_color *pdcolor, const gx_clip_path *pcpath,
+ gs_memory_t *memory, gs_text_enum_t **ppte)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, text_begin)(dev, pgs, text, font, path, pdcolor, pcpath, memory, ppte);
+}
+
+int epo_finish_copydevice(gx_device *dev, const gx_device *from_dev)
+{
+ /* 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
+ these pointers won't be set, anyway.
+ */
+ dev->child = NULL;
+ dev->parent = NULL;
+ dev->subclass_data = NULL;
+ /* Only allow copying the prototype. */
+ return (from_dev->memory ? gs_note_error(gs_error_rangecheck) : 0);
+}
+
+int epo_begin_image(gx_device *dev, const gs_gstate *pgs, const gs_image_t *pim,
+ gs_image_format_t format, const gs_int_rect *prect,
+ const gx_drawing_color *pdcolor, const gx_clip_path *pcpath,
+ gs_memory_t *memory, gx_image_enum_common_t **pinfo)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, begin_image)(dev, pgs, pim, format, prect, pdcolor, pcpath, memory, pinfo);
+}
+
+int epo_begin_typed_image(gx_device *dev, const gs_gstate *pgs, const gs_matrix *pmat,
+ const gs_image_common_t *pic, const gs_int_rect *prect,
+ const gx_drawing_color *pdcolor, const gx_clip_path *pcpath,
+ gs_memory_t *memory, gx_image_enum_common_t **pinfo)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, begin_typed_image)(dev, pgs, pmat, pic, prect, pdcolor, pcpath, memory, pinfo);
+}
+
+int epo_stroke_path(gx_device *dev, const gs_gstate *pgs, gx_path *ppath,
+ const gx_stroke_params *params,
+ const gx_drawing_color *pdcolor, const gx_clip_path *pcpath)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, stroke_path)(dev, pgs, ppath, params, pdcolor, pcpath);
+}
+
+int epo_tile_rectangle(gx_device *dev, const gx_tile_bitmap *tile, int x, int y, int width, int height,
+ gx_color_index color0, gx_color_index color1,
+ int phase_x, int phase_y)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, tile_rectangle)(dev, tile, x, y, width, height, color0, color1, phase_x, phase_y);
+}
+
+int epo_copy_mono(gx_device *dev, const byte *data, int data_x, int raster, gx_bitmap_id id,
+ int x, int y, int width, int height,
+ gx_color_index color0, gx_color_index color1)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_mono)(dev, data, data_x, raster, id, x, y, width, height, color0, color1);
+}
+
+int epo_copy_color(gx_device *dev, const byte *data, int data_x, int raster, gx_bitmap_id id,\
+ int x, int y, int width, int height)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_color)(dev, data, data_x, raster, id, x, y, width, height);
+}
+
+int epo_get_bits(gx_device *dev, int y, byte *data, byte **actual_data)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, get_bits)(dev, y, data, actual_data);
+}
+
+int epo_copy_alpha(gx_device *dev, const byte *data, int data_x,
+ int raster, gx_bitmap_id id, int x, int y, int width, int height,
+ gx_color_index color, int depth)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_alpha)(dev, data, data_x, raster, id, x, y, width, height, color, depth);
+}
+
+int epo_copy_rop(gx_device *dev, const byte *sdata, int sourcex, uint sraster, gx_bitmap_id id,
+ const gx_color_index *scolors,
+ const gx_tile_bitmap *texture, const gx_color_index *tcolors,
+ int x, int y, int width, int height,
+ int phase_x, int phase_y, gs_logical_operation_t lop)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_rop)(dev, sdata, sourcex, sraster, id, scolors, texture, tcolors, x, y, width, height, phase_x, phase_y, lop);
+}
+
+int epo_strip_tile_rectangle(gx_device *dev, const gx_strip_bitmap *tiles, int x, int y, int width, int height,
+ gx_color_index color0, gx_color_index color1,
+ int phase_x, int phase_y)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, strip_tile_rectangle)(dev, tiles, x, y, width, height, color0, color1, phase_x, phase_y);
+}
+
+int epo_strip_copy_rop(gx_device *dev, const byte *sdata, int sourcex, uint sraster, gx_bitmap_id id,
+ const gx_color_index *scolors,
+ const gx_strip_bitmap *textures, const gx_color_index *tcolors,
+ int x, int y, int width, int height,
+ int phase_x, int phase_y, gs_logical_operation_t lop)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, strip_copy_rop)(dev, sdata, sourcex, sraster, id, scolors, textures, tcolors, x, y, width, height, phase_x, phase_y, lop);
+}
+
+int epo_strip_copy_rop2(gx_device *dev, const byte *sdata, int sourcex, uint sraster, gx_bitmap_id id,
+ const gx_color_index *scolors, const gx_strip_bitmap *textures, const gx_color_index *tcolors,
+ int x, int y, int width, int height, int phase_x, int phase_y, gs_logical_operation_t lop, uint planar_height)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, strip_copy_rop2)(dev, sdata, sourcex, sraster, id, scolors, textures, tcolors, x, y, width, height, phase_x, phase_y, lop, planar_height);
+}
+
+int epo_copy_planes(gx_device *dev, const byte *data, int data_x, int raster, gx_bitmap_id id,
+ int x, int y, int width, int height, int plane_height)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_planes)(dev, data, data_x, raster, id, x, y, width, height, plane_height);
+}
+
+int epo_copy_alpha_hl_color(gx_device *dev, const byte *data, int data_x,
+ int raster, gx_bitmap_id id, int x, int y, int width, int height,
+ const gx_drawing_color *pdcolor, int depth)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, copy_alpha_hl_color)(dev, data, data_x, raster, id, x, y, width, height, pdcolor, depth);
+}
+
+int epo_process_page(gx_device *dev, gx_process_page_options_t *options)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, process_page)(dev, options);
+}
+
+int epo_transform_pixel_region(gx_device *dev, transform_pixel_region_reason reason, transform_pixel_region_data *data)
+{
+ int code = epo_handle_erase_page(dev);
+
+ if (code != 0)
+ return code;
+ return dev_proc(dev, transform_pixel_region)(dev, reason, data);
+}