summaryrefslogtreecommitdiff
path: root/media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2018-01-26 15:48:02 +0000
committerV3n3RiX <venerix@redcorelinux.org>2018-01-26 15:48:02 +0000
commit38b7258d086dd5e263c3bbe3880c8c956676bc71 (patch)
tree6fce284d5bfddaf597a490ac66069d16c6a485db /media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch
parent0ebf740b9c9bc7c10ac41bea315ecc6c01c79166 (diff)
gentoo resync : 25.01.2018
Diffstat (limited to 'media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch')
-rw-r--r--media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch248
1 files changed, 248 insertions, 0 deletions
diff --git a/media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch b/media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch
new file mode 100644
index 000000000000..83ce9ca93e9f
--- /dev/null
+++ b/media-libs/libharu/files/libharu-2.3.0-1-Included-necessary-char-widths-in-generated-PDF.patch
@@ -0,0 +1,248 @@
+From 16c09856508abbf059ed94b9234b28143025318b Mon Sep 17 00:00:00 2001
+From: Jonathan Scruggs <j.scruggs@gmail.com>
+Date: Wed, 24 Jan 2018 10:09:02 +0000
+Subject: [PATCH 1/4] Included necessary char widths in generated PDF
+
+* /W and /CIDToGIDMap can be created in the before_write_fn
+
+* Only add width for actually used glyphs to the /W array
+
+* Try reducing the size of the /CIDToGIDMap.
+
+Only care about actually used glyphs, so that
+a) the length of the array can be reduced,
+b) unused entries can be easily compressed as they are
+ zeroed out.
+---
+ src/hpdf_font_cid.c | 139 ++++++++++++++++++++++++++++------------------------
+ 1 file changed, 75 insertions(+), 64 deletions(-)
+
+diff --git a/src/hpdf_font_cid.c b/src/hpdf_font_cid.c
+index d1c1a82..5ab3b28 100644
+--- a/src/hpdf_font_cid.c
++++ b/src/hpdf_font_cid.c
+@@ -346,19 +346,14 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref)
+ HPDF_STATUS ret = HPDF_OK;
+ HPDF_FontAttr attr = (HPDF_FontAttr)parent->attr;
+ HPDF_FontDef fontdef = attr->fontdef;
+- HPDF_TTFontDefAttr fontdef_attr = (HPDF_TTFontDefAttr)fontdef->attr;
+ HPDF_Encoder encoder = attr->encoder;
+ HPDF_CMapEncoderAttr encoder_attr =
+ (HPDF_CMapEncoderAttr)encoder->attr;
+
+ HPDF_Font font;
+ HPDF_Array array;
+- HPDF_UINT i;
+- HPDF_UNICODE tmp_map[65536];
+ HPDF_Dict cid_system_info;
+
+- HPDF_UINT16 max = 0;
+-
+ HPDF_PTRACE ((" HPDF_CIDFontType2_New\n"));
+
+ font = HPDF_Dict_New (parent->mmgr);
+@@ -388,11 +383,55 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref)
+ ret += HPDF_Array_AddNumber (array, (HPDF_INT32)(fontdef->font_bbox.bottom -
+ fontdef->font_bbox.top));
+
+- HPDF_MemSet (tmp_map, 0, sizeof(HPDF_UNICODE) * 65536);
++ /* create CIDSystemInfo dictionary */
++ cid_system_info = HPDF_Dict_New (parent->mmgr);
++ if (!cid_system_info)
++ return NULL;
++
++ if (HPDF_Dict_Add (font, "CIDSystemInfo", cid_system_info) != HPDF_OK)
++ return NULL;
++
++ ret += HPDF_Dict_Add (cid_system_info, "Registry",
++ HPDF_String_New (parent->mmgr, encoder_attr->registry, NULL));
++ ret += HPDF_Dict_Add (cid_system_info, "Ordering",
++ HPDF_String_New (parent->mmgr, encoder_attr->ordering, NULL));
++ ret += HPDF_Dict_AddNumber (cid_system_info, "Supplement",
++ encoder_attr->suppliment);
+
+ if (ret != HPDF_OK)
+ return NULL;
+
++ return font;
++}
++
++
++static HPDF_STATUS
++CIDFontType2_BeforeWrite_Func (HPDF_Dict obj)
++{
++ HPDF_FontAttr font_attr = (HPDF_FontAttr)obj->attr;
++ HPDF_FontDef def = font_attr->fontdef;
++ HPDF_TTFontDefAttr def_attr = (HPDF_TTFontDefAttr)def->attr;
++ HPDF_STATUS ret = 0;
++
++ HPDF_Font font;
++ HPDF_Encoder encoder = font_attr->encoder;
++ HPDF_CMapEncoderAttr encoder_attr =
++ (HPDF_CMapEncoderAttr)encoder->attr;
++
++ HPDF_Array array;
++ HPDF_UINT i;
++ HPDF_UNICODE tmp_map[65536];
++ HPDF_UINT16 max = 0;
++
++
++ HPDF_PTRACE ((" CIDFontType2_BeforeWrite_Func\n"));
++
++ font = font_attr->descendant_font;
++ HPDF_MemSet (tmp_map, 0, sizeof(HPDF_UNICODE) * 65536);
++
++ if (ret != HPDF_OK)
++ return ret;
++
+ for (i = 0; i < 256; i++) {
+ HPDF_UINT j;
+
+@@ -401,66 +440,70 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref)
+ HPDF_UINT16 cid = encoder_attr->cid_map[i][j];
+ if (cid != 0) {
+ HPDF_UNICODE unicode = encoder_attr->unicode_map[i][j];
+- HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (fontdef,
++ HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (def,
+ unicode);
+- tmp_map[cid] = gid;
+- if (max < cid)
+- max = cid;
++ if (def_attr->glyph_tbl.flgs[gid]) {
++ tmp_map[cid] = gid;
++ if (max < cid)
++ max = cid;
++ }
+ }
+ } else {
+ HPDF_UNICODE unicode = (i << 8) | j;
+- HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (fontdef,
++ HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (def,
+ unicode);
+- tmp_map[unicode] = gid;
+- if (max < unicode)
+- max = unicode;
++ if (def_attr->glyph_tbl.flgs[gid]) {
++ tmp_map[unicode] = gid;
++ if (max < unicode)
++ max = unicode;
++ }
+ }
+ }
+ }
+
+ if (max > 0) {
+- HPDF_INT16 dw = fontdef->missing_width;
++ HPDF_INT16 dw = def->missing_width;
+ HPDF_UNICODE *ptmp_map = tmp_map;
+ HPDF_Array tmp_array = NULL;
+
+ /* add 'W' element */
+ array = HPDF_Array_New (font->mmgr);
+ if (!array)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+ if (HPDF_Dict_Add (font, "W", array) != HPDF_OK)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+ for (i = 0; i < max; i++, ptmp_map++) {
+- HPDF_INT w = HPDF_TTFontDef_GetGidWidth (fontdef, *ptmp_map);
++ HPDF_INT w = HPDF_TTFontDef_GetGidWidth (def, *ptmp_map);
+
+- if (w != dw) {
++ if (def_attr->glyph_tbl.flgs[*ptmp_map] && w != dw) {
+ if (!tmp_array) {
+ if (HPDF_Array_AddNumber (array, i) != HPDF_OK)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+ tmp_array = HPDF_Array_New (font->mmgr);
+ if (!tmp_array)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+ if (HPDF_Array_Add (array, tmp_array) != HPDF_OK)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+ }
+
+ if ((ret = HPDF_Array_AddNumber (tmp_array, w)) != HPDF_OK)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+ } else
+ tmp_array = NULL;
+ }
+
+ /* create "CIDToGIDMap" data */
+- if (fontdef_attr->embedding) {
+- attr->map_stream = HPDF_DictStream_New (font->mmgr, xref);
+- if (!attr->map_stream)
+- return NULL;
++ if (def_attr->embedding) {
++ font_attr->map_stream = HPDF_DictStream_New (font->mmgr, font_attr->xref);
++ if (!font_attr->map_stream)
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+- if (HPDF_Dict_Add (font, "CIDToGIDMap", attr->map_stream) != HPDF_OK)
+- return NULL;
++ if (HPDF_Dict_Add (font, "CIDToGIDMap", font_attr->map_stream) != HPDF_OK)
++ return HPDF_FAILD_TO_ALLOC_MEM;
+
+ for (i = 0; i < max; i++) {
+ HPDF_BYTE u[2];
+@@ -472,47 +515,15 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref)
+ HPDF_MemCpy ((HPDF_BYTE *)(tmp_map + i), u, 2);
+ }
+
+- if ((ret = HPDF_Stream_Write (attr->map_stream->stream,
++ if ((ret = HPDF_Stream_Write (font_attr->map_stream->stream,
+ (HPDF_BYTE *)tmp_map, max * 2)) != HPDF_OK)
+- return NULL;
++ return HPDF_FAILD_TO_ALLOC_MEM;
+ }
+ } else {
+ HPDF_SetError (font->error, HPDF_INVALID_FONTDEF_DATA, 0);
+- return 0;
++ return HPDF_INVALID_FONTDEF_DATA;
+ }
+
+- /* create CIDSystemInfo dictionary */
+- cid_system_info = HPDF_Dict_New (parent->mmgr);
+- if (!cid_system_info)
+- return NULL;
+-
+- if (HPDF_Dict_Add (font, "CIDSystemInfo", cid_system_info) != HPDF_OK)
+- return NULL;
+-
+- ret += HPDF_Dict_Add (cid_system_info, "Registry",
+- HPDF_String_New (parent->mmgr, encoder_attr->registry, NULL));
+- ret += HPDF_Dict_Add (cid_system_info, "Ordering",
+- HPDF_String_New (parent->mmgr, encoder_attr->ordering, NULL));
+- ret += HPDF_Dict_AddNumber (cid_system_info, "Supplement",
+- encoder_attr->suppliment);
+-
+- if (ret != HPDF_OK)
+- return NULL;
+-
+- return font;
+-}
+-
+-
+-static HPDF_STATUS
+-CIDFontType2_BeforeWrite_Func (HPDF_Dict obj)
+-{
+- HPDF_FontAttr font_attr = (HPDF_FontAttr)obj->attr;
+- HPDF_FontDef def = font_attr->fontdef;
+- HPDF_TTFontDefAttr def_attr = (HPDF_TTFontDefAttr)def->attr;
+- HPDF_STATUS ret = 0;
+-
+- HPDF_PTRACE ((" CIDFontType2_BeforeWrite_Func\n"));
+-
+ if (font_attr->map_stream)
+ font_attr->map_stream->filter = obj->filter;
+
+--
+2.16.0
+