[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