Fix Type 1 embedding in PDF

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 commit is contained in:
Adrian Johnson 2006-09-05 14:19:26 -04:00 committed by Kristian Høgsberg
parent e5a9c23308
commit d81de15804
4 changed files with 11 additions and 8 deletions

View file

@ -1594,7 +1594,7 @@ _cairo_pdf_surface_emit_type1_font_subset (cairo_pdf_surface_t *surface,
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;

View file

@ -399,7 +399,7 @@ _cairo_ps_surface_emit_type1_font_subset (cairo_ps_surface_t *surface,
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;

View file

@ -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:

View file

@ -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_unscaled_font_t *unscaled_font,
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_type1_font_subset_t *font,
}
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 *abstract_font)
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_subset_t *type1_subset,
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_subset_t *subset)
free (subset->widths);
free (subset->data);
}