[gs-cvs] gs/src
Raph Levien
raph at casper.ghostscript.com
Wed Oct 16 23:09:36 PDT 2002
Update of /cvs/ghostscript/gs/src
In directory casper:/tmp/cvs-serv8310/src
Modified Files:
gdevbmpc.c gdevdflt.c gdevijs.c gdevpdf.c gxcmap.c gxcmap.h
Log Message:
Fix: Introduces "backwards compatible" encode_color routine for
grayscale devices which supply map_rgb_color but not encode_color.
Fixes gray modes in pdfwrite and ijs devices, among others.
Index: gdevbmpc.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevbmpc.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- gdevbmpc.c 22 Aug 2002 07:12:28 -0000 1.6
+++ gdevbmpc.c 17 Oct 2002 06:09:33 -0000 1.7
@@ -174,6 +174,9 @@
q.reserved = 0;
for (i = 0; i != 1 << depth; i++) {
+ /* Note that the use of map_color_rgb is deprecated in
+ favor of decode_color. This should work, though, because
+ backwards compatibility is preserved. */
(*dev_proc(pdev, map_color_rgb))((gx_device *)pdev,
(gx_color_index)i, rgb);
q.red = gx_color_value_to_byte(rgb[0]);
Index: gdevdflt.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevdflt.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- gdevdflt.c 8 Oct 2002 00:49:49 -0000 1.8
+++ gdevdflt.c 17 Oct 2002 06:09:34 -0000 1.9
@@ -55,8 +55,11 @@
/* use encode_color if it has been provided */
if ((encode_proc = dev_proc(dev, encode_color)) == 0) {
- if ( (dev->color_info.num_components == 1 ||
- dev->color_info.num_components == 3 ) &&
+ if (dev->color_info.num_components == 1 &&
+ dev_proc(dev, map_rgb_color) != 0) {
+ set_cinfo_polarity(dev, GX_CINFO_POLARITY_ADDITIVE);
+ encode_proc = gx_backwards_compatible_gray_encode;
+ } else if ( (dev->color_info.num_components == 3 ) &&
(encode_proc = dev_proc(dev, map_rgb_color)) != 0 )
set_cinfo_polarity(dev, GX_CINFO_POLARITY_ADDITIVE);
else if ( dev->color_info.num_components == 4 &&
@@ -425,9 +428,10 @@
fill_dev_proc(dev, finish_copydevice, gx_default_finish_copydevice);
set_dev_proc(dev, encode_color, get_encode_color(dev));
- set_dev_proc(dev, map_cmyk_color, dev_proc(dev, encode_color));
- set_dev_proc(dev, map_rgb_color, dev_proc(dev, encode_color));
-
+ if (dev->color_info.num_components == 3)
+ set_dev_proc(dev, map_rgb_color, dev_proc(dev, encode_color));
+ if (dev->color_info.num_components == 4)
+ set_dev_proc(dev, map_cmyk_color, dev_proc(dev, encode_color));
if ( dev->color_info.separable_and_linear == GX_CINFO_SEP_LIN ) {
fill_dev_proc(dev, encode_color, gx_default_encode_color);
Index: gdevijs.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevijs.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- gdevijs.c 28 Mar 2002 20:44:35 -0000 1.4
+++ gdevijs.c 17 Oct 2002 06:09:34 -0000 1.5
@@ -1050,14 +1050,26 @@
ijsdev->procs.map_rgb_color = gx_default_gray_map_rgb_color;
ijsdev->procs.map_color_rgb = gx_default_gray_map_color_rgb;
}
+ ijsdev->procs.encode_color = gx_default_gray_fast_encode;
+ ijsdev->procs.decode_color = gx_default_decode_color;
+ dci.polarity = GX_CINFO_POLARITY_ADDITIVE;
+ dci.gray_index = 0;
} else if (!strcmp (ColorSpace, "DeviceRGB")) {
components = 3;
ijsdev->procs.map_rgb_color = gx_default_rgb_map_rgb_color;
ijsdev->procs.map_color_rgb = gx_default_rgb_map_color_rgb;
+ ijsdev->procs.encode_color = gx_default_rgb_map_rgb_color;
+ ijsdev->procs.decode_color = gx_default_rgb_map_color_rgb;
+ dci.polarity = GX_CINFO_POLARITY_ADDITIVE;
+ dci.gray_index = GX_CINFO_COMP_NO_INDEX;
} else if (!strcmp (ColorSpace, "DeviceCMYK")) {
components = 4;
ijsdev->procs.map_cmyk_color = cmyk_8bit_map_cmyk_color;
ijsdev->procs.map_color_rgb = cmyk_8bit_map_color_rgb;
+ ijsdev->procs.encode_color = cmyk_8bit_map_cmyk_color;
+ ijsdev->procs.decode_color = gx_default_decode_color;
+ dci.polarity = GX_CINFO_POLARITY_SUBTRACTIVE;
+ dci.gray_index = 3;
} else {
return -1;
}
@@ -1070,8 +1082,10 @@
dci.dither_grays = maxvalue+1;
dci.dither_colors = components > 1 ? maxvalue+1 : 0;
- /* restore old anti_alias info */
- dci.anti_alias = ijsdev->color_info.anti_alias;
+ dci.separable_and_linear = GX_CINFO_SEP_LIN;
+ dci.cm_name = ijsdev->ColorSpace;
+
+ set_linear_color_bits_mask_shift((gx_device *)ijsdev);
ijsdev->color_info = dci;
Index: gdevpdf.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdf.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- gdevpdf.c 7 Oct 2002 13:56:41 -0000 1.54
+++ gdevpdf.c 17 Oct 2002 06:09:34 -0000 1.55
@@ -407,8 +407,8 @@
set_dev_proc(pdev, map_cmyk_color, NULL);
set_dev_proc(pdev, get_color_mapping_procs, gx_default_DevGray_get_color_mapping_procs);
set_dev_proc(pdev, get_color_comp_index, gx_default_DevGray_get_color_comp_index);
- set_dev_proc(pdev, encode_color, gx_default_gray_map_rgb_color);
- set_dev_proc(pdev, decode_color, gx_default_gray_map_color_rgb);
+ set_dev_proc(pdev, encode_color, gx_default_gray_encode);
+ set_dev_proc(pdev, decode_color, gx_default_decode_color);
} else if (!strcmp(pdev->color_info.cm_name, "DeviceRGB")) {
set_dev_proc(pdev, map_rgb_color, gx_default_rgb_map_rgb_color);
set_dev_proc(pdev, map_color_rgb, gx_default_rgb_map_color_rgb);
Index: gxcmap.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gxcmap.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- gxcmap.c 8 Oct 2002 00:49:49 -0000 1.10
+++ gxcmap.c 17 Oct 2002 06:09:34 -0000 1.11
@@ -149,6 +149,24 @@
return cv[0] * (dev->color_info.max_gray + 1) / (gx_max_color_value + 1);
}
+/**
+ * This routine is provided for old devices which provide a
+ * map_rgb_color routine but not encode_color. New devices are
+ * encouraged either to use the defaults or to set encode_color rather
+ * than map_rgb_color.
+ **/
+gx_color_index
+gx_backwards_compatible_gray_encode(gx_device *dev,
+ const gx_color_value cv[])
+{
+ gx_color_value gray_val = cv[0];
+ gx_color_value rgb_cv[3];
+
+ rgb_cv[0] = gray_val;
+ rgb_cv[1] = gray_val;
+ rgb_cv[2] = gray_val;
+ return (*dev_proc(dev, map_rgb_color))(dev, rgb_cv);
+}
/* -------- Default color space to color model conversion routines -------- */
Index: gxcmap.h
===================================================================
RCS file: /cvs/ghostscript/gs/src/gxcmap.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- gxcmap.h 22 Aug 2002 07:12:29 -0000 1.6
+++ gxcmap.h 17 Oct 2002 06:09:34 -0000 1.7
@@ -254,6 +254,13 @@
dev_proc_encode_color(gx_default_gray_encode);
/*
+ * This is the default encode_color routine for grayscale devices
+ * that provide a map_rgb_color procedure, but don't themselves
+ * provide encode_color.
+ */
+dev_proc_encode_color(gx_backwards_compatible_gray_encode);
+
+/*
* These are the default routines for converting a gx_color_index into
* a list of device colorant values
*/
More information about the gs-cvs
mailing list