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

leonardo at ghostscript.com leonardo at ghostscript.com
Thu Aug 2 01:53:09 PDT 2007


Author: leonardo
Date: 2007-08-02 01:53:09 -0700 (Thu, 02 Aug 2007)
New Revision: 8170

Modified:
   trunk/gs/src/gdevm4.c
   trunk/gs/src/gdevp14.c
   trunk/gs/src/gdevp14.h
   trunk/gs/src/lib.mak
Log:
Fix (transparency in clist) : Write transparent paths and images to clist as high level objcts.

DETAILS :

Bug 689186 "PDF segfaults or exits with no output".

With the test case the old code creates a 2.5Gb clist file, 
because it transformes transparent paths and images into rectangles.
The new code writes them as high level objects,
so that the clist file reduces to 477Mb.

1. (gdevp14.c) The old code appears to provide all necessary
methods for writing paths and images to clist as high level objects,
but doesn't call them. To activate them we simply replace default implementations
with forwarding methods in pdf14_clist_*_device.

2. (gdevp14.c) The old code sets the lop_pdf14 flag to
the clist reader's imager state. Particularly
it may be set when calling p14dev->pdf14_procs->put_image.
It causes gx_image_enum_begin to fail,
and the image silently dissappers from the output.
We fixed it with resetting the flag immediately before
calling p14dev->pdf14_procs->put_image.
A better way would be to synchronize log_op
in clist_create_compositor, but we don't like to
write it to all bands as other compoitor commands do.

3. (gdevp14.h, gdevp14.c) New fields inserted into pdf14_device_t
to provide a synchronization of encode_color, decode_color, get_color_mapping_procs,
get_color_comp_index with changing color_info. Debugged with pkmraw -r300 Bug688631.pdf .
Without them the 1bpc color conversions 
were called from pdf14_cmap_cmyk_direct with an 8bpc color,
causing an almost white page instead blue axial and radial shadings.

4. (gdevm4.c) The old code defines a wrong color_info for mem_mapped4_device.
It defines 3 components instead the correct value 4 (3 colored and 1 gray).

5. (gdevp14.c) During the clist playback the new code does not change color_info
for the clist writer (p14dev->target->color_info). We marked this change
with the comment :
/* Disabled because *p14dev has no forwarding methods during the clist playback. */
We ise #if 0 because we're not sure why the old code does so.
We suspect it was done by a mistake and has no any effect.
#if 0 will keep it for a while.

More possible optimization :

1. Use pdf14_buf::bbox when back dropping a transparency buffer.
2. Use pdf14_buf::rect to restrict bands which set up the transparency compositor.
   Now it is written to all bands.
3. Write text to clist as high level object.    

EXPECTED DIFFERENCES :

Note: We're unable to perform a full test of this patch locally
because it affects too many devices. We commit it after a partial
testing with most significant cases. We hope the cluster regression test run
will discover provlems if any.

A banded rendering causes minor raster differences with transparency :
ai2.pdf
Bug688631.pdf
dina3_watermark.pdf


Modified: trunk/gs/src/gdevm4.c
===================================================================
--- trunk/gs/src/gdevm4.c	2007-08-02 04:08:11 UTC (rev 8169)
+++ trunk/gs/src/gdevm4.c	2007-08-02 08:53:09 UTC (rev 8170)
@@ -29,7 +29,7 @@
 
 /* The device descriptor. */
 const gx_device_memory mem_mapped4_device =
-mem_device("image4", 4, 0,
+mem_device("image4", 3, 1,
 	   mem_mapped_map_rgb_color, mem_mapped_map_color_rgb,
   mem_mapped4_copy_mono, mem_mapped4_copy_color, mem_mapped4_fill_rectangle,
 	   mem_gray_strip_copy_rop);

Modified: trunk/gs/src/gdevp14.c
===================================================================
--- trunk/gs/src/gdevp14.c	2007-08-02 04:08:11 UTC (rev 8169)
+++ trunk/gs/src/gdevp14.c	2007-08-02 08:53:09 UTC (rev 8170)
@@ -1936,7 +1936,14 @@
 	    pis->get_cmap_procs = p14dev->save_get_cmap_procs;
 	    gx_set_cmap_procs(pis, p14dev->target);
 	    /* Send image out raster data to output device */
-            p14dev->pdf14_procs->put_image(pdev, pis, p14dev->target);
+	    {	/* hack: Reset lop_pdf14, which could be set by 
+		   pdf14_fill_path, pdf14_stroke_path
+		   to prevent a failure ingx_image_enum_begin. */
+		gs_imager_state new_is = *pis;
+
+		new_is.log_op &= ~lop_pdf14;
+		p14dev->pdf14_procs->put_image(pdev, &new_is, p14dev->target);
+	    }
 	    pdf14_disable_device(pdev);
 	    pdf14_close(pdev);
 	    break;
@@ -2661,7 +2668,6 @@
     p14dev->save_get_cmap_procs = pis->get_cmap_procs;
     pis->get_cmap_procs = pdf14_get_cmap_procs;
     gx_set_cmap_procs(pis, (gx_device *)p14dev);
-
     code = dev_proc((gx_device *) p14dev, open_device) ((gx_device *) p14dev);
     *pdev = (gx_device *) p14dev;
     pdf14_set_marking_params((gx_device *)p14dev, pis);
@@ -3327,6 +3333,10 @@
 
     code = dev_proc((gx_device *) pdev, open_device) ((gx_device *) pdev);
     pdev->pclist_device = target;
+    pdev->my_encode_color = pdev->procs.encode_color;
+    pdev->my_decode_color = pdev->procs.decode_color;
+    pdev->my_get_color_mapping_procs = pdev->procs.get_color_mapping_procs;
+    pdev->my_get_color_comp_index = pdev->procs.get_color_comp_index;
     *ppdev = (gx_device *) pdev;
     return code;
 }
