From 27cc2be0735b9ff115a9565b905f3b46f26e9ec8 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 3 Feb 2012 15:14:13 +0100 Subject: Reference count fz_link objects. --- android/jni/Core.mk | 3 ++- apps/pdfapp.c | 8 +++---- fitz/base_link.c | 58 ------------------------------------------------ fitz/doc_link.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fitz/fitz.h | 4 +++- pdf/pdf_page.c | 4 ++-- xps/muxps.h | 1 + xps/xps_doc.c | 4 ++-- 8 files changed, 78 insertions(+), 68 deletions(-) delete mode 100644 fitz/base_link.c create mode 100644 fitz/doc_link.c diff --git a/android/jni/Core.mk b/android/jni/Core.mk index 79de7230..b8a93c0d 100644 --- a/android/jni/Core.mk +++ b/android/jni/Core.mk @@ -25,7 +25,6 @@ LOCAL_SRC_FILES := \ $(MY_ROOT)/fitz/base_geometry.c \ $(MY_ROOT)/fitz/base_getopt.c \ $(MY_ROOT)/fitz/base_hash.c \ - $(MY_ROOT)/fitz/base_link.c \ $(MY_ROOT)/fitz/base_memory.c \ $(MY_ROOT)/fitz/base_object.c \ $(MY_ROOT)/fitz/base_string.c \ @@ -39,6 +38,8 @@ LOCAL_SRC_FILES := \ $(MY_ROOT)/fitz/dev_null.c \ $(MY_ROOT)/fitz/dev_text.c \ $(MY_ROOT)/fitz/dev_trace.c \ + $(MY_ROOT)/fitz/doc_document.c \ + $(MY_ROOT)/fitz/doc_link.c \ $(MY_ROOT)/fitz/doc_outline.c \ $(MY_ROOT)/fitz/filt_basic.c \ $(MY_ROOT)/fitz/filt_dctd.c \ diff --git a/apps/pdfapp.c b/apps/pdfapp.c index aba2056f..cd4b0747 100644 --- a/apps/pdfapp.c +++ b/apps/pdfapp.c @@ -178,7 +178,7 @@ void pdfapp_close(pdfapp_t *app) app->page_text = NULL; if (app->page_links) - fz_free_link(app->ctx, app->page_links); + fz_drop_link(app->ctx, app->page_links); app->page_links = NULL; if (app->doctitle) @@ -242,8 +242,8 @@ static void pdfapp_loadpage(pdfapp_t *app) fz_free_display_list(app->ctx, app->page_list); if (app->page_text) fz_free_text_span(app->ctx, app->page_text); -// if (app->page_links) // TODO: ownership -// fz_free_link(app->ctx, app->page_links); + if (app->page_links) + fz_drop_link(app->ctx, app->page_links); if (app->page) fz_free_page(app->doc, app->page); @@ -258,7 +258,7 @@ static void pdfapp_loadpage(pdfapp_t *app) fz_free_device(mdev); app->page_bbox = fz_bound_page(app->doc, app->page); - app->page_links = fz_load_links(app->doc, app->page); // FIXME: refcount or ownership of links + app->page_links = fz_load_links(app->doc, app->page); } fz_catch(app->ctx) { diff --git a/fitz/base_link.c b/fitz/base_link.c deleted file mode 100644 index cf173b7a..00000000 --- a/fitz/base_link.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "fitz.h" - -void -fz_free_link_dest(fz_context *ctx, fz_link_dest *dest) -{ - switch(dest->kind) - { - case FZ_LINK_NONE: - case FZ_LINK_GOTO: - break; - case FZ_LINK_URI: - fz_free(ctx, dest->ld.uri.uri); - break; - case FZ_LINK_LAUNCH: - fz_free(ctx, dest->ld.launch.file_spec); - break; - case FZ_LINK_NAMED: - fz_free(ctx, dest->ld.named.named); - break; - case FZ_LINK_GOTOR: - fz_free(ctx, dest->ld.gotor.file_spec); - break; - } -} - -fz_link * -fz_new_link(fz_context *ctx, fz_rect bbox, fz_link_dest dest) -{ - fz_link *link; - - fz_try(ctx) - { - link = fz_malloc_struct(ctx, fz_link); - } - fz_catch(ctx) - { - fz_free_link_dest(ctx, &dest); - fz_rethrow(ctx); - } - link->dest = dest; - link->rect = bbox; - link->next = NULL; - return link; -} - -void -fz_free_link(fz_context *ctx, fz_link *link) -{ - fz_link *next; - - while (link) - { - next = link->next; - fz_free_link_dest(ctx, &link->dest); - fz_free(ctx, link); - link = next; - } -} diff --git a/fitz/doc_link.c b/fitz/doc_link.c new file mode 100644 index 00000000..c9065f24 --- /dev/null +++ b/fitz/doc_link.c @@ -0,0 +1,64 @@ +#include "fitz.h" + +void +fz_free_link_dest(fz_context *ctx, fz_link_dest *dest) +{ + switch(dest->kind) + { + case FZ_LINK_NONE: + case FZ_LINK_GOTO: + break; + case FZ_LINK_URI: + fz_free(ctx, dest->ld.uri.uri); + break; + case FZ_LINK_LAUNCH: + fz_free(ctx, dest->ld.launch.file_spec); + break; + case FZ_LINK_NAMED: + fz_free(ctx, dest->ld.named.named); + break; + case FZ_LINK_GOTOR: + fz_free(ctx, dest->ld.gotor.file_spec); + break; + } +} + +fz_link * +fz_new_link(fz_context *ctx, fz_rect bbox, fz_link_dest dest) +{ + fz_link *link; + + fz_try(ctx) + { + link = fz_malloc_struct(ctx, fz_link); + link->refs = 1; + } + fz_catch(ctx) + { + fz_free_link_dest(ctx, &dest); + fz_rethrow(ctx); + } + link->dest = dest; + link->rect = bbox; + link->next = NULL; + return link; +} + +fz_link * +fz_keep_link(fz_context *ctx, fz_link *link) +{ + if (link) + link->refs++; + return link; +} + +void +fz_drop_link(fz_context *ctx, fz_link *link) +{ + if (--link->refs == 0) + { + fz_drop_link(ctx, link->next); + fz_free_link_dest(ctx, &link->dest); + fz_free(ctx, link); + } +} diff --git a/fitz/fitz.h b/fitz/fitz.h index d22c6661..a97817db 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -1569,13 +1569,15 @@ struct fz_link_dest_s struct fz_link_s { + int refs; fz_rect rect; fz_link_dest dest; fz_link *next; }; fz_link *fz_new_link(fz_context *ctx, fz_rect bbox, fz_link_dest dest); -void fz_free_link(fz_context *ctx, fz_link *link); +fz_link *fz_keep_link(fz_context *ctx, fz_link *link); +void fz_drop_link(fz_context *ctx, fz_link *link); void fz_free_link_dest(fz_context *ctx, fz_link_dest *dest); /* Outline */ diff --git a/pdf/pdf_page.c b/pdf/pdf_page.c index 6f7a97e3..f2bf713e 100644 --- a/pdf/pdf_page.c +++ b/pdf/pdf_page.c @@ -401,7 +401,7 @@ pdf_bound_page(pdf_document *xref, pdf_page *page) fz_link * pdf_load_links(pdf_document *xref, pdf_page *page) { - return page->links; + return fz_keep_link(xref->ctx, page->links); } void @@ -412,7 +412,7 @@ pdf_free_page(pdf_document *xref, pdf_page *page) if (page->contents) fz_drop_buffer(xref->ctx, page->contents); if (page->links) - fz_free_link(xref->ctx, page->links); + fz_drop_link(xref->ctx, page->links); if (page->annots) pdf_free_annot(xref->ctx, page->annots); fz_free(xref->ctx, page); diff --git a/xps/muxps.h b/xps/muxps.h index 6a6f345f..6037a64e 100644 --- a/xps/muxps.h +++ b/xps/muxps.h @@ -108,6 +108,7 @@ void xps_free_page_list(xps_document *doc); int xps_count_pages(xps_document *doc); xps_page *xps_load_page(xps_document *doc, int number); +fz_link *xps_load_links(xps_document *doc, xps_page *page); fz_rect xps_bound_page(xps_document *doc, xps_page *page); void xps_free_page(xps_document *doc, xps_page *page); diff --git a/xps/xps_doc.c b/xps/xps_doc.c index 3a4738dd..340cd700 100644 --- a/xps/xps_doc.c +++ b/xps/xps_doc.c @@ -146,7 +146,7 @@ xps_load_links(xps_document *doc, xps_page *page) { if (!page->links_resolved) fz_warn(doc->ctx, "xps_load_links before page has been executed!"); - return page->links; + return fz_keep_link(doc->ctx, page->links); } static void @@ -463,6 +463,6 @@ xps_free_page(xps_document *doc, xps_page *page) /* only free the XML contents */ if (page->root) xml_free_element(doc->ctx, page->root); - fz_free_link(doc->ctx, page->links); + fz_drop_link(doc->ctx, page->links); page->root = NULL; } -- cgit v1.2.3