⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pslib.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <memdraw.h>#include <bio.h>#include "pslib.h"/* implement PsLib;/* /* include "sys.m";/* 	sys: Sys;/* /* include "draw.m";/* 	draw : Draw;/* Image, Display,Rect,Point : import draw;/* /* include "bufio.m";/* 	bufmod : Bufio;/* /* include "tk.m";/* 	tk: Tk;/* 	Toplevel: import tk;/* /* Iobuf : import bufmod;/* /* include "string.m";/* 	str : String;/* /* include "daytime.m";/* 	time : Daytime;/* /* include "pslib.m";/* /* ASCII,RUNE,IMAGE : con iota;/* */struct iteminfo {	int itype;	int offset;		/* offset from the start of line. */	int width;		/* width.... */	int ascent;		/* ascent of the item */	int font;		/* font */	int line;		/* line its on */	char *buf;	};struct lineinfo {	int xorg;	int yorg;	int width;	int height;	int ascent;};/* font_arr := array[256] of {* => (-1,"")};/* remap := array[20] of (string,string);/* /* PXPI : con 100;/* PTPI : con 100;/* */char *noinit = "pslib not properly initialized";/* */static int boxes;static int debug;static int totitems;static int totlines;static int curfont;static char *def_font;static int def_font_type;static int curfonttype;static int pagestart;static int started;static int bps;static int width;static int height;static int iwidth;static int iheight;static int xstart;static int ystart;static double xmagnification = 1.0, ymagnification = 1.0;static int rotation = 0;static int landscape = 0;static char *Patch = nil;/* ctxt 		: ref Draw->Context;/* t 		: ref Toplevel;*/char*psinit(int box, int deb) { /* d: ref Toplevel, *//* 	t=d; */	debug = deb;	totlines=0;	totitems=0;	pagestart=0;	boxes=box; /* #box; */	curfont=0;/* 	e := loadfonts();/* 	if (e != "")/* 		return e;*/	started=1;	return "";}/* stats() : (int,int,int)/* {/* 	return 	(totitems,totlines,curfont);/* }/* /* loadfonts() : string/* {/* 	input : string;/* 	iob:=bufmod->open("/fonts/psrename",bufmod->OREAD);/* 	if (iob==nil)/* 		return sys->sprint("can't open /fonts/psrename: %r");/* 	i:=0;/* 	while((input=iob.gets('\n'))!=nil){/* 		(tkfont,psfont):=str->splitl(input," ");/* 		psfont=psfont[1:len psfont -1];/* 		remap[i]=(tkfont,psfont);/* 		i++;/* 	}/* 	return "";/* }/* */static char *username;intpreamble(Biobuf *ioutb, Rectangle bb) {	if (!started) return 1;	username = getuser();	if(bb.max.x == 0 && bb.max.y == 0) {		bb.max.x = 612;		bb.max.y = 792;	}	Bprint(ioutb, "%%!PS-Adobe-3.0\n");	Bprint(ioutb, "%%%%Creator: PsLib 1.0 (%s)\n",username);	Bprint(ioutb, "%%%%CreationDate: %s", ctime(time(nil)));	Bprint(ioutb, "%%%%Pages: (atend) \n");	Bprint(ioutb, "%%%%BoundingBox: %d %d %d %d\n", bb.min.x, bb.min.y, bb.max.x, bb.max.y);	Bprint(ioutb, "%%%%EndComments\n");	Bprint(ioutb, "%%%%BeginProlog\n");	Bprint(ioutb, "/doimage {\n");	Bprint(ioutb, "/grey exch def\n");	Bprint(ioutb, "/bps exch def\n");	Bprint(ioutb, "/width exch def\n");	Bprint(ioutb, "/height exch def\n");	Bprint(ioutb, "/xstart exch def\n");	Bprint(ioutb, "/ystart exch def\n");	Bprint(ioutb, "/iwidth exch def\n");	Bprint(ioutb, "/ascent exch def\n");	Bprint(ioutb, "/iheight exch def\n");	Bprint(ioutb, "gsave\n");	if(boxes)		Bprint(ioutb, "xstart ystart iwidth iheight rectstroke\n");/*	# if bps==8, use inferno colormap; else (bps < 8) it's grayscale or true color */	Bprint(ioutb, "bps 8 eq grey false eq and {\n");	Bprint(ioutb, " [/Indexed /DeviceRGB 255 <\n");	Bprint(ioutb, "  ffffff ffffaa ffff55 ffff00 ffaaff ffaaaa ffaa55 ffaa00 ff55ff ff55aa ff5555 ff5500\n");	Bprint(ioutb, "  ff00ff ff00aa ff0055 ff0000 ee0000 eeeeee eeee9e eeee4f eeee00 ee9eee ee9e9e ee9e4f\n");	Bprint(ioutb, "  ee9e00 ee4fee ee4f9e ee4f4f ee4f00 ee00ee ee009e ee004f dd0049 dd0000 dddddd dddd93\n");	Bprint(ioutb, "  dddd49 dddd00 dd93dd dd9393 dd9349 dd9300 dd49dd dd4993 dd4949 dd4900 dd00dd dd0093\n");	Bprint(ioutb, "  cc0088 cc0044 cc0000 cccccc cccc88 cccc44 cccc00 cc88cc cc8888 cc8844 cc8800 cc44cc\n");	Bprint(ioutb, "  cc4488 cc4444 cc4400 cc00cc aaffaa aaff55 aaff00 aaaaff bbbbbb bbbb5d bbbb00 aa55ff\n");	Bprint(ioutb, "  bb5dbb bb5d5d bb5d00 aa00ff bb00bb bb005d bb0000 aaffff 9eeeee 9eee9e 9eee4f 9eee00\n");	Bprint(ioutb, "  9e9eee aaaaaa aaaa55 aaaa00 9e4fee aa55aa aa5555 aa5500 9e00ee aa00aa aa0055 aa0000\n");	Bprint(ioutb, "  990000 93dddd 93dd93 93dd49 93dd00 9393dd 999999 99994c 999900 9349dd 994c99 994c4c\n");	Bprint(ioutb, "  994c00 9300dd 990099 99004c 880044 880000 88cccc 88cc88 88cc44 88cc00 8888cc 888888\n");	Bprint(ioutb, "  888844 888800 8844cc 884488 884444 884400 8800cc 880088 55ff55 55ff00 55aaff 5dbbbb\n");	Bprint(ioutb, "  5dbb5d 5dbb00 5555ff 5d5dbb 777777 777700 5500ff 5d00bb 770077 770000 55ffff 55ffaa\n");	Bprint(ioutb, "  4fee9e 4fee4f 4fee00 4f9eee 55aaaa 55aa55 55aa00 4f4fee 5555aa 666666 666600 4f00ee\n");	Bprint(ioutb, "  5500aa 660066 660000 4feeee 49dddd 49dd93 49dd49 49dd00 4993dd 4c9999 4c994c 4c9900\n");	Bprint(ioutb, "  4949dd 4c4c99 555555 555500 4900dd 4c0099 550055 550000 440000 44cccc 44cc88 44cc44\n");	Bprint(ioutb, "  44cc00 4488cc 448888 448844 448800 4444cc 444488 444444 444400 4400cc 440088 440044\n");	Bprint(ioutb, "  00ff00 00aaff 00bbbb 00bb5d 00bb00 0055ff 005dbb 007777 007700 0000ff 0000bb 000077\n");	Bprint(ioutb, "  333333 00ffff 00ffaa 00ff55 00ee4f 00ee00 009eee 00aaaa 00aa55 00aa00 004fee 0055aa\n");	Bprint(ioutb, "  006666 006600 0000ee 0000aa 000066 222222 00eeee 00ee9e 00dd93 00dd49 00dd00 0093dd\n");	Bprint(ioutb, "  009999 00994c 009900 0049dd 004c99 005555 005500 0000dd 000099 000055 111111 00dddd\n");	Bprint(ioutb, "  00cccc 00cc88 00cc44 00cc00 0088cc 008888 008844 008800 0044cc 004488 004444 004400\n");	Bprint(ioutb, "  0000cc 000088 000044 000000>\n");	Bprint(ioutb, " ] setcolorspace\n");	Bprint(ioutb, " /decodemat [0 255] def\n");	Bprint(ioutb, "}\n");/*	# else, bps != 8 */	Bprint(ioutb, "{\n");/* is it greyscale or is it 24-bit color? */	Bprint(ioutb, " grey true eq {\n");	Bprint(ioutb, "  [/DeviceGray] setcolorspace\n");	Bprint(ioutb, "  /decodemat [1 0] def\n");	Bprint(ioutb, " }\n");	Bprint(ioutb, " {\n");/* must be color */	Bprint(ioutb, "  [/DeviceRGB] setcolorspace\n");	Bprint(ioutb, "  /bps 8 def\n");	Bprint(ioutb, "  /decodemat [1 0 1 0 1 0] def\n");	Bprint(ioutb, " }\n");	Bprint(ioutb, " ifelse\n");	Bprint(ioutb, "}\n");	Bprint(ioutb, "ifelse\n");	Bprint(ioutb, "/xmagnification %g def\n", xmagnification);	Bprint(ioutb, "/ymagnification %g def\n", ymagnification);	Bprint(ioutb, "/rotation %d def\n", rotation);	Bprint(ioutb, "xstart ystart translate rotation rotate\n");	Bprint(ioutb, "iwidth xmagnification mul iheight ymagnification mul scale\n");	Bprint(ioutb, "<<\n");	Bprint(ioutb, " /ImageType 1\n");	Bprint(ioutb, " /Width width \n");	Bprint(ioutb, " /Height height \n");	Bprint(ioutb, " /BitsPerComponent bps %% bits/sample\n");	Bprint(ioutb, " /Decode decodemat %% Brazil/Inferno cmap or DeviceGray value\n");	Bprint(ioutb, " /ImageMatrix [width 0 0 height neg 0 height]\n");	Bprint(ioutb, " /DataSource currentfile /ASCII85Decode filter\n");	Bprint(ioutb, ">> \n");	Bprint(ioutb, "image\n");	Bprint(ioutb, "grestore\n");	Bprint(ioutb, "} def\n");	Bprint(ioutb, "%%%%EndProlog\n");	if (Patch != nil)		Bprint(ioutb, "%s\n", Patch);	return 0;	}inttrailer(Biobuf *ioutb ,int pages) {	if(!started)		return 1;	Bprint(ioutb, "%%%%Trailer\n%%%%Pages: %d\n%%%%EOF\n", pages);	return 0;}voidprintnewpage(int pagenum, int end, Biobuf *ioutb){	if (!started) return;	if (end){			/*		# bounding box */		if (boxes){			Bprint(ioutb, "18 18 moveto 594 18 lineto 594 774 lineto 18 774 lineto closepath stroke\n");		}		Bprint(ioutb, "showpage\n%%%%EndPage %d %d\n", pagenum, pagenum);	} else 		Bprint(ioutb, "%%%%Page: %d %d\n", pagenum, pagenum);}/* int/* printimage(FILE *ioutb, struct lineinfo line, struct iteminfo imag) {/* 	int RM;/* /* 	RM=612-18;/* 	class:=tk->cmd(t,"winfo class "+imag.buf);/* #sys->print("Looking for [%s] of type [%s]\n",imag.buf,class);/* 	if (line.xorg+imag.offset+imag.width>RM)/* 		imag.width=RM-line.xorg-imag.offset;/* 	case class {/* 		"button" or "menubutton" =>/* 			# try to get the text out and print it..../* 			ioutb.puts(sys->sprint("%d %d moveto\n",line.xorg+imag.offset,/* 							line.yorg));/* 			msg:=tk->cmd(t,sys->sprint("%s cget -text",imag.buf));/* 			ft:=tk->cmd(t,sys->sprint("%s cget -font",imag.buf));/* 			sys->print("font is [%s]\n",ft);/* 			ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",/* 						line.xorg+imag.offset,line.yorg,imag.width,/* 						line.height));/* 			return (class,msg);/* 		"label" =>/* 			(im,im2,err) := tk->imageget(t,imag.buf);/* 			if (im!=nil){/* 				bps := 1<<im.ldepth;/* 				ioutb.puts(sys->sprint("%d %d %d %d %d %d %d %d doimage\n",/* 						im.r.dy(),line.ascent,im.r.dx(),line.yorg,/* 						line.xorg+imag.offset,im.r.dy(), im.r.dx(), bps));/* 				imagebits(ioutb,im);/* 			}/* 			return (class,"");/* 		"entry" =>/* 			ioutb.puts(sys->sprint("%d %d moveto\n",line.xorg+imag.offset,/* 					line.yorg));/* 			ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",/* 					line.xorg+imag.offset,line.yorg,imag.width,/* 					line.height));/* 			return (class,"");/* 		* =>/* 			sys->print("Unhandled class [%s]\n",class);/* 			return (class,"Error");/* 		/* 	}/* 	return ("","");	/* }/* /* printline(ioutb: ref Iobuf,line : lineinfo,items : array of iteminfo)/* {/* 	xstart:=line.xorg;/* 	wid:=xstart;/* 	# items/* 	if (len items == 0) return;/* 	for(j:=0;j<len items;j++){/* 		msg:="";/* 		class:="";/* 		if (items[j].itype==IMAGE)/* 			(class,msg)=printimage(ioutb,line,items[j]);/* 		if (items[j].itype!=IMAGE || class=="button"|| class=="menubutton"){/* 			setfont(ioutb,items[j].font);/* 			if (msg!=""){ /* 				# position the text in the center of the label/* 				# moveto curpoint/* 				# (msg) stringwidth pop xstart sub 2 div/* 				ioutb.puts(sys->sprint("%d %d moveto\n",xstart+items[j].offset,/* 						line.yorg+line.height-line.ascent));/* 				ioutb.puts(sys->sprint("(%s) dup stringwidth pop 2 div",/* 								msg));/* 				ioutb.puts(" 0 rmoveto show\n");/* 			}/* 			else {/* 				ioutb.puts(sys->sprint("%d %d moveto\n",/* 					xstart+items[j].offset,line.yorg+line.height/* 					-line.ascent));/* 				ioutb.puts(sys->sprint("(%s) show\n",items[j].buf));/* 			}/* 		}/* 		wid=xstart+items[j].offset+items[j].width;/* 	}/* 	if (boxes)/* 		ioutb.puts(sys->sprint("%d %d %d %d rectstroke\n",line.xorg,line.yorg,/* 									wid,line.height));/* }/* /* setfont(ioutb: ref Iobuf,font : int){/* 	ftype : int;/* 	fname : string;/* 	if ((curfonttype&font)!=curfonttype){/* 		for(f:=0;f<curfont;f++){/* 			(ftype,fname)=font_arr[f];/* 				if ((ftype&font)==ftype)/* 					break;/* 		}/* 		if (f==curfont){/* 			fname=def_font;/* 			ftype=def_font_type;/* 		}/* 		ioutb.puts(sys->sprint("%s setfont\n",fname));/* 		curfonttype=ftype;/* 	}/* }/* 	/* parseTkline(ioutb: ref Iobuf,input : string) : string/* {/* 	if (!started) return noinit;/* 	thisline : lineinfo;/* 	PS:=792-18-18;	# page size in points	/* 	TM:=792-18;	# top margin in points/* 	LM:=18;		# left margin 1/4 in. in/* 	BM:=18;		# bottom margin 1/4 in. in/* 	x : int;/* 	(x,input)=str->toint(input,10);/* 	thisline.xorg=(x*PTPI)/PXPI;/* 	(x,input)=str->toint(input,10);/* 	thisline.yorg=(x*PTPI)/PXPI;/* 	(x,input)=str->toint(input,10);/* 	thisline.width=(x*PTPI)/PXPI;/* 	(x,input)=str->toint(input,10);/* 	thisline.height=(x*PTPI)/PXPI;/* 	(x,input)=str->toint(input,10);/* 	thisline.ascent=(x*PTPI)/PXPI;/* 	(x,input)=str->toint(input,10);/* 	# thisline.numitems=x;/* 	if (thisline.width==0 || thisline.height==0)/* 		return "";/* 	if (thisline.yorg+thisline.height-pagestart>PS){/* 		pagestart=thisline.yorg;/* 		return "newpage";/* 		# must resend this line..../* 	}/* 	thisline.yorg=TM-thisline.yorg-thisline.height+pagestart;/* 	thisline.xorg+=LM;/* 	(items, err) :=getline(totlines,input);/* 	if(err != nil)/* 		return err;/* 	totitems+=len items;/* 	totlines++;/* 	printline(ioutb,thisline,items);/* 	return "";/* }/* 	/* /* getfonts(input: string) : string/* {/* 	if (!started) return "Error";/* 	tkfont,psfont : string;/* 	j : int;/* 	retval := "";/* 	if (input[0]=='%')/* 			return "";/* 	# get a line of the form /* 	# 5::/fonts/lucida/moo.16.font/* 	# translate it to.../* 	# 32 f32.16/* 	# where 32==1<<5 and f32.16 is a postscript function that loads the /* 	# appropriate postscript font (from remap)/* 	# and writes it to fonts..../* 	(bits,font):=str->toint(input,10);/* 	if (bits!=-1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -