diff options
author | Paul Gardiner <paul.gardiner@artifex.com> | 2013-09-24 16:58:27 +0100 |
---|---|---|
committer | Paul Gardiner <paul.gardiner@artifex.com> | 2013-09-24 16:58:27 +0100 |
commit | d4a69b3f24c3697cb0e77b7685468423c0949a71 (patch) | |
tree | 6677063014ee56fcdb45e8307805c87405d4b3b0 /platform/ios/Classes/MuPageViewReflow.m | |
parent | aa8bf97eb104986fae3245bc675bd50dded01804 (diff) | |
download | mupdf-d4a69b3f24c3697cb0e77b7685468423c0949a71.tar.xz |
iOS: add reflow mode
Diffstat (limited to 'platform/ios/Classes/MuPageViewReflow.m')
-rw-r--r-- | platform/ios/Classes/MuPageViewReflow.m | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/platform/ios/Classes/MuPageViewReflow.m b/platform/ios/Classes/MuPageViewReflow.m new file mode 100644 index 00000000..541731fb --- /dev/null +++ b/platform/ios/Classes/MuPageViewReflow.m @@ -0,0 +1,136 @@ +// +// MuPageViewReflow.m +// MuPDF +// +// Copyright (c) 2013 Artifex Software, Inc. All rights reserved. +// + +#include "common.h" +#import "MuPageViewReflow.h" + +NSString *textAsHtml(fz_document *doc, int pageNum) +{ + NSString *str = nil; + fz_page *page = NULL; + fz_text_sheet *sheet = NULL; + fz_text_page *text = NULL; + fz_device *dev = NULL; + fz_matrix ctm; + fz_buffer *buf = NULL; + fz_output *out = NULL; + + fz_var(page); + fz_var(sheet); + fz_var(text); + fz_var(dev); + fz_var(buf); + fz_var(out); + + fz_try(ctx) + { + int b, l, s, c; + + ctm = fz_identity; + sheet = fz_new_text_sheet(ctx); + text = fz_new_text_page(ctx); + dev = fz_new_text_device(ctx, sheet, text); + page = fz_load_page(doc, pageNum); + fz_run_page(doc, page, dev, &ctm, NULL); + fz_free_device(dev); + dev = NULL; + + fz_analyze_text(ctx, sheet, text); + + buf = fz_new_buffer(ctx, 256); + out = fz_new_output_with_buffer(ctx, buf); + fz_printf(out, "<html>\n"); + fz_printf(out, "<style>\n"); + fz_printf(out, "body{margin:0;}\n"); + fz_printf(out, "div.page{background-color:white;}\n"); + fz_printf(out, "div.block{margin:0pt;padding:0pt;}\n"); + fz_printf(out, "div.metaline{display:table;width:100%%}\n"); + fz_printf(out, "div.line{display:table-row;}\n"); + fz_printf(out, "div.cell{display:table-cell;padding-left:0.25em;padding-right:0.25em}\n"); + //fz_printf(out, "p{margin:0;padding:0;}\n"); + fz_printf(out, "</style>\n"); + fz_printf(out, "<body style=\"margin:0\"><div style=\"padding:10px\" id=\"content\">"); + fz_print_text_page_html(ctx, out, text); + fz_printf(out, "</div></body>\n"); + fz_printf(out, "<style>\n"); + fz_print_text_sheet(ctx, out, sheet); + fz_printf(out, "</style>\n</html>\n"); + fz_close_output(out); + out = NULL; + + str = [[[NSString alloc] initWithBytes:buf->data length:buf->len encoding:NSUTF8StringEncoding] autorelease]; + } + fz_always(ctx) + { + fz_free_text_page(ctx, text); + fz_free_text_sheet(ctx, sheet); + fz_free_device(dev); + fz_close_output(out); + fz_drop_buffer(ctx, buf); + fz_free_page(doc, page); + } + fz_catch(ctx) + { + str = nil; + } + + return str; +} + +@implementation MuPageViewReflow + +- (id)initWithFrame:(CGRect)frame document:(MuDocRef *)aDoc page:(int)aNumber +{ + self = [super initWithFrame:frame]; + if (self) { + number = aNumber; + scale = 1.0; + self.scalesPageToFit = NO; + [self setDelegate:self]; + dispatch_async(queue, ^{ + __block NSString *cont = [textAsHtml(aDoc->doc, aNumber) retain]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self loadHTMLString:cont baseURL:nil]; + }); + }); + } + return self; +} + +-(void) webViewDidFinishLoad:(UIWebView *)webView +{ + [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('content').style.zoom=\"%f\"", scale]]; +} + +-(void) dealloc +{ + [self setDelegate:nil]; + [super dealloc]; +} + +-(int) number +{ + return number; +} + +-(void) willRotate {} +-(void) showLinks {} +-(void) hideLinks {} +-(void) showSearchResults: (int)count {} +-(void) clearSearchResults {} +-(void) resetZoomAnimated: (BOOL)animated +{ + [self.scrollView setContentOffset:CGPointZero animated:NO]; +} + +-(void) setScale:(float)aFloat +{ + scale = aFloat; + [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('content').style.zoom=\"%f\"", scale]]; +} + +@end |