diff options
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/bbox-device.c | 4 | ||||
-rw-r--r-- | source/fitz/device.c | 12 | ||||
-rw-r--r-- | source/fitz/document.c | 12 | ||||
-rw-r--r-- | source/fitz/draw-device.c | 4 | ||||
-rw-r--r-- | source/fitz/font.c | 3 | ||||
-rw-r--r-- | source/fitz/image.c | 1 | ||||
-rw-r--r-- | source/fitz/list-device.c | 4 | ||||
-rw-r--r-- | source/fitz/output-cbz.c | 23 | ||||
-rw-r--r-- | source/fitz/output-png.c | 7 | ||||
-rw-r--r-- | source/fitz/stext-device.c | 16 | ||||
-rw-r--r-- | source/fitz/svg-device.c | 13 | ||||
-rw-r--r-- | source/fitz/util.c | 9 | ||||
-rw-r--r-- | source/fitz/writer.c | 12 | ||||
-rw-r--r-- | source/fitz/zip.c | 48 |
14 files changed, 104 insertions, 64 deletions
diff --git a/source/fitz/bbox-device.c b/source/fitz/bbox-device.c index 42ca57ad..340eef3c 100644 --- a/source/fitz/bbox-device.c +++ b/source/fitz/bbox-device.c @@ -179,7 +179,7 @@ fz_bbox_end_tile(fz_context *ctx, fz_device *dev) } static void -fz_bbox_close(fz_context *ctx, fz_device *dev) +fz_bbox_drop_device(fz_context *ctx, fz_device *dev) { fz_bbox_device *bdev = (fz_bbox_device*)dev; if (bdev->top > 0) @@ -191,7 +191,7 @@ fz_new_bbox_device(fz_context *ctx, fz_rect *result) { fz_bbox_device *dev = fz_new_device(ctx, sizeof *dev); - dev->super.close = fz_bbox_close; + dev->super.drop_device = fz_bbox_drop_device; dev->super.fill_path = fz_bbox_fill_path; dev->super.stroke_path = fz_bbox_stroke_path; diff --git a/source/fitz/device.c b/source/fitz/device.c index 4379bb21..88b658a3 100644 --- a/source/fitz/device.c +++ b/source/fitz/device.c @@ -13,11 +13,11 @@ fz_close_device(fz_context *ctx, fz_device *dev) { if (dev == NULL) return; - if (dev->close) - dev->close(ctx, dev); + if (dev->close_device) + dev->close_device(ctx, dev); /* Don't call more than once! */ - dev->close = NULL; + dev->close_device = NULL; /* And disable all further device calls. */ dev->fill_path = NULL; @@ -53,8 +53,10 @@ fz_drop_device(fz_context *ctx, fz_device *dev) { if (fz_drop_imp(ctx, dev, &dev->refs)) { - if (dev->close) - dev->close(ctx, dev); + if (dev->close_device) + fz_warn(ctx, "dropping unclosed device"); + if (dev->drop_device) + dev->drop_device(ctx, dev); fz_free(ctx, dev->container); fz_free(ctx, dev); } diff --git a/source/fitz/document.c b/source/fitz/document.c index 02c30459..ad602bc2 100644 --- a/source/fitz/document.c +++ b/source/fitz/document.c @@ -150,8 +150,8 @@ fz_keep_document(fz_context *ctx, fz_document *doc) void fz_drop_document(fz_context *ctx, fz_document *doc) { - if (doc && --doc->refs == 0 && doc->close) - doc->close(ctx, doc); + if (doc && --doc->refs == 0 && doc->drop_document) + doc->drop_document(ctx, doc); } static void @@ -362,8 +362,8 @@ fz_drop_annot(fz_context *ctx, fz_annot *annot) { if (annot && --annot->refs == 0) { - if (annot->drop_annot_imp) - annot->drop_annot_imp(ctx, annot); + if (annot->drop_annot) + annot->drop_annot(ctx, annot); fz_free(ctx, annot); } } @@ -389,9 +389,9 @@ fz_drop_page(fz_context *ctx, fz_page *page) { if (page) { - if (--page->refs == 0 && page->drop_page_imp) + if (--page->refs == 0 && page->drop_page) { - page->drop_page_imp(ctx, page); + page->drop_page(ctx, page); fz_free(ctx, page); } } diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c index 9a2cb507..ff746e29 100644 --- a/source/fitz/draw-device.c +++ b/source/fitz/draw-device.c @@ -2357,7 +2357,7 @@ fz_draw_end_tile(fz_context *ctx, fz_device *devp) } static void -fz_draw_close(fz_context *ctx, fz_device *devp) +fz_draw_drop_device(fz_context *ctx, fz_device *devp) { fz_draw_device *dev = (fz_draw_device*)devp; fz_gel *gel = dev->gel; @@ -2400,7 +2400,7 @@ fz_new_draw_device(fz_context *ctx, const fz_matrix *transform, fz_pixmap *dest) { fz_draw_device *dev = fz_new_device(ctx, sizeof *dev); - dev->super.close = fz_draw_close; + dev->super.drop_device = fz_draw_drop_device; dev->super.fill_path = fz_draw_fill_path; dev->super.stroke_path = fz_draw_stroke_path; diff --git a/source/fitz/font.c b/source/fitz/font.c index b0248bd7..79cd050a 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1169,6 +1169,7 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) font->bbox_table[gid] = dev->d1_rect; fz_transform_rect(&font->bbox_table[gid], &font->t3matrix); } + fz_close_device(ctx, dev); fz_drop_device(ctx, dev); } @@ -1191,6 +1192,7 @@ fz_bound_t3_glyph(fz_context *ctx, fz_font *font, int gid, fz_rect *bounds) fz_try(ctx) { fz_run_display_list(ctx, list, dev, &font->t3matrix, &fz_infinite_rect, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -1270,6 +1272,7 @@ fz_render_t3_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, const fz_matr fz_try(ctx) { fz_run_t3_glyph(ctx, font, gid, trm, dev); + fz_close_device(ctx, dev); } fz_always(ctx) { diff --git a/source/fitz/image.c b/source/fitz/image.c index 064b03c7..330b65cf 100644 --- a/source/fitz/image.c +++ b/source/fitz/image.c @@ -1085,6 +1085,7 @@ display_list_image_get_pixmap(fz_context *ctx, fz_image *image_, fz_irect *subar fz_clear_pixmap(ctx, pix); /* clear to transparent */ dev = fz_new_draw_device(ctx, &ctm, pix); fz_run_display_list(ctx, image->list, dev, &fz_identity, NULL, NULL); + fz_close_device(ctx, dev); fz_drop_device(ctx, dev); /* Never do more subsampling, cos we've already given them the right size */ diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c index 18af0e20..d5e13375 100644 --- a/source/fitz/list-device.c +++ b/source/fitz/list-device.c @@ -1199,7 +1199,7 @@ fz_list_render_flags(fz_context *ctx, fz_device *dev, int set, int clear) } static void -drop_writer(fz_context *ctx, fz_device *dev) +fz_list_drop_device(fz_context *ctx, fz_device *dev) { fz_list_device *writer = (fz_list_device *)dev; @@ -1243,7 +1243,7 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list) dev->super.render_flags = fz_list_render_flags; - dev->super.close = drop_writer; + dev->super.drop_device = fz_list_drop_device; dev->list = list; dev->path = NULL; diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c index 80ef287c..43be16cb 100644 --- a/source/fitz/output-cbz.c +++ b/source/fitz/output-cbz.c @@ -29,6 +29,9 @@ cbz_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_buffer *buffer; char name[40]; + fz_close_device(ctx, dev); + fz_drop_device(ctx, dev); + wri->count += 1; fz_snprintf(name, sizeof name, "p%04d.png", wri->count); @@ -43,20 +46,21 @@ cbz_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_drop_pixmap(ctx, wri->pixmap); wri->pixmap = NULL; +} - fz_drop_device(ctx, dev); +static void +cbz_close_writer(fz_context *ctx, fz_document_writer *wri_) +{ + fz_cbz_writer *wri = (fz_cbz_writer*)wri_; + fz_close_zip_writer(ctx, wri->zip); } static void -cbz_close(fz_context *ctx, fz_document_writer *wri_) +cbz_drop_writer(fz_context *ctx, fz_document_writer *wri_) { fz_cbz_writer *wri = (fz_cbz_writer*)wri_; - fz_try(ctx) - fz_drop_zip_writer(ctx, wri->zip); - fz_always(ctx) - fz_drop_pixmap(ctx, wri->pixmap); - fz_catch(ctx) - fz_rethrow(ctx); + fz_drop_zip_writer(ctx, wri->zip); + fz_drop_pixmap(ctx, wri->pixmap); } fz_document_writer * @@ -67,7 +71,8 @@ fz_new_cbz_writer(fz_context *ctx, const char *path, const char *options) wri = fz_malloc_struct(ctx, fz_cbz_writer); wri->super.begin_page = cbz_begin_page; wri->super.end_page = cbz_end_page; - wri->super.close = cbz_close; + wri->super.close_writer = cbz_close_writer; + wri->super.drop_writer = cbz_drop_writer; fz_try(ctx) { diff --git a/source/fitz/output-png.c b/source/fitz/output-png.c index 5bd0737e..d710a0cd 100644 --- a/source/fitz/output-png.c +++ b/source/fitz/output-png.c @@ -324,6 +324,9 @@ png_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_png_writer *wri = (fz_png_writer*)wri_; char path[PATH_MAX]; + fz_close_device(ctx, dev); + fz_drop_device(ctx, dev); + wri->count += 1; fz_format_output_path(ctx, path, sizeof path, wri->path, wri->count); @@ -333,7 +336,7 @@ png_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) } static void -png_close(fz_context *ctx, fz_document_writer *wri_) +png_drop_writer(fz_context *ctx, fz_document_writer *wri_) { fz_png_writer *wri = (fz_png_writer*)wri_; fz_drop_pixmap(ctx, wri->pixmap); @@ -348,7 +351,7 @@ fz_new_png_writer(fz_context *ctx, const char *path, const char *options) wri = fz_malloc_struct(ctx, fz_png_writer); wri->super.begin_page = png_begin_page; wri->super.end_page = png_end_page; - wri->super.close = png_close; + wri->super.drop_writer = png_drop_writer; fz_try(ctx) { diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c index f50bbf82..55f2033b 100644 --- a/source/fitz/stext-device.c +++ b/source/fitz/stext-device.c @@ -1015,7 +1015,7 @@ fz_bidi_reorder_stext_page(fz_context *ctx, fz_stext_page *page) } static void -fz_stext_close(fz_context *ctx, fz_device *dev) +fz_stext_close_device(fz_context *ctx, fz_device *dev) { fz_stext_device *tdev = (fz_stext_device*)dev; @@ -1023,8 +1023,6 @@ fz_stext_close(fz_context *ctx, fz_device *dev) tdev->cur_span = NULL; strain_soup(ctx, tdev); - free_span_soup(ctx, tdev->spans); - tdev->spans = NULL; /* TODO: smart sorting of blocks in reading order */ /* TODO: unicode NFC normalization */ @@ -1032,6 +1030,14 @@ fz_stext_close(fz_context *ctx, fz_device *dev) fz_bidi_reorder_stext_page(ctx, tdev->page); } +static void +fz_stext_drop_device(fz_context *ctx, fz_device *dev) +{ + fz_stext_device *tdev = (fz_stext_device*)dev; + free_span_soup(ctx, tdev->spans); + tdev->spans = NULL; +} + fz_device * fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page) { @@ -1039,7 +1045,9 @@ fz_new_stext_device(fz_context *ctx, fz_stext_sheet *sheet, fz_stext_page *page) dev->super.hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE; - dev->super.close = fz_stext_close; + dev->super.close_device = fz_stext_close_device; + dev->super.drop_device = fz_stext_drop_device; + dev->super.fill_text = fz_stext_fill_text; dev->super.stroke_text = fz_stext_stroke_text; dev->super.clip_text = fz_stext_clip_text; diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c index 1a486545..8a7f4bf9 100644 --- a/source/fitz/svg-device.c +++ b/source/fitz/svg-device.c @@ -1063,23 +1063,28 @@ svg_dev_end_tile(fz_context *ctx, fz_device *dev) } static void -svg_dev_close(fz_context *ctx, fz_device *dev) +svg_dev_close_device(fz_context *ctx, fz_device *dev) { svg_device *sdev = (svg_device*)dev; fz_output *out = sdev->out; + fz_printf(ctx, out, "</svg>\n"); +} +static void +svg_dev_drop_device(fz_context *ctx, fz_device *dev) +{ + svg_device *sdev = (svg_device*)dev; fz_free(ctx, sdev->tiles); fz_drop_buffer(ctx, sdev->defs_buffer); fz_drop_output(ctx, sdev->defs); - - fz_printf(ctx, out, "</svg>\n"); } fz_device *fz_new_svg_device(fz_context *ctx, fz_output *out, float page_width, float page_height) { svg_device *dev = fz_new_device(ctx, sizeof *dev); - dev->super.close = svg_dev_close; + dev->super.close_device = svg_dev_close_device; + dev->super.drop_device = svg_dev_drop_device; dev->super.fill_path = svg_dev_fill_path; dev->super.stroke_path = svg_dev_stroke_path; diff --git a/source/fitz/util.c b/source/fitz/util.c index f76e496a..cefac962 100644 --- a/source/fitz/util.c +++ b/source/fitz/util.c @@ -13,6 +13,7 @@ fz_new_display_list_from_page(fz_context *ctx, fz_page *page) { dev = fz_new_list_device(ctx, list); fz_run_page(ctx, page, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -56,6 +57,7 @@ fz_new_display_list_from_page_contents(fz_context *ctx, fz_page *page) { dev = fz_new_list_device(ctx, list); fz_run_page_contents(ctx, page, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -83,6 +85,7 @@ fz_new_display_list_from_annot(fz_context *ctx, fz_annot *annot) { dev = fz_new_list_device(ctx, list); fz_run_annot(ctx, annot, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -119,6 +122,7 @@ fz_new_pixmap_from_display_list(fz_context *ctx, fz_display_list *list, const fz { dev = fz_new_draw_device(ctx, ctm, pix); fz_run_display_list(ctx, list, dev, &fz_identity, NULL, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -155,6 +159,7 @@ fz_new_pixmap_from_page_contents(fz_context *ctx, fz_page *page, const fz_matrix { dev = fz_new_draw_device(ctx, ctm, pix); fz_run_page_contents(ctx, page, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -191,6 +196,7 @@ fz_new_pixmap_from_annot(fz_context *ctx, fz_annot *annot, const fz_matrix *ctm, { dev = fz_new_draw_device(ctx, ctm, pix); fz_run_annot(ctx, annot, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -227,6 +233,7 @@ fz_new_pixmap_from_page(fz_context *ctx, fz_page *page, const fz_matrix *ctm, fz { dev = fz_new_draw_device(ctx, ctm, pix); fz_run_page(ctx, page, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -268,6 +275,7 @@ fz_new_stext_page_from_display_list(fz_context *ctx, fz_display_list *list, fz_s { dev = fz_new_stext_device(ctx, sheet, text); fz_run_display_list(ctx, list, dev, &fz_identity, NULL, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { @@ -293,6 +301,7 @@ fz_new_stext_page_from_page(fz_context *ctx, fz_page *page, fz_stext_sheet *shee { dev = fz_new_stext_device(ctx, sheet, text); fz_run_page(ctx, page, dev, &fz_identity, NULL); + fz_close_device(ctx, dev); } fz_always(ctx) { diff --git a/source/fitz/writer.c b/source/fitz/writer.c index 556e01a8..c4e95e2a 100644 --- a/source/fitz/writer.c +++ b/source/fitz/writer.c @@ -67,16 +67,18 @@ fz_new_document_writer(fz_context *ctx, const char *path, const char *format, co void fz_close_document_writer(fz_context *ctx, fz_document_writer *wri) { - if (wri->close) - wri->close(ctx, wri); - wri->close = NULL; + if (wri->close_writer) + wri->close_writer(ctx, wri); + wri->close_writer = NULL; } void fz_drop_document_writer(fz_context *ctx, fz_document_writer *wri) { - if (wri->close) - wri->close(ctx, wri); + if (wri->close_writer) + fz_warn(ctx, "dropping unclosed document writer"); + if (wri->drop_writer) + wri->drop_writer(ctx, wri); fz_free(ctx, wri); } diff --git a/source/fitz/zip.c b/source/fitz/zip.c index dd67e5ac..599d2954 100644 --- a/source/fitz/zip.c +++ b/source/fitz/zip.c @@ -15,6 +15,7 @@ struct fz_zip_writer_s fz_output *output; fz_buffer *central; int count; + int closed; }; void @@ -63,33 +64,34 @@ fz_write_zip_entry(fz_context *ctx, fz_zip_writer *zip, const char *name, fz_buf } void -fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip) +fz_close_zip_writer(fz_context *ctx, fz_zip_writer *zip) { - fz_try(ctx) - { - fz_off_t offset = fz_tell_output(ctx, zip->output); + fz_off_t offset = fz_tell_output(ctx, zip->output); - fz_write(ctx, zip->output, zip->central->data, zip->central->len); + fz_write(ctx, zip->output, zip->central->data, zip->central->len); - fz_write_int32_le(ctx, zip->output, ZIP_END_OF_CENTRAL_DIRECTORY_SIG); - fz_write_int16_le(ctx, zip->output, 0); /* number of this disk */ - fz_write_int16_le(ctx, zip->output, 0); /* number of disk where central directory starts */ - fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in this disk */ - fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in total */ - fz_write_int32_le(ctx, zip->output, (int)zip->central->len); /* size of the central directory */ - fz_write_int32_le(ctx, zip->output, (int)offset); /* offset of the central directory */ - fz_write_int16_le(ctx, zip->output, 5); /* zip file comment length */ + fz_write_int32_le(ctx, zip->output, ZIP_END_OF_CENTRAL_DIRECTORY_SIG); + fz_write_int16_le(ctx, zip->output, 0); /* number of this disk */ + fz_write_int16_le(ctx, zip->output, 0); /* number of disk where central directory starts */ + fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in this disk */ + fz_write_int16_le(ctx, zip->output, zip->count); /* entries in central directory in total */ + fz_write_int32_le(ctx, zip->output, (int)zip->central->len); /* size of the central directory */ + fz_write_int32_le(ctx, zip->output, (int)offset); /* offset of the central directory */ + fz_write_int16_le(ctx, zip->output, 5); /* zip file comment length */ - fz_write(ctx, zip->output, "MuPDF", 5); - } - fz_always(ctx) - { - fz_drop_output(ctx, zip->output); - fz_drop_buffer(ctx, zip->central); - fz_free(ctx, zip); - } - fz_catch(ctx) - fz_rethrow(ctx); + fz_write(ctx, zip->output, "MuPDF", 5); + + zip->closed = 1; +} + +void +fz_drop_zip_writer(fz_context *ctx, fz_zip_writer *zip) +{ + if (!zip->closed) + fz_warn(ctx, "dropping unclosed zip writer"); + fz_drop_output(ctx, zip->output); + fz_drop_buffer(ctx, zip->central); + fz_free(ctx, zip); } fz_zip_writer * |