17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <memdraw.h>
57dd7cddfSDavid du Colombier #include <bio.h>
67dd7cddfSDavid du Colombier #include "pslib.h"
77dd7cddfSDavid du Colombier /* implement PsLib;
87dd7cddfSDavid du Colombier /*
97dd7cddfSDavid du Colombier /* include "sys.m";
107dd7cddfSDavid du Colombier /* sys: Sys;
117dd7cddfSDavid du Colombier /*
127dd7cddfSDavid du Colombier /* include "draw.m";
137dd7cddfSDavid du Colombier /* draw : Draw;
147dd7cddfSDavid du Colombier /* Image, Display,Rect,Point : import draw;
157dd7cddfSDavid du Colombier /*
167dd7cddfSDavid du Colombier /* include "bufio.m";
177dd7cddfSDavid du Colombier /* bufmod : Bufio;
187dd7cddfSDavid du Colombier /*
197dd7cddfSDavid du Colombier /* include "tk.m";
207dd7cddfSDavid du Colombier /* tk: Tk;
217dd7cddfSDavid du Colombier /* Toplevel: import tk;
227dd7cddfSDavid du Colombier /*
237dd7cddfSDavid du Colombier /* Iobuf : import bufmod;
247dd7cddfSDavid du Colombier /*
257dd7cddfSDavid du Colombier /* include "string.m";
267dd7cddfSDavid du Colombier /* str : String;
277dd7cddfSDavid du Colombier /*
287dd7cddfSDavid du Colombier /* include "daytime.m";
297dd7cddfSDavid du Colombier /* time : Daytime;
307dd7cddfSDavid du Colombier /*
317dd7cddfSDavid du Colombier /* include "pslib.m";
327dd7cddfSDavid du Colombier /*
337dd7cddfSDavid du Colombier /* ASCII,RUNE,IMAGE : con iota;
347dd7cddfSDavid du Colombier /*
357dd7cddfSDavid du Colombier */
367dd7cddfSDavid du Colombier struct iteminfo {
377dd7cddfSDavid du Colombier int itype;
387dd7cddfSDavid du Colombier int offset; /* offset from the start of line. */
397dd7cddfSDavid du Colombier int width; /* width.... */
407dd7cddfSDavid du Colombier int ascent; /* ascent of the item */
417dd7cddfSDavid du Colombier int font; /* font */
427dd7cddfSDavid du Colombier int line; /* line its on */
437dd7cddfSDavid du Colombier char *buf;
447dd7cddfSDavid du Colombier };
457dd7cddfSDavid du Colombier
467dd7cddfSDavid du Colombier struct lineinfo {
477dd7cddfSDavid du Colombier int xorg;
487dd7cddfSDavid du Colombier int yorg;
497dd7cddfSDavid du Colombier int width;
507dd7cddfSDavid du Colombier int height;
517dd7cddfSDavid du Colombier int ascent;
527dd7cddfSDavid du Colombier };
537dd7cddfSDavid du Colombier
547dd7cddfSDavid du Colombier
557dd7cddfSDavid du Colombier /* font_arr := array[256] of {* => (-1,"")};
567dd7cddfSDavid du Colombier /* remap := array[20] of (string,string);
577dd7cddfSDavid du Colombier /*
587dd7cddfSDavid du Colombier /* PXPI : con 100;
597dd7cddfSDavid du Colombier /* PTPI : con 100;
607dd7cddfSDavid du Colombier /*
617dd7cddfSDavid du Colombier */
627dd7cddfSDavid du Colombier char *noinit = "pslib not properly initialized";
637dd7cddfSDavid du Colombier /*
647dd7cddfSDavid du Colombier */
657dd7cddfSDavid du Colombier static int boxes;
667dd7cddfSDavid du Colombier static int debug;
677dd7cddfSDavid du Colombier static int totitems;
687dd7cddfSDavid du Colombier static int totlines;
697dd7cddfSDavid du Colombier static int curfont;
707dd7cddfSDavid du Colombier static char *def_font;
717dd7cddfSDavid du Colombier static int def_font_type;
727dd7cddfSDavid du Colombier static int curfonttype;
737dd7cddfSDavid du Colombier static int pagestart;
747dd7cddfSDavid du Colombier static int started;
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier static int bps;
777dd7cddfSDavid du Colombier static int width;
787dd7cddfSDavid du Colombier static int height;
797dd7cddfSDavid du Colombier static int iwidth;
807dd7cddfSDavid du Colombier static int iheight;
817dd7cddfSDavid du Colombier static int xstart;
827dd7cddfSDavid du Colombier static int ystart;
837dd7cddfSDavid du Colombier static double xmagnification = 1.0, ymagnification = 1.0;
847dd7cddfSDavid du Colombier static int rotation = 0;
857dd7cddfSDavid du Colombier static int landscape = 0;
867dd7cddfSDavid du Colombier static char *Patch = nil;
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier /* ctxt : ref Draw->Context;
897dd7cddfSDavid du Colombier /* t : ref Toplevel;
907dd7cddfSDavid du Colombier */
917dd7cddfSDavid du Colombier char*
psinit(int box,int deb)927dd7cddfSDavid du Colombier psinit(int box, int deb) { /* d: ref Toplevel, */
937dd7cddfSDavid du Colombier /* t=d; */
947dd7cddfSDavid du Colombier debug = deb;
957dd7cddfSDavid du Colombier totlines=0;
967dd7cddfSDavid du Colombier totitems=0;
977dd7cddfSDavid du Colombier pagestart=0;
987dd7cddfSDavid du Colombier boxes=box; /* #box; */
997dd7cddfSDavid du Colombier curfont=0;
1007dd7cddfSDavid du Colombier /* e := loadfonts();
1017dd7cddfSDavid du Colombier /* if (e != "")
1027dd7cddfSDavid du Colombier /* return e;
1037dd7cddfSDavid du Colombier */
1047dd7cddfSDavid du Colombier started=1;
1057dd7cddfSDavid du Colombier return "";
1067dd7cddfSDavid du Colombier }
1077dd7cddfSDavid du Colombier
1087dd7cddfSDavid du Colombier /* stats() : (int,int,int)
1097dd7cddfSDavid du Colombier /* {
1107dd7cddfSDavid du Colombier /* return (totitems,totlines,curfont);
1117dd7cddfSDavid du Colombier /* }
1127dd7cddfSDavid du Colombier /*
1137dd7cddfSDavid du Colombier /* loadfonts() : string
1147dd7cddfSDavid du Colombier /* {
1157dd7cddfSDavid du Colombier /* input : string;
1167dd7cddfSDavid du Colombier /* iob:=bufmod->open("/fonts/psrename",bufmod->OREAD);
1177dd7cddfSDavid du Colombier /* if (iob==nil)
1187dd7cddfSDavid du Colombier /* return sys->sprint("can't open /fonts/psrename: %r");
1197dd7cddfSDavid du Colombier /* i:=0;
1207dd7cddfSDavid du Colombier /* while((input=iob.gets('\n'))!=nil){
1217dd7cddfSDavid du Colombier /* (tkfont,psfont):=str->splitl(input," ");
1227dd7cddfSDavid du Colombier /* psfont=psfont[1:len psfont -1];
1237dd7cddfSDavid du Colombier /* remap[i]=(tkfont,psfont);
1247dd7cddfSDavid du Colombier /* i++;
1257dd7cddfSDavid du Colombier /* }
1267dd7cddfSDavid du Colombier /* return "";
1277dd7cddfSDavid du Colombier /* }
1287dd7cddfSDavid du Colombier /*
1297dd7cddfSDavid du Colombier */
1307dd7cddfSDavid du Colombier static char *username;
1317dd7cddfSDavid du Colombier
1327dd7cddfSDavid du Colombier int
preamble(Biobuf * ioutb,Rectangle bb)1337dd7cddfSDavid du Colombier preamble(Biobuf *ioutb, Rectangle bb) {
1347dd7cddfSDavid du Colombier
1357dd7cddfSDavid du Colombier if (!started) return 1;
1367dd7cddfSDavid du Colombier username = getuser();
1377dd7cddfSDavid du Colombier if(bb.max.x == 0 && bb.max.y == 0) {
1387dd7cddfSDavid du Colombier bb.max.x = 612;
1397dd7cddfSDavid du Colombier bb.max.y = 792;
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier Bprint(ioutb, "%%!PS-Adobe-3.0\n");
1427dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%Creator: PsLib 1.0 (%s)\n",username);
1437dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%CreationDate: %s", ctime(time(nil)));
1447dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%Pages: (atend) \n");
1457dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%BoundingBox: %d %d %d %d\n", bb.min.x, bb.min.y, bb.max.x, bb.max.y);
1467dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%EndComments\n");
1477dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%BeginProlog\n");
1487dd7cddfSDavid du Colombier Bprint(ioutb, "/doimage {\n");
1497dd7cddfSDavid du Colombier Bprint(ioutb, "/grey exch def\n");
1507dd7cddfSDavid du Colombier Bprint(ioutb, "/bps exch def\n");
1517dd7cddfSDavid du Colombier Bprint(ioutb, "/width exch def\n");
1527dd7cddfSDavid du Colombier Bprint(ioutb, "/height exch def\n");
1537dd7cddfSDavid du Colombier Bprint(ioutb, "/xstart exch def\n");
1547dd7cddfSDavid du Colombier Bprint(ioutb, "/ystart exch def\n");
1557dd7cddfSDavid du Colombier Bprint(ioutb, "/iwidth exch def\n");
1567dd7cddfSDavid du Colombier Bprint(ioutb, "/ascent exch def\n");
1577dd7cddfSDavid du Colombier Bprint(ioutb, "/iheight exch def\n");
1587dd7cddfSDavid du Colombier Bprint(ioutb, "gsave\n");
1597dd7cddfSDavid du Colombier if(boxes)
1607dd7cddfSDavid du Colombier Bprint(ioutb, "xstart ystart iwidth iheight rectstroke\n");
1617dd7cddfSDavid du Colombier /* # if bps==8, use inferno colormap; else (bps < 8) it's grayscale or true color */
1627dd7cddfSDavid du Colombier Bprint(ioutb, "bps 8 eq grey false eq and {\n");
1637dd7cddfSDavid du Colombier Bprint(ioutb, " [/Indexed /DeviceRGB 255 <\n");
1647dd7cddfSDavid du Colombier Bprint(ioutb, " ffffff ffffaa ffff55 ffff00 ffaaff ffaaaa ffaa55 ffaa00 ff55ff ff55aa ff5555 ff5500\n");
1657dd7cddfSDavid du Colombier Bprint(ioutb, " ff00ff ff00aa ff0055 ff0000 ee0000 eeeeee eeee9e eeee4f eeee00 ee9eee ee9e9e ee9e4f\n");
1667dd7cddfSDavid du Colombier Bprint(ioutb, " ee9e00 ee4fee ee4f9e ee4f4f ee4f00 ee00ee ee009e ee004f dd0049 dd0000 dddddd dddd93\n");
1677dd7cddfSDavid du Colombier Bprint(ioutb, " dddd49 dddd00 dd93dd dd9393 dd9349 dd9300 dd49dd dd4993 dd4949 dd4900 dd00dd dd0093\n");
1687dd7cddfSDavid du Colombier Bprint(ioutb, " cc0088 cc0044 cc0000 cccccc cccc88 cccc44 cccc00 cc88cc cc8888 cc8844 cc8800 cc44cc\n");
1697dd7cddfSDavid du Colombier Bprint(ioutb, " cc4488 cc4444 cc4400 cc00cc aaffaa aaff55 aaff00 aaaaff bbbbbb bbbb5d bbbb00 aa55ff\n");
1707dd7cddfSDavid du Colombier Bprint(ioutb, " bb5dbb bb5d5d bb5d00 aa00ff bb00bb bb005d bb0000 aaffff 9eeeee 9eee9e 9eee4f 9eee00\n");
1717dd7cddfSDavid du Colombier Bprint(ioutb, " 9e9eee aaaaaa aaaa55 aaaa00 9e4fee aa55aa aa5555 aa5500 9e00ee aa00aa aa0055 aa0000\n");
1727dd7cddfSDavid du Colombier Bprint(ioutb, " 990000 93dddd 93dd93 93dd49 93dd00 9393dd 999999 99994c 999900 9349dd 994c99 994c4c\n");
1737dd7cddfSDavid du Colombier Bprint(ioutb, " 994c00 9300dd 990099 99004c 880044 880000 88cccc 88cc88 88cc44 88cc00 8888cc 888888\n");
1747dd7cddfSDavid du Colombier Bprint(ioutb, " 888844 888800 8844cc 884488 884444 884400 8800cc 880088 55ff55 55ff00 55aaff 5dbbbb\n");
1757dd7cddfSDavid du Colombier Bprint(ioutb, " 5dbb5d 5dbb00 5555ff 5d5dbb 777777 777700 5500ff 5d00bb 770077 770000 55ffff 55ffaa\n");
1767dd7cddfSDavid du Colombier Bprint(ioutb, " 4fee9e 4fee4f 4fee00 4f9eee 55aaaa 55aa55 55aa00 4f4fee 5555aa 666666 666600 4f00ee\n");
1777dd7cddfSDavid du Colombier Bprint(ioutb, " 5500aa 660066 660000 4feeee 49dddd 49dd93 49dd49 49dd00 4993dd 4c9999 4c994c 4c9900\n");
1787dd7cddfSDavid du Colombier Bprint(ioutb, " 4949dd 4c4c99 555555 555500 4900dd 4c0099 550055 550000 440000 44cccc 44cc88 44cc44\n");
1797dd7cddfSDavid du Colombier Bprint(ioutb, " 44cc00 4488cc 448888 448844 448800 4444cc 444488 444444 444400 4400cc 440088 440044\n");
1807dd7cddfSDavid du Colombier Bprint(ioutb, " 00ff00 00aaff 00bbbb 00bb5d 00bb00 0055ff 005dbb 007777 007700 0000ff 0000bb 000077\n");
1817dd7cddfSDavid du Colombier Bprint(ioutb, " 333333 00ffff 00ffaa 00ff55 00ee4f 00ee00 009eee 00aaaa 00aa55 00aa00 004fee 0055aa\n");
1827dd7cddfSDavid du Colombier Bprint(ioutb, " 006666 006600 0000ee 0000aa 000066 222222 00eeee 00ee9e 00dd93 00dd49 00dd00 0093dd\n");
1837dd7cddfSDavid du Colombier Bprint(ioutb, " 009999 00994c 009900 0049dd 004c99 005555 005500 0000dd 000099 000055 111111 00dddd\n");
1847dd7cddfSDavid du Colombier Bprint(ioutb, " 00cccc 00cc88 00cc44 00cc00 0088cc 008888 008844 008800 0044cc 004488 004444 004400\n");
1857dd7cddfSDavid du Colombier Bprint(ioutb, " 0000cc 000088 000044 000000>\n");
1867dd7cddfSDavid du Colombier Bprint(ioutb, " ] setcolorspace\n");
1877dd7cddfSDavid du Colombier Bprint(ioutb, " /decodemat [0 255] def\n");
1887dd7cddfSDavid du Colombier Bprint(ioutb, "}\n");
1897dd7cddfSDavid du Colombier /* # else, bps != 8 */
1907dd7cddfSDavid du Colombier Bprint(ioutb, "{\n");
1917dd7cddfSDavid du Colombier /* is it greyscale or is it 24-bit color? */
1927dd7cddfSDavid du Colombier Bprint(ioutb, " grey true eq {\n");
1937dd7cddfSDavid du Colombier Bprint(ioutb, " [/DeviceGray] setcolorspace\n");
1947dd7cddfSDavid du Colombier Bprint(ioutb, " /decodemat [1 0] def\n");
1957dd7cddfSDavid du Colombier Bprint(ioutb, " }\n");
1967dd7cddfSDavid du Colombier Bprint(ioutb, " {\n");
1977dd7cddfSDavid du Colombier /* must be color */
1987dd7cddfSDavid du Colombier Bprint(ioutb, " [/DeviceRGB] setcolorspace\n");
1997dd7cddfSDavid du Colombier Bprint(ioutb, " /bps 8 def\n");
2007dd7cddfSDavid du Colombier Bprint(ioutb, " /decodemat [1 0 1 0 1 0] def\n");
2017dd7cddfSDavid du Colombier Bprint(ioutb, " }\n");
2027dd7cddfSDavid du Colombier Bprint(ioutb, " ifelse\n");
2037dd7cddfSDavid du Colombier Bprint(ioutb, "}\n");
2047dd7cddfSDavid du Colombier Bprint(ioutb, "ifelse\n");
2057dd7cddfSDavid du Colombier Bprint(ioutb, "/xmagnification %g def\n", xmagnification);
2067dd7cddfSDavid du Colombier Bprint(ioutb, "/ymagnification %g def\n", ymagnification);
2077dd7cddfSDavid du Colombier Bprint(ioutb, "/rotation %d def\n", rotation);
2087dd7cddfSDavid du Colombier Bprint(ioutb, "xstart ystart translate rotation rotate\n");
2097dd7cddfSDavid du Colombier Bprint(ioutb, "iwidth xmagnification mul iheight ymagnification mul scale\n");
2107dd7cddfSDavid du Colombier Bprint(ioutb, "<<\n");
2117dd7cddfSDavid du Colombier Bprint(ioutb, " /ImageType 1\n");
2127dd7cddfSDavid du Colombier Bprint(ioutb, " /Width width \n");
2137dd7cddfSDavid du Colombier Bprint(ioutb, " /Height height \n");
2147dd7cddfSDavid du Colombier Bprint(ioutb, " /BitsPerComponent bps %% bits/sample\n");
2157dd7cddfSDavid du Colombier Bprint(ioutb, " /Decode decodemat %% Brazil/Inferno cmap or DeviceGray value\n");
2167dd7cddfSDavid du Colombier Bprint(ioutb, " /ImageMatrix [width 0 0 height neg 0 height]\n");
2177dd7cddfSDavid du Colombier Bprint(ioutb, " /DataSource currentfile /ASCII85Decode filter\n");
2187dd7cddfSDavid du Colombier Bprint(ioutb, ">> \n");
2197dd7cddfSDavid du Colombier Bprint(ioutb, "image\n");
2207dd7cddfSDavid du Colombier Bprint(ioutb, "grestore\n");
2217dd7cddfSDavid du Colombier Bprint(ioutb, "} def\n");
2227dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%EndProlog\n");
2237dd7cddfSDavid du Colombier if (Patch != nil)
2247dd7cddfSDavid du Colombier Bprint(ioutb, "%s\n", Patch);
2257dd7cddfSDavid du Colombier return 0;
2267dd7cddfSDavid du Colombier }
2277dd7cddfSDavid du Colombier
2287dd7cddfSDavid du Colombier int
trailer(Biobuf * ioutb,int pages)2297dd7cddfSDavid du Colombier trailer(Biobuf *ioutb ,int pages) {
2307dd7cddfSDavid du Colombier if(!started)
2317dd7cddfSDavid du Colombier return 1;
2327dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%Trailer\n%%%%Pages: %d\n%%%%EOF\n", pages);
2337dd7cddfSDavid du Colombier return 0;
2347dd7cddfSDavid du Colombier }
2357dd7cddfSDavid du Colombier
2367dd7cddfSDavid du Colombier void
printnewpage(int pagenum,int end,Biobuf * ioutb)2377dd7cddfSDavid du Colombier printnewpage(int pagenum, int end, Biobuf *ioutb)
2387dd7cddfSDavid du Colombier {
2397dd7cddfSDavid du Colombier if (!started) return;
2407dd7cddfSDavid du Colombier if (end){
2417dd7cddfSDavid du Colombier /* # bounding box */
2427dd7cddfSDavid du Colombier if (boxes){
2437dd7cddfSDavid du Colombier Bprint(ioutb, "18 18 moveto 594 18 lineto 594 774 lineto 18 774 lineto closepath stroke\n");
2447dd7cddfSDavid du Colombier }
2457dd7cddfSDavid du Colombier Bprint(ioutb, "showpage\n%%%%EndPage %d %d\n", pagenum, pagenum);
2467dd7cddfSDavid du Colombier } else
2477dd7cddfSDavid du Colombier Bprint(ioutb, "%%%%Page: %d %d\n", pagenum, pagenum);
2487dd7cddfSDavid du Colombier }
2497dd7cddfSDavid du Colombier
2507dd7cddfSDavid du Colombier /* int
2517dd7cddfSDavid du Colombier /* printimage(FILE *ioutb, struct lineinfo line, struct iteminfo imag) {
2527dd7cddfSDavid du Colombier /* int RM;
2537dd7cddfSDavid du Colombier /*
2547dd7cddfSDavid du Colombier /* RM=612-18;
2557dd7cddfSDavid du Colombier /* class:=tk->cmd(t,"winfo class "+imag.buf);
2567dd7cddfSDavid du Colombier /* #sys->print("Looking for [%s] of type [%s]\n",imag.buf,class);
2577dd7cddfSDavid du Colombier /* if (line.xorg+imag.offset+imag.width>RM)
2587dd7cddfSDavid du Colombier /* imag.width=RM-line.xorg-imag.offset;
2597dd7cddfSDavid du Colombier /* case class {
2607dd7cddfSDavid du Colombier /* "button" or "menubutton" =>
2617dd7cddfSDavid du Colombier /* # try to get the text out and print it....
2627dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d moveto\n",line.xorg+imag.offset,
2637dd7cddfSDavid du Colombier /* line.yorg));
2647dd7cddfSDavid du Colombier /* msg:=tk->cmd(t,sys->sprint("%s cget -text",imag.buf));
2657dd7cddfSDavid du Colombier /* ft:=tk->cmd(t,sys->sprint("%s cget -font",imag.buf));
2667dd7cddfSDavid du Colombier /* sys->print("font is [%s]\n",ft);
2677dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",
2687dd7cddfSDavid du Colombier /* line.xorg+imag.offset,line.yorg,imag.width,
2697dd7cddfSDavid du Colombier /* line.height));
2707dd7cddfSDavid du Colombier /* return (class,msg);
2717dd7cddfSDavid du Colombier /* "label" =>
2727dd7cddfSDavid du Colombier /* (im,im2,err) := tk->imageget(t,imag.buf);
2737dd7cddfSDavid du Colombier /* if (im!=nil){
2747dd7cddfSDavid du Colombier /* bps := 1<<im.ldepth;
2757dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d %d %d %d %d %d %d doimage\n",
2767dd7cddfSDavid du Colombier /* im.r.dy(),line.ascent,im.r.dx(),line.yorg,
2777dd7cddfSDavid du Colombier /* line.xorg+imag.offset,im.r.dy(), im.r.dx(), bps));
2787dd7cddfSDavid du Colombier /* imagebits(ioutb,im);
2797dd7cddfSDavid du Colombier /* }
2807dd7cddfSDavid du Colombier /* return (class,"");
2817dd7cddfSDavid du Colombier /* "entry" =>
2827dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d moveto\n",line.xorg+imag.offset,
2837dd7cddfSDavid du Colombier /* line.yorg));
2847dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",
2857dd7cddfSDavid du Colombier /* line.xorg+imag.offset,line.yorg,imag.width,
2867dd7cddfSDavid du Colombier /* line.height));
2877dd7cddfSDavid du Colombier /* return (class,"");
2887dd7cddfSDavid du Colombier /* * =>
2897dd7cddfSDavid du Colombier /* sys->print("Unhandled class [%s]\n",class);
2907dd7cddfSDavid du Colombier /* return (class,"Error");
2917dd7cddfSDavid du Colombier /*
2927dd7cddfSDavid du Colombier /* }
2937dd7cddfSDavid du Colombier /* return ("","");
2947dd7cddfSDavid du Colombier /* }
2957dd7cddfSDavid du Colombier /*
2967dd7cddfSDavid du Colombier /* printline(ioutb: ref Iobuf,line : lineinfo,items : array of iteminfo)
2977dd7cddfSDavid du Colombier /* {
2987dd7cddfSDavid du Colombier /* xstart:=line.xorg;
2997dd7cddfSDavid du Colombier /* wid:=xstart;
3007dd7cddfSDavid du Colombier /* # items
3017dd7cddfSDavid du Colombier /* if (len items == 0) return;
3027dd7cddfSDavid du Colombier /* for(j:=0;j<len items;j++){
3037dd7cddfSDavid du Colombier /* msg:="";
3047dd7cddfSDavid du Colombier /* class:="";
3057dd7cddfSDavid du Colombier /* if (items[j].itype==IMAGE)
3067dd7cddfSDavid du Colombier /* (class,msg)=printimage(ioutb,line,items[j]);
3077dd7cddfSDavid du Colombier /* if (items[j].itype!=IMAGE || class=="button"|| class=="menubutton"){
3087dd7cddfSDavid du Colombier /* setfont(ioutb,items[j].font);
3097dd7cddfSDavid du Colombier /* if (msg!=""){
3107dd7cddfSDavid du Colombier /* # position the text in the center of the label
3117dd7cddfSDavid du Colombier /* # moveto curpoint
3127dd7cddfSDavid du Colombier /* # (msg) stringwidth pop xstart sub 2 div
3137dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d moveto\n",xstart+items[j].offset,
3147dd7cddfSDavid du Colombier /* line.yorg+line.height-line.ascent));
3157dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("(%s) dup stringwidth pop 2 div",
3167dd7cddfSDavid du Colombier /* msg));
3177dd7cddfSDavid du Colombier /* ioutb.puts(" 0 rmoveto show\n");
3187dd7cddfSDavid du Colombier /* }
3197dd7cddfSDavid du Colombier /* else {
3207dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d moveto\n",
3217dd7cddfSDavid du Colombier /* xstart+items[j].offset,line.yorg+line.height
3227dd7cddfSDavid du Colombier /* -line.ascent));
3237dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("(%s) show\n",items[j].buf));
3247dd7cddfSDavid du Colombier /* }
3257dd7cddfSDavid du Colombier /* }
3267dd7cddfSDavid du Colombier /* wid=xstart+items[j].offset+items[j].width;
3277dd7cddfSDavid du Colombier /* }
3287dd7cddfSDavid du Colombier /* if (boxes)
3297dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",line.xorg,line.yorg,
3307dd7cddfSDavid du Colombier /* wid,line.height));
3317dd7cddfSDavid du Colombier /* }
3327dd7cddfSDavid du Colombier /*
3337dd7cddfSDavid du Colombier /* setfont(ioutb: ref Iobuf,font : int){
3347dd7cddfSDavid du Colombier /* ftype : int;
3357dd7cddfSDavid du Colombier /* fname : string;
3367dd7cddfSDavid du Colombier /* if ((curfonttype&font)!=curfonttype){
3377dd7cddfSDavid du Colombier /* for(f:=0;f<curfont;f++){
3387dd7cddfSDavid du Colombier /* (ftype,fname)=font_arr[f];
3397dd7cddfSDavid du Colombier /* if ((ftype&font)==ftype)
3407dd7cddfSDavid du Colombier /* break;
3417dd7cddfSDavid du Colombier /* }
3427dd7cddfSDavid du Colombier /* if (f==curfont){
3437dd7cddfSDavid du Colombier /* fname=def_font;
3447dd7cddfSDavid du Colombier /* ftype=def_font_type;
3457dd7cddfSDavid du Colombier /* }
3467dd7cddfSDavid du Colombier /* ioutb.puts(sys->sprint("%s setfont\n",fname));
3477dd7cddfSDavid du Colombier /* curfonttype=ftype;
3487dd7cddfSDavid du Colombier /* }
3497dd7cddfSDavid du Colombier /* }
3507dd7cddfSDavid du Colombier /*
3517dd7cddfSDavid du Colombier /* parseTkline(ioutb: ref Iobuf,input : string) : string
3527dd7cddfSDavid du Colombier /* {
3537dd7cddfSDavid du Colombier /* if (!started) return noinit;
3547dd7cddfSDavid du Colombier /* thisline : lineinfo;
3557dd7cddfSDavid du Colombier /* PS:=792-18-18; # page size in points
3567dd7cddfSDavid du Colombier /* TM:=792-18; # top margin in points
3577dd7cddfSDavid du Colombier /* LM:=18; # left margin 1/4 in. in
3587dd7cddfSDavid du Colombier /* BM:=18; # bottom margin 1/4 in. in
3597dd7cddfSDavid du Colombier /* x : int;
3607dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3617dd7cddfSDavid du Colombier /* thisline.xorg=(x*PTPI)/PXPI;
3627dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3637dd7cddfSDavid du Colombier /* thisline.yorg=(x*PTPI)/PXPI;
3647dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3657dd7cddfSDavid du Colombier /* thisline.width=(x*PTPI)/PXPI;
3667dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3677dd7cddfSDavid du Colombier /* thisline.height=(x*PTPI)/PXPI;
3687dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3697dd7cddfSDavid du Colombier /* thisline.ascent=(x*PTPI)/PXPI;
3707dd7cddfSDavid du Colombier /* (x,input)=str->toint(input,10);
3717dd7cddfSDavid du Colombier /* # thisline.numitems=x;
3727dd7cddfSDavid du Colombier /* if (thisline.width==0 || thisline.height==0)
3737dd7cddfSDavid du Colombier /* return "";
3747dd7cddfSDavid du Colombier /* if (thisline.yorg+thisline.height-pagestart>PS){
3757dd7cddfSDavid du Colombier /* pagestart=thisline.yorg;
3767dd7cddfSDavid du Colombier /* return "newpage";
3777dd7cddfSDavid du Colombier /* # must resend this line....
3787dd7cddfSDavid du Colombier /* }
3797dd7cddfSDavid du Colombier /* thisline.yorg=TM-thisline.yorg-thisline.height+pagestart;
3807dd7cddfSDavid du Colombier /* thisline.xorg+=LM;
3817dd7cddfSDavid du Colombier /* (items, err) :=getline(totlines,input);
3827dd7cddfSDavid du Colombier /* if(err != nil)
3837dd7cddfSDavid du Colombier /* return err;
3847dd7cddfSDavid du Colombier /* totitems+=len items;
3857dd7cddfSDavid du Colombier /* totlines++;
3867dd7cddfSDavid du Colombier /* printline(ioutb,thisline,items);
3877dd7cddfSDavid du Colombier /* return "";
3887dd7cddfSDavid du Colombier /* }
3897dd7cddfSDavid du Colombier /*
3907dd7cddfSDavid du Colombier /*
3917dd7cddfSDavid du Colombier /* getfonts(input: string) : string
3927dd7cddfSDavid du Colombier /* {
3937dd7cddfSDavid du Colombier /* if (!started) return "Error";
3947dd7cddfSDavid du Colombier /* tkfont,psfont : string;
3957dd7cddfSDavid du Colombier /* j : int;
3967dd7cddfSDavid du Colombier /* retval := "";
3977dd7cddfSDavid du Colombier /* if (input[0]=='%')
3987dd7cddfSDavid du Colombier /* return "";
3997dd7cddfSDavid du Colombier /* # get a line of the form
4007dd7cddfSDavid du Colombier /* # 5::/fonts/lucida/moo.16.font
4017dd7cddfSDavid du Colombier /* # translate it to...
4027dd7cddfSDavid du Colombier /* # 32 f32.16
4037dd7cddfSDavid du Colombier /* # where 32==1<<5 and f32.16 is a postscript function that loads the
4047dd7cddfSDavid du Colombier /* # appropriate postscript font (from remap)
4057dd7cddfSDavid du Colombier /* # and writes it to fonts....
4067dd7cddfSDavid du Colombier /* (bits,font):=str->toint(input,10);
4077dd7cddfSDavid du Colombier /* if (bits!=-1)
4087dd7cddfSDavid du Colombier /* bits=1<<bits;
4097dd7cddfSDavid du Colombier /* else{
4107dd7cddfSDavid du Colombier /* bits=1;
4117dd7cddfSDavid du Colombier /* def_font_type=bits;
4127dd7cddfSDavid du Colombier /* curfonttype=def_font_type;
4137dd7cddfSDavid du Colombier /* }
4147dd7cddfSDavid du Colombier /* font=font[2:];
4157dd7cddfSDavid du Colombier /* for(i:=0;i<len remap;i++){
4167dd7cddfSDavid du Colombier /* (tkfont,psfont)=remap[i];
4177dd7cddfSDavid du Colombier /* if (tkfont==font)
4187dd7cddfSDavid du Colombier /* break;
4197dd7cddfSDavid du Colombier /* }
4207dd7cddfSDavid du Colombier /* if (i==len remap)
4217dd7cddfSDavid du Colombier /* psfont="Times-Roman";
4227dd7cddfSDavid du Colombier /* (font,nil)=str->splitr(font,".");
4237dd7cddfSDavid du Colombier /* (nil,font)=str->splitr(font[0:len font-1],".");
4247dd7cddfSDavid du Colombier /* (fsize,nil):=str->toint(font,10);
4257dd7cddfSDavid du Colombier /* fsize=(PTPI*3*fsize)/(2*PXPI);
4267dd7cddfSDavid du Colombier /* enc_font:="f"+string bits+"."+string fsize;
4277dd7cddfSDavid du Colombier /* ps_func:="/"+enc_font+" /"+psfont+" findfont "+string fsize+
4287dd7cddfSDavid du Colombier /* " scalefont def\n";
4297dd7cddfSDavid du Colombier /* sy_font:="sy"+string fsize;
4307dd7cddfSDavid du Colombier /* xtra_func:="/"+sy_font+" /Symbol findfont "+string fsize+
4317dd7cddfSDavid du Colombier /* " scalefont def\n";
4327dd7cddfSDavid du Colombier /* for(i=0;i<len font_arr;i++){
4337dd7cddfSDavid du Colombier /* (j,font)=font_arr[i];
4347dd7cddfSDavid du Colombier /* if (j==-1) break;
4357dd7cddfSDavid du Colombier /* }
4367dd7cddfSDavid du Colombier /* if (j==len font_arr)
4377dd7cddfSDavid du Colombier /* return "Error";
4387dd7cddfSDavid du Colombier /* font_arr[i]=(bits,enc_font);
4397dd7cddfSDavid du Colombier /* if (bits==1)
4407dd7cddfSDavid du Colombier /* def_font=enc_font;
4417dd7cddfSDavid du Colombier /* curfont++;
4427dd7cddfSDavid du Colombier /* retval+= ps_func;
4437dd7cddfSDavid du Colombier /* retval+= xtra_func;
4447dd7cddfSDavid du Colombier /* return retval;
4457dd7cddfSDavid du Colombier /* }
4467dd7cddfSDavid du Colombier /*
4477dd7cddfSDavid du Colombier /* deffont() : string
4487dd7cddfSDavid du Colombier /* {
4497dd7cddfSDavid du Colombier /* return def_font;
4507dd7cddfSDavid du Colombier /* }
4517dd7cddfSDavid du Colombier /*
4527dd7cddfSDavid du Colombier /* getline(k : int, input : string) : (array of iteminfo, string)
4537dd7cddfSDavid du Colombier /* {
4547dd7cddfSDavid du Colombier /* lineval,args : string;
4557dd7cddfSDavid du Colombier /* j, nb : int;
4567dd7cddfSDavid du Colombier /* lw:=0;
4577dd7cddfSDavid du Colombier /* wid:=0;
4587dd7cddfSDavid du Colombier /* flags:=0;
4597dd7cddfSDavid du Colombier /* item_arr := array[32] of {* => iteminfo(-1,-1,-1,-1,-1,-1,"")};
4607dd7cddfSDavid du Colombier /* curitem:=0;
4617dd7cddfSDavid du Colombier /* while(input!=nil){
4627dd7cddfSDavid du Colombier /* (nil,input)=str->splitl(input,"[");
4637dd7cddfSDavid du Colombier /* if (input==nil)
4647dd7cddfSDavid du Colombier /* break;
4657dd7cddfSDavid du Colombier /* com:=input[1];
4667dd7cddfSDavid du Colombier /* input=input[2:];
4677dd7cddfSDavid du Colombier /* case com {
4687dd7cddfSDavid du Colombier /* 'A' =>
4697dd7cddfSDavid du Colombier /* nb=0;
4707dd7cddfSDavid du Colombier /* # get the width of the item
4717dd7cddfSDavid du Colombier /* (wid,input)=str->toint(input,10);
4727dd7cddfSDavid du Colombier /* wid=(wid*PTPI)/PXPI;
4737dd7cddfSDavid du Colombier /* if (input[0]!='{')
4747dd7cddfSDavid du Colombier /* return (nil, sys->sprint(
4757dd7cddfSDavid du Colombier /* "line %d item %d Bad Syntax : '{' expected",
4767dd7cddfSDavid du Colombier /* k,curitem));
4777dd7cddfSDavid du Colombier /* # get the args.
4787dd7cddfSDavid du Colombier /* (args,input)=str->splitl(input,"}");
4797dd7cddfSDavid du Colombier /* # get the flags.
4807dd7cddfSDavid du Colombier /* # assume there is only one int flag..
4817dd7cddfSDavid du Colombier /* (flags,args)=str->toint(args[1:],16);
4827dd7cddfSDavid du Colombier /* if (args!=nil && debug){
4837dd7cddfSDavid du Colombier /* sys->print("line %d item %d extra flags=%s\n",
4847dd7cddfSDavid du Colombier /* k,curitem,args);
4857dd7cddfSDavid du Colombier /* }
4867dd7cddfSDavid du Colombier /* if (flags<1024) flags=1;
4877dd7cddfSDavid du Colombier /* item_arr[curitem].font=flags;
4887dd7cddfSDavid du Colombier /* item_arr[curitem].offset=lw;
4897dd7cddfSDavid du Colombier /* item_arr[curitem].width=wid;
4907dd7cddfSDavid du Colombier /* lw+=wid;
4917dd7cddfSDavid du Colombier /* for(j=1;j<len input;j++){
4927dd7cddfSDavid du Colombier /* if ((input[j]==')')||(input[j]=='('))
4937dd7cddfSDavid du Colombier /* lineval[len lineval]='\\';
4947dd7cddfSDavid du Colombier /* if (input[j]=='[')
4957dd7cddfSDavid du Colombier /* nb++;
4967dd7cddfSDavid du Colombier /* if (input[j]==']')
4977dd7cddfSDavid du Colombier /* if (nb==0)
4987dd7cddfSDavid du Colombier /* break;
4997dd7cddfSDavid du Colombier /* else
5007dd7cddfSDavid du Colombier /* nb--;
5017dd7cddfSDavid du Colombier /* lineval[len lineval]=input[j];
5027dd7cddfSDavid du Colombier /* }
5037dd7cddfSDavid du Colombier /* if (j<len input)
5047dd7cddfSDavid du Colombier /* input=input[j:];
5057dd7cddfSDavid du Colombier /* item_arr[curitem].buf=lineval;
5067dd7cddfSDavid du Colombier /* item_arr[curitem].line=k;
5077dd7cddfSDavid du Colombier /* item_arr[curitem].itype=ASCII;
5087dd7cddfSDavid du Colombier /* curitem++;
5097dd7cddfSDavid du Colombier /* lineval="";
5107dd7cddfSDavid du Colombier /* 'R' =>
5117dd7cddfSDavid du Colombier /* nb=0;
5127dd7cddfSDavid du Colombier /* # get the width of the item
5137dd7cddfSDavid du Colombier /* (wid,input)=str->toint(input,10);
5147dd7cddfSDavid du Colombier /* wid=(wid*PTPI)/PXPI;
5157dd7cddfSDavid du Colombier /* if (input[0]!='{')
5167dd7cddfSDavid du Colombier /* return (nil, "Bad Syntax : '{' expected");
5177dd7cddfSDavid du Colombier /* # get the args.
5187dd7cddfSDavid du Colombier /* (args,input)=str->splitl(input,"}");
5197dd7cddfSDavid du Colombier /* # get the flags.
5207dd7cddfSDavid du Colombier /* # assume there is only one int flag..
5217dd7cddfSDavid du Colombier /* (flags,args)=str->toint(args[1:],16);
5227dd7cddfSDavid du Colombier /* if (args!=nil && debug){
5237dd7cddfSDavid du Colombier /* sys->print("line %d item %d Bad Syntax args=%s",
5247dd7cddfSDavid du Colombier /* k,curitem,args);
5257dd7cddfSDavid du Colombier /* }
5267dd7cddfSDavid du Colombier /* item_arr[curitem].font=flags;
5277dd7cddfSDavid du Colombier /* item_arr[curitem].offset=lw;
5287dd7cddfSDavid du Colombier /* item_arr[curitem].width=wid;
5297dd7cddfSDavid du Colombier /* lw+=wid;
5307dd7cddfSDavid du Colombier /* for(j=1;j<len input;j++){
5317dd7cddfSDavid du Colombier /* if (input[j]=='[')
5327dd7cddfSDavid du Colombier /* nb++;
5337dd7cddfSDavid du Colombier /* if (input[j]==']')
5347dd7cddfSDavid du Colombier /* if (nb==0)
5357dd7cddfSDavid du Colombier /* break;
5367dd7cddfSDavid du Colombier /* else
5377dd7cddfSDavid du Colombier /* nb--;
5387dd7cddfSDavid du Colombier /* case input[j] {
5397dd7cddfSDavid du Colombier /* 8226 => # bullet
5407dd7cddfSDavid du Colombier /* lineval+="\\267 ";
5417dd7cddfSDavid du Colombier /* 169 => # copyright
5427dd7cddfSDavid du Colombier /* lineval+="\\251 ";
5437dd7cddfSDavid du Colombier /* curitem++;
5447dd7cddfSDavid du Colombier /* * =>
5457dd7cddfSDavid du Colombier /* lineval[len lineval]=input[j];
5467dd7cddfSDavid du Colombier /* }
5477dd7cddfSDavid du Colombier /* }
5487dd7cddfSDavid du Colombier /* if (j>len input)
5497dd7cddfSDavid du Colombier /* input=input[j:];
5507dd7cddfSDavid du Colombier /* item_arr[curitem].buf=lineval;
5517dd7cddfSDavid du Colombier /* item_arr[curitem].line=k;
5527dd7cddfSDavid du Colombier /* item_arr[curitem].itype=RUNE;
5537dd7cddfSDavid du Colombier /* curitem++;
5547dd7cddfSDavid du Colombier /* lineval="";
5557dd7cddfSDavid du Colombier /* 'N' or 'C'=>
5567dd7cddfSDavid du Colombier /* # next item
5577dd7cddfSDavid du Colombier /* for(j=0;j<len input;j++)
5587dd7cddfSDavid du Colombier /* if (input[j]==']')
5597dd7cddfSDavid du Colombier /* break;
5607dd7cddfSDavid du Colombier /* if (j>len input)
5617dd7cddfSDavid du Colombier /* input=input[j:];
5627dd7cddfSDavid du Colombier /* 'T' =>
5637dd7cddfSDavid du Colombier /* (wid,input)=str->toint(input,10);
5647dd7cddfSDavid du Colombier /* wid=(wid*PTPI)/PXPI;
5657dd7cddfSDavid du Colombier /* item_arr[curitem].offset=lw;
5667dd7cddfSDavid du Colombier /* item_arr[curitem].width=wid;
5677dd7cddfSDavid du Colombier /* lw+=wid;
5687dd7cddfSDavid du Colombier /* lineval[len lineval]='\t';
5697dd7cddfSDavid du Colombier /* # next item
5707dd7cddfSDavid du Colombier /* for(j=0;j<len input;j++)
5717dd7cddfSDavid du Colombier /* if (input[j]==']')
5727dd7cddfSDavid du Colombier /* break;
5737dd7cddfSDavid du Colombier /* if (j>len input)
5747dd7cddfSDavid du Colombier /* input=input[j:];
5757dd7cddfSDavid du Colombier /* item_arr[curitem].buf=lineval;
5767dd7cddfSDavid du Colombier /* item_arr[curitem].line=k;
5777dd7cddfSDavid du Colombier /* item_arr[curitem].itype=ASCII;
5787dd7cddfSDavid du Colombier /* curitem++;
5797dd7cddfSDavid du Colombier /* lineval="";
5807dd7cddfSDavid du Colombier /* 'W' =>
5817dd7cddfSDavid du Colombier /* (wid,input)=str->toint(input,10);
5827dd7cddfSDavid du Colombier /* wid=(wid*PTPI)/PXPI;
5837dd7cddfSDavid du Colombier /* item_arr[curitem].offset=lw;
5847dd7cddfSDavid du Colombier /* item_arr[curitem].width=wid;
5857dd7cddfSDavid du Colombier /* item_arr[curitem].itype=IMAGE;
5867dd7cddfSDavid du Colombier /* lw+=wid;
5877dd7cddfSDavid du Colombier /* # next item
5887dd7cddfSDavid du Colombier /* for(j=1;j<len input;j++){
5897dd7cddfSDavid du Colombier /* if (input[j]==']')
5907dd7cddfSDavid du Colombier /* break;
5917dd7cddfSDavid du Colombier /* lineval[len lineval]=input[j];
5927dd7cddfSDavid du Colombier /* }
5937dd7cddfSDavid du Colombier /* item_arr[curitem].buf=lineval;
5947dd7cddfSDavid du Colombier /* if (j>len input)
5957dd7cddfSDavid du Colombier /* input=input[j:];
5967dd7cddfSDavid du Colombier /* curitem++;
5977dd7cddfSDavid du Colombier /* lineval="";
5987dd7cddfSDavid du Colombier /* * =>
5997dd7cddfSDavid du Colombier /* # next item
6007dd7cddfSDavid du Colombier /* for(j=0;j<len input;j++)
6017dd7cddfSDavid du Colombier /* if (input[j]==']')
6027dd7cddfSDavid du Colombier /* break;
6037dd7cddfSDavid du Colombier /* if (j>len input)
6047dd7cddfSDavid du Colombier /* input=input[j:];
6057dd7cddfSDavid du Colombier /*
6067dd7cddfSDavid du Colombier /* }
6077dd7cddfSDavid du Colombier /* }
6087dd7cddfSDavid du Colombier /* return (item_arr[0:curitem], "");
6097dd7cddfSDavid du Colombier /* }
6107dd7cddfSDavid du Colombier */
6117dd7cddfSDavid du Colombier
6127dd7cddfSDavid du Colombier void
cmap2ascii85(uchar * b,uchar * c)6137dd7cddfSDavid du Colombier cmap2ascii85(uchar *b, uchar *c) {
6147dd7cddfSDavid du Colombier int i;
6157dd7cddfSDavid du Colombier unsigned long i1;
6167dd7cddfSDavid du Colombier
6177dd7cddfSDavid du Colombier /* fprintf(stderr, "addr=0x%x %x %x %x %x\n", b, b[0], b[1], b[2], b[3]); */
6187dd7cddfSDavid du Colombier b--; /* one-index b */
6197dd7cddfSDavid du Colombier c--; /* one-index c */
6207dd7cddfSDavid du Colombier i1 = (b[1]<<24)+(b[2]<<16)+(b[3]<<8)+b[4];
6217dd7cddfSDavid du Colombier if(i1 == 0){
6227dd7cddfSDavid du Colombier c[1] = 'z';
6237dd7cddfSDavid du Colombier c[2] = '\0';
6247dd7cddfSDavid du Colombier return;
6257dd7cddfSDavid du Colombier }
6267dd7cddfSDavid du Colombier for(i=0; i<=4; i++){
6277dd7cddfSDavid du Colombier c[5-i] = '!' + (i1 % 85);
6287dd7cddfSDavid du Colombier i1 /= 85;
6297dd7cddfSDavid du Colombier }
6307dd7cddfSDavid du Colombier c[6] = '\0';
6317dd7cddfSDavid du Colombier }
6327dd7cddfSDavid du Colombier
6337dd7cddfSDavid du Colombier static uchar *arr = nil;
6347dd7cddfSDavid du Colombier ulong onesbits = ~0;
6357dd7cddfSDavid du Colombier void
imagebits(Biobuf * ioutb,Memimage * im)6367dd7cddfSDavid du Colombier imagebits(Biobuf *ioutb, Memimage *im)
6377dd7cddfSDavid du Colombier {
6387dd7cddfSDavid du Colombier int spb;
6397dd7cddfSDavid du Colombier int bitoff;
6407dd7cddfSDavid du Colombier int j, n, n4, i, bpl, nrest;
6417dd7cddfSDavid du Colombier int lsf;
6427dd7cddfSDavid du Colombier uchar c85[6], *data, *src, *dst;
6437dd7cddfSDavid du Colombier Memimage *tmp;
6447dd7cddfSDavid du Colombier Rectangle r;
6457dd7cddfSDavid du Colombier
6467dd7cddfSDavid du Colombier tmp = nil;
6477dd7cddfSDavid du Colombier if (debug)
6487dd7cddfSDavid du Colombier fprint(2, "imagebits, r=%d %d %d %d, depth=%d\n",
6497dd7cddfSDavid du Colombier im->r.min.x, im->r.min.y, im->r.max.x, im->r.max.y, im->depth);
6507dd7cddfSDavid du Colombier width = Dx(im->r);
6517dd7cddfSDavid du Colombier height = Dy(im->r);
6527dd7cddfSDavid du Colombier bps = im->depth; /* # bits per sample */
6537dd7cddfSDavid du Colombier bitoff = 0; /* # bit offset of beginning sample within first byte */
6547dd7cddfSDavid du Colombier if (bps < 8) {
6557dd7cddfSDavid du Colombier spb = 8 / bps;
6567dd7cddfSDavid du Colombier bitoff = (im->r.min.x % spb) * bps;
6577dd7cddfSDavid du Colombier }
6587dd7cddfSDavid du Colombier if (bitoff != 0) {
6597dd7cddfSDavid du Colombier /* # Postscript image wants beginning of line at beginning of byte */
6607dd7cddfSDavid du Colombier r = im->r;
6617dd7cddfSDavid du Colombier r.min.x -= bitoff/im->depth;
6627dd7cddfSDavid du Colombier r.max.x -= bitoff/im->depth;
6637dd7cddfSDavid du Colombier tmp = allocmemimage(r, im->chan);
6647dd7cddfSDavid du Colombier if(tmp == nil){
6657dd7cddfSDavid du Colombier fprint(2, "p9bitpost: allocmemimage failed: %r\n");
6667dd7cddfSDavid du Colombier exits("alloc");
6677dd7cddfSDavid du Colombier }
6686a9fc400SDavid du Colombier memimagedraw(tmp, r, im, im->r.min, nil, ZP, S);
6697dd7cddfSDavid du Colombier im = tmp;
6707dd7cddfSDavid du Colombier }
6717dd7cddfSDavid du Colombier lsf = 0;
6727dd7cddfSDavid du Colombier /* compact data to remove word-boundary padding */
6737dd7cddfSDavid du Colombier bpl = bytesperline(im->r, im->depth);
6747dd7cddfSDavid du Colombier n = bpl*Dy(im->r);
6757dd7cddfSDavid du Colombier data = malloc(n);
6767dd7cddfSDavid du Colombier if(data == nil){
6777dd7cddfSDavid du Colombier fprint(2, "p9bitpost: malloc failed: %r\n");
6787dd7cddfSDavid du Colombier exits("malloc");
6797dd7cddfSDavid du Colombier }
6807dd7cddfSDavid du Colombier for(i=0; i<Dy(im->r); i++){
6817dd7cddfSDavid du Colombier /* memmove(data+bpl*i, byteaddr(im, Pt(im->r.min.x, im->r.min.y+i)), bpl); with inversion */
6827dd7cddfSDavid du Colombier dst = data+bpl*i;
6837dd7cddfSDavid du Colombier src = byteaddr(im, Pt(im->r.min.x, im->r.min.y+i));
6847dd7cddfSDavid du Colombier for(j=0; j<bpl; j++)
6857dd7cddfSDavid du Colombier *dst++ = 255 - *src++;
6867dd7cddfSDavid du Colombier }
6877dd7cddfSDavid du Colombier n4 = (n / 4) * 4;
6887dd7cddfSDavid du Colombier for (i = 0; i < n4; i += 4){
6897dd7cddfSDavid du Colombier cmap2ascii85(data+i, c85);
6907dd7cddfSDavid du Colombier lsf += strlen((char *)c85);
691*14f51593SDavid du Colombier Bprint(ioutb, "%s", (char *)c85);
6927dd7cddfSDavid du Colombier if (lsf > 74) {
6937dd7cddfSDavid du Colombier Bprint(ioutb, "\n");
6947dd7cddfSDavid du Colombier lsf = 0;
6957dd7cddfSDavid du Colombier }
6967dd7cddfSDavid du Colombier }
6977dd7cddfSDavid du Colombier nrest = n - n4;
6987dd7cddfSDavid du Colombier if (nrest != 0) {
6997dd7cddfSDavid du Colombier uchar foo[4];
7007dd7cddfSDavid du Colombier
7017dd7cddfSDavid du Colombier for (i=0; i<nrest; i++)
7027dd7cddfSDavid du Colombier foo[i] = data[n4+i];
7037dd7cddfSDavid du Colombier for (i=nrest; i<4; i++)
7047dd7cddfSDavid du Colombier foo[i] = '\0';
7057dd7cddfSDavid du Colombier cmap2ascii85(foo, c85);
7067dd7cddfSDavid du Colombier if (strcmp((char *)c85, "z") == 0 )
7077dd7cddfSDavid du Colombier strcpy((char *)c85, "!!!!!");
708*14f51593SDavid du Colombier Bprint(ioutb, "%.*s", nrest+1, (char *)c85);
7097dd7cddfSDavid du Colombier }
7107dd7cddfSDavid du Colombier Bprint(ioutb, "\n~>");
7117dd7cddfSDavid du Colombier Bprint(ioutb, "\n");
7127dd7cddfSDavid du Colombier freememimage(tmp);
7137dd7cddfSDavid du Colombier }
7147dd7cddfSDavid du Colombier
7157dd7cddfSDavid du Colombier int
image2psfile(int fd,Memimage * im,int dpi)7167dd7cddfSDavid du Colombier image2psfile(int fd, Memimage *im, int dpi) {
7177dd7cddfSDavid du Colombier Rectangle r;
7187dd7cddfSDavid du Colombier Rectangle bbox;
7197dd7cddfSDavid du Colombier int e;
7207dd7cddfSDavid du Colombier int xmargin = 36;
7217dd7cddfSDavid du Colombier int ymargin = 36;
7227dd7cddfSDavid du Colombier double paperaspectratio;
7237dd7cddfSDavid du Colombier double imageaspectratio;
7247dd7cddfSDavid du Colombier Biobuf ioutb;
7257dd7cddfSDavid du Colombier Memimage *tmp;
7267dd7cddfSDavid du Colombier
7277dd7cddfSDavid du Colombier if(im->depth >= 8 && im->chan != CMAP8 && im->chan != GREY8){
7287dd7cddfSDavid du Colombier /*
7297dd7cddfSDavid du Colombier * the postscript libraries can only handle [1248]-bit grey, 8-bit cmap,
7307dd7cddfSDavid du Colombier * and 24-bit color, so convert.
7317dd7cddfSDavid du Colombier */
7327dd7cddfSDavid du Colombier tmp = allocmemimage(im->r, strtochan("b8g8r8"));
7337dd7cddfSDavid du Colombier if(tmp == nil)
7347dd7cddfSDavid du Colombier return 1;
7356a9fc400SDavid du Colombier memimagedraw(tmp, tmp->r, im, im->r.min, nil, ZP, S);
7367dd7cddfSDavid du Colombier freememimage(im);
7377dd7cddfSDavid du Colombier im = tmp;
7387dd7cddfSDavid du Colombier }
7397dd7cddfSDavid du Colombier
7407dd7cddfSDavid du Colombier Binit(&ioutb, fd, OWRITE);
7417dd7cddfSDavid du Colombier r = im->r;
7427dd7cddfSDavid du Colombier width = Dx(r);
7437dd7cddfSDavid du Colombier height = Dy(r);
7447dd7cddfSDavid du Colombier imageaspectratio = (double) width / (double) height;
7457dd7cddfSDavid du Colombier if (landscape) {
7467dd7cddfSDavid du Colombier paperaspectratio = ((double)paperlength - (ymargin * 2)) / ((double)paperwidth - (xmargin * 2));
7477dd7cddfSDavid du Colombier if (dpi > 0) {
7487dd7cddfSDavid du Colombier iwidth = width * 72 / dpi;
7497dd7cddfSDavid du Colombier iheight = height * 72 / dpi;
7507dd7cddfSDavid du Colombier } else if (imageaspectratio > paperaspectratio) {
7517dd7cddfSDavid du Colombier iwidth = paperlength - (ymargin * 2);
7527dd7cddfSDavid du Colombier iheight = iwidth / imageaspectratio;
7537dd7cddfSDavid du Colombier } else {
7547dd7cddfSDavid du Colombier iheight = paperwidth - (xmargin * 2);
7557dd7cddfSDavid du Colombier iwidth = iheight * imageaspectratio;
7567dd7cddfSDavid du Colombier }
7577dd7cddfSDavid du Colombier xstart = paperwidth - xmargin - (iheight * ymagnification);
7587dd7cddfSDavid du Colombier ystart = paperlength - ymargin;
7597dd7cddfSDavid du Colombier rotation = -90;
7607dd7cddfSDavid du Colombier } else {
7617dd7cddfSDavid du Colombier paperaspectratio = ((double)paperwidth - (xmargin * 2)) / ((double)paperlength - (ymargin * 2));
7627dd7cddfSDavid du Colombier if (dpi > 0) {
7637dd7cddfSDavid du Colombier iwidth = width * 72 / dpi;
7647dd7cddfSDavid du Colombier iheight = height * 72 / dpi;
7657dd7cddfSDavid du Colombier } else if (imageaspectratio > paperaspectratio) {
7667dd7cddfSDavid du Colombier iwidth = paperwidth - (xmargin * 2);
7677dd7cddfSDavid du Colombier iheight = iwidth / imageaspectratio;
7687dd7cddfSDavid du Colombier } else {
7697dd7cddfSDavid du Colombier iheight = paperlength - (ymargin * 2);
7707dd7cddfSDavid du Colombier iwidth = iheight * imageaspectratio;
7717dd7cddfSDavid du Colombier }
7727dd7cddfSDavid du Colombier xstart = xmargin;
7737dd7cddfSDavid du Colombier ystart = paperlength - ymargin - (iheight * ymagnification);
7747dd7cddfSDavid du Colombier rotation = 0;
7757dd7cddfSDavid du Colombier }
7767dd7cddfSDavid du Colombier bbox = Rect(xstart,ystart,xstart+iwidth,ystart+iheight);
7777dd7cddfSDavid du Colombier e = preamble(&ioutb, bbox);
7787dd7cddfSDavid du Colombier if(e != 0)
7797dd7cddfSDavid du Colombier return e;
7807dd7cddfSDavid du Colombier Bprint(&ioutb, "%%%%Page: 1\n%%%%BeginPageSetup\n");
7817dd7cddfSDavid du Colombier Bprint(&ioutb, "/pgsave save def\n");
7827dd7cddfSDavid du Colombier Bprint(&ioutb, "%%%%EndPageSetup\n");
7837dd7cddfSDavid du Colombier bps = im->depth;
7847dd7cddfSDavid du Colombier Bprint(&ioutb, "%d 0 %d %d %d %d %d %d %s doimage\n", iheight, iwidth, ystart, xstart, height, width, bps, im->flags&Fgrey ? "true" : "false");
7857dd7cddfSDavid du Colombier imagebits(&ioutb, im);
7867dd7cddfSDavid du Colombier Bprint(&ioutb, "pgsave restore\nshowpage\n");
7877dd7cddfSDavid du Colombier e = trailer(&ioutb, 1);
7887dd7cddfSDavid du Colombier if(e != 0)
7897dd7cddfSDavid du Colombier return e;
7907dd7cddfSDavid du Colombier Bterm(&ioutb);
7917dd7cddfSDavid du Colombier return 0;
7927dd7cddfSDavid du Colombier }
7937dd7cddfSDavid du Colombier
7947dd7cddfSDavid du Colombier /* set local variables by string and pointer to its value
7957dd7cddfSDavid du Colombier * the variables are:
7967dd7cddfSDavid du Colombier * int magnification
7977dd7cddfSDavid du Colombier * int landscape
7987dd7cddfSDavid du Colombier * char *Patch
7997dd7cddfSDavid du Colombier */
8007dd7cddfSDavid du Colombier void
psopt(char * s,void * val)8017dd7cddfSDavid du Colombier psopt(char *s, void *val)
8027dd7cddfSDavid du Colombier {
8037dd7cddfSDavid du Colombier if(s == nil)
8047dd7cddfSDavid du Colombier return;
8057dd7cddfSDavid du Colombier if(strcmp("xmagnification", s) == 0)
8067dd7cddfSDavid du Colombier xmagnification = *((double *)val);
8077dd7cddfSDavid du Colombier if(strcmp("ymagnification", s) == 0)
8087dd7cddfSDavid du Colombier ymagnification = *((double *)val);
8097dd7cddfSDavid du Colombier if(strcmp("landscape", s) == 0)
8107dd7cddfSDavid du Colombier landscape = *((int *)val);
8117dd7cddfSDavid du Colombier if(strcmp("Patch", s) == 0)
8127dd7cddfSDavid du Colombier Patch = *((char **)val);
8137dd7cddfSDavid du Colombier }
814