mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-25 13:00:19 +01:00
PDF: Only Type 3 fonts should include glyph 0 in /ToUnicode
4c498098 made all 8-bit fonts include glyph 0 which incorrectly
included Type 1 fallback fonts.
This commit is contained in:
parent
c11f369057
commit
1ae5a41951
3 changed files with 33 additions and 25 deletions
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue