summaryrefslogtreecommitdiff
path: root/source/html/epub-doc.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/html/epub-doc.c')
-rw-r--r--source/html/epub-doc.c90
1 files changed, 51 insertions, 39 deletions
diff --git a/source/html/epub-doc.c b/source/html/epub-doc.c
index 3aaedd33..69963ff0 100644
--- a/source/html/epub-doc.c
+++ b/source/html/epub-doc.c
@@ -11,7 +11,6 @@ typedef struct epub_page_s epub_page;
struct epub_document_s
{
fz_document super;
- fz_context *ctx;
fz_archive *zip;
fz_html_font_set *set;
float page_w, page_h, em;
@@ -26,10 +25,17 @@ struct epub_chapter_s
epub_chapter *next;
};
+struct epub_page_s
+{
+ fz_page super;
+ epub_document *doc;
+ int number;
+};
+
static void
-epub_layout(epub_document *doc, float w, float h, float em)
+epub_layout(fz_context *ctx, fz_document *doc_, float w, float h, float em)
{
- fz_context *ctx = doc->ctx;
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch;
doc->page_w = w;
@@ -43,8 +49,9 @@ epub_layout(epub_document *doc, float w, float h, float em)
}
static int
-epub_count_pages(epub_document *doc)
+epub_count_pages(fz_context *ctx, fz_document *doc_)
{
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch;
int count = 0;
for (ch = doc->spine; ch; ch = ch->next)
@@ -52,20 +59,16 @@ epub_count_pages(epub_document *doc)
return count;
}
-static epub_page *
-epub_load_page(epub_document *doc, int number)
-{
- return (void*)((intptr_t)number + 1);
-}
-
static void
-epub_free_page(epub_document *doc, epub_page *page)
+epub_drop_page_imp(fz_context *ctx, fz_page *page_)
{
}
static fz_rect *
-epub_bound_page(epub_document *doc, epub_page *page, fz_rect *bbox)
+epub_bound_page(fz_context *ctx, fz_page *page_, fz_rect *bbox)
{
+ epub_page *page = (epub_page*)page_;
+ epub_document *doc = page->doc;
bbox->x0 = 0;
bbox->y0 = 0;
bbox->x1 = doc->page_w;
@@ -74,11 +77,13 @@ epub_bound_page(epub_document *doc, epub_page *page, fz_rect *bbox)
}
static void
-epub_run_page(epub_document *doc, epub_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+epub_run_page(fz_context *ctx, fz_page *page_, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
+ epub_page *page = (epub_page*)page_;
+ epub_document *doc = page->doc;
epub_chapter *ch;
- int n = ((intptr_t)page) - 1;
+ int n = page->number;
+
int count = 0;
for (ch = doc->spine; ch; ch = ch->next)
{
@@ -92,21 +97,34 @@ epub_run_page(epub_document *doc, epub_page *page, fz_device *dev, const fz_matr
}
}
+static fz_page *
+epub_load_page(fz_context *ctx, fz_document *doc_, int number)
+{
+ epub_document *doc = (epub_document*)doc_;
+ epub_page *page = fz_new_page(ctx, sizeof *page);
+ page->super.bound_page = epub_bound_page;
+ page->super.run_page_contents = epub_run_page;
+ page->super.drop_page_imp = epub_drop_page_imp;
+ page->doc = doc;
+ page->number = number;
+ return (fz_page*)page;
+}
+
static void
-epub_close_document(epub_document *doc)
+epub_close_document(fz_context *ctx, fz_document *doc_)
{
- fz_context *ctx = doc->ctx;
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch, *next;
ch = doc->spine;
while (ch)
{
next = ch->next;
- fz_free_html(ctx, ch->box);
+ fz_drop_html(ctx, ch->box);
fz_free(ctx, ch);
ch = next;
}
- fz_close_archive(ctx, doc->zip);
- fz_free_html_font_set(ctx, doc->set);
+ fz_drop_archive(ctx, doc->zip);
+ fz_drop_html_font_set(ctx, doc->set);
fz_free(ctx, doc);
}
@@ -143,9 +161,8 @@ path_from_idref(char *path, fz_xml *manifest, const char *base_uri, const char *
}
static epub_chapter *
-epub_parse_chapter(epub_document *doc, const char *path)
+epub_parse_chapter(fz_context *ctx, epub_document *doc, const char *path)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf;
epub_chapter *ch;
@@ -166,9 +183,8 @@ epub_parse_chapter(epub_document *doc, const char *path)
}
static void
-epub_parse_header(epub_document *doc)
+epub_parse_header(fz_context *ctx, epub_document *doc)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf;
fz_xml *container_xml, *content_opf;
@@ -222,9 +238,9 @@ epub_parse_header(epub_document *doc)
{
printf("epub: found spine %s\n", s);
if (!head)
- head = tail = epub_parse_chapter(doc, s);
+ head = tail = epub_parse_chapter(ctx, doc, s);
else
- tail = tail->next = epub_parse_chapter(doc, s);
+ tail = tail->next = epub_parse_chapter(ctx, doc, s);
}
itemref = fz_xml_find_next(itemref, "itemref");
}
@@ -233,8 +249,8 @@ epub_parse_header(epub_document *doc)
printf("epub: done.\n");
- fz_free_xml(ctx, container_xml);
- fz_free_xml(ctx, content_opf);
+ fz_drop_xml(ctx, container_xml);
+ fz_drop_xml(ctx, content_opf);
}
static epub_document *
@@ -243,26 +259,22 @@ epub_init(fz_context *ctx, fz_archive *zip)
epub_document *doc;
doc = fz_malloc_struct(ctx, epub_document);
- doc->ctx = ctx;
doc->zip = zip;
doc->set = fz_new_html_font_set(ctx);
- doc->super.close = (void*)epub_close_document;
- doc->super.layout = (void*)epub_layout;
- doc->super.count_pages = (void*)epub_count_pages;
- doc->super.load_page = (void*)epub_load_page;
- doc->super.bound_page = (void*)epub_bound_page;
- doc->super.run_page_contents = (void*)epub_run_page;
- doc->super.free_page = (void*)epub_free_page;
+ doc->super.close = epub_close_document;
+ doc->super.layout = epub_layout;
+ doc->super.count_pages = epub_count_pages;
+ doc->super.load_page = epub_load_page;
fz_try(ctx)
{
- epub_parse_header(doc);
- epub_layout(doc, DEFW, DEFH, DEFEM);
+ epub_parse_header(ctx, doc);
+ epub_layout(ctx, (fz_document*)doc, DEFW, DEFH, DEFEM);
}
fz_catch(ctx)
{
- epub_close_document(doc);
+ epub_close_document(ctx, (fz_document*)doc);
fz_rethrow(ctx);
}