summaryrefslogtreecommitdiff
path: root/pdf/pdf_font0.c
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2021-12-07 18:55:55 +0000
committerChris Liddell <chris.liddell@artifex.com>2021-12-08 14:48:15 +0000
commitb74abb758b09295e025ad31228bcfe3a9927f9be (patch)
treec87b9a71342b2c97b018ae88857f13ca4d7d0d14 /pdf/pdf_font0.c
parente6ef306974ca479d252b53b6624d1d614d6fac6a (diff)
downloadghostpdl-b74abb758b09295e025ad31228bcfe3a9927f9be.tar.gz
Interpret and use ToUnicode CMaps for regular fonts
as well as Type 0 fonts.
Diffstat (limited to 'pdf/pdf_font0.c')
-rw-r--r--pdf/pdf_font0.c60
1 files changed, 2 insertions, 58 deletions
diff --git a/pdf/pdf_font0.c b/pdf/pdf_font0.c
index 86baec8d1..126ac930b 100644
--- a/pdf/pdf_font0.c
+++ b/pdf/pdf_font0.c
@@ -77,7 +77,6 @@ pdfi_font0_map_glyph_to_unicode(gs_font *font, gs_glyph glyph, int ch, ushort *u
int code = gs_error_undefined, i;
uchar *unicode_return = (uchar *)u;
pdf_cidfont_type2 *decfont = NULL;
- pdf_cmap *tounicode = (pdf_cmap *)pt0font->ToUnicode;
pdfi_cid_subst_nwp_table_t *substnwp = pt0font->substnwp;
code = pdfi_array_get(pt0font->ctx, pt0font->DescendantFonts, 0, (pdf_obj **)&decfont);
@@ -89,63 +88,7 @@ pdfi_font0_map_glyph_to_unicode(gs_font *font, gs_glyph glyph, int ch, ushort *u
code = gs_error_undefined;
while (1) { /* Loop to make retrying with a substitute CID easier */
/* Favour the ToUnicode if one exists */
- if (tounicode) {
- int l = 0;
- gs_cmap_lookups_enum_t lenum;
- gs_cmap_lookups_enum_init((const gs_cmap_t *)tounicode->gscmap, 0, &lenum);
- while (l == 0 && (code = gs_cmap_enum_next_lookup(font->memory, &lenum)) == 0) {
- gs_cmap_lookups_enum_t counter = lenum;
- while (l == 0 && (code = gs_cmap_enum_next_entry(&counter) == 0)) {
- if (counter.entry.value_type == CODE_VALUE_CID) {
- unsigned int v = 0;
- for (i = 0; i < counter.entry.key_size; i++) {
- v |= (counter.entry.key[0][counter.entry.key_size - i - 1]) << (i * 8);
- }
- if (ch == v) {
- if (counter.entry.value.size == 1) {
- l = 2;
- if (unicode_return != NULL && length >= l) {
- unicode_return[0] = counter.entry.value.data[0];
- unicode_return[1] = counter.entry.value.data[1];
- }
- }
- else if (counter.entry.value.size == 2) {
- l = 2;
- if (unicode_return != NULL && length >= l) {
- unicode_return[0] = counter.entry.value.data[0];
- unicode_return[1] = counter.entry.value.data[1];
- }
- }
- else if (counter.entry.value.size == 3) {
- l = 4;
- if (unicode_return != NULL && length >= l) {
- unicode_return[0] = counter.entry.value.data[0];
- unicode_return[1] = counter.entry.value.data[1];
- unicode_return[2] = counter.entry.value.data[2];
- unicode_return[3] = 0;
- }
- }
- else {
- l = 4;
- if (unicode_return != NULL && length >= l) {
- unicode_return[0] = counter.entry.value.data[0];
- unicode_return[1] = counter.entry.value.data[1];
- unicode_return[2] = counter.entry.value.data[1];
- unicode_return[3] = counter.entry.value.data[3];
- }
- }
- }
- }
- else {
- l = 0;
- }
- }
- }
- if (l > 0)
- code = l;
- else
- code = gs_error_undefined;
- }
+ code = pdfi_tounicode_char_to_unicode(pt0font->ctx, (pdf_cmap *)pt0font->ToUnicode, glyph, ch, u, length);
if (code == gs_error_undefined && pt0font->decoding) {
const int *n;
@@ -404,6 +347,7 @@ int pdfi_read_type0_font(pdf_context *ctx, pdf_dict *font_dict, pdf_dict *stream
pdft0->indirect_gen = font_dict->indirect_gen;
pdft0->Encoding = (pdf_obj *)pcmap;
pdft0->ToUnicode = tounicode;
+ tounicode = NULL;
pdft0->DescendantFonts = arr;
pdft0->PDF_font = font_dict;
pdfi_countup(font_dict);