[gs-cvs] gs/src

Igor Melichev igor at ghostscript.com
Thu Jun 10 12:09:52 PDT 2004


Update of /cvs/ghostscript/gs/src
In directory casper:/tmp/cvs-serv22104/gs/src

Modified Files:
	gdevpdfi.c gdevpdfm.c gdevpdti.c gdevpdfx.h 
Log Message:
(pdfwrite) : Implementing a dynamic recongnition for Type 3 charproc variations (continued 4).

DETAILS :

Recent changes about charproc variations caused an appearence of idle entries
in the xref table. Those entries pointed to zero length objects
and were never referred.

Idle entries appeared due to the substream accumulator reserved an object id
before entering a substream, but later the object (a charproc) was cancelled.

This patch delays the reservation of an object id until we decide
that the object won't be cancelled. Added a new argument of pdf_enter_substream
for this purpose.

EXPECTED DIFFERENCES :

None.


Index: gdevpdfi.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdfi.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- gdevpdfi.c	11 Mar 2004 14:58:31 -0000	1.52
+++ gdevpdfi.c	10 Jun 2004 19:09:50 -0000	1.53
@@ -890,7 +890,7 @@
 	case pattern_manage__can_accum:
 	    return 1;
 	case pattern_manage__start_accum:
-	    code = pdf_enter_substream(pdev, resourcePattern, id, &pres);
+	    code = pdf_enter_substream(pdev, resourcePattern, id, &pres, true);
 	    if (code < 0)
 		return code;
 	    pres->rid = id;

Index: gdevpdfm.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdfm.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- gdevpdfm.c	26 May 2004 08:44:26 -0000	1.38
+++ gdevpdfm.c	10 Jun 2004 19:09:50 -0000	1.39
@@ -1383,7 +1383,7 @@
 	code = pdf_open_page(pdev, PDF_IN_STREAM);
 	if (code < 0)
 	    return code;
-	code = pdf_enter_substream(pdev, resourceXObject, gs_no_id, &pres);
+	code = pdf_enter_substream(pdev, resourceXObject, gs_no_id, &pres, true);
 	if (code < 0)
 	    return code;
 	pcs = (cos_stream_t *)pres->object;

Index: gdevpdti.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdti.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- gdevpdti.c	3 Jun 2004 17:12:07 -0000	1.31
+++ gdevpdti.c	10 Jun 2004 19:09:50 -0000	1.32
@@ -385,7 +385,7 @@
 {
     pdf_char_proc_t *pcp;
     pdf_resource_t *pres;
-    int code = pdf_enter_substream(pdev, resourceCharProc, gs_next_ids(1), &pres);
+    int code = pdf_enter_substream(pdev, resourceCharProc, gs_next_ids(1), &pres, false);
 
     if (code < 0)
        return code;
@@ -446,7 +446,7 @@
  */
 int
 pdf_enter_substream(gx_device_pdf *pdev, pdf_resource_type_t rtype, 
-			    gs_id id, pdf_resource_t **ppres) 
+			    gs_id id, pdf_resource_t **ppres, bool reserve_object_id) 
 {
     int sbstack_ptr = pdev->sbstack_depth;
     stream *s, *save_strm = pdev->strm;
@@ -460,7 +460,7 @@
     if (pdev->sbstack_depth >= pdev->sbstack_size)
 	return_error(gs_error_unregistered); /* Must not happen. */
     code = pdf_alloc_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, id),
-		pdf_resource_type_structs[rtype], &pres, 0);
+		pdf_resource_type_structs[rtype], &pres, reserve_object_id ? 0 : -1);
     if (code < 0)
 	return code;
     cos_become(pres->object, cos_type_stream);
@@ -646,7 +646,7 @@
 pdf_end_charproc_accum(gx_device_pdf *pdev, gs_font *font) 
 {
     int code;
-    pdf_font_resource_t *pres = (pdf_font_resource_t *)pdev->accumulating_substream_resource;
+    pdf_resource_t *pres = (pdf_resource_t *)pdev->accumulating_substream_resource;
     /* We could use pdfont->u.simple.s.type3.char_procs insted the thing above
        unless the font is defined recursively.
        But we don't want such assumption. */
@@ -699,7 +699,8 @@
 		    return code;
 	    }
 	}
-    }
+    } 
+    pdf_reserve_object_id(pdev, pres, 0);
     code = pdf_attached_font_resource(pdev, font, &pdfont,
 		&glyph_usage, &real_widths, &char_cache_size, &width_cache_size);
     if (code < 0)

Index: gdevpdfx.h
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdfx.h,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- gdevpdfx.h	2 Jun 2004 17:45:30 -0000	1.92
+++ gdevpdfx.h	10 Jun 2004 19:09:50 -0000	1.93
@@ -1053,7 +1053,7 @@
 
 /* Enter the substream accumulation mode. */
 int pdf_enter_substream(gx_device_pdf *pdev, pdf_resource_type_t rtype, 
-			gs_id id, pdf_resource_t **ppres);
+			gs_id id, pdf_resource_t **ppres, bool reserve_object_id);
 
 /* Exit the substream accumulation mode. */
 int pdf_exit_substream(gx_device_pdf *pdev);



More information about the gs-cvs mailing list