diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2012-12-09 00:12:51 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2012-12-08 19:03:34 -0800 |
commit | 761b2da827096a8287daa14b4ea0ad304ad1f341 (patch) | |
tree | 7ff42ae7cc4cdd5461622fdfda49e9e487351f89 | |
parent | 3dbf93f4612d6736f8b8ba43b5eb6e7971632cfa (diff) | |
download | mupdf-761b2da827096a8287daa14b4ea0ad304ad1f341.tar.xz |
ios: Use fz_document interface directly.
-rw-r--r-- | ios/Default-568h@2x.png | bin | 0 -> 18594 bytes | |||
-rw-r--r-- | ios/MuPDF.xcodeproj/project.pbxproj | 10 | ||||
-rw-r--r-- | ios/document.c | 306 | ||||
-rw-r--r-- | ios/document.h | 29 | ||||
-rw-r--r-- | ios/main.m | 136 |
5 files changed, 90 insertions, 391 deletions
diff --git a/ios/Default-568h@2x.png b/ios/Default-568h@2x.png Binary files differnew file mode 100644 index 00000000..0891b7aa --- /dev/null +++ b/ios/Default-568h@2x.png diff --git a/ios/MuPDF.xcodeproj/project.pbxproj b/ios/MuPDF.xcodeproj/project.pbxproj index f7b1f956..5430f38a 100644 --- a/ios/MuPDF.xcodeproj/project.pbxproj +++ b/ios/MuPDF.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 9644E9A0146ACEC000E5B70A /* document.c in Sources */ = {isa = PBXBuildFile; fileRef = 9644E99E146ACEC000E5B70A /* document.c */; }; 9668C8D91476A30200D7BA52 /* About.xps in Resources */ = {isa = PBXBuildFile; fileRef = 9668C8D81476A30200D7BA52 /* About.xps */; }; 968F2E9C14539C880085264E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 968F2E9B14539C880085264E /* UIKit.framework */; }; 968F2E9E14539C880085264E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 968F2E9D14539C880085264E /* Foundation.framework */; }; @@ -18,6 +17,7 @@ 96B6AF8415D16A7E00EAAF7B /* x_alt_blue@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 96B6AF8215D16A7E00EAAF7B /* x_alt_blue@2x.png */; }; 96BD2B38145AC485001CEBC3 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 96BD2B35145AC485001CEBC3 /* Icon-72.png */; }; 96BD2B39145AC485001CEBC3 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 96BD2B36145AC485001CEBC3 /* Icon.png */; }; + 96EC0F931672AAC60007F804 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 96EC0F921672AAC60007F804 /* Default-568h@2x.png */; }; 96F2341514603FBA004A8A22 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 96F2341414603FBA004A8A22 /* Icon@2x.png */; }; /* End PBXBuildFile section */ @@ -32,8 +32,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 9644E99E146ACEC000E5B70A /* document.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = document.c; sourceTree = "<group>"; }; - 9644E99F146ACEC000E5B70A /* document.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = document.h; sourceTree = "<group>"; }; 9668C8D81476A30200D7BA52 /* About.xps */ = {isa = PBXFileReference; lastKnownFileType = file; path = About.xps; sourceTree = "<group>"; }; 968461E214642DB00012AE09 /* libLibraries.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libLibraries.a; sourceTree = BUILT_PRODUCTS_DIR; }; 968F2E8E14539BEB0085264E /* build_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = build_libs.sh; sourceTree = "<group>"; }; @@ -47,6 +45,7 @@ 96B6AF8215D16A7E00EAAF7B /* x_alt_blue@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "x_alt_blue@2x.png"; sourceTree = "<group>"; }; 96BD2B35145AC485001CEBC3 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = "<group>"; }; 96BD2B36145AC485001CEBC3 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; }; + 96EC0F921672AAC60007F804 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; }; 96F2341414603FBA004A8A22 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = "<group>"; }; /* End PBXFileReference section */ @@ -76,8 +75,6 @@ 96B6AF8215D16A7E00EAAF7B /* x_alt_blue@2x.png */, 968F2E8F14539BEB0085264E /* Info.plist */, 968F2E8E14539BEB0085264E /* build_libs.sh */, - 9644E99E146ACEC000E5B70A /* document.c */, - 9644E99F146ACEC000E5B70A /* document.h */, 968F2E9014539BEB0085264E /* main.m */, ); name = Sources; @@ -105,6 +102,7 @@ 96A3B27414539BAD00D0A895 = { isa = PBXGroup; children = ( + 96EC0F921672AAC60007F804 /* Default-568h@2x.png */, 968F2E9214539BF10085264E /* Sources */, 968F2E9A14539C880085264E /* Frameworks */, 968F2E9814539C880085264E /* Products */, @@ -184,6 +182,7 @@ 9668C8D91476A30200D7BA52 /* About.xps in Resources */, 96B6AF8315D16A7E00EAAF7B /* x_alt_blue.png in Resources */, 96B6AF8415D16A7E00EAAF7B /* x_alt_blue@2x.png in Resources */, + 96EC0F931672AAC60007F804 /* Default-568h@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -213,7 +212,6 @@ buildActionMask = 2147483647; files = ( 968F2EB014539CDA0085264E /* main.m in Sources */, - 9644E9A0146ACEC000E5B70A /* document.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/document.c b/ios/document.c deleted file mode 100644 index 0fb077ad..00000000 --- a/ios/document.c +++ /dev/null @@ -1,306 +0,0 @@ -#include "fitz/fitz.h" -#include "pdf/mupdf.h" -#include "xps/muxps.h" -#include "cbz/mucbz.h" -#include "document.h" - -#include <ctype.h> /* for tolower() */ - -struct document * -open_document(fz_context *ctx, char *filename) -{ - struct document *doc; - - doc = fz_malloc_struct(ctx, struct document); - memset(doc, 0, sizeof *doc); - doc->ctx = ctx; - doc->number = -1; - - fz_try(ctx) - { - if (strstr(filename, ".pdf") || strstr(filename, ".PDF")) - doc->pdf = pdf_open_document(ctx, filename); - else if (strstr(filename, ".xps") || strstr(filename, ".XPS")) - doc->xps = xps_open_document(ctx, filename); - else if (strstr(filename, ".cbz") || strstr(filename, ".CBZ") || strstr(filename, ".zip") || strstr(filename, ".ZIP")) - doc->cbz = cbz_open_document(ctx, filename); - else - fz_throw(ctx, "unknown document format"); - } - fz_catch(ctx) - { - close_document(doc); - return NULL; - } - - return doc; -} - -int -needs_password(struct document *doc) -{ - if (doc->pdf) - return pdf_needs_password(doc->pdf); - return 0; -} - -int -authenticate_password(struct document *doc, char *password) -{ - if (doc->pdf) - return pdf_authenticate_password(doc->pdf, password); - return 1; -} - -fz_outline * -load_outline(struct document *doc) -{ - fz_outline *outline; - fz_var(outline); - fz_try (doc->ctx) - { - if (doc->pdf) - outline = pdf_load_outline(doc->pdf); - else if (doc->xps) - outline = xps_load_outline(doc->xps); - else - outline = NULL; - } - fz_catch (doc->ctx) - { - outline = NULL; - } - return outline; -} - -int -count_pages(struct document *doc) -{ - if (doc->pdf) - return pdf_count_pages(doc->pdf); - else if (doc->xps) - return xps_count_pages(doc->xps); - else if (doc->cbz) - return cbz_count_pages(doc->cbz); - else - return 1; -} - -static void -load_page(struct document *doc, int number) -{ - if (doc->number == number) - return; - fz_try (doc->ctx) - { - doc->number = number; - if (doc->pdf) { - if (doc->pdf_page) - pdf_free_page(doc->pdf, doc->pdf_page); - doc->pdf_page = NULL; - doc->pdf_page = pdf_load_page(doc->pdf, number); - } - if (doc->xps) { - if (doc->xps_page) - xps_free_page(doc->xps, doc->xps_page); - doc->xps_page = NULL; - doc->xps_page = xps_load_page(doc->xps, number); - } - if (doc->cbz) { - if (doc->cbz_page) - cbz_free_page(doc->cbz, doc->cbz_page); - doc->cbz_page = NULL; - doc->cbz_page = cbz_load_page(doc->cbz, number); - } - } - fz_catch (doc->ctx) - { - fprintf(stderr, "cannot load page %d", number); - } -} - -void -measure_page(struct document *doc, int number, float *w, float *h) -{ - load_page(doc, number); - if (doc->pdf_page) { - fz_rect bounds = pdf_bound_page(doc->pdf, doc->pdf_page); - *w = bounds.x1 - bounds.x0; - *h = bounds.y1 - bounds.y0; - } - else if (doc->xps_page) { - fz_rect bounds = xps_bound_page(doc->xps, doc->xps_page); - *w = bounds.x1 - bounds.x0; - *h = bounds.y1 - bounds.y0; - } - else if (doc->cbz_page) { - fz_rect bounds = cbz_bound_page(doc->cbz, doc->cbz_page); - *w = bounds.x1 - bounds.x0; - *h = bounds.y1 - bounds.y0; - } - else { - *w = *h = 72; - } - fz_flush_warnings(doc->ctx); -} - -void -draw_page(struct document *doc, int number, fz_device *dev, fz_matrix ctm, fz_cookie *cookie) -{ - load_page(doc, number); - fz_try (doc->ctx) - { - if (doc->pdf_page) - pdf_run_page(doc->pdf, doc->pdf_page, dev, ctm, cookie); - else if (doc->xps_page) - xps_run_page(doc->xps, doc->xps_page, dev, ctm, cookie); - else if (doc->cbz_page) - cbz_run_page(doc->cbz, doc->cbz_page, dev, ctm, cookie); - } - fz_catch (doc->ctx) - { - fprintf(stderr, "cannot draw page %d", number); - } - fz_flush_warnings(doc->ctx); -} - -static fz_text_char -textcharat(fz_text_page *page, int idx) -{ - static fz_text_char emptychar = { {0,0,0,0}, ' ' }; - fz_text_block *block; - fz_text_line *line; - fz_text_span *span; - int ofs = 0; - for (block = page->blocks; block < page->blocks + page->len; block++) - { - for (line = block->lines; line < block->lines + block->len; line++) - { - for (span = line->spans; span < line->spans + line->len; span++) - { - if (idx < ofs + span->len) - return span->text[idx - ofs]; - /* pseudo-newline */ - if (span + 1 == line->spans + line->len) - { - if (idx == ofs + span->len) - return emptychar; - ofs++; - } - ofs += span->len; - } - } - } - return emptychar; -} - -static int -charat(fz_text_page *page, int idx) -{ - return textcharat(page, idx).c; -} - -static fz_bbox -bboxat(fz_text_page *page, int idx) -{ - return fz_round_rect(textcharat(page, idx).bbox); -} - -static int -textlen(fz_text_page *page) -{ - fz_text_block *block; - fz_text_line *line; - fz_text_span *span; - int len = 0; - for (block = page->blocks; block < page->blocks + page->len; block++) - { - for (line = block->lines; line < block->lines + block->len; line++) - { - for (span = line->spans; span < line->spans + line->len; span++) - len += span->len; - len++; /* pseudo-newline */ - } - } - return len; -} - -static int -match(fz_text_page *page, const char *s, int n) -{ - int orig = n; - int c; - while (*s) { - s += fz_chartorune(&c, (char *)s); - if (c == ' ' && charat(page, n) == ' ') { - while (charat(page, n) == ' ') - n++; - } else { - if (tolower(c) != tolower(charat(page, n))) - return 0; - n++; - } - } - return n - orig; -} - -int -search_page(struct document *doc, int number, char *needle, fz_cookie *cookie) -{ - int pos, len, i, n; - - if (strlen(needle) == 0) - return 0; - - fz_text_sheet *sheet = fz_new_text_sheet(doc->ctx); - fz_text_page *text = fz_new_text_page(doc->ctx, fz_empty_rect); - fz_device *dev = fz_new_text_device(doc->ctx, sheet, text); - draw_page(doc, number, dev, fz_identity, cookie); - fz_free_device(dev); - - doc->hit_count = 0; - - len = textlen(text); - for (pos = 0; pos < len; pos++) { - n = match(text, needle, pos); - if (n) { - for (i = 0; i < n; i++) { - fz_bbox r = bboxat(text, pos + i); - if (!fz_is_empty_bbox(r) && doc->hit_count < nelem(doc->hit_bbox)) - doc->hit_bbox[doc->hit_count++] = r; - } - } - } - - fz_free_text_page(doc->ctx, text); - fz_free_text_sheet(doc->ctx, sheet); - return doc->hit_count; -} - -fz_bbox -search_result_bbox(struct document *doc, int i) -{ - return doc->hit_bbox[i]; -} - -void -close_document(struct document *doc) -{ - if (doc->pdf) { - if (doc->pdf_page) - pdf_free_page(doc->pdf, doc->pdf_page); - pdf_close_document(doc->pdf); - } - if (doc->xps) { - if (doc->xps_page) - xps_free_page(doc->xps, doc->xps_page); - xps_close_document(doc->xps); - } - if (doc->cbz) { - if (doc->cbz_page) - cbz_free_page(doc->cbz, doc->cbz_page); - cbz_close_document(doc->cbz); - } - fz_flush_warnings(doc->ctx); - fz_free(doc->ctx, doc); -} diff --git a/ios/document.h b/ios/document.h deleted file mode 100644 index b4555578..00000000 --- a/ios/document.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef DOCUMENT_H -#define DOCUMENT_H - -struct document -{ - fz_context *ctx; - pdf_document *pdf; - xps_document *xps; - cbz_document *cbz; - int number; - pdf_page *pdf_page; - xps_page *xps_page; - cbz_page *cbz_page; - fz_bbox hit_bbox[500]; - int hit_count; -}; - -struct document *open_document(fz_context *ctx, char *filename); -int needs_password(struct document *doc); -int authenticate_password(struct document *doc, char *password); -fz_outline *load_outline(struct document *doc); -int count_pages(struct document *doc); -void measure_page(struct document *doc, int number, float *w, float *h); -void draw_page(struct document *doc, int number, fz_device *dev, fz_matrix ctm, fz_cookie *cookie); -int search_page(struct document *doc, int number, char *needle, fz_cookie *cookie); -fz_bbox search_result_bbox(struct document *doc, int i); -void close_document(struct document *doc); - -#endif @@ -5,11 +5,6 @@ #undef MAX #include "fitz/fitz.h" -#include "pdf/mupdf.h" -#include "xps/muxps.h" -#include "cbz/mucbz.h" - -#include "document.h" #define GAP 20 #define INDICATOR_Y -44-24 @@ -24,7 +19,7 @@ static fz_context *ctx = NULL; { NSArray *files; NSTimer *timer; - struct document *_doc; // temporaries for juggling password dialog + fz_document *_doc; // temporaries for juggling password dialog NSString *_filename; } - (void) openDocument: (NSString*)filename; @@ -49,24 +44,26 @@ static fz_context *ctx = NULL; int hitCount; CGRect hitRects[500]; } -- (id) initWithSearchResults: (int)n forDocument: (struct document *)doc; +- (id) initWithSearchResults: (int)n forDocument: (fz_document *)doc; - (void) setPageSize: (CGSize)s; @end @interface MuPageView : UIScrollView <UIScrollViewDelegate> { - struct document *doc; + fz_document *doc; + fz_page *page; int number; UIActivityIndicatorView *loadingView; UIImageView *imageView; UIImageView *tileView; MuHitView *hitView; + MuHitView *linkView; CGSize pageSize; CGRect tileFrame; float tileScale; BOOL cancel; } -- (id) initWithFrame: (CGRect)frame document: (struct document*)aDoc page: (int)aNumber; +- (id) initWithFrame: (CGRect)frame document: (fz_document*)aDoc page: (int)aNumber; - (void) displayImage: (UIImage*)image; - (void) resizeImage; - (void) loadPage; @@ -80,7 +77,7 @@ static fz_context *ctx = NULL; @interface MuDocumentController : UIViewController <UIScrollViewDelegate, UISearchBarDelegate> { - struct document *doc; + fz_document *doc; NSString *key; MuOutlineController *outline; UIScrollView *canvas; @@ -96,7 +93,7 @@ static fz_context *ctx = NULL; int current; // currently visible page int scroll_animating; // stop view updates during scrolling animations } -- (id) initWithFilename: (NSString*)nsfilename document: (struct document *)aDoc; +- (id) initWithFilename: (NSString*)nsfilename document: (fz_document *)aDoc; - (void) createPageView: (int)number; - (void) gotoPage: (int)number animated: (BOOL)animated; - (void) onShowOutline: (id)sender; @@ -120,6 +117,35 @@ static fz_context *ctx = NULL; #pragma mark - +static int hit_count = 0; +static fz_bbox hit_bbox[500]; + +static int +search_page(fz_document *doc, int number, char *needle, fz_cookie *cookie) +{ + fz_page *page = fz_load_page(doc, number); + + fz_text_sheet *sheet = fz_new_text_sheet(ctx); + fz_text_page *text = fz_new_text_page(ctx, fz_empty_rect); + fz_device *dev = fz_new_text_device(ctx, sheet, text); + fz_run_page(doc, page, dev, fz_identity, cookie); + fz_free_device(dev); + + hit_count = fz_search_text_page(ctx, text, needle, hit_bbox, nelem(hit_bbox));; + + fz_free_text_page(ctx, text); + fz_free_text_sheet(ctx, sheet); + fz_free_page(doc, page); + + return hit_count; +} + +static fz_bbox +search_result_bbox(fz_document *doc, int i) +{ + return hit_bbox[i]; +} + static void showAlert(NSString *msg, NSString *filename) { UIAlertView *alert = [[UIAlertView alloc] @@ -156,10 +182,6 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out } } -static void loadOutline(NSMutableArray *titles, NSMutableArray *pages, struct document *doc) -{ -} - static void releasePixmap(void *info, const void *data, size_t size) { fz_drop_pixmap(ctx, info); @@ -195,14 +217,16 @@ static CGSize fitPageToScreen(CGSize page, CGSize screen) return CGSizeMake(hscale, vscale); } -static CGSize measurePage(struct document *doc, int number) +static CGSize measurePage(fz_document *doc, fz_page *page) { CGSize pageSize; - measure_page(doc, number, &pageSize.width, &pageSize.height); + fz_rect bounds = fz_bound_page(doc, page); + pageSize.width = bounds.x1 - bounds.x0; + pageSize.height = bounds.y1 - bounds.y0; return pageSize; } -static UIImage *renderPage(struct document *doc, int number, CGSize screenSize) +static UIImage *renderPage(fz_document *doc, fz_page *page, CGSize screenSize) { CGSize pageSize; fz_bbox bbox; @@ -214,7 +238,7 @@ static UIImage *renderPage(struct document *doc, int number, CGSize screenSize) screenSize.width *= screenScale; screenSize.height *= screenScale; - measure_page(doc, number, &pageSize.width, &pageSize.height); + pageSize = measurePage(doc, page); scale = fitPageToScreen(pageSize, screenSize); ctm = fz_scale(scale.width, scale.height); bbox = (fz_bbox){0, 0, pageSize.width * scale.width, pageSize.height * scale.height}; @@ -223,13 +247,13 @@ static UIImage *renderPage(struct document *doc, int number, CGSize screenSize) fz_clear_pixmap_with_value(ctx, pix, 255); dev = fz_new_draw_device(ctx, pix); - draw_page(doc, number, dev, ctm, NULL); + fz_run_page(doc, page, dev, ctm, NULL); fz_free_device(dev); return newImageWithPixmap(pix); } -static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, CGRect tileRect, float zoom) +static UIImage *renderTile(fz_document *doc, fz_page *page, CGSize screenSize, CGRect tileRect, float zoom) { CGSize pageSize; fz_rect rect; @@ -246,7 +270,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, tileRect.size.width *= screenScale; tileRect.size.height *= screenScale; - measure_page(doc, number, &pageSize.width, &pageSize.height); + pageSize = measurePage(doc, page); scale = fitPageToScreen(pageSize, screenSize); ctm = fz_scale(scale.width * zoom, scale.height * zoom); @@ -260,7 +284,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, fz_clear_pixmap_with_value(ctx, pix, 255); dev = fz_new_draw_device(ctx, pix); - draw_page(doc, number, dev, ctm, NULL); + fz_run_page(doc, page, dev, ctm, NULL); fz_free_device(dev); return newImageWithPixmap(pix); @@ -425,13 +449,13 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, printf("open document '%s'\n", filename); _filename = [nsfilename retain]; - _doc = open_document(ctx, filename); + _doc = fz_open_document(ctx, filename); if (!_doc) { showAlert(@"Cannot open document", nsfilename); return; } - if (needs_password(_doc)) + if (fz_needs_password(_doc)) [self askForPassword: @"'%@' needs a password:"]; else [self onPasswordOkay]; @@ -455,7 +479,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, char *password = (char*) [[[alertView textFieldAtIndex: 0] text] UTF8String]; [alertView dismissWithClickedButtonIndex: buttonIndex animated: TRUE]; if (buttonIndex == 1) { - if (authenticate_password(_doc, password)) + if (fz_authenticate_password(_doc, password)) [self onPasswordOkay]; else [self askForPassword: @"Wrong password for '%@'. Try again:"]; @@ -480,7 +504,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, { [_filename release]; printf("close document (password cancel)\n"); - close_document(_doc); + fz_close_document(_doc); _doc = NULL; } @@ -560,7 +584,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, @implementation MuHitView -- (id) initWithSearchResults: (int)n forDocument: (struct document *)doc +- (id) initWithSearchResults: (int)n forDocument: (fz_document *)doc { self = [super initWithFrame: CGRectMake(0,0,100,100)]; if (self) { @@ -607,7 +631,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, @implementation MuPageView -- (id) initWithFrame: (CGRect)frame document: (struct document*)aDoc page: (int)aNumber +- (id) initWithFrame: (CGRect)frame document: (fz_document*)aDoc page: (int)aNumber { self = [super initWithFrame: frame]; if (self) { @@ -645,6 +669,13 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, __block id block_self = self; // don't auto-retain self! dispatch_async(dispatch_get_main_queue(), ^{ [block_self dealloc]; }); } else { + __block fz_page *block_page = page; + __block fz_document *block_doc = doc; + dispatch_async(queue, ^{ + if (block_page) + fz_free_page(block_doc, block_page); + }); + [linkView release]; [hitView release]; [tileView release]; [loadingView release]; @@ -706,13 +737,15 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, - (void) loadPage { - if (number < 0 || number >= count_pages(doc)) + if (number < 0 || number >= fz_count_pages(doc)) return; dispatch_async(queue, ^{ if (!cancel) { printf("render page %d\n", number); - CGSize size = measurePage(doc, number); - UIImage *image = renderPage(doc, number, self.bounds.size); + if (!page) + page = fz_load_page(doc, number); + CGSize size = measurePage(doc, page); + UIImage *image = renderPage(doc, page, self.bounds.size); dispatch_async(dispatch_get_main_queue(), ^{ pageSize = size; [self displayImage: image]; @@ -852,8 +885,11 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, return; } + if (!page) + page = fz_load_page(doc, number); + printf("render tile\n"); - UIImage *image = renderTile(doc, number, screenSize, viewFrame, scale); + UIImage *image = renderTile(doc, page, screenSize, viewFrame, scale); dispatch_async(dispatch_get_main_queue(), ^{ isValid = CGRectEqualToRect(frame, tileFrame) && scale == tileScale; @@ -917,7 +953,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, @implementation MuDocumentController -- (id) initWithFilename: (NSString*)filename document: (struct document *)aDoc +- (id) initWithFilename: (NSString*)filename document: (fz_document *)aDoc { self = [super init]; if (!self) @@ -928,7 +964,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, dispatch_sync(queue, ^{}); - fz_outline *root = load_outline(doc); + fz_outline *root = fz_load_outline(doc); if (root) { NSMutableArray *titles = [[NSMutableArray alloc] init]; NSMutableArray *pages = [[NSMutableArray alloc] init]; @@ -948,7 +984,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, [[NSUserDefaults standardUserDefaults] setObject: key forKey: @"OpenDocumentKey"]; current = [[NSUserDefaults standardUserDefaults] integerForKey: key]; - if (current < 0 || current >= count_pages(doc)) + if (current < 0 || current >= fz_count_pages(doc)) current = 0; UIView *view = [[UIView alloc] initWithFrame: CGRectZero]; @@ -980,7 +1016,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, slider = [[UISlider alloc] initWithFrame: CGRectZero]; [slider setMinimumValue: 0]; - [slider setMaximumValue: count_pages(doc) - 1]; + [slider setMaximumValue: fz_count_pages(doc) - 1]; [slider addTarget: self action: @selector(onSlide:) forControlEvents: UIControlEventValueChanged]; sliderWrapper = [[UIBarButtonItem alloc] initWithCustomView: slider]; @@ -1028,10 +1064,10 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, - (void) dealloc { if (doc) { - struct document *self_doc = doc; // don't auto-retain self here! + fz_document *self_doc = doc; // don't auto-retain self here! dispatch_async(queue, ^{ printf("close document\n"); - close_document(self_doc); + fz_close_document(self_doc); }); } @@ -1057,7 +1093,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, [slider setValue: current]; - [indicator setText: [NSString stringWithFormat: @" %d of %d ", current+1, count_pages(doc)]]; + [indicator setText: [NSString stringWithFormat: @" %d of %d ", current+1, fz_count_pages(doc)]]; [[self navigationController] setToolbarHidden: NO animated: animated]; } @@ -1071,7 +1107,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, height = size.height; [canvas setContentInset: UIEdgeInsetsZero]; - [canvas setContentSize: CGSizeMake(count_pages(doc) * width, height)]; + [canvas setContentSize: CGSizeMake(fz_count_pages(doc) * width, height)]; [canvas setContentOffset: CGPointMake(current * width, 0)]; [sliderWrapper setWidth: SLIDER_W]; @@ -1080,7 +1116,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, [[[self navigationController] toolbar] setNeedsLayout]; // force layout! // use max_width so we don't clamp the content offset too early during animation - [canvas setContentSize: CGSizeMake(count_pages(doc) * max_width, height)]; + [canvas setContentSize: CGSizeMake(fz_count_pages(doc) * max_width, height)]; [canvas setContentOffset: CGPointMake(current * width, 0)]; for (MuPageView *view in [canvas subviews]) { @@ -1221,7 +1257,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, cancelSearch = NO; dispatch_async(queue, ^{ - for (int i = start; i >= 0 && i < count_pages(doc); i += dir) { + for (int i = start; i >= 0 && i < fz_count_pages(doc); i += dir) { int n = search_page(doc, i, needle, NULL); if (n) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -1292,7 +1328,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, { int number = [slider value]; if ([slider isTracking]) - [indicator setText: [NSString stringWithFormat: @" %d of %d ", number+1, count_pages(doc)]]; + [indicator setText: [NSString stringWithFormat: @" %d of %d ", number+1, fz_count_pages(doc)]]; else [self gotoPage: number animated: NO]; } @@ -1335,7 +1371,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, [[NSUserDefaults standardUserDefaults] setInteger: current forKey: key]; - [indicator setText: [NSString stringWithFormat: @" %d of %d ", current+1, count_pages(doc)]]; + [indicator setText: [NSString stringWithFormat: @" %d of %d ", current+1, fz_count_pages(doc)]]; [slider setValue: current]; // swap the distant page views out @@ -1362,7 +1398,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, - (void) createPageView: (int)number { - if (number < 0 || number >= count_pages(doc)) + if (number < 0 || number >= fz_count_pages(doc)) return; int found = 0; for (MuPageView *view in [canvas subviews]) @@ -1379,8 +1415,8 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, { if (number < 0) number = 0; - if (number >= count_pages(doc)) - number = count_pages(doc) - 1; + if (number >= fz_count_pages(doc)) + number = fz_count_pages(doc) - 1; if (current == number) return; if (animated) { @@ -1403,7 +1439,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, [canvas setContentOffset: CGPointMake(number * width, 0)]; [slider setValue: number]; - [indicator setText: [NSString stringWithFormat: @" %d of %d ", number+1, count_pages(doc)]]; + [indicator setText: [NSString stringWithFormat: @" %d of %d ", number+1, fz_count_pages(doc)]]; [UIView commitAnimations]; } else { @@ -1427,7 +1463,7 @@ static UIImage *renderTile(struct document *doc, int number, CGSize screenSize, - (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation)o { - [canvas setContentSize: CGSizeMake(count_pages(doc) * width, height)]; + [canvas setContentSize: CGSizeMake(fz_count_pages(doc) * width, height)]; [canvas setContentOffset: CGPointMake(current * width, 0)]; } |