summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2015-10-02 15:00:56 +0100
committerRobin Watts <robin.watts@artifex.com>2015-10-02 15:21:43 +0100
commitd203b82976bbcfc41995c2a0d05eec467112297b (patch)
treecc567ef17b88fb3de8eecc7737c55a1541f730a3
parent6d57575a362af052cbc43f00fba5d853bc81767c (diff)
downloadmupdf-d203b82976bbcfc41995c2a0d05eec467112297b.tar.xz
Reference count fz_outline struct.
-rw-r--r--include/mupdf/fitz/outline.h26
-rw-r--r--source/fitz/outline.c16
-rw-r--r--source/pdf/pdf-outline.c7
-rw-r--r--source/xps/xps-outline.c2
4 files changed, 22 insertions, 29 deletions
diff --git a/include/mupdf/fitz/outline.h b/include/mupdf/fitz/outline.h
index f0b2cc42..c3f724bc 100644
--- a/include/mupdf/fitz/outline.h
+++ b/include/mupdf/fitz/outline.h
@@ -30,6 +30,7 @@ typedef struct fz_outline_s fz_outline;
struct fz_outline_s
{
+ int refs;
char *title;
fz_link_dest dest;
fz_outline *next;
@@ -37,31 +38,14 @@ struct fz_outline_s
int is_open;
};
-/*
- fz_print_outline_xml: Dump the given outlines as (pseudo) XML.
-
- out: The file handle to output to.
-
- outline: The outlines to output.
-*/
+/* fz_print_outline_xml: Print an outline to 'out' as XML. */
void fz_print_outline_xml(fz_context *ctx, fz_output *out, fz_outline *outline);
-/*
- fz_print_outline: Dump the given outlines to as text.
-
- out: The file handle to output to.
-
- outline: The outlines to output.
-*/
+/* fz_print_outline: Print an outline to 'out' is plain text. */
void fz_print_outline(fz_context *ctx, fz_output *out, fz_outline *outline);
-/*
- fz_drop_outline: Free hierarchical outline.
-
- Free an outline obtained from fz_load_outline.
-
- Does not throw exceptions.
-*/
+fz_outline *fz_new_outline(fz_context *ctx);
+fz_outline *fz_keep_outline(fz_context *ctx, fz_outline *outline);
void fz_drop_outline(fz_context *ctx, fz_outline *outline);
#endif
diff --git a/source/fitz/outline.c b/source/fitz/outline.c
index 0cd1890d..257c44c1 100644
--- a/source/fitz/outline.c
+++ b/source/fitz/outline.c
@@ -1,9 +1,23 @@
#include "mupdf/fitz.h"
+fz_outline *
+fz_new_outline(fz_context *ctx)
+{
+ fz_outline *outline = fz_malloc_struct(ctx, fz_outline);
+ outline->refs = 1;
+ return outline;
+}
+
+fz_outline *
+fz_keep_outline(fz_context *ctx, fz_outline *outline)
+{
+ return fz_keep_imp(ctx, outline, &outline->refs);
+}
+
void
fz_drop_outline(fz_context *ctx, fz_outline *outline)
{
- while (outline)
+ while (fz_drop_imp(ctx, outline, &outline->refs))
{
fz_outline *next = outline->next;
fz_drop_outline(ctx, outline->down);
diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c
index 44c0c518..0c1d3feb 100644
--- a/source/pdf/pdf-outline.c
+++ b/source/pdf/pdf-outline.c
@@ -18,12 +18,7 @@ pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
if (pdf_mark_obj(ctx, dict))
break;
- node = fz_malloc_struct(ctx, fz_outline);
- node->title = NULL;
- node->dest.kind = FZ_LINK_NONE;
- node->down = NULL;
- node->next = NULL;
- node->is_open = 0;
+ node = fz_new_outline(ctx);
*prev = node;
prev = &node->next;
diff --git a/source/xps/xps-outline.c b/source/xps/xps-outline.c
index b6e68c29..14f8cae7 100644
--- a/source/xps/xps-outline.c
+++ b/source/xps/xps-outline.c
@@ -30,7 +30,7 @@ xps_parse_document_outline(fz_context *ctx, xps_document *doc, fz_xml *root)
if (!target || !description)
continue;
- entry = fz_malloc_struct(ctx, fz_outline);
+ entry = fz_new_outline(ctx);
entry->title = fz_strdup(ctx, description);
entry->dest.kind = FZ_LINK_GOTO;
entry->dest.ld.gotor.flags = 0;