From 610cf851fbbe1fc342f40429b1b0da9d9d7daebc Mon Sep 17 00:00:00 2001 From: Chris Liddell <chris.liddell@artifex.com> Date: Mon, 3 Oct 2022 15:24:33 +0100 Subject: [PATCH 127/155] Bug 705939: Fix BaseEncoding logic for fonts flagged symbolic For a font encoding defined in a PDF dictionary (i.e. with a Differences array) for a symbolic font, we were ignoring the BaseEncoding entry, and opting to use the font's native encoding. In fact, we should always use the BaseEncoding if it exists, and fall back to the native encoding only if BaseEncoding isn't specified. With non-symbolic fonts, we fall back to StandardEncoding in the absence of a BaseEncoding entry --- pdf/pdf_font.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pdf/pdf_font.c b/pdf/pdf_font.c index 7c922c835..e4a3cb857 100644 --- a/pdf/pdf_font.c +++ b/pdf/pdf_font.c @@ -1558,8 +1558,18 @@ int pdfi_create_Encoding(pdf_context *ctx, pdf_obj *pdf_Encoding, pdf_obj *font_ pdf_array *a = NULL; pdf_obj *o = NULL; int offset = 0; + bool b_e_known; - if (font_Encoding != NULL && pdfi_type_of(font_Encoding) == PDF_ARRAY) { + if (pdfi_type_of(pdf_Encoding) == PDF_DICT) { + code = pdfi_dict_known(ctx, (pdf_dict *)pdf_Encoding, "BaseEncoding", &b_e_known); + if (code < 0) + b_e_known = false; + } + else { + b_e_known = false; + } + + if (b_e_known == false && font_Encoding != NULL && pdfi_type_of(font_Encoding) == PDF_ARRAY) { pdf_array *fenc = (pdf_array *)font_Encoding; for (i = 0; i < pdfi_array_size(fenc) && code >= 0; i++) { code = pdfi_array_get(ctx, fenc, (uint64_t)i, &o); -- 2.30.4