[gs-cvs] gs/src

L. Peter Deutsch lpd at casper.ghostscript.com
Wed Jun 26 21:19:59 PDT 2002


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

Modified Files:
	gdevpdtc.c gdevpdte.c gdevpdtf.c gdevpdts.c gdevpdtt.h 
Log Message:

Fixes more bugs in the new pdfwrite text code.  This code can now process
the entire regression suite with no crashes.  (The output has many problems,
but pdfwrite itself does not crash.)


Index: gdevpdtc.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdtc.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- gdevpdtc.c	26 Jun 2002 19:03:00 -0000	1.3
+++ gdevpdtc.c	27 Jun 2002 04:19:57 -0000	1.4
@@ -110,8 +110,8 @@
 
 	    gs_matrix_multiply(&curr.current_font->FontMatrix, psmat,
 			       &fmat);
-	    code = pdf_process_string(&curr, &str, &fmat, false, &text_state,
-				      &index);
+	    code = pdf_encode_process_string(&curr, &str, &fmat, &text_state,
+					     &index);
 	    if (code < 0)
 		return code;
 	    gs_text_enum_copy_dynamic(pte, (gs_text_enum_t *)&curr, true);

Index: gdevpdte.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdte.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- gdevpdte.c	26 Jun 2002 19:03:00 -0000	1.2
+++ gdevpdte.c	27 Jun 2002 04:19:57 -0000	1.3
@@ -35,6 +35,53 @@
 #include "gdevpdtt.h"
 
 /*
+ * Given a text string and a simple gs_font, process it in chunks
+ * determined by pdf_encode_string.
+ */
+private int pdf_encode_string(gx_device_pdf *pdev, gs_font_base *font,
+			      const gs_string *pstr, int *pindex,
+			      pdf_font_resource_t **ppdfont);
+private int pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr,
+			       pdf_font_resource_t *pdfont,
+			       const gs_matrix *pfmat,
+			       pdf_text_process_state_t *ppts, int *pindex);
+int
+pdf_encode_process_string(pdf_text_enum_t *penum, gs_string *pstr,
+			  const gs_matrix *pfmat,
+			  pdf_text_process_state_t *ppts, int *pindex)
+{
+    gx_device_pdf *const pdev = (gx_device_pdf *)penum->dev;
+    gs_font_base *font;
+    int code = 0;
+
+    switch (penum->current_font->FontType) {
+    case ft_TrueType:
+    case ft_encrypted:
+    case ft_encrypted2:
+	break;
+    default:
+	return_error(gs_error_rangecheck);
+    }
+    font = (gs_font_base *)penum->current_font;
+
+    while (*pindex < pstr->size) {
+	int index = *pindex;
+	uint end = pstr->size;
+	pdf_font_resource_t *pdfont;
+
+	code = pdf_encode_string(pdev, font, pstr, &index, &pdfont);
+	if (index == *pindex)
+	    break;
+	pstr->size = index;
+	code = pdf_process_string(penum, pstr, pdfont, pfmat, ppts, pindex);
+	pstr->size = end;
+	if (code < 0 || *pindex < index)
+	    break;
+    }
+    return code;
+}
+
+/*
  * Given a text string and a simple gs_font, return a font resource suitable
  * for a prefix of the text string, possibly re-encoding the string.  This
  * may involve creating a font resource and/or adding glyphs and/or Encoding
@@ -111,46 +158,6 @@
 }
 
 /*
- * Given a text string and a simple gs_font, process it in chunks
- * determined by pdf_encode_string.
- */
-private int
-pdf_encode_process_string(pdf_text_enum_t *penum, gs_string *pstr,
-			  const gs_matrix *pfmat,
-			  pdf_text_process_state_t *ppts, int *pindex)
-{
-    gx_device_pdf *const pdev = (gx_device_pdf *)penum->dev;
-    gs_font_base *font;
-    int code = 0;
-
-    switch (penum->current_font->FontType) {
-    case ft_TrueType:
-    case ft_encrypted:
-    case ft_encrypted2:
-	break;
-    default:
-	return_error(gs_error_rangecheck);
-    }
-    font = (gs_font_base *)penum->current_font;
-
-    while (*pindex < pstr->size) {
-	int index = *pindex;
-	uint end = pstr->size;
-	pdf_font_resource_t *pdfont;
-
-	code = pdf_encode_string(pdev, font, pstr, &index, &pdfont);
-	if (index == *pindex)
-	    break;
-	pstr->size = index;
-	code = pdf_process_string(penum, pstr, pdfont, pfmat, ppts, pindex);
-	pstr->size = end;
-	if (code < 0 || *pindex < index)
-	    break;
-    }
-    return code;
-}
-
-/*
  * Internal procedure to process a string in a non-composite font.
  * Doesn't use or set pte->{data,size,index}; may use/set pte->xy_index;
  * may set penum->returned.total_width.  Sets ppts->values.
@@ -171,7 +178,7 @@
 				   pdf_text_process_state_t *ppts,
 				   const gs_const_string *pstr,
 				   int *pindex, gs_point *pdpt);
-int
+private int
 pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr,
 		   pdf_font_resource_t *pdfont, const gs_matrix *pfmat,
 		   pdf_text_process_state_t *ppts, int *pindex)

Index: gdevpdtf.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdtf.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- gdevpdtf.c	26 Jun 2002 19:03:00 -0000	1.4
+++ gdevpdtf.c	27 Jun 2002 04:19:57 -0000	1.5
@@ -41,13 +41,15 @@
 /* ---------------- Private ---------------- */
 
 private
