summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2013-06-13 16:00:35 +0100
committerRobin Watts <robin.watts@artifex.com>2013-06-13 16:37:06 +0100
commitf85653219a85a9f91cb14471485611ca5f6b25ba (patch)
treed0abcf8b18b90f1430d4dddf4d4ae2e9d3deb07e /fitz
parent181dca77f819f9953e0eed4b10ee83d0a9153212 (diff)
downloadmupdf-f85653219a85a9f91cb14471485611ca5f6b25ba.tar.xz
Make display lists reference counted objects.
Remove fz_free_display_list from the API; instead use fz_drop_display_list.
Diffstat (limited to 'fitz')
-rw-r--r--fitz/dev_list.c41
-rw-r--r--fitz/fitz.h15
-rw-r--r--fitz/res_font.c2
-rw-r--r--fitz/text_extract.c9
4 files changed, 47 insertions, 20 deletions
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)