@@ -3775,6 +3785,14 @@
 		/* Re-activate the PDF 1.4 compositor */
 		pdev->saved_target_color_info = pdev->target->color_info;
 		pdev->target->color_info = pdev->color_info;
+		pdev->saved_target_encode_color = pdev->target->procs.encode_color;
+		pdev->saved_target_decode_color = pdev->target->procs.decode_color;
+		pdev->target->procs.encode_color = pdev->procs.encode_color = pdev->my_encode_color;
+		pdev->target->procs.decode_color = pdev->procs.decode_color = pdev->my_decode_color;
+		pdev->saved_target_get_color_mapping_procs = pdev->target->procs.get_color_mapping_procs;
+		pdev->saved_target_get_color_comp_index = pdev->target->procs.get_color_comp_index;
+		pdev->target->procs.get_color_mapping_procs = pdev->procs.get_color_mapping_procs = pdev->my_get_color_mapping_procs;
+		pdev->target->procs.get_color_comp_index = pdev->procs.get_color_comp_index = pdev->my_get_color_comp_index;
 		pdev->save_get_cmap_procs = pis->get_cmap_procs;
 		pis->get_cmap_procs = pdf14_get_cmap_procs;
 		gx_set_cmap_procs(pis, dev);
@@ -3806,6 +3824,10 @@
 	        pdf14_clist_get_param_compressed_color_list(pdev);
 		/* Restore the color_info for the clist device */
 		pdev->target->color_info = pdev->saved_target_color_info;
+		pdev->target->procs.encode_color = pdev->saved_target_encode_color;
+		pdev->target->procs.decode_color = pdev->saved_target_decode_color;
+		pdev->target->procs.get_color_mapping_procs = pdev->saved_target_get_color_mapping_procs;
+		pdev->target->procs.get_color_comp_index = pdev->saved_target_get_color_comp_index;
 		pis->get_cmap_procs = pdev->save_get_cmap_procs;
 		gx_set_cmap_procs(pis, pdev->target);
 		/* Disable the PDF 1.4 compositor */
@@ -3951,7 +3973,7 @@
      * filling and stroking operations.
      */
     new_is.log_op |= lop_pdf14;
-    return gx_default_fill_path(dev, &new_is, ppath, params, pdcolor, pcpath);
+    return gx_forward_fill_path(dev, &new_is, ppath, params, pdcolor, pcpath);
 }
 
 /*
@@ -3982,7 +4004,7 @@
      * filling and stroking operations.
      */
     new_is.log_op |= lop_pdf14;
-    return gx_default_stroke_path(dev, &new_is, ppath, params, pdcolor, pcpath);
+    return gx_forward_stroke_path(dev, &new_is, ppath, params, pdcolor, pcpath);
 }
 
 /*
@@ -4010,7 +4032,7 @@
     if (code < 0)
 	return code;
     /* Pass text_begin to the target */
