From b37edd2dfe521f73f4b9c5ea1f436ce33b6b53aa Mon Sep 17 00:00:00 2001 From: Richard Lescak Date: Fri, 17 Mar 2023 16:03:15 +0100 Subject: [PATCH] fix embedding of CIDFonts Resolves: rhbz#2179023 --- ...ite-Substituted-TTF-CIDFont-CID-hand.patch | 106 ++++++++++++++++++ ghostscript.spec | 7 +- 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch diff --git a/ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch b/ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch new file mode 100644 index 0000000..29dbebb --- /dev/null +++ b/ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch @@ -0,0 +1,106 @@ +From 346f12459aa67cdb5ff9e267c2c8cccc17f4a376 Mon Sep 17 00:00:00 2001 +From: Chris Liddell +Date: Wed, 15 Mar 2023 15:38:29 +0000 +Subject: [PATCH] Bug 706478: pdfwrite: Substituted TTF CIDFont CID handling + +The PS interpreter callback that handles converting a CID to a TTF GID did +not handle the case of substituted CIDFonts. + +It requires looking up the CID on the Decoding (to get a Unicode code point), +and then looking up the code point in the TTF cmap table to get the GID. + +The rendering code already handled it. +--- + psi/zfcid1.c | 73 +++++++++++++++++++++++++++++++++------------------- + 1 file changed, 46 insertions(+), 27 deletions(-) + +diff --git a/psi/zfcid1.c b/psi/zfcid1.c +index fd502ff12..55de85d45 100644 +--- a/psi/zfcid1.c ++++ b/psi/zfcid1.c +@@ -77,37 +77,56 @@ + int gdbytes = pfont->cidata.common.GDBytes; + int gnum = 0; + const byte *data; +- int i, code; ++ int i, code = -1; + ref rcid; + ref *prgnum; ++ ref *p, *fdict = pfont_dict(pfont); ++ ++ if (r_has_type(fdict, t_dictionary) && dict_find_string(fdict, "Path", &p)) { ++ ref *Decoding = NULL, *TT_cmap = NULL, *SubstNWP = NULL, src_type, dst_type; ++ uint c; ++ ++ code = dict_find_string(fdict, "Decoding", &Decoding); ++ if (code > 0) ++ code = dict_find_string(fdict, "TT_cmap", &TT_cmap); ++ if (code > 0) ++ code = dict_find_string(fdict, "SubstNWP", &SubstNWP); ++ if (code > 0) { ++ code = cid_to_TT_charcode(pfont->memory, Decoding, TT_cmap, SubstNWP, cid, &c, &src_type, &dst_type); ++ if (code >= 0) ++ gnum = c; ++ } ++ } + +- switch (r_type(pcidmap)) { +- case t_string: +- if (cid >= r_size(pcidmap) / gdbytes) +- return_error(gs_error_rangecheck); +- data = pcidmap->value.const_bytes + cid * gdbytes; +- break; +- case t_integer: +- return cid + pcidmap->value.intval; +- case t_dictionary: +- make_int(&rcid, cid); +- code = dict_find(pcidmap, &rcid, &prgnum); +- if (code <= 0) +- return (code < 0 ? code : gs_note_error(gs_error_undefined)); +- if (!r_has_type(prgnum, t_integer)) +- return_error(gs_error_typecheck); +- return prgnum->value.intval; +- default: /* array type */ +- code = string_array_access_proc(pfont->memory, pcidmap, 1, cid * gdbytes, +- gdbytes, NULL, NULL, &data); ++ if (code < 0) { ++ switch (r_type(pcidmap)) { ++ case t_string: ++ if (cid >= r_size(pcidmap) / gdbytes) ++ return_error(gs_error_rangecheck); ++ data = pcidmap->value.const_bytes + cid * gdbytes; ++ break; ++ case t_integer: ++ return cid + pcidmap->value.intval; ++ case t_dictionary: ++ make_int(&rcid, cid); ++ code = dict_find(pcidmap, &rcid, &prgnum); ++ if (code <= 0) ++ return (code < 0 ? code : gs_note_error(gs_error_undefined)); ++ if (!r_has_type(prgnum, t_integer)) ++ return_error(gs_error_typecheck); ++ return prgnum->value.intval; ++ default: /* array type */ ++ code = string_array_access_proc(pfont->memory, pcidmap, 1, cid * gdbytes, ++ gdbytes, NULL, NULL, &data); + +- if (code < 0) +- return code; +- if ( code > 0 ) +- return_error(gs_error_invalidfont); ++ if (code < 0) ++ return code; ++ if ( code > 0 ) ++ return_error(gs_error_invalidfont); ++ } ++ for (i = 0; i < gdbytes; ++i) ++ gnum = (gnum << 8) + data[i]; + } +- for (i = 0; i < gdbytes; ++i) +- gnum = (gnum << 8) + data[i]; + if (gnum >= pfont->data.trueNumGlyphs) + return_error(gs_error_invalidfont); + return gnum; +-- +2.39.2 + diff --git a/ghostscript.spec b/ghostscript.spec index e43c770..25921ad 100644 --- a/ghostscript.spec +++ b/ghostscript.spec @@ -42,7 +42,7 @@ Name: ghostscript Summary: Interpreter for PostScript language & PDF Version: 9.54.0 -Release: 9%{?dist} +Release: 10%{?dist} License: AGPLv3+ @@ -108,6 +108,7 @@ Patch003: ghostscript-9.54.0-covscan-fixes.patch Patch004: ghostscript-9.54.0-Fix-op-stack-management-in-sampled_data_c.patch Patch005: ghostscript-9.54.0-Deal-with-different-VM-modes-during-CIDFont-loading.patch Patch006: ghostscript-9.54.0-ESC-Page-driver-does-not-set-page-size-correctly.patch +Patch007: ghostscript-9.54.0-pdfwrite-Substituted-TTF-CIDFont-CID-hand.patch # Downstream patches -- these should be always included when doing rebase: # ------------------ @@ -441,6 +442,10 @@ done # ============================================================================= %changelog +* Fri Mar 17 2023 Richard Lescak - 9.54.0-10 +- fix embedding of CIDFonts +- Resolves: rhbz#2179023 + * Thu Feb 02 2023 Richard Lescak - 9.54.0-9 - set the page size for A4 correctly in ESC/Page driver - Resolves: rhbz#2164613