[gs-cvs] rev 8161 - trunk/gs/src

ray at ghostscript.com ray at ghostscript.com
Wed Aug 1 14:20:57 PDT 2007


Author: ray
Date: 2007-08-01 14:20:57 -0700 (Wed, 01 Aug 2007)
New Revision: 8161

Modified:
   trunk/gs/src/gdevdflt.c
   trunk/gs/src/gdevstc.c
   trunk/gs/src/gspaint.c
   trunk/gs/src/gxcmap.c
Log:
Fix problem seen with stcolor device where the get_color_mapping_procs
device proc was NULL, causing SEGV. Bug #689371.

DETAILS:

The fix was local to gdevstc.c. The other modules were changed to
add protection in case other devices (such as all of the new devices
in contrib) don't manage to change the get_color_mapping_procs from
the usual default of NULL in the device structure. Rather than
dprintf or error messages that may be supressed with #if DEBUG.
I elected to use eprintf.

Note that the get_color_mapping_procs is usually set up by gdevdflt
gx_device_fill_in_procs, but there are several cases where we don't
know what to do, so we set the gx_error_get_color_mapping_procs.

The detection in gs_fillpage will usually result in a single error
message then we return gs_error_Fatal (-100).

EXPECTED DIFFERENCES:

None.



Modified: trunk/gs/src/gdevdflt.c
===================================================================
--- trunk/gs/src/gdevdflt.c	2007-08-01 19:18:12 UTC (rev 8160)
+++ trunk/gs/src/gdevdflt.c	2007-08-01 21:20:57 UTC (rev 8161)
@@ -604,7 +604,8 @@
 		fill_dev_proc( dev,
                            get_color_mapping_procs,
                            gx_default_DevGray_get_color_mapping_procs );
-            }
+            } else
+		fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
 	}
         fill_dev_proc( dev,
                        get_color_comp_index,
@@ -621,14 +622,8 @@
                            get_color_comp_index,
                            gx_default_DevRGB_get_color_comp_index );
             } else {
-#if 0
-                fill_dev_proc( dev,
-                           get_color_mapping_procs,
-                           gx_default_DevCMY_get_color_mapping_procs );
-                fill_dev_proc( dev,
-                           get_color_comp_index,
-                           gx_default_DevCMY_get_color_comp_index );
-#endif
+		fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
+		fill_dev_proc(dev, get_color_comp_index, gx_error_get_color_comp_index);
 	    }
         }
         break;
@@ -638,8 +633,10 @@
         fill_dev_proc(dev, get_color_comp_index, gx_default_DevCMYK_get_color_comp_index);
         break;
     default:		/* Unknown color model - set error handlers */
-        fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
-        fill_dev_proc(dev, get_color_comp_index, gx_error_get_color_comp_index);
+	if (dev_proc(dev, get_color_mapping_procs) == NULL) {
+	    fill_dev_proc(dev, get_color_mapping_procs, gx_error_get_color_mapping_procs);
+	    fill_dev_proc(dev, get_color_comp_index, gx_error_get_color_comp_index);
+	}
     }
 
     set_dev_proc(dev, decode_color, get_decode_color(dev));

