diff options
author | Chris Liddell <chris.liddell@artifex.com> | 2021-05-31 10:46:07 +0100 |
---|---|---|
committer | Chris Liddell <chris.liddell@artifex.com> | 2021-05-31 10:46:07 +0100 |
commit | d0878871a3779da17510f0c7140ca81d090e97b9 (patch) | |
tree | 2932dc502068d842780a6bcdfc9462abc465044d | |
parent | f27f3e7fad654869d9f2cb1d9218016a302aea14 (diff) | |
download | ghostpdl-d0878871a3779da17510f0c7140ca81d090e97b9.tar.gz |
Changes to avoid rendering TTF notdef glyphs
Basically all we can do is fall back to a unicode code point for space,
and hope.
-rw-r--r-- | pdf/pdf_fapi.c | 32 | ||||
-rw-r--r-- | pdf/pdf_font.h | 2 | ||||
-rw-r--r-- | pdf/pdf_font0.c | 2 | ||||
-rw-r--r-- | pdf/pdf_fontTT.c | 2 |
4 files changed, 19 insertions, 19 deletions
diff --git a/pdf/pdf_fapi.c b/pdf/pdf_fapi.c index 27079cd08..a761a3500 100644 --- a/pdf/pdf_fapi.c +++ b/pdf/pdf_fapi.c @@ -807,7 +807,6 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ if (pbfont->FontType == ft_CID_TrueType) { pdf_cidfont_type2 *pttfont = (pdf_cidfont_type2 *)pbfont->client_data; - pdf_font_type0 *pt0font = (pdf_font_type0 *)penum->orig_font->client_data; gs_glyph gid; if (ccode >= GS_MIN_CID_GLYPH) @@ -823,10 +822,9 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ cr->is_glyph_index = true; } else { /* If the composite font has a decoding, then this is a subsituted CIDFont with a "known" ordering */ - unsigned int cc = ccode; + unsigned int gc = 0, cc = (unsigned int)ccode; byte uc[4]; int l; - bool is_glyph_index = true; if (penum->text.operation & TEXT_FROM_SINGLE_CHAR) { cc = penum->text.data.d_char; @@ -844,20 +842,21 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ l = penum->orig_font->procs.decode_glyph((gs_font *)penum->orig_font, ccode, (gs_char)cc, (ushort *)uc, 4); if (l == 2) { - is_glyph_index = false; - gid = uc[1] | uc[0] << 8; + cc = uc[1] | uc[0] << 8; } else if (l == 4) { - is_glyph_index = false; - gid = uc[3] | uc[2] << 8 | uc[2] << 16 | uc[2] << 24; + cc = uc[3] | uc[2] << 8 | uc[2] << 16 | uc[2] << 24; } else - gid = ccode; + cc = ccode; + code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, cc, &gc); + if (code < 0 || gc == 0) + (void)pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, 32, &gc); cr->client_char_code = ccode; - cr->char_codes[0] = gid; - cr->is_glyph_index = is_glyph_index; + cr->char_codes[0] = gc; + cr->is_glyph_index = true; } return 0; } @@ -927,10 +926,10 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ int i; if ((ttfont->descflags & 4) != 0) { if (ttfont->cmap == pdfi_truetype_cmap_30) { - uint cc = (uint)ccode; + uint cc = 0; cr->client_char_code = ccode; - code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, &cc); + code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, (uint)ccode, &cc); if (code < 0 || cc == 0) cr->char_codes[0] = ccode | 0xf0 << 8; else @@ -966,8 +965,7 @@ pdfi_fapi_get_glyphname_or_cid(gs_text_enum_t *penum, gs_font_base * pbfont, gs_ } if (g != GS_NO_CHAR) { - cc = g; - code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, &cc); + code = pdfi_fapi_check_cmap_for_GID((gs_font *)pbfont, (uint)g, &cc); } if (code < 0 || cc == 0) { @@ -1671,7 +1669,7 @@ pdfi_fapi_passfont(pdf_font *font, int subfont, char *fapi_request, } int -pdfi_fapi_check_cmap_for_GID(gs_font *pfont, uint *c) +pdfi_fapi_check_cmap_for_GID(gs_font *pfont, uint cid, uint *gid) { if (pfont->FontType == ft_TrueType || pfont->FontType == ft_CID_TrueType) { @@ -1679,8 +1677,10 @@ pdfi_fapi_check_cmap_for_GID(gs_font *pfont, uint *c) gs_fapi_server *I = pbfont->FAPI; if (I) { + uint c = cid; I->ff.server_font_data = pbfont->FAPI_font_data; - I->check_cmap_for_GID(I, c); + I->check_cmap_for_GID(I, &c); + *gid = c; return 0; } } diff --git a/pdf/pdf_font.h b/pdf/pdf_font.h index 5356f45f1..b1d7ab4fb 100644 --- a/pdf/pdf_font.h +++ b/pdf/pdf_font.h @@ -71,7 +71,7 @@ pdfi_fapi_passfont(pdf_font *font, int subfont, char *fapi_request, char *file_name, byte * font_data, int font_data_len); int -pdfi_fapi_check_cmap_for_GID(gs_font *pfont, uint *c); +pdfi_fapi_check_cmap_for_GID(gs_font *pfont, uint c, uint *g); int pdfi_init_font_directory(pdf_context *ctx); diff --git a/pdf/pdf_font0.c b/pdf/pdf_font0.c index 4613bc94f..b3299fede 100644 --- a/pdf/pdf_font0.c +++ b/pdf/pdf_font0.c @@ -238,7 +238,7 @@ pdfi_font0_map_glyph_to_unicode(gs_font *font, gs_glyph glyph, int ch, ushort *u cc = n[i]; cmapcc = (unsigned int)cc; if (decfont->pdfi_font_type == e_pdf_cidfont_type2) - code = pdfi_fapi_check_cmap_for_GID((gs_font *)decfont->pfont, &cmapcc); + code = pdfi_fapi_check_cmap_for_GID((gs_font *)decfont->pfont, (unsigned int)cc, &cmapcc); else code = 0; if (code >= 0 && cmapcc != 0){ diff --git a/pdf/pdf_fontTT.c b/pdf/pdf_fontTT.c index d31437b65..fac8baee2 100644 --- a/pdf/pdf_fontTT.c +++ b/pdf/pdf_fontTT.c @@ -128,7 +128,7 @@ static uint pdfi_type42_get_glyph_index(gs_font_type42 *pfont, gs_glyph glyph) uint ID = glyph; int code = 0; - code = pdfi_fapi_check_cmap_for_GID((gs_font *)pfont, &ID); + code = pdfi_fapi_check_cmap_for_GID((gs_font *)pfont, (uint)glyph, &ID); if (code < 0) return code; |