diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-02-25 14:08:27 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-02-29 16:03:34 +0100 |
commit | 763f739410df658cb9fb2c37368abd79b29b4d02 (patch) | |
tree | f7f54d96254e71d8ef13346d7e7fb7b4ac737e9f /source | |
parent | 9c28b43b4807aca041dbda3bd6f4f361582d3f5a (diff) | |
download | mupdf-763f739410df658cb9fb2c37368abd79b29b4d02.tar.xz |
Clean up error handling.
There were plenty of places where we might double free objects
in case of errors.
Diffstat (limited to 'source')
-rw-r--r-- | source/pdf/pdf-font.c | 252 |
1 files changed, 108 insertions, 144 deletions
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index 8ddea304..54ed4e03 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -1437,25 +1437,27 @@ pdf_add_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd pdf_obj *ref = NULL; pdf_obj *fdobj = NULL; pdf_obj *bbox = NULL; - FT_Face face; - if (fontdesc->font == NULL || fontdesc->font->ft_face == NULL) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot create font description"); - face = fontdesc->font->ft_face; + fz_font *font = fontdesc->font; + FT_Face face = font->ft_face; + + fz_var(fdobj); + fz_var(bbox); + fz_var(ref); fz_try(ctx) { fdobj = pdf_new_dict(ctx, doc, 10); - pdf_dict_put_drop(ctx, fdobj, PDF_NAME_Type, PDF_NAME_FontDescriptor); - pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontName, pdf_new_name(ctx, doc, fontdesc->font->name)); + pdf_dict_put(ctx, fdobj, PDF_NAME_Type, PDF_NAME_FontDescriptor); + pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontName, pdf_new_name(ctx, doc, font->name)); bbox = pdf_new_array(ctx, doc, 4); - pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * fontdesc->font->bbox.x0)); - pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * fontdesc->font->bbox.y0)); - pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * fontdesc->font->bbox.x1)); - pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * fontdesc->font->bbox.y1)); - pdf_dict_put_drop(ctx, fdobj, PDF_NAME_FontBBox, bbox); - bbox = NULL; + pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * font->bbox.x0)); + pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * font->bbox.y0)); + pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * font->bbox.x1)); + pdf_array_push_drop(ctx, bbox, pdf_new_real(ctx, doc, 1000.0f * font->bbox.y1)); + pdf_dict_put(ctx, fdobj, PDF_NAME_FontBBox, bbox); + pdf_dict_put_drop(ctx, fdobj, PDF_NAME_ItalicAngle, pdf_new_real(ctx, doc, fontdesc->italic_angle)); pdf_dict_put_drop(ctx, fdobj, PDF_NAME_Ascent, pdf_new_real(ctx, doc, fontdesc->ascent)); pdf_dict_put_drop(ctx, fdobj, PDF_NAME_Descent, pdf_new_real(ctx, doc, fontdesc->descent)); @@ -1467,12 +1469,9 @@ pdf_add_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd { switch (ft_font_file_kind(face)) { - 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; - case UNKNOWN: - fz_throw(ctx, FZ_ERROR_GENERIC, "Unknown font subtype"); - break; + 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; } } @@ -1481,11 +1480,11 @@ pdf_add_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd fz_always(ctx) { pdf_drop_obj(ctx, fdobj); + pdf_drop_obj(ctx, bbox); } fz_catch(ctx) { pdf_drop_obj(ctx, ref); - pdf_drop_obj(ctx, bbox); fz_rethrow(ctx); } return ref; @@ -1496,13 +1495,9 @@ pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fo int *first_char, int *last_char) { int width_table[256]; - pdf_obj *ref = NULL; - pdf_obj *arr = NULL; + pdf_obj *arr; int i; - fz_var(arr); - fz_var(ref); - *first_char = 0; *last_char = 0; @@ -1517,56 +1512,40 @@ pdf_add_simple_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fo width_table[i] = fz_advance_glyph(ctx, fontdesc->font, glyph, 0) * 1000; } else - { width_table[i] = 0; - } } + arr = pdf_new_array(ctx, doc, *last_char - *first_char + 1); fz_try(ctx) { - arr = pdf_new_array(ctx, doc, *last_char - *first_char + 1); for (i = *first_char; i <= *last_char; i++) pdf_array_push_drop(ctx, arr, pdf_new_int(ctx, doc, width_table[i])); - ref = pdf_new_ref(ctx, doc, arr); - } - fz_always(ctx) - { - pdf_drop_obj(ctx, arr); } fz_catch(ctx) { - pdf_drop_obj(ctx, ref); + pdf_drop_obj(ctx, arr); fz_rethrow(ctx); } - return ref; + + return pdf_new_ref(ctx, doc, arr); } static pdf_obj* pdf_add_cid_system_info(fz_context *ctx, pdf_document *doc) { - pdf_obj *fobj = NULL; - pdf_obj *ref = NULL; - - fz_var(fobj); - + pdf_obj *fobj = pdf_new_dict(ctx, doc, 3); fz_try(ctx) { - fobj = pdf_new_dict(ctx, doc, 3); pdf_dict_put_drop(ctx, fobj, PDF_NAME_Ordering, pdf_new_string(ctx, doc, "Identity", strlen("Identity"))); pdf_dict_put_drop(ctx, fobj, PDF_NAME_Registry, pdf_new_string(ctx, doc, "Adobe", strlen("Adobe"))); pdf_dict_put_drop(ctx, fobj, PDF_NAME_Supplement, pdf_new_int(ctx, doc, 0)); - ref = pdf_new_ref(ctx, doc, fobj); - } - fz_always(ctx) - { - pdf_drop_obj(ctx, fobj); } fz_catch(ctx) { - pdf_drop_obj(ctx, ref); + pdf_drop_obj(ctx, fobj); fz_rethrow(ctx); } - return ref; + return fobj; } /* Different states of starting, same width as last, or consecutive glyph */ @@ -1575,46 +1554,41 @@ enum { FW_START, FW_SAME, FW_RUN }; static void pdf_add_cid_font_widths_entry(fz_context *ctx, pdf_document *doc, pdf_obj *fwobj, pdf_obj *run_obj, int state, int first_code, int prev_code, int prev_size) { - pdf_obj *temp_array = NULL; - - fz_var(temp_array); + pdf_obj *temp_array; - fz_try(ctx) + switch (state) { - switch (state) + case FW_SAME: + /* Add three entries. First cid, last cid and width */ + pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, first_code)); + pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_code)); + pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_size)); + break; + case FW_RUN: + if (pdf_array_len(ctx, run_obj) > 0) { - case FW_SAME: - /* Add three entries. First cid, last cid and width */ pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, first_code)); - pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_code)); - pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_size)); - break; - case FW_RUN: - if (pdf_array_len(ctx, run_obj) > 0) - { - pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, first_code)); - pdf_array_push_drop(ctx, fwobj, run_obj); - } - else - { - pdf_drop_obj(ctx, run_obj); - } - run_obj = NULL; - break; - case FW_START: - /* Lone wolf. Not part of a consecutive run */ - pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_code)); - temp_array = pdf_new_array(ctx, doc, 1); + pdf_array_push_drop(ctx, fwobj, run_obj); + } + else + { + pdf_drop_obj(ctx, run_obj); + } + break; + case FW_START: + /* Lone wolf. Not part of a consecutive run */ + pdf_array_push_drop(ctx, fwobj, pdf_new_int(ctx, doc, prev_code)); + temp_array = pdf_new_array(ctx, doc, 1); + fz_try(ctx) + { pdf_array_push_drop(ctx, temp_array, pdf_new_int(ctx, doc, prev_size)); - pdf_array_push_drop(ctx, fwobj, temp_array); - temp_array = NULL; - break; + pdf_array_push(ctx, fwobj, temp_array); } - } - fz_catch(ctx) - { - pdf_drop_obj(ctx, temp_array); - fz_rethrow(ctx); + fz_always(ctx) + pdf_drop_obj(ctx, temp_array); + fz_catch(ctx) + fz_rethrow(ctx); + break; } } @@ -1622,8 +1596,8 @@ pdf_add_cid_font_widths_entry(fz_context *ctx, pdf_document *doc, pdf_obj *fwobj static pdf_obj* pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, fz_font *source_font) { - pdf_obj *fwobj = NULL; pdf_obj *run_obj = NULL; + pdf_obj *fwobj; FT_ULong curr_code; FT_ULong prev_code; FT_UInt gindex; @@ -1657,12 +1631,11 @@ pdf_add_cid_font_widths(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd gindex = 1; } - fz_var(fwobj); fz_var(run_obj); + fwobj = pdf_new_array(ctx, doc, 10); fz_try(ctx) { - fwobj = pdf_new_array(ctx, doc, 10); while (gindex != 0) { if (source_font->width_table == NULL) @@ -1795,46 +1768,41 @@ pdf_add_descendant_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd 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 */ + /* 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_drop(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, font->name)); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_FontDescriptor, fdes_ref); - if (fw != NULL) - pdf_dict_put_drop(ctx, fobj, PDF_NAME_W, fw); - if (font->width_table != NULL) - pdf_dict_put_drop(ctx, fobj, PDF_NAME_DW, pdf_new_int(ctx, doc, font->width_default)); - if ((ps_name = FT_Get_Postscript_Name(face)) != NULL) - pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_string(ctx, doc, ps_name, strlen(ps_name))); + pdf_dict_put(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); switch (ft_kind(face)) { - case TYPE1: - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_CIDFontType0); - break; - case TRUETYPE: - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_CIDFontType2); - break; - case UNKNOWN: - fz_throw(ctx, FZ_ERROR_GENERIC, "Unknown font subtype"); - break; + 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_dict_put_drop(ctx, fobj, PDF_NAME_CIDSystemInfo, fsys_ref); + ps_name = FT_Get_Postscript_Name(face); + if (ps_name) + pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, ps_name)); + else + pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, 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_drop(ctx, fobj, PDF_NAME_DW, pdf_new_int(ctx, doc, font->width_default)); + if (fw != NULL) + pdf_dict_put(ctx, fobj, PDF_NAME_W, fw); + fref = pdf_new_ref(ctx, doc, fobj); } fz_always(ctx) { pdf_drop_obj(ctx, fobj); - } - fz_catch(ctx) - { 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); } @@ -1843,7 +1811,7 @@ pdf_add_descendant_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontd /* Create the ToUnicode CMap. */ static pdf_obj* -pdf_add_cid_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc) +pdf_add_tounicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc) { fz_buffer *fzbuf = NULL; pdf_obj *fref = NULL; @@ -1886,13 +1854,11 @@ pdf_add_cid_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontde /* Sort via populating */ table = fz_calloc(ctx, 65536, sizeof(unsigned short)); count = 0; + fz_lock(ctx, FZ_LOCK_FREETYPE); + has_lock = 1; for (k = 0; k < 65536; k++) { - fz_lock(ctx, FZ_LOCK_FREETYPE); - has_lock = 1; glyph_index = FT_Get_Char_Index(face, k); - fz_unlock(ctx, FZ_LOCK_FREETYPE); - has_lock = 0; if (glyph_index > 0 && glyph_index < 65536) { if (table[glyph_index] == 0) @@ -1902,6 +1868,8 @@ pdf_add_cid_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontde } } } + fz_unlock(ctx, FZ_LOCK_FREETYPE); + has_lock = 0; /* Now output non-zero entries. */ /* Note to have a valid CMap, the number of entries in table set can @@ -2062,7 +2030,8 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) pdf_obj *obj_tounicode_ref = NULL; pdf_obj *obj_array = NULL; pdf_font_desc *fontdesc = NULL; - FT_Face face; + + FT_Face face = font->ft_face; unsigned char digest[16]; fz_var(fobj); @@ -2070,7 +2039,6 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) fz_var(obj_desc_ref); fz_var(obj_tounicode_ref); fz_var(fontdesc); - fz_var(font); fz_var(obj_array); fz_try(ctx) @@ -2082,28 +2050,27 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) if (fref == NULL) { /* Set up desc, width, and font file */ - face = font->ft_face; fontdesc = pdf_new_font_desc(ctx); - fontdesc->font = font; + 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_cid_to_unicode(ctx, doc, fontdesc); + obj_tounicode_ref = pdf_add_tounicode(ctx, doc, fontdesc); /* And now the font */ fobj = pdf_new_dict(ctx, doc, 10); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type0); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, fontdesc->font->name)); - pdf_dict_put_drop(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_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, font->name)); + pdf_dict_put(ctx, fobj, PDF_NAME_Encoding, PDF_NAME_Identity_H); obj_array = pdf_new_array(ctx, doc, 3); - pdf_array_insert_drop(ctx, obj_array, obj_desc_ref, 0); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_DescendantFonts, obj_array); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_ToUnicode, obj_tounicode_ref); + pdf_array_insert(ctx, obj_array, obj_desc_ref, 0); + pdf_dict_put(ctx, fobj, PDF_NAME_DescendantFonts, obj_array); + pdf_dict_put(ctx, fobj, PDF_NAME_ToUnicode, obj_tounicode_ref); fref = pdf_new_ref(ctx, doc, fobj); /* Add ref to our font resource hash table. */ @@ -2112,16 +2079,14 @@ pdf_add_cid_font(fz_context *ctx, pdf_document *doc, fz_font *font) } fz_always(ctx) { - if (fontdesc != NULL) - fontdesc->font = NULL; pdf_drop_font(ctx, fontdesc); pdf_drop_obj(ctx, fobj); - } - fz_catch(ctx) - { 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); } @@ -2138,7 +2103,8 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font) pdf_obj *fdes_ref = NULL; pdf_obj *fwidth_ref = NULL; pdf_font_desc *fontdesc = NULL; - FT_Face face; + + FT_Face face = font->ft_face; const char *ps_name; unsigned char digest[16]; int first_char, last_char; @@ -2149,7 +2115,6 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font) fz_var(fdes_ref); fz_var(fwidth_ref); fz_var(fontdesc); - fz_var(font); fz_try(ctx) { @@ -2159,25 +2124,24 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font) fref = pdf_find_resource(ctx, doc, doc->resources->font, font->buffer, digest); if (fref == NULL) { - face = font->ft_face; - fobj = pdf_new_dict(ctx, doc, 10); pdf_dict_put_drop(ctx, fobj, PDF_NAME_Type, PDF_NAME_Font); switch (ft_kind(face)) { - case TYPE1: pdf_dict_put_drop(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_Type1); break; - case TRUETYPE: pdf_dict_put_drop(ctx, fobj, PDF_NAME_Subtype, PDF_NAME_TrueType); break; + 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 ((ps_name = FT_Get_Postscript_Name(face)) != NULL) + ps_name = FT_Get_Postscript_Name(face); + if (ps_name) pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, ps_name)); else pdf_dict_put_drop(ctx, fobj, PDF_NAME_BaseFont, pdf_new_name(ctx, doc, font->name)); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Encoding, PDF_NAME_WinAnsiEncoding); + pdf_dict_put(ctx, fobj, PDF_NAME_Encoding, PDF_NAME_WinAnsiEncoding); if (!is_builtin_font(ctx, font)) { fontdesc = pdf_new_font_desc(ctx); - fontdesc->font = font; + 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; @@ -2188,8 +2152,8 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font) pdf_dict_put_drop(ctx, fobj, PDF_NAME_FirstChar, pdf_new_int(ctx, doc, first_char)); pdf_dict_put_drop(ctx, fobj, PDF_NAME_LastChar, pdf_new_int(ctx, doc, last_char)); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_Widths, fwidth_ref); - pdf_dict_put_drop(ctx, fobj, PDF_NAME_FontDescriptor, fdes_ref); + pdf_dict_put(ctx, fobj, PDF_NAME_Widths, fwidth_ref); + pdf_dict_put(ctx, fobj, PDF_NAME_FontDescriptor, fdes_ref); } fref = pdf_new_ref(ctx, doc, fobj); @@ -2202,12 +2166,12 @@ pdf_add_simple_font(fz_context *ctx, pdf_document *doc, fz_font *font) { pdf_drop_font(ctx, fontdesc); pdf_drop_obj(ctx, fobj); - } - fz_catch(ctx) - { 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); } |