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* 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 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 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 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 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 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 } 668*6a9fc400SDavid 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); 6917dd7cddfSDavid du Colombier Bprint(ioutb, "%s", 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, "!!!!!"); 7087dd7cddfSDavid du Colombier Bprint(ioutb, "%.*s", nrest+1, 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 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; 735*6a9fc400SDavid 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 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