diff options
author | Ralph Giles <giles@ghostscript.com> | 2005-04-25 04:42:35 +0200 |
---|---|---|
committer | Ralph Giles <giles@ghostscript.com> | 2005-04-25 04:42:35 +0200 |
commit | 59472e3211bc7acd1656fa98c072e387b83800f4 (patch) | |
tree | 207000968e2fe0407230901d044a7f7da4878805 | |
parent | 94eb5cef1df52e509dfb59cd99c9258663562945 (diff) | |
download | mupdf-59472e3211bc7acd1656fa98c072e387b83800f4.tar.xz |
refactor macos to use pdfapp
Rehook the event loops to use the pdfapp viewer abstraction rather than our
own version of that code. There's still some cruft with the GetData and
SetData events, but it works under the new framework.
-rw-r--r-- | apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/info.nib | 3 | ||||
-rw-r--r-- | apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/objects.xib | 2 | ||||
-rw-r--r-- | apps/macosx/macpdf.c | 357 | ||||
-rw-r--r-- | include/pdfapp.h | 4 |
4 files changed, 123 insertions, 243 deletions
diff --git a/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/info.nib b/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/info.nib index 4e1f755c..40806e42 100644 --- a/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/info.nib +++ b/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/info.nib @@ -7,13 +7,14 @@ <key>IBEditorPositions</key> <dict> <key>29</key> - <string>17 273 218 44 0 0 1152 746 </string> + <string>17 273 236 44 0 0 1152 746 </string> </dict> <key>IBFramework Version</key> <string>364.0</string> <key>IBOpenObjects</key> <array> <integer>231</integer> + <integer>166</integer> <integer>29</integer> </array> <key>IBSystem Version</key> diff --git a/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/objects.xib b/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/objects.xib index 39401159..dba01432 100644 --- a/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/objects.xib +++ b/apps/macosx/GhostPDF.app/Contents/Resources/English.lproj/main.nib/objects.xib @@ -358,7 +358,7 @@ <int name="bindingBottomKind">2</int> <int name="bindingRightKind">2</int> </object> - <string name="classID">com.artofcode.mupdf.View</string> + <string name="classID">com.artofcode.ghostpdf.View</string> </object> </array> </object> diff --git a/apps/macosx/macpdf.c b/apps/macosx/macpdf.c index 66ca3f68..90197cb5 100644 --- a/apps/macosx/macpdf.c +++ b/apps/macosx/macpdf.c @@ -2,74 +2,127 @@ #include <fitz.h> #include <mupdf.h> +#include "pdfapp.h" -#define kViewClassID CFSTR("com.artofcode.mupdf.View") +#define gDefaultFilename "/Users/giles/projects/ghostscript/tiger.pdf" + +#define kViewClassID CFSTR("com.artofcode.ghostpdf.View") #define kViewPrivate 'MU_v' -typedef struct viewctx +/* the pdfapp abstraction currently uses magic callbacks, so we have + to use a a global state for our own data, or subclass pdfapp_t and + do a lot of casting */ + +/* pdfapp callbacks - error handling */ +void winwarn(pdfapp_t *pdf, char *msg) { - WindowRef window; - HIViewRef view; - char *doctitle; - - float zoom; - int rotate; - int pageno; - - pdf_page *page; - fz_obj *pageobj; - - pdf_xref *xref; - pdf_pagetree *pages; - pdf_outline *outline; - fz_renderer *rast; - fz_pixmap *image; -} viewctx; + fprintf(stderr, "ghostpdf warning: %s\n", msg); +} + +void winerror(pdfapp_t *pdf, char *msg) +{ + fprintf(stderr, "ghostpdf error: %s\n", msg); + exit(1); +} + +/* pdfapp callbacks - drawing */ + +void wintitle(pdfapp_t *pdf, char *title) +{ + /* set new document title */ +} + +void winresize(pdfapp_t *pdf, int w, int h) +{ + /* pdfapp as been asked to shrinkwrap the document image; + we're called to actually apply the new window size. */ +} + +void winconvert(pdfapp_t *pdf, fz_pixmap *image) +{ + /* notification that page drawing is complete */ + /* do nothing */ +} + +void winrepaint(pdfapp_t *pdf) +{ + /* image needs repainting */ + HIViewSetNeedsDisplay((HIViewRef)pdf->userdata, true); +} + +char* winpassword(pdfapp_t *pdf, char *filename) +{ + /* prompt user for document password */ + return NULL; +} + +void winopenuri(pdfapp_t *pdf, char *s) +{ + /* user clicked on an external uri */ + /* todo: launch browser and/or open a new window if it's a PDF */ +} + +void wincursor(pdfapp_t *pdf, int curs) +{ + /* cursor status change notification */ +} + +void windocopy(pdfapp_t *pdf) +{ + /* user selected some text; copy it to the clipboard */ +} static OSStatus view_construct(EventRef inEvent) { OSStatus err; - viewctx *ctx; + pdfapp_t *pdf; + + pdf = (pdfapp_t *)malloc(sizeof(pdfapp_t)); + require_action(pdf != NULL, CantMalloc, err = memFullErr); + + pdfapp_init(pdf); - ctx = (viewctx *)malloc(sizeof(viewctx)); - require_action(ctx != NULL, CantMalloc, err = memFullErr); err = GetEventParameter(inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL, sizeof(HIObjectRef), NULL, - (HIObjectRef *)&ctx->view); + (HIObjectRef *)&pdf->userdata); require_noerr(err, ParameterMissing); err = SetEventParameter(inEvent, kEventParamHIObjectInstance, - typeVoidPtr, sizeof(viewctx *), &ctx); + typeVoidPtr, sizeof(pdfapp_t *), &pdf); ParameterMissing: if (err != noErr) - free(ctx); + free(pdf); CantMalloc: return err; } static OSStatus -view_destruct(EventRef inEvent, viewctx *inData) +view_destruct(EventRef inEvent, pdfapp_t *pdf) { - free(inData); + pdfapp_close(pdf); + free(pdf); return noErr; } static OSStatus view_initialize(EventHandlerCallRef inCallRef, EventRef inEvent, - viewctx *ctx) + pdfapp_t *pdf) { OSStatus err; - + HIRect bounds; + HIViewRef view = (HIViewRef)pdf->userdata; + err = CallNextEventHandler(inCallRef, inEvent); require_noerr(err, TroubleInSuperClass); - ctx->zoom = 1.0; - ctx->rotate = 0; - ctx->pageno = 1; - ctx->window = nil; - + HIViewGetBounds (view, &bounds); + pdf->scrw = bounds.size.width; + pdf->scrh = bounds.size.height; + + pdfapp_open(pdf, gDefaultFilename); + TroubleInSuperClass: return err; } @@ -100,7 +153,7 @@ draw_rect(CGContextRef ctx, double x0, double y0, double x1, double y1, } static OSStatus -view_draw(EventRef inEvent, viewctx *ctx) +view_draw(EventRef inEvent, pdfapp_t *pdf) { OSStatus err; CGContextRef gc; @@ -114,18 +167,18 @@ view_draw(EventRef inEvent, viewctx *ctx) require_noerr(err, cleanup); colorspace = CGColorSpaceCreateDeviceRGB(); - provider = CGDataProviderCreateWithData(NULL, ctx->image->samples, - ctx->image->w * ctx->image->h * 4, + provider = CGDataProviderCreateWithData(NULL, pdf->image->samples, + pdf->image->w * pdf->image->h * 4, NULL); - image = CGImageCreate(ctx->image->w, ctx->image->h, - 8, 32, ctx->image->w * 4, + image = CGImageCreate(pdf->image->w, pdf->image->h, + 8, 32, pdf->image->w * 4, colorspace, kCGImageAlphaNoneSkipFirst, provider, NULL, 0, kCGRenderingIntentDefault); rect.origin.x = 0; rect.origin.y = 0; - rect.size.width = ctx->image->w; - rect.size.height = ctx->image->h; + rect.size.width = pdf->image->w; + rect.size.height = pdf->image->h; HIViewDrawCGImage(gc, &rect, image); CGColorSpaceRelease(colorspace); @@ -136,7 +189,7 @@ view_draw(EventRef inEvent, viewctx *ctx) } static OSStatus -view_get_data(EventRef inEvent, viewctx *inData) +view_get_data(EventRef inEvent, pdfapp_t *pdf) { OSStatus err; OSType tag; @@ -154,8 +207,8 @@ view_get_data(EventRef inEvent, viewctx *inData) NULL, sizeof(Ptr), NULL, &ptr); if (tag == kViewPrivate) { - *((viewctx **)ptr) = inData; - outSize = sizeof(viewctx *); + *((pdfapp_t **)ptr) = pdf; + outSize = sizeof(pdfapp_t *); } else err = errDataNotSupported; @@ -168,7 +221,7 @@ view_get_data(EventRef inEvent, viewctx *inData) } static OSStatus -view_set_data(EventRef inEvent, viewctx *inData) +view_set_data(EventRef inEvent, pdfapp_t *pdf) { OSStatus err; Ptr ptr; @@ -182,17 +235,15 @@ view_set_data(EventRef inEvent, viewctx *inData) NULL, sizeof(Ptr), NULL, &ptr); require_noerr(err, ParameterMissing); - if (tag == 'Plat') { - //inData->p = *(plate **)ptr; - } else - err = errDataNotSupported; + /* we think we don't use this */ + err = errDataNotSupported; ParameterMissing: return err; } static OSStatus -view_hittest(EventRef inEvent, viewctx *inData) +view_hittest(EventRef inEvent, pdfapp_t *pdf) { OSStatus err; HIPoint where; @@ -203,7 +254,7 @@ view_hittest(EventRef inEvent, viewctx *inData) NULL, sizeof(HIPoint), NULL, &where); require_noerr(err, ParameterMissing); - err = HIViewGetBounds(inData->view, &bounds); + err = HIViewGetBounds(pdf->userdata, &bounds); require_noerr(err, ParameterMissing); if (CGRectContainsPoint(bounds, where)) @@ -219,23 +270,6 @@ view_hittest(EventRef inEvent, viewctx *inData) return err; } -static void -view_queue_draw(viewctx *pe) -{ - HIViewSetNeedsDisplay(pe->view, true); -} - - -static int -view_motion(viewctx *pe, double x, double y) -{ - //if (pe->p->motmode == MOTION_MODE_MOVE) - //plate_motion_move(pe->p, x, y); - //else if (pe->p->motmode == MOTION_MODE_SELECT) - //plate_motion_select(pe->p, x, y); - view_queue_draw(pe); - return 1; -} pascal OSStatus view_handler(EventHandlerCallRef inCallRef, @@ -245,7 +279,7 @@ view_handler(EventHandlerCallRef inCallRef, OSStatus err = eventNotHandledErr; UInt32 eventClass = GetEventClass(inEvent); UInt32 eventKind = GetEventKind(inEvent); - viewctx *data = (viewctx *)inUserData; + pdfapp_t *pdf = (pdfapp_t *)inUserData; switch (eventClass) { case kEventClassHIObject: @@ -254,10 +288,10 @@ view_handler(EventHandlerCallRef inCallRef, err = view_construct(inEvent); break; case kEventHIObjectInitialize: - err = view_initialize(inCallRef, inEvent, data); + err = view_initialize(inCallRef, inEvent, pdf); break; case kEventHIObjectDestruct: - err = view_destruct(inEvent, data); + err = view_destruct(inEvent, pdf); break; } break; @@ -267,16 +301,16 @@ view_handler(EventHandlerCallRef inCallRef, err = noErr; break; case kEventControlDraw: - err = view_draw(inEvent, data); + err = view_draw(inEvent, pdf); break; case kEventControlGetData: - err = view_get_data(inEvent, data); + err = view_get_data(inEvent, pdf); break; case kEventControlSetData: - err = view_set_data(inEvent, data); + err = view_set_data(inEvent, pdf); break; case kEventControlHitTest: - err = view_hittest(inEvent, data); + err = view_hittest(inEvent, pdf); break; /*...*/ } @@ -357,171 +391,7 @@ OSStatus view_create( return err; } -OSStatus -view_openpdf(HIViewRef view, char *filename) -{ - OSStatus err; - viewctx *ctx; - - err = GetControlData(view, 1, kViewPrivate, 4, &ctx, NULL); - require_noerr(err, CantGetPrivate); - - fz_error *error; - fz_obj *obj; - pdf_xref *xref; - - error = pdf_newxref(&xref); - if (error) - fz_abort(error); - ctx->xref = xref; - - error = pdf_loadxref(xref, filename); - if (error) - { - fz_warn(error->msg); - printf("trying to repair...\n"); - error = pdf_repairxref(xref, filename); - if (error) - fz_abort(error); - } - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - -#if 0 - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } -#endif - - obj = fz_dictgets(xref->trailer, "Root"); - if (!obj) - fz_abort(fz_throw("syntaxerror: missing Root object")); - error = pdf_loadindirect(&xref->root, xref, obj); - if (error) fz_abort(error); - - obj = fz_dictgets(xref->trailer, "Info"); - if (obj) - { - error = pdf_loadindirect(&xref->info, xref, obj); - if (error) fz_abort(error); - } - - error = pdf_loadnametrees(xref); - if (error) fz_abort(error); - - error = pdf_loadoutline(&ctx->outline, xref); - if (error) fz_abort(error); - - ctx->doctitle = filename; - if (xref->info) - { - obj = fz_dictgets(xref->info, "Title"); - if (obj) - { - error = pdf_toutf8(&ctx->doctitle, obj); - if (error) fz_abort(error); - } - } - - error = pdf_loadpagetree(&ctx->pages, xref); - if (error) fz_abort(error); - - //count = pdf_getpagecount(ctx->pages); - - error = fz_newrenderer(&ctx->rast, pdf_devicergb, 0, 1024 * 512); - if (error) fz_abort(error); - - ctx->image = nil; - printf("hit bottom\n"); - - - CantGetPrivate: - return err; -} - -OSStatus view_showpage(HIViewRef view) -{ - OSStatus err; - viewctx *ctx; - - err = GetControlData(view, 1, kViewPrivate, 4, &ctx, NULL); - require_noerr(err, CantGetPrivate); - - fz_error *error; - fz_matrix ctm; - fz_rect bbox; - fz_obj *obj; - - assert(ctx->pageno > 0 && ctx->pageno <= pdf_getpagecount(ctx->pages)); - - //XDefineCursor(xdpy, xwin, xcwait); - - if (ctx->image) - fz_droppixmap(ctx->image); - ctx->image = nil; - - obj = pdf_getpageobject(ctx->pages, ctx->pageno - 1); - if (obj == ctx->pageobj) - goto Lskipload; - ctx->pageobj = obj; - if (ctx->page) - pdf_droppage(ctx->page); - - error = pdf_loadpage(&ctx->page, ctx->xref, ctx->pageobj); - if (error) - fz_abort(error); - -Lskipload: - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -ctx->page->mediabox.y1)); - ctm = fz_concat(ctm, fz_scale(ctx->zoom, -ctx->zoom)); - ctm = fz_concat(ctm, fz_rotate(ctx->rotate + ctx->page->rotate)); - - bbox = fz_transformaabb(ctm, ctx->page->mediabox); - - error = fz_rendertree(&ctx->image, ctx->rast, ctx->page->tree, ctm, fz_roundrect(bbox), 1); - if (error) - fz_abort(error); - - //XDefineCursor(xdpy, xwin, xcarrow); - - { - char buf[512]; - int count = pdf_getpagecount(ctx->pages); - sprintf(buf, "%s - %d/%d", ctx->doctitle, ctx->pageno, count); - //xtitle(buf); - } - - //xresize(); - //xblit(); - CantGetPrivate: - return err; -} - -int -openpdf(WindowRef window, char *filename) -{ - HIViewRef viewPane; - static const HIViewID viewPaneID = { 'Poof', 666 }; - OSStatus err; - - err = HIViewFindByID(HIViewGetRoot(window), viewPaneID, &viewPane); - require_noerr(err, cleanup); - - err = view_openpdf(viewPane, filename); - require_noerr(err, cleanup); - - err = view_showpage(viewPane); - - cleanup: - return err; -} int main(int argc, char *argv[]) { @@ -529,6 +399,8 @@ int main(int argc, char *argv[]) OSStatus err; WindowRef window; + pdfapp_t pdf; + fz_cpudetect(); fz_accelerate(); @@ -545,13 +417,18 @@ int main(int argc, char *argv[]) err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window); require_noerr(err, CantCreateWindow); - openpdf(window, "/Users/tor/src/pdf/tiger.pdf"); + //openpdf(window, gDefaultFilename); DisposeNibReference(nibRef); + pdfapp_init(&pdf); + pdfapp_open(&pdf, gDefaultFilename); + ShowWindow(window); RunApplicationEventLoop(); + pdfapp_close(&pdf); + CantGetNibRef: CantSetMenuBar: CantCreateWindow: diff --git a/include/pdfapp.h b/include/pdfapp.h index cffd2eb7..407427e8 100644 --- a/include/pdfapp.h +++ b/include/pdfapp.h @@ -48,7 +48,6 @@ struct pdfapp_s int shrinkwrap; /* event handling state */ - char number[256]; int numberlen; @@ -58,6 +57,9 @@ struct pdfapp_s int iscopying; int selx, sely; fz_irect selr; + + /* client context storage */ + void *userdata; }; void pdfapp_init(pdfapp_t *app); |