-ENUM_PTRS_WITH(pdf_font_resource_enum_ptrs, pdf_font_resource_t *pdfont) return 0;
+ENUM_PTRS_WITH(pdf_font_resource_enum_ptrs, pdf_font_resource_t *pdfont)
+ENUM_PREFIX(st_pdf_resource, 8);
 case 0: return ENUM_STRING(&pdfont->BaseFont);
 case 1: ENUM_RETURN(pdfont->FontDescriptor);
 case 2: ENUM_RETURN(pdfont->Widths);
 case 3: ENUM_RETURN(pdfont->real_widths);
-case 4: ENUM_RETURN(pdfont->ToUnicode);
-case 5: switch (pdfont->FontType) {
+case 4: ENUM_RETURN(pdfont->used);
+case 5: ENUM_RETURN(pdfont->ToUnicode);
+case 6: switch (pdfont->FontType) {
  case ft_composite:
      ENUM_RETURN(pdfont->u.type0.DescendantFont);
  case ft_CID_encrypted:
@@ -55,22 +57,23 @@
      ENUM_RETURN(pdfont->u.cidfont.glyphshow_font);
  default:
      ENUM_RETURN(pdfont->u.simple.Encoding);
-case 6: switch (pdfont->FontType) {
+case 7: switch (pdfont->FontType) {
  case ft_composite:
-     return (pdfont->u.type0.cmap_is_standard ? 0 :
+     return (pdfont->u.type0.cmap_is_standard ? ENUM_OBJ(0) :
 	     ENUM_CONST_STRING(&pdfont->u.type0.CMapName));
  case ft_CID_TrueType:
      ENUM_RETURN(pdfont->u.cidfont.CIDToGIDMap);
  case ft_user_defined:
      ENUM_RETURN(pdfont->u.simple.s.type3.char_procs);
  default:
-     return 0;
+     ENUM_RETURN(0);
 }
 }
 ENUM_PTRS_END
 private
 RELOC_PTRS_WITH(pdf_font_resource_reloc_ptrs, pdf_font_resource_t *pdfont)
 {
+    RELOC_PREFIX(st_pdf_resource);
     RELOC_STRING_VAR(pdfont->BaseFont);
     RELOC_VAR(pdfont->FontDescriptor);
     RELOC_VAR(pdfont->Widths);

Index: gdevpdts.c
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdts.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- gdevpdts.c	26 Jun 2002 19:03:00 -0000	1.5
+++ gdevpdts.c	27 Jun 2002 04:19:57 -0000	1.6
@@ -463,7 +463,7 @@
 			  int members)
 {
     pdf_text_state_t *pts = pdev->text->text_state;
-    int skip = 0;
+    int reset = members & pts->members;
 
     if (members & TEXT_STATE_SET_MATRIX) {
 	int code = add_text_delta_move(pdev, &ptsv->matrix);
@@ -472,15 +472,18 @@
 	    members &= ~TEXT_STATE_SET_MATRIX;
     }
 
-    if (pts->in.character_spacing == ptsv->character_spacing)
-	skip |= TEXT_STATE_SET_CHARACTER_SPACING;
-    if (pts->in.pdfont == ptsv->pdfont && pts->in.size == ptsv->size)
-	skip |= TEXT_STATE_SET_FONT_AND_SIZE;
-    if (pts->in.render_mode == ptsv->render_mode)
-	skip |= TEXT_STATE_SET_RENDER_MODE;
-    if (pts->in.word_spacing == ptsv->word_spacing)
-	skip |= TEXT_STATE_SET_WORD_SPACING;
-    members &= ~(skip & pts->members);
+    if ((reset & TEXT_STATE_SET_CHARACTER_SPACING) &&
+	pts->in.character_spacing == ptsv->character_spacing)
+	members -= TEXT_STATE_SET_CHARACTER_SPACING;
+    if ((reset & TEXT_STATE_SET_FONT_AND_SIZE) &&
+	pts->in.pdfont == ptsv->pdfont && pts->in.size == ptsv->size)
+	members -= TEXT_STATE_SET_FONT_AND_SIZE;
+    if ((reset & TEXT_STATE_SET_RENDER_MODE) &&
+	pts->in.render_mode == ptsv->render_mode)
+	members -= TEXT_STATE_SET_RENDER_MODE;
+    if ((reset & TEXT_STATE_SET_WORD_SPACING) &&
+	pts->in.word_spacing == ptsv->word_spacing)
+	members -= TEXT_STATE_SET_WORD_SPACING;
 
     if (pts->buffer.count_chars > 0 && members != 0) {
 	int code = sync_text_state(pdev);

Index: gdevpdtt.h
===================================================================
RCS file: /cvs/ghostscript/gs/src/gdevpdtt.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- gdevpdtt.h	26 Jun 2002 19:03:00 -0000	1.2
+++ gdevpdtt.h	27 Jun 2002 04:19:57 -0000	1.3
@@ -128,17 +128,11 @@
 PROCESS_TEXT_PROC(process_plain_text);
 
 /*
- * Internal procedure to process a string in a simple font.
- * Doesn't use or set penum->{data,size,index}; may use/set penum->xy_index;
- * may set penum->returned.total_width.  Sets ppts->values.
- *
- * Note that the caller is responsible for re-encoding the string, if
- * necessary; for adding Encoding entries in pdfont; and for copying any
- * necessary glyphs.  penum->current_font provides the gs_font for getting
- * glyph metrics, but this font's Encoding is not used.
+ * Given a text string and a simple gs_font, process it in chunks
+ * as needed to parcel it out using multiple font resources.
  */
-int pdf_process_string(pdf_text_enum_t *penum, gs_string *pstr,
-		       pdf_font_resource_t *pdfont, const gs_matrix *pfmat,
-		       pdf_text_process_state_t *ppts, int *pindex);
+int pdf_encode_process_string(pdf_text_enum_t *penum, gs_string *pstr,
+			      const gs_matrix *pfmat,
+			      pdf_text_process_state_t *ppts, int *pindex);
 
 #endif /* gdevpdtt_INCLUDED */




More information about the gs-cvs mailing list