Skip to content

Commit

Permalink
PDF: Fix toUnicode for CID fonts
Browse files Browse the repository at this point in the history
1047dc6 introduced a regression for text that is using 16-bit glyphs
in the content stream.
  • Loading branch information
Adrian Johnson committed Nov 7, 2010
1 parent f1d1928 commit daaef05
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 15 deletions.
38 changes: 24 additions & 14 deletions src/cairo-pdf-surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -3812,7 +3812,7 @@ _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface,
"/CMapType 2 def\n"
"1 begincodespacerange\n");

if (font_subset->is_composite) {
if (font_subset->is_composite && !font_subset->is_latin) {
_cairo_output_stream_printf (surface->output,
"<0000> <ffff>\n");
} else {
Expand Down Expand Up @@ -3864,7 +3864,7 @@ _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface,
"%d beginbfchar\n",
num_bfchar - i > 100 ? 100 : num_bfchar - i);
}
if (font_subset->is_composite)
if (font_subset->is_composite && !font_subset->is_latin)
_cairo_output_stream_printf (surface->output, "<%04x> ", i + 1);
else
_cairo_output_stream_printf (surface->output, "<%02x> ", i + 1);
Expand Down Expand Up @@ -4113,6 +4113,11 @@ _cairo_pdf_surface_emit_cff_fallback_font (cairo_pdf_surface_t *surface,
cairo_cff_subset_t subset;
char name[64];

/* CFF fallback subsetting does not work with 8-bit glyphs unless
* they are a latin subset */
if (!font_subset->is_composite && !font_subset->is_latin)
return CAIRO_INT_STATUS_UNSUPPORTED;

snprintf (name, sizeof name, "CairoFont-%d-%d",
font_subset->font_id, font_subset->subset_id);
status = _cairo_cff_fallback_init (&subset, name, font_subset);
Expand Down Expand Up @@ -4274,6 +4279,10 @@ _cairo_pdf_surface_emit_type1_font_subset (cairo_pdf_surface_t *surface,
cairo_type1_subset_t subset;
char name[64];

/* 16-bit glyphs not compatible with Type 1 fonts */
if (font_subset->is_composite && !font_subset->is_latin)
return CAIRO_INT_STATUS_UNSUPPORTED;

snprintf (name, sizeof name, "CairoFont-%d-%d",
font_subset->font_id, font_subset->subset_id);
status = _cairo_type1_subset_init (&subset, name, font_subset, FALSE);
Expand All @@ -4295,6 +4304,10 @@ _cairo_pdf_surface_emit_type1_fallback_font (cairo_pdf_surface_t *surface,
cairo_type1_subset_t subset;
char name[64];

/* 16-bit glyphs not compatible with Type 1 fonts */
if (font_subset->is_composite && !font_subset->is_latin)
return CAIRO_INT_STATUS_UNSUPPORTED;

snprintf (name, sizeof name, "CairoFont-%d-%d",
font_subset->font_id, font_subset->subset_id);
status = _cairo_type1_fallback_init_binary (&subset, name, font_subset);
Expand Down Expand Up @@ -4793,22 +4806,19 @@ _cairo_pdf_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_s
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;

if (font_subset->is_composite) {
status = _cairo_pdf_surface_emit_cff_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
} else {
#if CAIRO_HAS_FT_FONT
status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
#endif

status = _cairo_pdf_surface_emit_type1_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;
status = _cairo_pdf_surface_emit_cff_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;

}
status = _cairo_pdf_surface_emit_type1_fallback_font (surface, font_subset);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return status;

ASSERT_NOT_REACHED;
return CAIRO_STATUS_SUCCESS;
Expand Down
1 change: 0 additions & 1 deletion src/cairo-scaled-font-subsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,7 +638,6 @@ _cairo_sub_font_map_glyph (cairo_sub_font_t *sub_font,
(latin_character == 0 && sub_font->num_glyphs_in_latin_subset > 0))
{
is_latin = TRUE;
sub_font->is_composite = FALSE;
}
}

Expand Down

0 comments on commit daaef05

Please sign in to comment.