summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2021-05-31 10:46:07 +0100
committerChris Liddell <chris.liddell@artifex.com>2021-05-31 10:46:07 +0100
commitd0878871a3779da17510f0c7140ca81d090e97b9 (patch)
tree2932dc502068d842780a6bcdfc9462abc465044d
parentf27f3e7fad654869d9f2cb1d9218016a302aea14 (diff)
downloadghostpdl-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.c32
-rw-r--r--pdf/pdf_font.h2
-rw-r--r--pdf/pdf_font0.c2
-rw-r--r--pdf/pdf_fontTT.c2
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;