summaryrefslogtreecommitdiff
path: root/sys/src/cmd/page.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-10-10 05:13:33 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-10-10 05:13:33 +0200
commit19d38407011bf4b6b16053b699cca8a689bf5808 (patch)
tree359eb835db3f9560546061e87fdbe2db76822969 /sys/src/cmd/page.c
parent9779179614cb7586d14ac130bd2eabaaf6158d89 (diff)
page: refactor code, skip dummy pages, faster zoomdraw
Diffstat (limited to 'sys/src/cmd/page.c')
-rw-r--r--sys/src/cmd/page.c96
1 files changed, 55 insertions, 41 deletions
diff --git a/sys/src/cmd/page.c b/sys/src/cmd/page.c
index b3e7405e5..db091245d 100644
--- a/sys/src/cmd/page.c
+++ b/sys/src/cmd/page.c
@@ -14,7 +14,6 @@ struct Page {
void *data;
int (*open)(Page *);
- char *text;
Image *image;
int fd;
int gen;
@@ -104,7 +103,6 @@ addpage(Page *up, char *label, int (*popen)(Page *), void *pdata, int fd)
p = mallocz(sizeof(*p), 1);
p->label = strdup(label);
p->gen = pagegen;
- p->text = nil;
p->image = nil;
p->data = pdata;
p->open = popen;
@@ -335,7 +333,6 @@ popenepub(Page *p)
addpage(p, shortname(buf), popenfile, strdup(buf), -1);
}
close(fd);
- p->text = strdup(p->label);
return -1;
}
@@ -420,7 +417,6 @@ popengs(Page *p)
seek(ifd, 0, 0);
if(memcmp(buf, "%PDF-", 5) == 0)
pdf = 1;
- p->text = strdup(p->label);
if(pipe(pin) < 0){
Err0:
close(ifd);
@@ -570,6 +566,11 @@ filetype(char *buf, int nbuf, char *typ, int ntyp)
int n, ifd[2], ofd[2];
char *argv[3];
+ if(infernobithdr(buf, nbuf)){
+ strncpy(typ, "image/p9bit", ntyp);
+ return 0;
+ }
+
typ[0] = 0;
if(pipe(ifd) < 0)
return -1;
@@ -656,10 +657,10 @@ popenfile(Page *p)
fd = p->fd;
p->fd = -1;
file = p->data;
+ p->data = nil;
if(fd < 0){
if((fd = open(file, OREAD)) < 0){
Err0:
- p->data = nil;
free(file);
return -1;
}
@@ -678,6 +679,7 @@ popenfile(Page *p)
if((tfd = open(buf, OREAD)) >= 0){
close(fd);
p->fd = tfd;
+ p->data = file;
p->open = popenepub;
return p->open(p);
}
@@ -688,7 +690,6 @@ popenfile(Page *p)
for(i = 0; i<n; i++)
addpage(p, d[i].name, popenfile, smprint("%s/%s", file, d[i].name), -1);
free(d);
- p->text = strdup(p->label);
goto Err1;
}
free(d);
@@ -696,10 +697,7 @@ popenfile(Page *p)
memset(buf, 0, NBUF/2);
if((n = readn(fd, buf, NBUF/2)) <= 0)
goto Err1;
- if(infernobithdr(buf, n))
- strcpy(typ, "image/p9bit");
- else
- filetype(buf, n, typ, sizeof(typ));
+ filetype(buf, n, typ, sizeof(typ));
for(i=0; i<nelem(tab); i++)
if(strncmp(typ, tab[i].typ, strlen(tab[i].typ)) == 0)
break;
@@ -787,14 +785,14 @@ loadpage(Page *p)
{
int fd;
- if(p->open && p->image == nil && p->text == nil){
+ if(p->open && p->image == nil){
if((fd = openpage(p)) >= 0){
pagegen++;
p->image = readimage(display, fd, 1);
close(fd);
}
- if(p->image == nil && p->text == nil)
- p->text = smprint("%s: %r", p->label);
+ if(p->image == nil)
+ p->open = nil;
}
p->gen = pagegen;
}
@@ -802,17 +800,12 @@ loadpage(Page *p)
void
unloadpage(Page *p)
{
- if(p->open){
- if(p->text)
- free(p->text);
- p->text = nil;
- if(p->image){
- lockdisplay(display);
- freeimage(p->image);
- unlockdisplay(display);
- }
- p->image = nil;
- }
+ if(p->open == nil || p->image == nil)
+ return;
+ lockdisplay(display);
+ freeimage(p->image);
+ unlockdisplay(display);
+ p->image = nil;
}
void
@@ -964,14 +957,16 @@ zoomdraw(Image *d, Rectangle r, Rectangle top, Image *s, Point sp, int f)
sp.y++;
}
}
- sp = r.min;
- for(x=r.min.x; x<r.max.x; x++){
+
+ x=r.min.x;
+ for(sp=r.min; x<r.max.x; sp.x++){
gendrawdiff(d, Rect(x, r.min.y, x+1, r.max.y), top, t, sp, nil, ZP, SoverD);
- if(++a.x == f){
- a.x = 0;
- sp.x++;
- }
+ for(x++; ++a.x<f && x<r.max.x; x++)
+ gendrawdiff(d, Rect(x, r.min.y, x+1, r.max.y), top, d,
+ Pt(x-1, r.min.y), nil, ZP, SoverD);
+ a.x = 0;
}
+
freeimage(t);
}
@@ -988,16 +983,12 @@ drawpage(Page *p)
Image *i;
if((i = p->image) == nil){
- char *s;
-
- if((s = p->text) == nil)
- s = "...";
r.min = ZP;
- r.max = stringsize(font, p->text);
+ r.max = stringsize(font, p->label);
r = rectaddpt(r, addpt(subpt(divpt(subpt(screen->r.max, screen->r.min), 2), divpt(r.max, 2)),
screen->r.min));
draw(screen, r, display->white, nil, ZP);
- string(screen, r.min, display->black, ZP, font, s);
+ string(screen, r.min, display->black, ZP, font, p->label);
} else {
r = rectaddpt(Rpt(ZP, pagesize(p)), addpt(pos, screen->r.min));
zoomdraw(screen, r, ZR, i, i->r.min, zoom);
@@ -1102,6 +1093,28 @@ showpage(Page *p)
}
void
+shownext(void)
+{
+ Page *p;
+
+ for(p = nextpage(current); p; p = nextpage(p))
+ if(p->image || p->open)
+ break;
+ showpage(p);
+}
+
+void
+showprev(void)
+{
+ Page *p;
+
+ for(p = prevpage(current); p; p = prevpage(p))
+ if(p->image || p->open)
+ break;
+ showpage(p);
+}
+
+void
zerox(Page *p)
{
char nam[64], *argv[4];
@@ -1252,6 +1265,7 @@ main(int argc, char *argv[])
goto Unlock;
}
if(m.buttons & 2){
+ o = m.xy;
i = emenuhit(2, &m, &menu);
if(i < 0 || i >= nelem(menuitems) || menuitems[i]==nil)
goto Unlock;
@@ -1294,7 +1308,7 @@ main(int argc, char *argv[])
}
if(strncmp(s, "zoom", 4)==0){
if(current && canqlock(current)){
- o = subpt(m.xy, screen->r.min);
+ o = subpt(o, screen->r.min);
if(strstr(s, "in")){
if(zoom < 0x40000000){
zoom *= 2;
@@ -1312,9 +1326,9 @@ main(int argc, char *argv[])
}
unlockdisplay(display);
if(strcmp(s, "next")==0)
- showpage(nextpage(current));
+ shownext();
if(strcmp(s, "prev")==0)
- showpage(prevpage(current));
+ showprev();
if(strcmp(s, "zerox")==0)
zerox(current);
if(strcmp(s, "quit")==0)
@@ -1357,7 +1371,7 @@ main(int argc, char *argv[])
case '-':
case Kbs:
case Kleft:
- showpage(prevpage(current));
+ showprev();
break;
case Kdown:
if(current == nil || !canqlock(current))
@@ -1382,7 +1396,7 @@ main(int argc, char *argv[])
}
case ' ':
case Kright:
- showpage(nextpage(current));
+ shownext();
break;
default:
i = strlen(jump);