From b3453e08b88b3973f427c5bf982670bb5a09d259 Mon Sep 17 00:00:00 2001 From: Fazlul Shahriar Date: Sun, 9 Aug 2009 20:13:48 -0400 Subject: page: add caching from Plan 9 http://codereview.appspot.com/105070 --- src/cmd/page/mkfile | 1 + src/cmd/page/page.c | 2 ++ src/cmd/page/page.h | 2 ++ src/cmd/page/view.c | 67 +++++++++-------------------------------------------- 4 files changed, 16 insertions(+), 56 deletions(-) (limited to 'src') diff --git a/src/cmd/page/mkfile b/src/cmd/page/mkfile index bcd02a8d..e1a2162f 100644 --- a/src/cmd/page/mkfile +++ b/src/cmd/page/mkfile @@ -4,6 +4,7 @@ TARG=page HFILES=page.h OFILES=\ + cache.$O\ filter.$O\ gfx.$O\ gs.$O\ diff --git a/src/cmd/page/page.c b/src/cmd/page/page.c index 32ba9c2f..23da4b91 100644 --- a/src/cmd/page/page.c +++ b/src/cmd/page/page.c @@ -228,6 +228,8 @@ threadmain(int argc, char **argv) fprint(2, "page: initdraw failed: %r\n"); wexits("initdraw"); } + display->locking = 1; + truecolor = screen->depth > 8; viewer(doc); wexits(0); diff --git a/src/cmd/page/page.h b/src/cmd/page/page.h index 3dff4789..e4b320e5 100644 --- a/src/cmd/page/page.h +++ b/src/cmd/page/page.h @@ -96,6 +96,8 @@ void wexits(char*); Image* xallocimage(Display*, Rectangle, ulong, int, ulong); int bell(void*, char*); Image* convert(Graphic *g); +Image* cachedpage(Document*, int, int); +void cacheflush(void); extern int stdinfd; extern int truecolor; diff --git a/src/cmd/page/view.c b/src/cmd/page/view.c index 8fc6fa79..c59a0edb 100644 --- a/src/cmd/page/view.c +++ b/src/cmd/page/view.c @@ -115,55 +115,17 @@ menugen(int n) void showpage(int page, Menu *m) { - Image *tmp; - if(doc->fwdonly) m->lasthit = 0; /* this page */ else m->lasthit = reverse ? doc->npage-1-page : page; setcursor(mc, &reading); - freeimage(im); - if((page < 0 || page >= doc->npage) && !doc->fwdonly){ - im = nil; - return; - } - im = doc->drawpage(doc, page); - if(im == nil) { - if(doc->fwdonly) /* this is how we know we're out of pages */ - wexits(0); - - im = xallocimage(display, Rect(0,0,50,50), GREY1, 1, DBlack); - if(im == nil) { - fprint(2, "out of memory: %r\n"); - wexits("memory"); - } - string(im, ZP, display->white, ZP, display->defaultfont, "?"); - }else if(resizing){ + im = cachedpage(doc, angle, page); + if(im == nil) + wexits(0); + if(resizing) resize(Dx(im->r), Dy(im->r)); - } - if(im->r.min.x > 0 || im->r.min.y > 0) { - tmp = xallocimage(display, Rect(0, 0, Dx(im->r), Dy(im->r)), im->chan, 0, DNofill); - if(tmp == nil) { - fprint(2, "out of memory during showpage: %r\n"); - wexits("memory"); - } - drawop(tmp, tmp->r, im, nil, im->r.min, S); - freeimage(im); - im = tmp; - } - - switch(angle){ - case 90: - im = rot90(im); - break; - case 180: - rot180(im); - break; - case 270: - im = rot270(im); - break; - } setcursor(mc, nil); if(showbottom){ @@ -268,7 +230,7 @@ void viewer(Document *dd) { int i, fd, n, oldpage; - int nxt; + int nxt, a; Channel *cp; Menu menu, midmenu; Mouse m; @@ -372,7 +334,10 @@ viewer(Document *dd) * a fair amount. we don't care about doc->npage anymore, and * all that can be done is select the next page. */ - switch(alt(alts)) { + unlockdisplay(display); + a = alt(alts); + lockdisplay(display); + switch(a) { case CKeyboard: if(run <= 0xFF && isdigit(run)) { nxt = nxt*10+run-'0'; @@ -622,22 +587,12 @@ viewer(Document *dd) break; } case Rot: /* rotate 90 */ - setcursor(mc, &reading); - im = rot90(im); - setcursor(mc, nil); angle = (angle+90) % 360; - redraw(screen); - flushimage(display, 1); + showpage(page, &menu); break; case Upside: /* upside-down */ - if(im==nil) - break; - setcursor(mc, &reading); - rot180(im); - setcursor(mc, nil); angle = (angle+180) % 360; - redraw(screen); - flushimage(display, 1); + showpage(page, &menu); break; case Restore: /* restore */ showpage(page, &menu); -- cgit v1.2.3