diff options
Diffstat (limited to 'source/html/epub-doc.c')
-rw-r--r-- | source/html/epub-doc.c | 90 |
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); } |