summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2014-04-23 17:16:55 +0200
committerTor Andersson <tor.andersson@artifex.com>2014-04-23 17:16:55 +0200
commit0b5c38d26a822ec8b3e82ec24da6c0b92e4aa0bd (patch)
tree055f4c09c79bea872002616d847276e93642fc06 /source
parent4cb52a8a8578a04352e727c21ddc033dcff9e588 (diff)
downloadmupdf-0b5c38d26a822ec8b3e82ec24da6c0b92e4aa0bd.tar.xz
Fix 693419: always load CIDToGIDMap if it exists.
OpenType CFF fonts are detected as TYPE1 by ft_kind. Relaxing the test for when to load a CIDToGIDMap lets us load it even for OpenType fonts.
Diffstat (limited to 'source')
-rw-r--r--source/pdf/pdf-font.c68
1 files changed, 31 insertions, 37 deletions
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index 8454e925..3f6d5601 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -849,10 +849,10 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_obj *descriptor;
pdf_font_desc *fontdesc = NULL;
FT_Face face;
- int kind;
char collection[256];
char *basefont;
int i, k, fterr;
+ pdf_obj *cidtogidmap;
pdf_obj *obj;
int dw;
fz_context *ctx = doc->ctx;
@@ -899,7 +899,6 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_load_font_descriptor(fontdesc, doc, descriptor, collection, basefont, 1);
face = fontdesc->font->ft_face;
- kind = ft_kind(face);
/* Encoding */
@@ -924,48 +923,43 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_set_font_wmode(ctx, fontdesc, pdf_cmap_wmode(ctx, fontdesc->encoding));
- if (kind == TRUETYPE)
+ cidtogidmap = pdf_dict_gets(dict, "CIDToGIDMap");
+ if (pdf_is_indirect(cidtogidmap))
{
- pdf_obj *cidtogidmap;
+ fz_buffer *buf;
- cidtogidmap = pdf_dict_gets(dict, "CIDToGIDMap");
- if (pdf_is_indirect(cidtogidmap))
- {
- fz_buffer *buf;
+ buf = pdf_load_stream(doc, pdf_to_num(cidtogidmap), pdf_to_gen(cidtogidmap));
- buf = pdf_load_stream(doc, pdf_to_num(cidtogidmap), pdf_to_gen(cidtogidmap));
+ fontdesc->cid_to_gid_len = (buf->len) / 2;
+ fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short));
+ fontdesc->size += fontdesc->cid_to_gid_len * sizeof(unsigned short);
+ for (i = 0; i < fontdesc->cid_to_gid_len; i++)
+ fontdesc->cid_to_gid[i] = (buf->data[i * 2] << 8) + buf->data[i * 2 + 1];
- fontdesc->cid_to_gid_len = (buf->len) / 2;
- fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short));
- fontdesc->size += fontdesc->cid_to_gid_len * sizeof(unsigned short);
- for (i = 0; i < fontdesc->cid_to_gid_len; i++)
- fontdesc->cid_to_gid[i] = (buf->data[i * 2] << 8) + buf->data[i * 2 + 1];
-
- fz_drop_buffer(ctx, buf);
- }
+ fz_drop_buffer(ctx, buf);
+ }
- /* if truetype font is external, cidtogidmap should not be identity */
- /* so we map from cid to unicode and then map that through the (3 1) */
- /* unicode cmap to get a glyph id */
- else if (fontdesc->font->ft_substitute)
+ /* if font is external, cidtogidmap should not be identity */
+ /* so we map from cid to unicode and then map that through the (3 1) */
+ /* unicode cmap to get a glyph id */
+ else if (fontdesc->font->ft_substitute)
+ {
+ fterr = FT_Select_Charmap(face, ft_encoding_unicode);
+ if (fterr)
{
- fterr = FT_Select_Charmap(face, ft_encoding_unicode);
- if (fterr)
- {
- fz_throw(ctx, FZ_ERROR_GENERIC, "fonterror: no unicode cmap when emulating CID font: %s", ft_error_string(fterr));
- }
-
- if (!strcmp(collection, "Adobe-CNS1"))
- fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-CNS1-UCS2");
- else if (!strcmp(collection, "Adobe-GB1"))
- fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
- else if (!strcmp(collection, "Adobe-Japan1"))
- fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Japan1-UCS2");
- else if (!strcmp(collection, "Adobe-Japan2"))
- fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Japan2-UCS2");
- else if (!strcmp(collection, "Adobe-Korea1"))
- fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Korea1-UCS2");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "fonterror: no unicode cmap when emulating CID font: %s", ft_error_string(fterr));
}
+
+ if (!strcmp(collection, "Adobe-CNS1"))
+ fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-CNS1-UCS2");
+ else if (!strcmp(collection, "Adobe-GB1"))
+ fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
+ else if (!strcmp(collection, "Adobe-Japan1"))
+ fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Japan1-UCS2");
+ else if (!strcmp(collection, "Adobe-Japan2"))
+ fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Japan2-UCS2");
+ else if (!strcmp(collection, "Adobe-Korea1"))
+ fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Korea1-UCS2");
}
pdf_load_to_unicode(doc, fontdesc, NULL, collection, to_unicode);