[gs-commits] ghostpdl branch, master, updated. ghostpdl-9.02-593-g50d947b
Robin Watts
robin at ghostscript.com
Thu Sep 15 23:08:16 UTC 2011
The ghostpdl branch, master has been updated
via 50d947b5f4801d1042166acbd8b5aed982f57697 (commit)
from 6aa157b438ac69f9732b9f7b29e8570cceb50e8e (commit)
----------------------------------------------------------------------
commit 50d947b5f4801d1042166acbd8b5aed982f57697
Author: Robin Watts <Robin.Watts at artifex.com>
Date: Thu Sep 15 20:36:31 2011 +0100
Allow planar device to make use of special getbits handling for 1bit cmyk.
We have a special function gx_get_bits_copy_cmyk_1bit, used to quickly
map cmyk (1bpc) to rgb. Our use of this is dependant on the
gxdso_is_std_cmyk_1bit call. Unfortunately this was broken for planar
devices, so plank was never getting the speed benefits of this routine.
Fixed here.
diff --git a/gs/base/gdevmpla.c b/gs/base/gdevmpla.c
index 81eaccf..1b5f88a 100644
--- a/gs/base/gdevmpla.c
+++ b/gs/base/gdevmpla.c
@@ -33,6 +33,10 @@ static dev_proc_strip_tile_rectangle(mem_planar_strip_tile_rectangle);
static dev_proc_strip_copy_rop(mem_planar_strip_copy_rop);
static dev_proc_get_bits_rectangle(mem_planar_get_bits_rectangle);
+/* It's a bit nasty to have to fork the planar dev_spec_op like this, but
+ * the forwarding nature of the device means that the function pointer test
+ * for the map_cmyk_color call fails if we let it fall through to the
+ * default device. */
static int
mem_planar_dev_spec_op(gx_device *pdev, int dev_spec_op,
void *data, int size)
@@ -42,6 +46,17 @@ mem_planar_dev_spec_op(gx_device *pdev, int dev_spec_op,
return gx_default_dev_spec_op(pdev, dev_spec_op, data, size);
}
+static int
+mem_planar_dev_spec_op_cmyk4(gx_device *pdev, int dev_spec_op,
+ void *data, int size)
+{
+ if (dev_spec_op == gxdso_is_native_planar)
+ return 1;
+ if (dev_spec_op == gxdso_is_std_cmyk_1bit)
+ return 1;
+ return gx_default_dev_spec_op(pdev, dev_spec_op, data, size);
+}
+
/*
* Set up a planar memory device, after calling gs_make_mem_device but
* before opening the device. The pre-existing device provides the color
@@ -99,6 +114,7 @@ gdev_mem_set_planar(gx_device_memory * mdev, int num_planes,
} else {
set_dev_proc(mdev, fill_rectangle, mem_planar_fill_rectangle);
set_dev_proc(mdev, copy_mono, mem_planar_copy_mono);
+ set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op);
if ((mdev->color_info.depth == 24) &&
(mdev->num_planes == 3) &&
(mdev->planes[0].depth == 8) && (mdev->planes[0].shift == 16) &&
@@ -110,16 +126,16 @@ gdev_mem_set_planar(gx_device_memory * mdev, int num_planes,
(mdev->planes[0].depth == 1) && (mdev->planes[0].shift == 3) &&
(mdev->planes[1].depth == 1) && (mdev->planes[1].shift == 2) &&
(mdev->planes[2].depth == 1) && (mdev->planes[2].shift == 1) &&
- (mdev->planes[3].depth == 1) && (mdev->planes[3].shift == 0))
+ (mdev->planes[3].depth == 1) && (mdev->planes[3].shift == 0)) {
set_dev_proc(mdev, copy_color, mem_planar_copy_color_4to1);
- else
+ set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op_cmyk4);
+ } else
set_dev_proc(mdev, copy_color, mem_planar_copy_color);
set_dev_proc(mdev, copy_alpha, gx_default_copy_alpha);
set_dev_proc(mdev, copy_plane, mem_planar_copy_plane);
set_dev_proc(mdev, strip_tile_rectangle, mem_planar_strip_tile_rectangle);
set_dev_proc(mdev, strip_copy_rop, mem_planar_strip_copy_rop);
set_dev_proc(mdev, get_bits_rectangle, mem_planar_get_bits_rectangle);
- set_dev_proc(mdev, dev_spec_op, mem_planar_dev_spec_op);
}
return 0;
}
Summary of changes:
gs/base/gdevmpla.c | 22 +++++++++++++++++++---
1 files changed, 19 insertions(+), 3 deletions(-)
More information about the gs-commits
mailing list