summaryrefslogtreecommitdiff
path: root/platform/ios/Classes/MuPageViewReflow.m
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/Classes/MuPageViewReflow.m')
-rw-r--r--platform/ios/Classes/MuPageViewReflow.m136
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