commit - 2d6da3763ec643f353a1c48e2e7a2ed7c25046a7
commit + d9e047e5d5560912da6d2860fa25e427322f08bb
blob - a1af240e964afc49400bfed04dd551355a11c819
blob + 468df51b3c51ad48d62e9aed40bc76c0b0330707
--- CONTRIBUTORS
+++ CONTRIBUTORS
Jeff Sickel <jas@corpus-callosum.com>
Kris Maglione <jg@suckless.org>
Mathieu Lonjaret <lejatorn@gmail.com>
+Mathieu Lonjaret <mathieu.lonjaret@gmail.com>
Michael Teichgräber <mt4swm@googlemail.com>
Michael Teichgräber <mt@ib.wmipf.de>
Russ Cox <rsc@swtch.com>
blob - 87c2c25ae7d8eec2967be328f90ce88e7e026ff7
blob + 0063a339627b3a61a23d67970a30e788cce77228
--- src/cmd/page/cache.c
+++ src/cmd/page/cache.c
int page;
int angle;
Image *im;
+ int ppi;
};
static Cached cache[5];
int i;
Cached *c, old;
Image *im, *tmp;
+ int ppi = 100;
+ PDFInfo *pdf;
+ PSInfo *ps;
if((page < 0 || page >= doc->npage) && !doc->fwdonly)
return nil;
+ if (doc->type == Tpdf){
+ pdf = (PDFInfo *) doc->extra;
+ ppi = pdf->gs.ppi;
+ }
+ else{
+ if (doc->type == Tps){
+ ps = (PSInfo *) doc->extra;
+ ppi = ps->gs.ppi;
+ }
+ }
+
Again:
for(i=0; i<nelem(cache); i++){
c = &cache[i];
- if(c->doc == doc && c->angle == angle && c->page == page){
+ if(c->doc == doc && c->angle == angle && c->page == page && c->ppi == ppi){
if(chatty) fprint(2, "cache%s hit %d\n", ra, page);
goto Found;
}
c->im = nil;
c->doc = nil;
c->page = -1;
+ c->ppi = -1;
if(chatty) fprint(2, "cache%s load %d\n", ra, page);
im = doc->drawpage(doc, page);
c->page = page;
c->angle = angle;
c->im = im;
+ c->ppi = ppi;
Found:
if(chatty) fprint(2, "cache%s mtf %d @%d:", ra, c->page, i);
blob - da887d25fedf348cb62d446f06cfbc8b9b409950
blob + 22e08665fc1a4fa3b77ea20b7d02783fb859aab5
--- src/cmd/page/gfx.c
+++ src/cmd/page/gfx.c
doc->rmpage = rmpage;
doc->extra = gfx;
doc->fwdonly = 0;
+ doc->type = Tgfx;
fprint(2, "reading through graphics...\n");
if(argc==0 && buf)
blob - e4a9c76238c2d7e38bed4f88a223a9afe126f43e
blob + 041df26bb97440cf74502518d206b91ebdc78a7f
--- src/cmd/page/page.c
+++ src/cmd/page/page.c
int imagemode;
int notewatcher;
int notegp;
+int fitwin;
char tempfile[40];
int
void
usage(void)
{
- fprint(2, "usage: page [-biRrw] [-p ppi] file...\n");
+ fprint(2, "usage: page [-biRrwf] [-p ppi] file...\n");
wexits("usage");
}
case 'W':
winsize = EARGF(usage());
break;
+ case 'f':
+ fitwin = 1;
+ break;
default:
usage();
}ARGEND;
blob - 93e0da79cf1774fbae7cda1d7abfb53eafdf1076
blob + 7d3c4b86d83165ea26c22ebcf6561073141a1151
--- src/cmd/page/page.h
+++ src/cmd/page/page.h
int (*rmpage)(Document*, int);
Biobuf *b;
void *extra;
+ int type;
};
typedef struct Graphic Graphic;
Ibmp,
};
+enum {
+ Tgfx,
+ Tpdf,
+ Tps,
+}
+;
void *emalloc(int);
void *erealloc(void*, int);
extern int wctlfd;
extern int resizing;
extern int mknewwindow;
+extern int fitwin;
void rot180(Image*);
Image *rot90(Image*);
/* ghostscript interface shared by ps, pdf */
typedef struct GSInfo GSInfo;
+typedef struct PDFInfo PDFInfo;
+typedef struct Page Page;
+typedef struct PSInfo PSInfo;
struct GSInfo {
Graphic g;
int gsfd;
int gspid;
int ppi;
};
+struct PDFInfo {
+ GSInfo gs;
+ Rectangle *pagebbox;
+};
+struct Page {
+ char *name;
+ int offset; /* offset of page beginning within file */
+};
+struct PSInfo {
+ GSInfo gs;
+ Rectangle bbox; /* default bounding box */
+ Page *page;
+ int npage;
+ int clueless; /* don't know where page boundaries are */
+ long psoff; /* location of %! in file */
+ char ctm[256];
+};
+
void waitgs(GSInfo*);
int gscmd(GSInfo*, char*, ...);
int spawngs(GSInfo*, char*);
Image* convert(Graphic *g);
Image* cachedpage(Document*, int, int);
void cacheflush(void);
+void fit(void);
extern char tempfile[40];
blob - 77c888522e45175291de991236f3d27d51423c91
blob + cf6ecf90312db860362528f8da2bd1a2747648ae
--- src/cmd/page/pdf.c
+++ src/cmd/page/pdf.c
#include <bio.h>
#include "page.h"
-typedef struct PDFInfo PDFInfo;
-struct PDFInfo {
- GSInfo gs;
- Rectangle *pagebbox;
-};
-
static Image* pdfdrawpage(Document *d, int page);
static char* pdfpagename(Document*, int);
d->drawpage = pdfdrawpage;
d->pagename = pdfpagename;
d->fwdonly = 0;
+ d->type = Tpdf;
if(spawngs(&pdf->gs, "-dDELAYSAFER") < 0)
return nil;
blob - 4b678dc383958f71bbab5d5d63878639ccb93fd5
blob + e75a1477c6927dac4e566624c4a639f8b80ac3b1
--- src/cmd/page/ps.c
+++ src/cmd/page/ps.c
#include <ctype.h>
#include "page.h"
-typedef struct PSInfo PSInfo;
-typedef struct Page Page;
-
-struct Page {
- char *name;
- int offset; /* offset of page beginning within file */
-};
-
-struct PSInfo {
- GSInfo gs;
- Rectangle bbox; /* default bounding box */
- Page *page;
- int npage;
- int clueless; /* don't know where page boundaries are */
- long psoff; /* location of %! in file */
- char ctm[256];
-};
-
static int pswritepage(Document *d, int fd, int page);
static Image* psdrawpage(Document *d, int page);
static char* pspagename(Document*, int);
d->fwdonly = ps->clueless = dumb;
d->docname = argv[0];
+ /*
+ * "tag" the doc as an image for now since there still is the "blank page"
+ * problem for ps files.
+ */
+ d->type = Tgfx;
if(spawngs(&ps->gs, "-dSAFER") < 0)
return nil;
blob - e9378dc69a89a9750e1f1776554f7c5ede02c839
blob + 315a22a80c4196cd826f453643f9259db2556a63
--- src/cmd/page/view.c
+++ src/cmd/page/view.c
showbottom = 0;
}
- redraw(screen);
- flushimage(display, 1);
+ if((doc->type == Tgfx) && fitwin)
+ fit();
+ else{
+ redraw(screen);
+ flushimage(display, 1);
+ }
}
char*
Rectangle r;
int size[2];
Image *tmp;
+ PDFInfo *pdf;
+ PSInfo *ps;
static char *fwditems[] = { "this page", "next page", "exit", 0 };
static char *miditems[] = {
"orig size",
};
Alt alts[CN+1];
Plumbmsg *pm;
-
+
cp = chancreate(sizeof pm, 0);
assert(cp);
zerox();
break;
case Zin: /* zoom in */
- {
+ if (dd->type == Tpdf){ /* pdf */
+ pdf = (PDFInfo *) dd->extra;
+ if (pdf != nil){
+ ppi+= 50;
+ setdim(&pdf->gs, Rect(0,0,0,0), ppi, 0);
+ showpage(page, &menu);
+ }
+ break;
+ }
+ if (dd->type == Tps){ /* ps */
+ ps = (PSInfo *) dd->extra;
+ if (ps != nil){
+ ppi+= 50;
+ setdim(&ps->gs, Rect(0,0,0,0), ppi, 0);
+ showpage(page, &menu);
+ }
+ break;
+ }
+ else{ /* image */
double delta;
Rectangle r;
break;
}
case Fit: /* fit */
- {
- double delta;
- Rectangle r;
-
- delta = (double)Dx(screen->r)/(double)Dx(im->r);
- if((double)Dy(im->r)*delta > Dy(screen->r))
- delta = (double)Dy(screen->r)/(double)Dy(im->r);
-
- r = Rect(0, 0, (int)((double)Dx(im->r)*delta), (int)((double)Dy(im->r)*delta));
- setcursor(mc, &reading);
- tmp = xallocimage(display, r, im->chan, 0, DBlack);
- if(tmp == nil) {
- fprint(2, "out of memory during fit: %r\n");
- wexits("memory");
- }
- resample(im, tmp);
- im = tmp;
- delayfreeimage(tmp);
- setcursor(mc, nil);
- ul = screen->r.min;
- redraw(screen);
- flushimage(display, 1);
- break;
+ /* no op if pdf or ps*/
+ if (dd->type == Tgfx){
+ fitwin = 1;
+ fit();
}
+ break;
case Rot: /* rotate 90 */
angle = (angle+90) % 360;
showpage(page, &menu);
showpage(page, &menu);
break;
case Restore: /* restore */
+ if (dd->type == Tpdf){ /* pdf */
+ pdf = (PDFInfo *) dd->extra;
+ if (pdf != nil){
+ ppi = 100;
+ setdim(&pdf->gs, Rect(0,0,0,0), ppi, 0);
+ }
+ showpage(page, &menu);
+ break;
+ }
+ if (dd->type == Tps){ /* ps */
+ ps = (PSInfo *) dd->extra;
+ if (ps != nil){
+ ppi = 100;
+ setdim(&ps->gs, Rect(0,0,0,0), ppi, 0);
+ }
+ showpage(page, &menu);
+ break;
+ }
+ fitwin = 0;
showpage(page, &menu);
break;
case Reverse: /* reverse */
writeimage(pfd[1], im, 0);
close(pfd[1]);
}
+
+void
+fit()
+{
+ double delta;
+ Rectangle r;
+ Image* tmp;
+
+ delta = (double)Dx(screen->r)/(double)Dx(im->r);
+ if((double)Dy(im->r)*delta > Dy(screen->r))
+ delta = (double)Dy(screen->r)/(double)Dy(im->r);
+ r = Rect(0, 0, (int)((double)Dx(im->r)*delta), (int)((double)Dy(im->r)*delta));
+ setcursor(mc, &reading);
+ tmp = xallocimage(display, r, im->chan, 0, DBlack);
+ if(tmp == nil) {
+ fprint(2, "out of memory during fit: %r\n");
+ wexits("memory");
+ }
+ resample(im, tmp);
+ im = tmp;
+ delayfreeimage(tmp);
+ setcursor(mc, nil);
+ ul = screen->r.min;
+ redraw(screen);
+ flushimage(display, 1);
+}