-    code = gx_default_text_begin(dev, pis, text, font, path,
+    code = gx_forward_text_begin(dev, pis, text, font, path,
 				pdcolor, pcpath, memory, &penum);
     if (code < 0)
 	return code;
@@ -4039,7 +4061,7 @@
     if (code < 0)
 	return code;
     /* Pass image to the target */
-    return gx_default_begin_image(dev, pis, pim, format, prect,
+    return gx_forward_begin_image(dev, pis, pim, format, prect,
 					pdcolor, pcpath, memory, pinfo);
 }
 
@@ -4064,7 +4086,7 @@
     if (code < 0)
 	return code;
     /* Pass image to the target */
-    return gx_default_begin_typed_image(dev, pis, pmat,
+    return gx_forward_begin_typed_image(dev, pis, pmat,
 			    pic, prect, pdcolor, pcpath, mem, pinfo);
 }
 
@@ -4100,6 +4122,14 @@
 	    p14dev = (pdf14_clist_device *)(*pcdev);
 	    p14dev->saved_target_color_info = dev->color_info;
 	    dev->color_info = (*pcdev)->color_info;
+	    p14dev->saved_target_encode_color = dev->procs.encode_color;
+	    p14dev->saved_target_decode_color = dev->procs.decode_color;
+	    dev->procs.encode_color = p14dev->procs.encode_color = p14dev->my_encode_color;
+	    dev->procs.decode_color = p14dev->procs.decode_color = p14dev->my_decode_color;
+	    p14dev->saved_target_get_color_mapping_procs = dev->procs.get_color_mapping_procs;
+	    p14dev->saved_target_get_color_comp_index = dev->procs.get_color_comp_index;
+	    dev->procs.get_color_mapping_procs = p14dev->procs.get_color_mapping_procs = p14dev->my_get_color_mapping_procs;
+	    dev->procs.get_color_comp_index = p14dev->procs.get_color_comp_index = p14dev->my_get_color_comp_index;
 	    p14dev->save_get_cmap_procs = pis->get_cmap_procs;
 	    pis->get_cmap_procs = pdf14_get_cmap_procs;
 	    gx_set_cmap_procs(pis, dev);
@@ -4143,8 +4173,12 @@
      */
     switch (pdf14pct->params.pdf14_op) {
 	case PDF14_PUSH_DEVICE:
+#	    if 0 /* Disabled because *p14dev has no forwarding methods during the clist playback. 
+		    This code is not executed while clist writing. */
 	    p14dev->saved_target_color_info = cdev->color_info;
 	    cdev->color_info = p14dev->color_info;
+	     */
+#	    endif
 	    /*
 	     * If we are blending using spot colors (i.e. the output device
 	     * supports spot colors) then we need to transfer compressed
@@ -4185,7 +4219,10 @@
 	    }
 	    break;
 	case PDF14_POP_DEVICE:
+#	    if 0 /* Disabled because *p14dev has no forwarding methods during the clist playback. 
+		    This code is not executed while clist writing. */
 	    cdev->color_info = p14dev->saved_target_color_info;
+#	    endif
 	    break;
 	default:
 	    break;		/* do nothing for remaining ops */

Modified: trunk/gs/src/gdevp14.h
===================================================================
--- trunk/gs/src/gdevp14.h	2007-08-02 04:08:11 UTC (rev 8169)
+++ trunk/gs/src/gdevp14.h	2007-08-02 08:53:09 UTC (rev 8170)
@@ -16,6 +16,8 @@
 #ifndef gdevp14_INCLUDED
 #  define gdevp14_INCLUDED
 
+#include "gxcmap.h"
+
 typedef enum {
     PDF14_DeviceGray = 0,
     PDF14_DeviceRGB = 1,
@@ -134,6 +136,14 @@
     const gx_color_map_procs *(*save_get_cmap_procs)(const gs_imager_state *,
 						     const gx_device *);
     gx_device_color_info saved_target_color_info;
+    dev_proc_encode_color(*saved_target_encode_color);
+    dev_proc_decode_color(*saved_target_decode_color);
+    dev_proc_get_color_mapping_procs(*saved_target_get_color_mapping_procs);
+    dev_proc_get_color_comp_index(*saved_target_get_color_comp_index);
+    dev_proc_encode_color(*my_encode_color);
+    dev_proc_decode_color(*my_decode_color);
+    dev_proc_get_color_mapping_procs(*my_get_color_mapping_procs);
+    dev_proc_get_color_comp_index(*my_get_color_comp_index);
 } pdf14_device_t;
 
 /*

Modified: trunk/gs/src/lib.mak
===================================================================
--- trunk/gs/src/lib.mak	2007-08-02 04:08:11 UTC (rev 8169)
+++ trunk/gs/src/lib.mak	2007-08-02 08:53:09 UTC (rev 8170)
@@ -2569,7 +2569,7 @@
 gsipar3x_h=$(GLSRC)gsipar3x.h $(gsiparam_h) $(gsiparm3_h)
 gximag3x_h=$(GLSRC)gximag3x.h $(gsipar3x_h) $(gxiparam_h)
 gxblend_h=$(GLSRC)gxblend.h
-gdevp14_h=$(GLSRC)gdevp14.h
+gdevp14_h=$(GLSRC)gdevp14.h $(GLSRC)gxcmap.h
 
 $(GLOBJ)gstrans.$(OBJ) : $(GLSRC)gstrans.c $(GXERR)\
  $(math__h) $(memory__h) $(gdevp14_h)\



More information about the gs-cvs mailing list