From 17157e4aa85baea6c1503e2c95d98ed66a1596f1 Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 20 Mar 2006 02:25:59 +0000 Subject: update lucida --- LICENSE | 13 ++------ bin/9c | 1 + dist/deb.html | 5 +++ dist/mkfilelist | 2 +- man/fonts | 2 +- src/cmd/draw/img.c | 2 ++ src/cmd/page/filter.c | 1 + src/cmd/page/gfx.c | 4 +++ src/cmd/page/gs.c | 16 +++++----- src/cmd/page/mkfile | 2 +- src/cmd/page/nrotate.c | 1 + src/cmd/page/page.c | 59 ++-------------------------------- src/cmd/page/page.h | 5 ++- src/cmd/page/pdf.c | 9 +++--- src/cmd/page/ps.c | 3 +- src/cmd/page/rotate.c | 29 +++++++++++++++++ src/cmd/page/util.c | 1 + src/cmd/page/view.c | 82 +++++++++++++++++++++++++++++++++++++++++++++--- src/cmd/rc/lex.c | 2 +- src/cmd/sam/io.c | 4 ++- src/cmd/sam/sam.c | 6 +++- src/cmd/sam/sam.h | 1 + src/cmd/upas/smtp/smtp.c | 5 +-- src/mkfile | 1 + 24 files changed, 160 insertions(+), 96 deletions(-) diff --git a/LICENSE b/LICENSE index 4af3a242..996e6a2b 100644 --- a/LICENSE +++ b/LICENSE @@ -6,16 +6,9 @@ under simpler BSD-like boilerplates. See the LICENSE files in those directories. There are other exceptions, also marked with LICENSE files in their directories. -The bitmap fonts in the font/lucida directory are copyright B&H Inc. and Y&Y Inc. -and distributed under the following exception to the Lucent license: - - No right is granted to create derivative works of or - to redistribute (other than with the Plan 9 Operating System) - the screen imprinter fonts identified in subdirectory - font/lucida. This directory contains material copyrights by - B&H Inc. and Y&Y Inc. - -(Of course, X11 already distributes non-Unicode versions of these fonts.) +The bitmap fonts in the font/luc, font/lucm, font/lucsans, and font/pelm +directory are copyright B&H Inc. and distributed under more restricted +terms under agreement with B&H. See the NOTICE file in those directories. =================================================================== diff --git a/bin/9c b/bin/9c index a19c7378..f15dffb1 100755 --- a/bin/9c +++ b/bin/9c @@ -15,6 +15,7 @@ usegcc() -Wno-sign-compare \ -Wno-unknown-pragmas \ -fno-omit-frame-pointer \ + -fno-inline-functions-called-once \ " # want to put -fno-optimize-sibling-calls here but # that option only works with gcc3+ it seems diff --git a/dist/deb.html b/dist/deb.html index a3db08a9..a7f5ae58 100644 --- a/dist/deb.html +++ b/dist/deb.html @@ -26,6 +26,11 @@ Edit ./^$/,s/
Here are packages built for the Debian distribution of Linux. +
+ Newer packages can be had by adding +
+    deb http://swtch.com/debian/ testing main
to your + /etc/apt/sources.list.
diff --git a/dist/mkfilelist b/dist/mkfilelist index cd642527..4061e1cf 100755 --- a/dist/mkfilelist +++ b/dist/mkfilelist @@ -67,7 +67,7 @@ awk -vplan9'='$PLAN9 ' /^font\/(big5|gb|jis|naga10|shinonome)/ { cat("font-asian") } /^font\/LICENSE/ { cat("font-bh") } - /^font\/(lucida|lucidasans|lucm|pelm)\// { cat("font-bh") } + /^font\/(luc|lucsans|lucm|pelm)\// { cat("font-bh") } /^font\/(MAP|fixed|misc|sample|smiley)/ { cat("font-core") } /^font\/(palatino|times|special)/ { cat("font-proof") } /^font\// { cat("font-core") } diff --git a/man/fonts b/man/fonts index ce45b0d6..ac147dad 100755 --- a/man/fonts +++ b/man/fonts @@ -1,4 +1,4 @@ -# mkfile rules to get fonts in Lucida Sans. +# mkfile rules to set fonts # if you want to use Times, change these next lines to # MAN=mantimes # FONTS='' diff --git a/src/cmd/draw/img.c b/src/cmd/draw/img.c index 01caa3c4..1e961920 100644 --- a/src/cmd/draw/img.c +++ b/src/cmd/draw/img.c @@ -50,6 +50,7 @@ main(int argc, char **argv) if((image=readimage(display, fd, 0)) == nil) sysfatal("readimage: %r"); + sleep(1000); drawresizewindow(Rect(0,0,Dx(image->r),Dy(image->r))); @@ -60,6 +61,7 @@ main(int argc, char **argv) case Ekeyboard: if(e.kbdc == 'q' || e.kbdc == 0x7F) exits(nil); + eresized(0); break; case Emouse: break; diff --git a/src/cmd/page/filter.c b/src/cmd/page/filter.c index 07c3df2b..319cfb68 100644 --- a/src/cmd/page/filter.c +++ b/src/cmd/page/filter.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include "page.h" diff --git a/src/cmd/page/gfx.c b/src/cmd/page/gfx.c index 72254de8..6a947039 100644 --- a/src/cmd/page/gfx.c +++ b/src/cmd/page/gfx.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "page.h" @@ -71,6 +72,8 @@ static Image* convert(Graphic*); static Image* gfxdrawpage(Document *d, int page); static char* gfxpagename(Document*, int); static int spawnrc(char*, uchar*, int); +static void waitrc(void); +static int spawnpost(int); static int addpage(Document*, char*); static int rmpage(Document*, int); static int genaddpage(Document*, char*, uchar*, int); @@ -97,6 +100,7 @@ initgfx(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) int i; USED(b); + doc = emalloc(sizeof(*doc)); gfx = emalloc(sizeof(*gfx)); gfx->g = nil; diff --git a/src/cmd/page/gs.c b/src/cmd/page/gs.c index 524701e3..2093af56 100644 --- a/src/cmd/page/gs.c +++ b/src/cmd/page/gs.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "page.h" @@ -134,7 +135,7 @@ spawnmonitor(int fd) } int -spawngs(GSInfo *g) +spawngs(GSInfo *g, char *safer) { char *args[16]; char tb[32], gb[32]; @@ -158,7 +159,7 @@ spawngs(GSInfo *g) nargs = 0; args[nargs++] = "gs"; args[nargs++] = "-dNOPAUSE"; - args[nargs++] = "-dSAFER"; + args[nargs++] = safer; args[nargs++] = "-sDEVICE=plan9"; args[nargs++] = "-sOutputFile=/fd/3"; args[nargs++] = "-dQUIET"; @@ -268,14 +269,11 @@ setdim(GSInfo *gs, Rectangle bbox, int ppi, int landscape) if(!Dx(bbox)) bbox = Rect(0, 0, 612, 792); /* 8½×11 */ - switch(landscape){ - case 0: - pbox = bbox; - break; - case 1: + if(landscape) pbox = Rect(bbox.min.y, bbox.min.x, bbox.max.y, bbox.max.x); - break; - } + else + pbox = bbox; + gscmd(gs, "/PageSize [%d %d]\n", Dx(pbox), Dy(pbox)); gscmd(gs, "/Margins [%d %d]\n", -pbox.min.x, -pbox.min.y); gscmd(gs, "currentdevice putdeviceprops pop\n"); diff --git a/src/cmd/page/mkfile b/src/cmd/page/mkfile index e8dbf52a..0c4163ad 100644 --- a/src/cmd/page/mkfile +++ b/src/cmd/page/mkfile @@ -14,7 +14,7 @@ OFILES=\ util.$O\ view.$O\ -<$PLAN9/src//mkone +<$PLAN9/src/mkone pdfprolog.c: pdfprolog.ps cat pdfprolog.ps | sed 's/.*/"&\\n"/g' >pdfprolog.c diff --git a/src/cmd/page/nrotate.c b/src/cmd/page/nrotate.c index 2225ec3f..65fe33ab 100644 --- a/src/cmd/page/nrotate.c +++ b/src/cmd/page/nrotate.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "page.h" diff --git a/src/cmd/page/page.c b/src/cmd/page/page.c index 3669ebfb..4c76e033 100644 --- a/src/cmd/page/page.c +++ b/src/cmd/page/page.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include "page.h" @@ -19,43 +20,6 @@ int wctlfd = -1; int stdinfd; int truecolor; int imagemode; -int notewatcher; -int notegp; - -int -watcher(void *v, char *x) -{ - USED(v); - - if(strcmp(x, "die") != 0) - postnote(PNGROUP, notegp, x); - _exits(0); - return 0; -} - -int -bell(void *u, char *x) -{ - if(x && strcmp(x, "hangup") == 0) - _exits(0); - - if(x && strstr(x, "die") == nil) - fprint(2, "postnote %d: %s\n", getpid(), x); - - /* alarms come from the gs monitor */ - if(x && strstr(x, "alarm")){ - postnote(PNGROUP, getpid(), "die (gs error)"); - postnote(PNPROC, notewatcher, "die (gs error)"); - } - - /* function mentions u so that it's in the stack trace */ - if((u == nil || u != x) && doabort) - abort(); - -/* fprint(2, "exiting %d\n", getpid()); */ - wexits("note"); - return 0; -} static int afmt(Fmt *fmt) @@ -128,23 +92,7 @@ main(int argc, char **argv) usage(); }ARGEND; - notegp = getpid(); - - switch(notewatcher = fork()){ - case -1: - sysfatal("fork\n"); - exits(0); - default: - break; - case 0: - atnotify(watcher, 1); - for(;;) - sleep(1000); - _exits(0); - } - rfork(RFNOTEG); - atnotify(bell, 1); readstdin = 0; if(imagemode == 0 && argc == 0){ @@ -159,6 +107,8 @@ main(int argc, char **argv) fmtinstall('R', Rfmt); fmtinstall('P', Pfmt); + if(mknewwindow) + newwin(); if(readstdin){ b = nil; @@ -229,8 +179,5 @@ main(int argc, char **argv) void wexits(char *s) { - if(s && *s && strcmp(s, "note") != 0 && mknewwindow) - sleep(10*1000); - postnote(PNPROC, notewatcher, "die"); exits(s); } diff --git a/src/cmd/page/page.h b/src/cmd/page/page.h index aa19ff71..be54e386 100644 --- a/src/cmd/page/page.h +++ b/src/cmd/page/page.h @@ -1,5 +1,3 @@ -#include - typedef struct Document Document; struct Document { @@ -44,6 +42,7 @@ extern int mknewwindow; void rot180(Image*); Image *rot90(Image*); +Image *rot270(Image*); Image *resample(Image*, Image*); /* ghostscript interface shared by ps, pdf */ @@ -57,7 +56,7 @@ struct GSInfo { }; void waitgs(GSInfo*); int gscmd(GSInfo*, char*, ...); -int spawngs(GSInfo*); +int spawngs(GSInfo*, char*); void setdim(GSInfo*, Rectangle, int, int); int spawnwriter(GSInfo*, Biobuf*); Rectangle screenrect(void); diff --git a/src/cmd/page/pdf.c b/src/cmd/page/pdf.c index 44615a21..d723ad8c 100644 --- a/src/cmd/page/pdf.c +++ b/src/cmd/page/pdf.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "page.h" @@ -97,14 +98,14 @@ initpdf(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) d->pagename = pdfpagename; d->fwdonly = 0; - if(spawngs(&pdf->gs) < 0) + if(spawngs(&pdf->gs, "-dDELAYSAFER") < 0) return nil; gscmd(&pdf->gs, "%s", pdfprolog); waitgs(&pdf->gs); setdim(&pdf->gs, Rect(0,0,0,0), ppi, 0); - gscmd(&pdf->gs, "(%s) (r) file pdfopen begin\n", fn); + gscmd(&pdf->gs, "(%s) (r) file { DELAYSAFER { .setsafe } if } stopped pop pdfopen begin\n", fn); gscmd(&pdf->gs, "pdfpagecount PAGE==\n"); p = Brdline(&pdf->gs.gsrd, '\n'); npage = atoi(p); @@ -121,11 +122,10 @@ initpdf(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf) pdf->pagebbox = emalloc(sizeof(Rectangle)*npage); for(i=0; igs, "%d pdfgetpage\n", i+1); - pdf->pagebbox[i] = pdfbbox(&pdf->gs); + pdf->pagebbox[i] = pdfbbox(pdf); if(Dx(pdf->pagebbox[i]) <= 0) pdf->pagebbox[i] = bbox; } - return d; } @@ -149,6 +149,7 @@ static char* pdfpagename(Document *d, int page) { static char str[15]; + USED(d); sprint(str, "p %d", page+1); return str; diff --git a/src/cmd/page/ps.c b/src/cmd/page/ps.c index 46ad5cdb..cc6f3c51 100644 --- a/src/cmd/page/ps.c +++ b/src/cmd/page/ps.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -348,7 +349,7 @@ Keepreading: d->fwdonly = ps->clueless = dumb; d->docname = argv[0]; - if(spawngs(&ps->gs) < 0) + if(spawngs(&ps->gs, "-dSAFER") < 0) return nil; if(!cantranslate) diff --git a/src/cmd/page/rotate.c b/src/cmd/page/rotate.c index b2952637..9e1c20db 100644 --- a/src/cmd/page/rotate.c +++ b/src/cmd/page/rotate.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "page.h" @@ -54,6 +55,7 @@ moveup(Image *im, Image *tmp, int a, int b, int c, int axis) drawop(tmp, tmp->r, im, nil, im->r.min, S); switch(axis){ + default: case Xaxis: range = Rect(a, im->r.min.y, c, im->r.max.y); dr0 = range; @@ -88,6 +90,7 @@ interlace(Image *im, Image *tmp, int axis, int n, Image *mask, int gran) r0 = im->r; r1 = im->r; switch(axis) { + default: case Xaxis: r0.max.x = n; r1.min.x = n; @@ -245,6 +248,31 @@ rot90(Image *im) return(tmp); } +/* rotates an image 270 degrees clockwise */ +Image * +rot270(Image *im) +{ + Image *tmp; + int i, j, dx, dy; + + dx = Dx(im->r); + dy = Dy(im->r); + tmp = xallocimage(display, Rect(0, 0, dy, dx), im->chan, 0, DCyan); + if(tmp == nil) { + fprint(2, "out of memory during rot270: %r\n"); + wexits("memory"); + } + + for(i = 0; i < dy; i++) { + for(j = 0; j < dx; j++) { + drawop(tmp, Rect(i, j, i+1, j+1), im, nil, Pt(dx-(j+1), i), S); + } + } + freeimage(im); + + return(tmp); +} + /* from resample.c -- resize from → to using interpolation */ @@ -288,6 +316,7 @@ kaiser(double x, double tau, double alpha) return i0(alpha*sqrt(1-(x*x/(tau*tau))))/i0(alpha); } + void resamplex(uchar *in, int off, int d, int inx, uchar *out, int outx) { diff --git a/src/cmd/page/util.c b/src/cmd/page/util.c index 22832baa..2669df84 100644 --- a/src/cmd/page/util.c +++ b/src/cmd/page/util.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include "page.h" diff --git a/src/cmd/page/view.c b/src/cmd/page/view.c index 92aedeb9..4321f829 100644 --- a/src/cmd/page/view.c +++ b/src/cmd/page/view.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -16,7 +17,7 @@ Document *doc; Image *im; int page; -int upside = 0; +int angle = 0; int showbottom = 0; /* on the next showpage, move the image so the bottom is visible. */ Rectangle ulrange; /* the upper left corner of the image must be in this rectangle */ @@ -156,8 +157,17 @@ showpage(int page, Menu *m) im = tmp; } - if(upside) + switch(angle){ + case 90: + im = rot90(im); + break; + case 180: rot180(im); + break; + case 270: + im = rot270(im); + break; + } esetcursor(nil); if(showbottom){ @@ -390,7 +400,7 @@ viewer(Document *dd) esetcursor(&reading); rot180(im); esetcursor(nil); - upside = !upside; + angle = (angle+180) % 360; redraw(screen); flushimage(display, 1); break; @@ -589,6 +599,7 @@ viewer(Document *dd) esetcursor(&reading); im = rot90(im); esetcursor(nil); + angle = (angle+90) % 360; redraw(screen); flushimage(display, 1); break; @@ -598,7 +609,7 @@ viewer(Document *dd) esetcursor(&reading); rot180(im); esetcursor(nil); - upside = !upside; + angle = (angle+180) % 360; redraw(screen); flushimage(display, 1); break; @@ -978,6 +989,67 @@ rdenv(char *name) return v; } +void +newwin(void) +{ + char *srv, *mntsrv; + char spec[100]; + int srvfd, cons, pid; + + switch(rfork(RFFDG|RFPROC|RFNAMEG|RFENVG|RFNOTEG|RFNOWAIT)){ + case -1: + fprint(2, "page: can't fork: %r\n"); + wexits("no fork"); + case 0: + break; + default: + wexits(0); + } + + srv = rdenv("/env/wsys"); + if(srv == 0){ + mntsrv = rdenv("/mnt/term/env/wsys"); + if(mntsrv == 0){ + fprint(2, "page: can't find $wsys\n"); + wexits("srv"); + } + srv = malloc(strlen(mntsrv)+10); + sprint(srv, "/mnt/term%s", mntsrv); + free(mntsrv); + pid = 0; /* can't send notes to remote processes! */ + }else + pid = getpid(); + srvfd = open(srv, ORDWR); + free(srv); + if(srvfd == -1){ + fprint(2, "page: can't open %s: %r\n", srv); + wexits("no srv"); + } + sprint(spec, "new -pid %d", pid); + if(mount(srvfd, -1, "/mnt/wsys", 0, spec) == -1){ + fprint(2, "page: can't mount /mnt/wsys: %r (spec=%s)\n", spec); + wexits("no mount"); + } + close(srvfd); + unmount("/mnt/acme", "/dev"); + bind("/mnt/wsys", "/dev", MBEFORE); + cons = open("/dev/cons", OREAD); + if(cons==-1){ + NoCons: + fprint(2, "page: can't open /dev/cons: %r"); + wexits("no cons"); + } + dup(cons, 0); + close(cons); + cons = open("/dev/cons", OWRITE); + if(cons==-1) + goto NoCons; + dup(cons, 1); + dup(cons, 2); + close(cons); +// wctlfd = open("/dev/wctl", OWRITE); +} + Rectangle screenrect(void) { @@ -1011,7 +1083,7 @@ zerox(void) case 0: dup(pfd[1], 0); close(pfd[0]); - execl("/bin/page", "page", "-w", 0); + execl("/bin/page", "page", "-w", nil); wexits("cannot exec in zerox: %r\n"); default: close(pfd[1]); diff --git a/src/cmd/rc/lex.c b/src/cmd/rc/lex.c index 798ffe87..b0e27eb3 100644 --- a/src/cmd/rc/lex.c +++ b/src/cmd/rc/lex.c @@ -113,7 +113,7 @@ int nextis(int c){ } char *addtok(char *p, int val){ if(p==0) return 0; - if(p==&tok[NTOK]){ + if(p==&tok[NTOK-1]){ *p=0; yyerror("token buffer too short"); return 0; diff --git a/src/cmd/sam/io.c b/src/cmd/sam/io.c index 95c2e0ce..8b6f281f 100644 --- a/src/cmd/sam/io.c +++ b/src/cmd/sam/io.c @@ -226,7 +226,7 @@ connectto(char *machine, char **argv) // count args for(av = argv; *av; av++) ; - av = malloc(sizeof(char*)*((av-argv) + 5)); + av = malloc(sizeof(char*)*((av-argv) + 10)); if(av == nil){ dprint("out of memory\n"); exits("fork/exec"); @@ -234,6 +234,8 @@ connectto(char *machine, char **argv) ac = 0; av[ac++] = RX; av[ac++] = machine; + if(rxopt) + av[ac++] = rxopt; av[ac++] = rsamname; av[ac++] = "-R"; while(*argv) diff --git a/src/cmd/sam/sam.c b/src/cmd/sam/sam.c index 0ade9c21..01893cbb 100644 --- a/src/cmd/sam/sam.c +++ b/src/cmd/sam/sam.c @@ -30,6 +30,7 @@ Disk *disk; long seq; char *winsize; +char *rxopt; Rune baddir[] = { '<', 'b', 'a', 'd', 'd', 'i', 'r', '>', '\n'}; @@ -56,6 +57,9 @@ main(int volatile argc, char **volatile argv) case 'R': Rflag++; break; + case 'O': + rxopt = EARGF(usage()); + break; case 't': samterm = EARGF(usage()); break; @@ -118,7 +122,7 @@ main(int volatile argc, char **volatile argv) void usage(void) { - dprint("usage: sam [-d] [-t samterm] [-s sam name] -r machine\n"); + dprint("usage: sam [-d] [-t samterm] [-s sam name] [-r machine] [file ...]\n"); exits("usage"); } diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h index eefb4b34..bb88c33d 100644 --- a/src/cmd/sam/sam.h +++ b/src/cmd/sam/sam.h @@ -348,6 +348,7 @@ extern char SH[]; extern char SHPATH[]; extern char RX[]; extern char RXPATH[]; +extern char *rxopt; /* * acme globals diff --git a/src/cmd/upas/smtp/smtp.c b/src/cmd/upas/smtp/smtp.c index 0661f4c6..d3297dfa 100644 --- a/src/cmd/upas/smtp/smtp.c +++ b/src/cmd/upas/smtp/smtp.c @@ -754,6 +754,8 @@ getreply(void) reply = s_reset(reply); for(;;){ line = getcrnl(reply); + if(debug) + Bflush(&berr); if(line == 0) return -1; if(!isdigit(line[0]) || !isdigit(line[1]) || !isdigit(line[2])) @@ -761,8 +763,6 @@ getreply(void) if(line[3] != '-') break; } - if(debug) - Bflush(&berr); rv = atoi(line)/100; return rv; } @@ -999,6 +999,7 @@ getcrnl(String *s) case '\r': c = Bgetc(&bin); if(c == '\n'){ + case '\n': s_putc(s, c); if(debug) Bputc(&berr, c); diff --git a/src/mkfile b/src/mkfile index a6720110..8c1f7454 100644 --- a/src/mkfile +++ b/src/mkfile @@ -24,6 +24,7 @@ MKDIRS=\ mkmk.sh:VD: ( + echo '# AUTOMATICALLY GENERATED - DO NOT EDIT' echo cd lib9 echo 'echo cd `pwd`' (cd lib9; mk -n -a install) -- cgit v1.2.3