From f85653219a85a9f91cb14471485611ca5f6b25ba Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Thu, 13 Jun 2013 16:00:35 +0100 Subject: Make display lists reference counted objects. Remove fz_free_display_list from the API; instead use fz_drop_display_list. --- fitz/dev_list.c | 41 ++++++++++++++++++++++++++++------------- fitz/fitz.h | 15 ++++++++++----- fitz/res_font.c | 2 +- fitz/text_extract.c | 9 ++++++++- 4 files changed, 47 insertions(+), 20 deletions(-) (limited to 'fitz') diff --git a/fitz/dev_list.c b/fitz/dev_list.c index 5caf34fd..972c4ba5 100644 --- a/fitz/dev_list.c +++ b/fitz/dev_list.c @@ -52,6 +52,7 @@ struct fz_display_node_s struct fz_display_list_s { + fz_storable storable; fz_display_node *first; fz_display_node *last; int len; @@ -586,10 +587,29 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list) return dev; } +static void +fz_free_display_list(fz_context *ctx, fz_storable *list_) +{ + fz_display_list *list = (fz_display_list *)list_; + fz_display_node *node; + + if (list == NULL) + return; + node = list->first; + while (node) + { + fz_display_node *next = node->next; + fz_free_display_node(ctx, node); + node = next; + } + fz_free(ctx, list); +} + fz_display_list * fz_new_display_list(fz_context *ctx) { fz_display_list *list = fz_malloc_struct(ctx, fz_display_list); + FZ_INIT_STORABLE(list, 1, fz_free_display_list); list->first = NULL; list->last = NULL; list->len = 0; @@ -598,21 +618,16 @@ fz_new_display_list(fz_context *ctx) return list; } -void -fz_free_display_list(fz_context *ctx, fz_display_list *list) +fz_display_list * +fz_keep_display_list(fz_context *ctx, fz_display_list *list) { - fz_display_node *node; + return (fz_display_list *)fz_keep_storable(ctx, &list->storable); +} - if (list == NULL) - return; - node = list->first; - while (node) - { - fz_display_node *next = node->next; - fz_free_display_node(ctx, node); - node = next; - } - fz_free(ctx, list); +void +fz_drop_display_list(fz_context *ctx, fz_display_list *list) +{ + fz_drop_storable(ctx, &list->storable); } static fz_display_node * diff --git a/fitz/fitz.h b/fitz/fitz.h index 1dc12ff9..73bf8bcd 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -2380,7 +2380,7 @@ struct fz_cookie_s Create a displaylist with fz_new_display_list, hand it over to fz_new_list_device to have it populated, and later replay the list (once or many times) by calling fz_run_display_list. When - the list is no longer needed free it with fz_free_display_list. + the list is no longer needed drop it with fz_drop_display_list. */ typedef struct fz_display_list_s fz_display_list; @@ -2434,14 +2434,19 @@ fz_device *fz_new_list_device(fz_context *ctx, fz_display_list *list); void fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *ctm, const fz_rect *area, fz_cookie *cookie); /* - fz_free_display_list: Frees a display list. + fz_keep_display_list: Keep a reference to a display list. - list: Display list to be freed. Any objects put into the - display list by a list device will also be freed. + Does not throw exceptions. +*/ +fz_display_list *fz_keep_display_list(fz_context *ctx, fz_display_list *list); + +/* + fz_drop_display_list: Drop a reference to a display list, freeing it + if the reference count reaches zero. Does not throw exceptions. */ -void fz_free_display_list(fz_context *ctx, fz_display_list *list); +void fz_drop_display_list(fz_context *ctx, fz_display_list *list); /* Links diff --git a/fitz/res_font.c b/fitz/res_font.c index 3263f88c..db2ffe5d 100644 --- a/fitz/res_font.c +++ b/fitz/res_font.c @@ -103,7 +103,7 @@ fz_drop_font(fz_context *ctx, fz_font *font) if (font->t3procs[i]) fz_drop_buffer(ctx, font->t3procs[i]); if (font->t3lists[i]) - fz_free_display_list(ctx, font->t3lists[i]); + fz_drop_display_list(ctx, font->t3lists[i]); } fz_free(ctx, font->t3procs); fz_free(ctx, font->t3lists); diff --git a/fitz/text_extract.c b/fitz/text_extract.c index bf50e6a4..01a789fd 100644 --- a/fitz/text_extract.c +++ b/fitz/text_extract.c @@ -369,7 +369,12 @@ fz_new_text_sheet(fz_context *ctx) void fz_free_text_sheet(fz_context *ctx, fz_text_sheet *sheet) { - fz_text_style *style = sheet->style; + fz_text_style *style; + + if (sheet == NULL) + return; + + style = sheet->style; while (style) { fz_text_style *next = style->next; @@ -478,6 +483,8 @@ void fz_free_text_page(fz_context *ctx, fz_text_page *page) { fz_page_block *block; + if (page == NULL) + return; for (block = page->blocks; block < page->blocks + page->len; block++) { switch (block->type) -- cgit v1.2.3