diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 4038f309c..83d5776e1 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -3673,31 +3673,8 @@ _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface, _cairo_output_stream_printf (surface->output, "endcodespacerange\n"); - if (is_composite) { - num_bfchar = font_subset->num_glyphs - 1; - - /* The CMap specification has a limit of 100 characters per beginbfchar operator */ - _cairo_output_stream_printf (surface->output, - "%d beginbfchar\n", - num_bfchar > 100 ? 100 : num_bfchar); - - for (i = 0; i < num_bfchar; i++) { - if (i != 0 && i % 100 == 0) { - _cairo_output_stream_printf (surface->output, - "endbfchar\n" - "%d beginbfchar\n", - num_bfchar - i > 100 ? 100 : num_bfchar - i); - } - _cairo_output_stream_printf (surface->output, "<%04x> ", i + 1); - status = _cairo_pdf_surface_emit_unicode_for_glyph (surface, - font_subset->utf8[i + 1]); - if (unlikely (status)) - return status; - - _cairo_output_stream_printf (surface->output, - "\n"); - } - } else { + if (font_subset->is_scaled) { + /* Type 3 fonts include glyph 0 in the subset */ num_bfchar = font_subset->num_glyphs; /* The CMap specification has a limit of 100 characters per beginbfchar operator */ @@ -3718,6 +3695,35 @@ _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface, if (unlikely (status)) return status; + _cairo_output_stream_printf (surface->output, + "\n"); + } + } else { + /* Other fonts reserve glyph 0 for .notdef. Omit glyph 0 from the /ToUnicode map */ + num_bfchar = font_subset->num_glyphs - 1; + + /* The CMap specification has a limit of 100 characters per beginbfchar operator */ + _cairo_output_stream_printf (surface->output, + "%d beginbfchar\n", + num_bfchar > 100 ? 100 : num_bfchar); + + for (i = 0; i < num_bfchar; i++) { + if (i != 0 && i % 100 == 0) { + _cairo_output_stream_printf (surface->output, + "endbfchar\n" + "%d beginbfchar\n", + num_bfchar - i > 100 ? 100 : num_bfchar - i); + } + if (is_composite) + _cairo_output_stream_printf (surface->output, "<%04x> ", i + 1); + else + _cairo_output_stream_printf (surface->output, "<%02x> ", i + 1); + + status = _cairo_pdf_surface_emit_unicode_for_glyph (surface, + font_subset->utf8[i + 1]); + if (unlikely (status)) + return status; + _cairo_output_stream_printf (surface->output, "\n"); } diff --git a/src/cairo-scaled-font-subsets.c b/src/cairo-scaled-font-subsets.c index 64c9d9aad..2dd20d0e9 100644 --- a/src/cairo-scaled-font-subsets.c +++ b/src/cairo-scaled-font-subsets.c @@ -570,6 +570,7 @@ _cairo_sub_font_collect (void *entry, void *closure) subset.scaled_font = sub_font->scaled_font; subset.is_composite = sub_font->is_composite; + subset.is_scaled = sub_font->is_scaled; subset.font_id = sub_font->font_id; subset.subset_id = i; subset.glyphs = collection->glyphs; diff --git a/src/cairoint.h b/src/cairoint.h index 6010e20fa..96062c2f9 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -453,6 +453,7 @@ typedef struct _cairo_scaled_font_subset { char **glyph_names; unsigned int num_glyphs; cairo_bool_t is_composite; + cairo_bool_t is_scaled; } cairo_scaled_font_subset_t; struct _cairo_scaled_font_backend {