[cairo] [PATCH] Fix Type 1 embedding in PDF

Adrian Johnson ajohnson at redneon.com
Tue Sep 5 06:30:20 PDT 2006


PDF Files with Type 1 fonts fail to open in any version of
ghostscript prior to 8.54. The problem is the hex encoding of the
encrypted portion of the font. The PDF reference says this should
only be in binary.

This patch fixes this issue and corrects the value of /LastChar
in the PDF Type 1 font dictionary.

-------------- next part --------------
---
 src/cairo-pdf-surface.c                 |    4 ++--
 src/cairo-ps-surface.c                  |    2 +-
 src/cairo-scaled-font-subsets-private.h |    4 +++-
 src/cairo-type1-subset.c                |   11 ++++++-----
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index 91a1968..68d0e7c 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -1594,7 +1594,7 @@ _cairo_pdf_surface_emit_type1_font_subse
 
     snprintf (name, sizeof name, "CairoFont-%d-%d",
 	      font_subset->font_id, font_subset->subset_id);
-    status = _cairo_type1_subset_init (&subset, name, font_subset);
+    status = _cairo_type1_subset_init (&subset, name, font_subset, FALSE);
     if (status)
 	return status;
 
@@ -1665,7 +1665,7 @@ _cairo_pdf_surface_emit_type1_font_subse
 				 "   /Widths [",
 				 subset_resource.id,
 				 subset.base_font,
-				 font_subset->num_glyphs,
+				 font_subset->num_glyphs - 1,
 				 descriptor.id);
 
     for (i = 0; i < font_subset->num_glyphs; i++)
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index 6ae3a38..019a53d 100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -399,7 +399,7 @@ _cairo_ps_surface_emit_type1_font_subset
 
     snprintf (name, sizeof name, "CairoFont-%d-%d",
 	      font_subset->font_id, font_subset->subset_id);
-    status = _cairo_type1_subset_init (&subset, name, font_subset);
+    status = _cairo_type1_subset_init (&subset, name, font_subset, TRUE);
     if (status)
 	return status;
 
diff --git a/src/cairo-scaled-font-subsets-private.h b/src/cairo-scaled-font-subsets-private.h
index c41e477..8122c5c 100644
--- a/src/cairo-scaled-font-subsets-private.h
+++ b/src/cairo-scaled-font-subsets-private.h
@@ -239,6 +239,7 @@ typedef struct _cairo_type1_subset {
  * _cairo_type1_subset_init:
  * @type1_subset: a #cairo_type1_subset_t to initialize
  * @font_subset: the #cairo_scaled_font_subset_t to initialize from
+ * @hex_encode: if true the encrypted portion of the font is hex encoded
  *
  * If possible (depending on the format of the underlying
  * cairo_scaled_font_t and the font backend in use) generate a type1
@@ -253,7 +254,8 @@ typedef struct _cairo_type1_subset {
 cairo_private cairo_status_t
 _cairo_type1_subset_init (cairo_type1_subset_t		*type_subset,
 			  const char			*name,
-			  cairo_scaled_font_subset_t	*font_subset);
+			  cairo_scaled_font_subset_t	*font_subset,
+                          cairo_bool_t                   hex_encode);
 
 /**
  * _cairo_type1_subset_fini:
diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c
index 8ee1f40..6f1be2c 100644
--- a/src/cairo-type1-subset.c
+++ b/src/cairo-type1-subset.c
@@ -103,7 +103,8 @@ typedef struct _cairo_type1_font_subset 
 
 static cairo_status_t
 _cairo_type1_font_subset_create (cairo_unscaled_font_t      *unscaled_font,
-				 cairo_type1_font_subset_t **subset_return)
+				 cairo_type1_font_subset_t **subset_return,
+                                 cairo_bool_t                hex_encode)
 {
     cairo_ft_unscaled_font_t *ft_unscaled_font;
     FT_Face face;
@@ -145,6 +146,7 @@ _cairo_type1_font_subset_create (cairo_u
     if (font->glyphs == NULL)
 	goto fail2;
 
+    font->hex_encode = hex_encode;
     font->num_glyphs = 0;
     for (i = 0; i < face->num_glyphs; i++)
 	font->glyphs[i].subset_index = -1;
@@ -900,7 +902,6 @@ cairo_type1_font_subset_write (cairo_typ
     }
 
     font->eexec_key = private_dict_key;
-    font->hex_encode = TRUE;
     font->hex_column = 0;
 
     cairo_type1_font_subset_write_private_dict (font, name);
@@ -994,7 +995,8 @@ cairo_type1_font_subset_destroy (void *a
 cairo_status_t
 _cairo_type1_subset_init (cairo_type1_subset_t		*type1_subset,
 			  const char			*name,
-			  cairo_scaled_font_subset_t	*scaled_font_subset)
+			  cairo_scaled_font_subset_t	*scaled_font_subset,
+                          cairo_bool_t                   hex_encode)
 {
     cairo_type1_font_subset_t *font;
     cairo_status_t status;
@@ -1008,7 +1010,7 @@ _cairo_type1_subset_init (cairo_type1_su
 
     unscaled_font = _cairo_ft_scaled_font_get_unscaled_font (scaled_font_subset->scaled_font);
 
-    status = _cairo_type1_font_subset_create (unscaled_font, &font);
+    status = _cairo_type1_font_subset_create (unscaled_font, &font, hex_encode);
     if (status)
 	return status;
 
@@ -1079,4 +1081,3 @@ _cairo_type1_subset_fini (cairo_type1_su
     free (subset->widths);
     free (subset->data);
 }
-
-- 
1.4.2



More information about the cairo mailing list