diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-03-15 12:44:36 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2018-03-16 14:51:41 +0100 |
commit | 4b66d5773bf513e72a82b10b0f80a529aaa12313 (patch) | |
tree | 8bdd71bb0ba499c8b0dd9ace6fc87b0bfd1798aa /source/pdf/pdf-font.c | |
parent | 1cd2046b3cce264a3d13481652868fd1c31537fc (diff) | |
download | mupdf-4b66d5773bf513e72a82b10b0f80a529aaa12313.tar.xz |
Simplify PDF font creation code.
Don't create a useless pdf_font_desc when writing font resources.
Simplify reference counting by using fewer intermediate variables.
Diffstat (limited to 'source/pdf/pdf-font.c')
-rw-r--r-- | source/pdf/pdf-font.c | 470 |
1 files changed, 171 insertions, 299 deletions
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index 69044c53..7caf9e3a 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -1485,6 +1485,8 @@ pdf_print_font(fz_context *ctx, fz_output *out, pdf_font_desc *fontdesc) } } +/* Font creation */ + fz_rect *pdf_measure_text(fz_context *ctx, pdf_font_desc *fontdesc, unsigned char *buf, size_t len, fz_rect *acc) { size_t i; @@ -1578,133 +1580,110 @@ pdf_add_font_file(fz_context *ctx, pdf_document *doc, fz_font *font) return ref; } -static pdf_obj* -pdf_add_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *fileref) +static void +pdf_add_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font) { - pdf_obj *ref = NULL; - pdf_obj *fdobj = NULL; - pdf_obj *bbox = NULL; - - fz_font *font = fontdesc->font; FT_Face face = font->ft_face; + pdf_obj *fdobj = NULL; + pdf_obj *fileref; + fz_rect bbox; - fz_var(fdobj); - fz_var(bbox); - fz_var(ref); - + fdobj = pdf_new_dict(ctx, doc, 10); fz_try(ctx) { - fdobj = pdf_new_dict(ctx, doc, 10); pdf_dict_put(ctx, fdobj, PDF_NAME_Type, PDF_NAME_FontDescriptor); pdf_dict_put_name(ctx, fdobj, PDF_NAME_FontName, font->name); - bbox = pdf_new_array(ctx, doc, 4); - pdf_array_push_real(ctx, bbox, 1000.0f * font->bbox.x0); - pdf_array_push_real(ctx, bbox, 1000.0f * font->bbox.y0); - pdf_array_push_real(ctx, bbox, 1000.0f * font->bbox.x1); - pdf_array_push_real(ctx, bbox, 1000.0f * font->bbox.y1); - pdf_dict_put(ctx, fdobj, PDF_NAME_FontBBox, bbox); + bbox.x0 = font->bbox.x0 * 1000; + bbox.y0 = font->bbox.y0 * 1000; + bbox.x1 = font->bbox.x1 * 1000; + bbox.y1 = font->bbox.y1 * 1000; + pdf_dict_put_rect(ctx, fdobj, PDF_NAME_FontBBox, &bbox); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_ItalicAngle, fontdesc->italic_angle); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_Ascent, fontdesc->ascent); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_Descent, fontdesc->descent); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_CapHeight, fontdesc->cap_height); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_StemV, 80); - pdf_dict_put_real(ctx, fdobj, PDF_NAME_Flags, fontdesc->flags); + pdf_dict_put_int(ctx, fdobj, PDF_NAME_ItalicAngle, 0); + pdf_dict_put_int(ctx, fdobj, PDF_NAME_Ascent, face->ascender * 1000.0f / face->units_per_EM); + pdf_dict_put_int(ctx, fdobj, PDF_NAME_Descent, face->descender * 1000.0f / face->units_per_EM); + pdf_dict_put_int(ctx, fdobj, PDF_NAME_StemV, 80); + pdf_dict_put_int(ctx, fdobj, PDF_NAME_Flags, PDF_FD_NONSYMBOLIC); + fileref = pdf_add_font_file(ctx, doc, font); if (fileref) { switch (ft_font_file_kind(face)) { - case 1: pdf_dict_put(ctx, fdobj, PDF_NAME_FontFile, fileref); break; - case 2: pdf_dict_put(ctx, fdobj, PDF_NAME_FontFile2, fileref); break; - case 3: pdf_dict_put(ctx, fdobj, PDF_NAME_FontFile3, fileref); break; + default: + case 1: pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontFile, fileref); break; + case 2: pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontFile2, fileref); break; + case 3: pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontFile3, fileref); break; } } - ref = pdf_add_object(ctx, doc, fdobj); + pdf_dict_put_drop(ctx, fobj, PDF_NAME_FontDescriptor, pdf_add_object(ctx, doc, fdobj)); } fz_always(ctx) - { pdf_drop_obj(ctx, fdobj); - pdf_drop_obj(ctx, bbox); - } fz_catch(ctx) - { - pdf_drop_obj(ctx, ref); fz_rethrow(ctx); - } - return ref; } -static pdf_obj* -pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, - int *first_char, int *last_char) +static void +pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font, const char * const encoding[]) { int width_table[256]; - pdf_obj *arr; - int i; + pdf_obj *widths; + int i, first, last; - *first_char = 0; - *last_char = 0; + first = 0; + last = 0; for (i = 0; i < 256; ++i) { - int glyph = fz_encode_character(ctx, fontdesc->font, i); + int glyph = 0; + if (encoding[i]) + { + glyph = ft_name_index(font->ft_face, encoding[i]); + if (glyph == 0) + glyph = ft_char_index(font->ft_face, pdf_lookup_agl(encoding[i])); + } if (glyph > 0) { - if (!*first_char) - *first_char = i; - *last_char = i; - width_table[i] = fz_advance_glyph(ctx, fontdesc->font, glyph, 0) * 1000; + if (!first) + first = i; + last = i; + width_table[i] = fz_advance_glyph(ctx, font, glyph, 0) * 1000; } else width_table[i] = 0; } - arr = pdf_new_array(ctx, doc, *last_char - *first_char + 1); - fz_try(ctx) - { - for (i = *first_char; i <= *last_char; i++) - pdf_array_push_int(ctx, arr, width_table[i]); - } - fz_catch(ctx) - { - pdf_drop_obj(ctx, arr); - fz_rethrow(ctx); - } - - return pdf_add_object_drop(ctx, doc, arr); + widths = pdf_new_array(ctx, doc, last - first + 1); + pdf_dict_put_drop(ctx, fobj, PDF_NAME_Widths, widths); + for (i = first; i <= last; ++i) + pdf_array_push_int(ctx, widths, width_table[i]); + pdf_dict_put_int(ctx, fobj, PDF_NAME_FirstChar, first); + pdf_dict_put_int(ctx, fobj, PDF_NAME_LastChar, last); } -static pdf_obj* -pdf_add_cid_system_info(fz_context *ctx, pdf_document *doc) +static void +pdf_add_cid_system_info(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, const char *reg, const char *ord, int supp) { - pdf_obj *fobj = pdf_new_dict(ctx, doc, 3); - fz_try(ctx) - { - pdf_dict_put_string(ctx, fobj, PDF_NAME_Ordering, "Identity", strlen("Identity")); - pdf_dict_put_string(ctx, fobj, PDF_NAME_Registry, "Adobe", strlen("Adobe")); - pdf_dict_put_int(ctx, fobj, PDF_NAME_Supplement, 0); - } - fz_catch(ctx) - { - pdf_drop_obj(ctx, fobj); - fz_rethrow(ctx); - } - return fobj; + pdf_obj *csi; + pdf_dict_put_drop(ctx, fobj, PDF_NAME_CIDSystemInfo, csi = pdf_new_dict(ctx, doc, 3)); + pdf_dict_put_string(ctx, csi, PDF_NAME_Registry, reg, strlen(reg)); + pdf_dict_put_string(ctx, csi, PDF_NAME_Ordering, ord, strlen(ord)); + pdf_dict_put_int(ctx, csi, PDF_NAME_Supplement, supp); } /* Different states of starting, same width as last, or consecutive glyph */ enum { FW_START, FW_SAME, FW_RUN }; /* ToDo: Ignore the default sized characters */ -static pdf_obj* -pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, fz_font *font) +static void +pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font) { FT_Face face = font->ft_face; pdf_obj *run_obj = NULL; - pdf_obj *fwobj; + pdf_obj *fw; int curr_code; int prev_code; int curr_size; @@ -1717,7 +1696,7 @@ pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd fz_var(run_obj); - fwobj = pdf_new_array(ctx, doc, 10); + fw = pdf_add_object_drop(ctx, doc, pdf_new_array(ctx, doc, 10)); fz_try(ctx) { prev_code = 0; @@ -1782,24 +1761,24 @@ pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd { case FW_SAME: /* Add three entries. First cid, last cid and width */ - pdf_array_push_int(ctx, fwobj, first_code); - pdf_array_push_int(ctx, fwobj, prev_code); - pdf_array_push_int(ctx, fwobj, prev_size); + pdf_array_push_int(ctx, fw, first_code); + pdf_array_push_int(ctx, fw, prev_code); + pdf_array_push_int(ctx, fw, prev_size); break; case FW_RUN: if (pdf_array_len(ctx, run_obj) > 0) { - pdf_array_push_int(ctx, fwobj, first_code); - pdf_array_push(ctx, fwobj, run_obj); + pdf_array_push_int(ctx, fw, first_code); + pdf_array_push(ctx, fw, run_obj); } pdf_drop_obj(ctx, run_obj); run_obj = NULL; break; case FW_START: /* Lone wolf. Not part of a consecutive run */ - pdf_array_push_int(ctx, fwobj, prev_code); - pdf_array_push_int(ctx, fwobj, prev_code); - pdf_array_push_int(ctx, fwobj, prev_size); + pdf_array_push_int(ctx, fw, prev_code); + pdf_array_push_int(ctx, fw, prev_code); + pdf_array_push_int(ctx, fw, prev_size); break; } @@ -1814,82 +1793,55 @@ pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd prev_size = curr_size; prev_code = curr_code; } + + if (font->width_table != NULL) + pdf_dict_put_int(ctx, fobj, PDF_NAME_DW, font->width_default); + if (pdf_array_len(ctx, fw) > 0) + pdf_dict_put(ctx, fobj, PDF_NAME_W, fw); } + fz_always(ctx) + pdf_drop_obj(ctx, fw); fz_catch(ctx) - { - pdf_drop_obj(ctx, fwobj); - pdf_drop_obj(ctx, run_obj); fz_rethrow(ctx); - } - return pdf_add_object_drop(ctx, doc, fwobj); } /* Descendant font construction used for CID font creation from ttf or Adobe type1 */ static pdf_obj* -pdf_add_descendant_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc) +pdf_add_descendant_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) { - pdf_obj *fobj = NULL; - pdf_obj *fref = NULL; - pdf_obj *fstr_ref = NULL; - pdf_obj *fsys_ref = NULL; - pdf_obj *fdes_ref = NULL; - pdf_obj *fw = NULL; - - const char *ps_name; - fz_font *font = fontdesc->font; FT_Face face = font->ft_face; + pdf_obj *fobj, *fref; + const char *ps_name; - fz_var(fobj); - fz_var(fref); - fz_var(fstr_ref); - fz_var(fsys_ref); - fz_var(fw); - + fobj = pdf_new_dict(ctx, doc, 3); fz_try(ctx) { - /* refs */ - fstr_ref = pdf_add_font_file(ctx, doc, fontdesc->font); - fdes_ref = pdf_add_font_descriptor(ctx, doc, fontdesc, fstr_ref); - fsys_ref = pdf_add_cid_system_info(ctx, doc); - - /* We may have a cid font already with width info in source font and no cmap in the ft face */ - fw = pdf_add_cid_font_widths(ctx, doc, fontdesc, font); - - /* And now the font */ - fobj = pdf_new_dict(ctx, doc, 3); pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); switch (ft_kind(face)) { case TYPE1: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_CIDFontType0); break; case TRUETYPE: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_CIDFontType2); break; } + + pdf_add_cid_system_info(ctx, doc, fobj, "Adobe", "Identity", 0); + ps_name = FT_Get_Postscript_Name(face); if (ps_name) pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, ps_name); else pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, font->name); - pdf_dict_put(ctx, fobj, PDF_NAME_CIDSystemInfo, fsys_ref); - pdf_dict_put(ctx, fobj, PDF_NAME_FontDescriptor, fdes_ref); - if (font->width_table != NULL) - pdf_dict_put_int(ctx, fobj, PDF_NAME_DW, font->width_default); - if (fw != NULL) - pdf_dict_put(ctx, fobj, PDF_NAME_W, fw); + + pdf_add_font_descriptor(ctx, doc, fobj, font); + + /* We may have a cid font already with width info in source font and no cmap in the ft face */ + pdf_add_cid_font_widths(ctx, doc, fobj, font); fref = pdf_add_object(ctx, doc, fobj); } fz_always(ctx) - { pdf_drop_obj(ctx, fobj); - pdf_drop_obj(ctx, fstr_ref); - pdf_drop_obj(ctx, fsys_ref); - pdf_drop_obj(ctx, fdes_ref); - pdf_drop_obj(ctx, fw); - } fz_catch(ctx) - { - pdf_drop_obj(ctx, fref); fz_rethrow(ctx); - } return fref; } @@ -1907,12 +1859,10 @@ static int next_range(int *table, int size, int k) } /* Create the ToUnicode CMap. */ -static pdf_obj* -pdf_add_to_unicode(fz_context *ctx, pdf_document *doc, fz_font *font) +static void +pdf_add_to_unicode(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, fz_font *font) { FT_Face face = font->ft_face; - pdf_obj *fref = NULL; - pdf_obj *fobj = NULL; fz_buffer *buf; int *table; @@ -1920,9 +1870,6 @@ pdf_add_to_unicode(fz_context *ctx, pdf_document *doc, fz_font *font) int num_chr = 0; int n, k; - fz_var(fref); - fz_var(fobj); - /* Populate reverse cmap table */ { FT_ULong ucs; @@ -1954,7 +1901,7 @@ pdf_add_to_unicode(fz_context *ctx, pdf_document *doc, fz_font *font) { fz_warn(ctx, "cannot create ToUnicode mapping for %s", font->name); fz_free(ctx, table); - return NULL; + return; } buf = fz_new_buffer(ctx, 0); @@ -2052,22 +1999,15 @@ pdf_add_to_unicode(fz_context *ctx, pdf_document *doc, fz_font *font) fz_append_string(ctx, buf, "CMapName currentdict /CMap defineresource pop\n"); fz_append_string(ctx, buf, "end\nend\n"); - fobj = pdf_new_dict(ctx, doc, 3); - fref = pdf_add_object(ctx, doc, fobj); - pdf_update_stream(ctx, doc, fref, buf, 0); + pdf_dict_put_drop(ctx, fobj, PDF_NAME_ToUnicode, pdf_add_stream(ctx, doc, buf, NULL, 0)); } fz_always(ctx) { fz_free(ctx, table); fz_drop_buffer(ctx, buf); - pdf_drop_obj(ctx, fobj); } fz_catch(ctx) - { - pdf_drop_obj(ctx, fref); fz_rethrow(ctx); - } - return fref; } /* Creates CID font with Identity-H CMap and a ToUnicode CMap that is created by @@ -2079,78 +2019,38 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) { pdf_obj *fobj = NULL; pdf_obj *fref = NULL; - pdf_obj *obj_desc_ref = NULL; - pdf_obj *obj_tounicode_ref = NULL; - pdf_obj *obj_array = NULL; - pdf_font_desc *fontdesc = NULL; - - FT_Face face = font->ft_face; + pdf_obj *dfonts = NULL; unsigned char digest[16]; - fz_var(fobj); - fz_var(fref); - fz_var(obj_desc_ref); - fz_var(obj_tounicode_ref); - fz_var(fontdesc); - fz_var(obj_array); + fref = pdf_find_font_resource(ctx, doc, PDF_CID_FONT_RESOURCE, 0, font->buffer, digest); + if (fref) + return fref; + fobj = pdf_add_object_drop(ctx, doc, pdf_new_dict(ctx, doc, 10)); fz_try(ctx) { - /* Before we add this font as a resource check if the same font - * already exists in our resources for this doc. If yes, then - * hand back that reference */ - fref = pdf_find_font_resource(ctx, doc, PDF_CID_FONT_RESOURCE, 0, font->buffer, digest); - if (fref == NULL) - { - /* Set up desc, width, and font file */ - fontdesc = pdf_new_font_desc(ctx); - fontdesc->font = fz_keep_font(ctx, font); - fontdesc->flags = PDF_FD_NONSYMBOLIC; /* ToDo: FixMe. Set non-symbolic always for now */ - fontdesc->ascent = face->ascender * 1000.0f / face->units_per_EM; - fontdesc->descent = face->descender * 1000.0f / face->units_per_EM; - - /* Get the descendant font and the tounicode references */ - obj_desc_ref = pdf_add_descendant_font(ctx, doc, fontdesc); - obj_tounicode_ref = pdf_add_to_unicode(ctx, doc, font); - - /* And now the font */ - fobj = pdf_new_dict(ctx, doc, 10); - pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); - pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type0); - pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, font->name); - pdf_dict_put(ctx, fobj, PDF_NAME_Encoding, PDF_NAME_Identity_H); + pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); + pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type0); + pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, font->name); + pdf_dict_put(ctx, fobj, PDF_NAME_Encoding, PDF_NAME_Identity_H); + pdf_add_to_unicode(ctx, doc, fobj, font); - obj_array = pdf_new_array(ctx, doc, 3); - pdf_array_insert(ctx, obj_array, obj_desc_ref, 0); - pdf_dict_put(ctx, fobj, PDF_NAME_DescendantFonts, obj_array); - if (obj_tounicode_ref) - pdf_dict_put(ctx, fobj, PDF_NAME_ToUnicode, obj_tounicode_ref); - fref = pdf_add_object(ctx, doc, fobj); + pdf_dict_put_drop(ctx, fobj, PDF_NAME_DescendantFonts, dfonts = pdf_new_array(ctx, doc, 1)); + pdf_array_push_drop(ctx, dfonts, pdf_add_descendant_cid_font(ctx, doc, font)); - /* Add ref to our font resource hash table. */ - fref = pdf_insert_font_resource(ctx, doc, digest, fref); - } + fref = pdf_insert_font_resource(ctx, doc, digest, fobj); } fz_always(ctx) - { - pdf_drop_font(ctx, fontdesc); pdf_drop_obj(ctx, fobj); - pdf_drop_obj(ctx, obj_desc_ref); - pdf_drop_obj(ctx, obj_array); - pdf_drop_obj(ctx, obj_tounicode_ref); - } fz_catch(ctx) - { - pdf_drop_obj(ctx, fref); fz_rethrow(ctx); - } return fref; } /* Create simple (8-bit encoding) fonts */ static void -pdf_add_simple_font_encoding_imp(fz_context *ctx, pdf_document *doc, pdf_obj *font, const char * const glyph_names[]) +pdf_add_simple_font_encoding_imp(fz_context *ctx, pdf_document *doc, pdf_obj *font, const char *glyph_names[]) { pdf_obj *enc, *diff; int i, last; @@ -2161,7 +2061,7 @@ pdf_add_simple_font_encoding_imp(fz_context *ctx, pdf_document *doc, pdf_obj *fo last = 0; for (i = 128; i < 256; ++i) { - const char *glyph = glyph_names[i-128]; + const char *glyph = glyph_names[i]; if (glyph) { if (last != i-1) @@ -2193,88 +2093,60 @@ pdf_add_simple_font_encoding(fz_context *ctx, pdf_document *doc, pdf_obj *fobj, pdf_obj * pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font, int encoding) { + FT_Face face = font->ft_face; pdf_obj *fobj = NULL; pdf_obj *fref = NULL; - pdf_obj *fstr_ref = NULL; - pdf_obj *fdes_ref = NULL; - pdf_obj *fwidth_ref = NULL; - pdf_font_desc *fontdesc = NULL; - - FT_Face face = font->ft_face; + const char **enc; unsigned char digest[16]; - int first_char, last_char; - fz_var(fobj); - fz_var(fref); - fz_var(fstr_ref); - fz_var(fdes_ref); - fz_var(fwidth_ref); - fz_var(fontdesc); + fref = pdf_find_font_resource(ctx, doc, PDF_SIMPLE_FONT_RESOURCE, encoding, font->buffer, digest); + if (fref) + return fref; + switch (encoding) + { + default: enc = pdf_win_ansi; break; + case PDF_SIMPLE_ENCODING_LATIN: enc = pdf_win_ansi; break; + case PDF_SIMPLE_ENCODING_GREEK: enc = pdf_glyph_name_from_iso8859_7; break; + case PDF_SIMPLE_ENCODING_CYRILLIC: enc = pdf_glyph_name_from_koi8u; break; + } + + fobj = pdf_add_object_drop(ctx, doc, pdf_new_dict(ctx, doc, 10)); fz_try(ctx) { - /* Before we add this font as a resource check if the same font - * already exists in our resources for this doc. If yes, then - * hand back that reference */ - fref = pdf_find_font_resource(ctx, doc, PDF_SIMPLE_FONT_RESOURCE, encoding, font->buffer, digest); - if (fref == NULL) + pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); + switch (ft_kind(face)) { - fobj = pdf_new_dict(ctx, doc, 10); - pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); - switch (ft_kind(face)) - { - case TYPE1: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type1); break; - case TRUETYPE: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_TrueType); break; - } - - if (!is_builtin_font(ctx, font)) - { - const char *ps_name = FT_Get_Postscript_Name(face); - if (!ps_name) - ps_name = font->name; - pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, ps_name); - - fontdesc = pdf_new_font_desc(ctx); - fontdesc->font = fz_keep_font(ctx, font); - fontdesc->flags = PDF_FD_NONSYMBOLIC; /* ToDo: FixMe. Set non-symbolic always for now */ - fontdesc->ascent = face->ascender * 1000.0f / face->units_per_EM; - fontdesc->descent = face->descender * 1000.0f / face->units_per_EM; - - fstr_ref = pdf_add_font_file(ctx, doc, font); - fdes_ref = pdf_add_font_descriptor(ctx, doc, fontdesc, fstr_ref); - fwidth_ref = pdf_add_simple_font_widths(ctx, doc, fontdesc, &first_char, &last_char); - - pdf_dict_put_int(ctx, fobj, PDF_NAME_FirstChar, first_char); - pdf_dict_put_int(ctx, fobj, PDF_NAME_LastChar, last_char); - pdf_dict_put(ctx, fobj, PDF_NAME_Widths, fwidth_ref); - pdf_dict_put(ctx, fobj, PDF_NAME_FontDescriptor, fdes_ref); - } - else - { - pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, clean_font_name(font->name)); - } + case TYPE1: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type1); break; + case TRUETYPE: pdf_dict_put(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_TrueType); break; + } + if (!is_builtin_font(ctx, font)) + { + const char *ps_name = FT_Get_Postscript_Name(face); + if (!ps_name) + ps_name = font->name; + pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, ps_name); pdf_add_simple_font_encoding(ctx, doc, fobj, encoding); - - fref = pdf_add_object(ctx, doc, fobj); - - /* Add ref to our font resource hash table. */ - fref = pdf_insert_font_resource(ctx, doc, digest, fref); + pdf_add_simple_font_widths(ctx, doc, fobj, font, enc); + pdf_add_font_descriptor(ctx, doc, fobj, font); } + else + { + pdf_dict_put_name(ctx, fobj, PDF_NAME_BaseFont, clean_font_name(font->name)); + pdf_add_simple_font_encoding(ctx, doc, fobj, encoding); + if (encoding != PDF_SIMPLE_ENCODING_LATIN) + pdf_add_simple_font_widths(ctx, doc, fobj, font, enc); + } + + fref = pdf_insert_font_resource(ctx, doc, digest, fobj); } fz_always(ctx) { - pdf_drop_font(ctx, fontdesc); pdf_drop_obj(ctx, fobj); - pdf_drop_obj(ctx, fstr_ref); - pdf_drop_obj(ctx, fdes_ref); - pdf_drop_obj(ctx, fwidth_ref); } fz_catch(ctx) - { - pdf_drop_obj(ctx, fref); fz_rethrow(ctx); - } return fref; } @@ -2296,7 +2168,7 @@ pdf_obj * pdf_add_cjk_font(fz_context *ctx, pdf_document *doc, fz_font *fzfont, int script) { pdf_obj *fref, *font, *subfont, *fontdesc; - pdf_obj *dfonts, *ros; + pdf_obj *dfonts; fz_rect bbox = { -200, -200, 1200, 1200 }; unsigned char digest[16]; @@ -2338,40 +2210,40 @@ pdf_add_cjk_font(fz_context *ctx, pdf_document *doc, fz_font *fzfont, int script if (fref) return fref; - font = pdf_new_dict(ctx, doc, 5); - pdf_dict_put(ctx, font, PDF_NAME_Type, PDF_NAME_Font); - pdf_dict_put(ctx, font, PDF_NAME_Subtype, PDF_NAME_Type0); - pdf_dict_put_name(ctx, font, PDF_NAME_BaseFont, basefont); - pdf_dict_put_name(ctx, font, PDF_NAME_Encoding, encoding); - pdf_dict_put_drop(ctx, font, PDF_NAME_DescendantFonts, dfonts = pdf_new_array(ctx, doc, 1)); - subfont = pdf_new_dict(ctx, doc, 5); + font = pdf_add_object_drop(ctx, doc, pdf_new_dict(ctx, doc, 5)); + fz_try(ctx) { - pdf_dict_put(ctx, subfont, PDF_NAME_Type, PDF_NAME_Font); - pdf_dict_put(ctx, subfont, PDF_NAME_Subtype, PDF_NAME_CIDFontType0); - pdf_dict_put_name(ctx, subfont, PDF_NAME_BaseFont, basefont); - pdf_dict_put_drop(ctx, subfont, PDF_NAME_CIDSystemInfo, ros = pdf_new_dict(ctx, doc, 3)); - pdf_dict_put_text_string(ctx, ros, PDF_NAME_Registry, "Adobe"); - pdf_dict_put_text_string(ctx, ros, PDF_NAME_Ordering, ordering); - pdf_dict_put_int(ctx, ros, PDF_NAME_Supplement, supplement); - fontdesc = pdf_new_dict(ctx, doc, 8); + pdf_dict_put(ctx, font, PDF_NAME_Type, PDF_NAME_Font); + pdf_dict_put(ctx, font, PDF_NAME_Subtype, PDF_NAME_Type0); + pdf_dict_put_name(ctx, font, PDF_NAME_BaseFont, basefont); + pdf_dict_put_name(ctx, font, PDF_NAME_Encoding, encoding); + pdf_dict_put_drop(ctx, font, PDF_NAME_DescendantFonts, dfonts = pdf_new_array(ctx, doc, 1)); + pdf_array_push_drop(ctx, dfonts, pdf_add_object_drop(ctx, doc, subfont = pdf_new_dict(ctx, doc, 5))); { - pdf_dict_put(ctx, fontdesc, PDF_NAME_Type, PDF_NAME_FontDescriptor); - pdf_dict_put_text_string(ctx, fontdesc, PDF_NAME_FontName, basefont); - pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Flags, 0); - pdf_dict_put_rect(ctx, fontdesc, PDF_NAME_FontBBox, &bbox); - pdf_dict_put_int(ctx, fontdesc, PDF_NAME_ItalicAngle, 0); - pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Ascent, 1000); - pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Descent, -200); - pdf_dict_put_int(ctx, fontdesc, PDF_NAME_StemV, 80); + pdf_dict_put(ctx, subfont, PDF_NAME_Type, PDF_NAME_Font); + pdf_dict_put(ctx, subfont, PDF_NAME_Subtype, PDF_NAME_CIDFontType0); + pdf_dict_put_name(ctx, subfont, PDF_NAME_BaseFont, basefont); + pdf_add_cid_system_info(ctx, doc, subfont, "Adobe", ordering, supplement); + fontdesc = pdf_add_object_drop(ctx, doc, pdf_new_dict(ctx, doc, 8)); + pdf_dict_put_drop(ctx, subfont, PDF_NAME_FontDescriptor, fontdesc); + { + pdf_dict_put(ctx, fontdesc, PDF_NAME_Type, PDF_NAME_FontDescriptor); + pdf_dict_put_text_string(ctx, fontdesc, PDF_NAME_FontName, basefont); + pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Flags, 0); + pdf_dict_put_rect(ctx, fontdesc, PDF_NAME_FontBBox, &bbox); + pdf_dict_put_int(ctx, fontdesc, PDF_NAME_ItalicAngle, 0); + pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Ascent, 1000); + pdf_dict_put_int(ctx, fontdesc, PDF_NAME_Descent, -200); + pdf_dict_put_int(ctx, fontdesc, PDF_NAME_StemV, 80); + } } - pdf_dict_put_drop(ctx, subfont, PDF_NAME_FontDescriptor, pdf_add_object_drop(ctx, doc, fontdesc)); - } - pdf_array_push_drop(ctx, dfonts, pdf_add_object_drop(ctx, doc, subfont)); - - fref = pdf_add_object_drop(ctx, doc, font); - /* Add ref to our font resource hash table. */ - fref = pdf_insert_font_resource(ctx, doc, digest, fref); + fref = pdf_insert_font_resource(ctx, doc, digest, font); + } + fz_always(ctx) + pdf_drop_obj(ctx, font); + fz_catch(ctx) + fz_rethrow(ctx); return fref; } |