Modified: trunk/gs/src/gdevstc.c
===================================================================
--- trunk/gs/src/gdevstc.c	2007-08-01 19:18:12 UTC (rev 8160)
+++ trunk/gs/src/gdevstc.c	2007-08-01 21:20:57 UTC (rev 8161)
@@ -1793,25 +1793,40 @@
 
       switch(sd->color_info.num_components) { /* Establish color-procs */
       case 1:
+	 sd->color_info.polarity = GX_CINFO_POLARITY_ADDITIVE;
          set_dev_proc(sd,map_rgb_color, stc_map_gray_color);
          set_dev_proc(sd,map_cmyk_color,gx_default_map_cmyk_color);
          set_dev_proc(sd,map_color_rgb, stc_map_color_gray);
 	 set_dev_proc(sd,encode_color, stc_map_gray_color);
          set_dev_proc(sd,decode_color, stc_map_color_gray);
+         set_dev_proc(sd, get_color_mapping_procs,
+                           gx_default_DevGray_get_color_mapping_procs);
+         set_dev_proc(sd, get_color_comp_index,
+                       gx_default_DevGray_get_color_comp_index );
          cv[0] = cv[1] = cv[2] = gx_max_color_value;
          white = stc_map_gray_color((gx_device *) sd, cv);
          break;
       case 3:
+	 sd->color_info.polarity = GX_CINFO_POLARITY_ADDITIVE;
          set_dev_proc(sd,map_rgb_color, stc_map_rgb_color);
          set_dev_proc(sd,map_cmyk_color,gx_default_map_cmyk_color);
          set_dev_proc(sd,map_color_rgb, stc_map_color_rgb);
 	 set_dev_proc(sd,encode_color, stc_map_rgb_color);
          set_dev_proc(sd,decode_color, stc_map_color_rgb);
+         set_dev_proc(sd, get_color_mapping_procs,
+                           gx_default_DevRGB_get_color_mapping_procs);
+         set_dev_proc(sd, get_color_comp_index,
+                       gx_default_DevRGB_get_color_comp_index );
          cv[0] = cv[1] = cv[2] = gx_max_color_value;
          white = stc_map_rgb_color((gx_device *) sd, cv);
          break;
       default:
+	 sd->color_info.polarity = GX_CINFO_POLARITY_SUBTRACTIVE;
          set_dev_proc(sd,map_rgb_color, gx_default_map_rgb_color);
+         set_dev_proc(sd, get_color_mapping_procs,
+                           gx_default_DevCMYK_get_color_mapping_procs);
+         set_dev_proc(sd, get_color_comp_index,
+                       gx_default_DevCMYK_get_color_comp_index );
          if(sd->stc.flags & STCCMYK10) {
             set_dev_proc(sd,map_cmyk_color,stc_map_cmyk10_color);
             set_dev_proc(sd,map_color_rgb, stc_map_color_cmyk10);

Modified: trunk/gs/src/gspaint.c
===================================================================
--- trunk/gs/src/gspaint.c	2007-08-01 19:18:12 UTC (rev 8160)
+++ trunk/gs/src/gspaint.c	2007-08-01 21:20:57 UTC (rev 8161)
@@ -67,18 +67,23 @@
 int
 gs_fillpage(gs_state * pgs)
 {
-    gx_device *dev;
+    gx_device *dev = gs_currentdevice(pgs);
     int code = 0;
     gs_logical_operation_t save_lop;
     bool hl_color_available;
 
+    /* If we get here without a valid get_color_mapping_procs, fail */
+    if (dev_proc(dev, get_color_mapping_procs) == NULL || 
+        dev_proc(dev, get_color_mapping_procs) == gx_error_get_color_mapping_procs) {
+	eprintf1("\n   *** Error: No get_color_mapping_procs for device: %s\n", dev->dname);
+	return_error(gs_error_Fatal);
+    }
     /* Processing a fill object operation */
     gs_set_object_tag(pgs, GS_PATH_TAG);
 
     gx_set_dev_color(pgs);
     hl_color_available = gx_hld_is_hl_color_available((gs_imager_state *)pgs, 
 						    pgs->dev_color);
-    dev = gs_currentdevice(pgs);
     /* Fill the page directly, ignoring clipping. */
     /* Use the default RasterOp. */
     save_lop = pgs->log_op;

Modified: trunk/gs/src/gxcmap.c
===================================================================
--- trunk/gs/src/gxcmap.c	2007-08-01 19:18:12 UTC (rev 8160)
+++ trunk/gs/src/gxcmap.c	2007-08-01 21:20:57 UTC (rev 8161)
@@ -365,12 +365,21 @@
 {
     /*
      * We should never get here.  If we do then we do not have a "get_color_mapping_procs"
-     * routine for the device.
+     * routine for the device. This will be noisy, but better than returning NULL which
+     * would lead to SEGV (Segmentation Fault) errors when this is used.
      */
-#ifdef DEBUG
-    dprintf("No get_color_mapping_procs proc defined for device.\n");
-#endif
-    return NULL;
+    eprintf1("No get_color_mapping_procs proc defined for device '%s'\n", dev->dname);
+    switch (dev->color_info.num_components) {
+      case 1:     /* DeviceGray or DeviceInvertGray */
+	return gx_default_DevGray_get_color_mapping_procs(dev);
+
+      case 3:
+	return gx_default_DevRGB_get_color_mapping_procs(dev);
+
+      case 4:
+      default:		/* Unknown color model - punt with CMYK */
+        return gx_default_DevCMYK_get_color_mapping_procs(dev);
+    }
 }
     
 /* ----- Default color component name to colorant index conversion routines ------ */



More information about the gs-cvs mailing list