summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-08-10 15:12:16 +0200
committerRobin Watts <robin.watts@artifex.com>2018-09-19 17:13:45 +0100
commit6ff43c0f084b2ca5356ee6710b23fd751ce94749 (patch)
tree8a99682d6098d98a13b8f20af69b95ad8eff4fb6 /source
parent29af4a4709fea3ad06514083d3e96f08a202ebf4 (diff)
downloadmupdf-6ff43c0f084b2ca5356ee6710b23fd751ce94749.tar.xz
Make fz_page objects singleton.
Keep a list of currently open pages for each document. Attempting to load a page that is already loaded will return the same instance again.
Diffstat (limited to 'source')
-rw-r--r--source/fitz/document.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/source/fitz/document.c b/source/fitz/document.c
index 013badb0..26ae93ea 100644
--- a/source/fitz/document.c
+++ b/source/fitz/document.c
@@ -319,9 +319,27 @@ fz_document_output_intent(fz_context *ctx, fz_document *doc)
fz_page *
fz_load_page(fz_context *ctx, fz_document *doc, int number)
{
+ fz_page *page;
+
fz_ensure_layout(ctx, doc);
+
+ for (page = doc->open; page; page = page->next)
+ if (page->number == number)
+ return fz_keep_page(ctx, page);
+
if (doc && doc->load_page)
- return doc->load_page(ctx, doc, number);
+ {
+ page = doc->load_page(ctx, doc, number);
+ page->number = number;
+
+ /* Insert new page at the head of the list of open pages. */
+ if ((page->next = doc->open) != NULL)
+ doc->open->prev = &page->next;
+ doc->open = page;
+ page->prev = &doc->open;
+ return page;
+ }
+
return NULL;
}
@@ -472,8 +490,14 @@ fz_drop_page(fz_context *ctx, fz_page *page)
{
if (fz_drop_imp(ctx, page, &page->refs))
{
+ /* Remove page from the list of open pages */
+ if (page->next != NULL)
+ page->next->prev = page->prev;
+ *page->prev = page->next;
+
if (page->drop_page)
page->drop_page(ctx, page);
+
fz_free(ctx, page);
}
}