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

📄 pslib.c

📁 PSlib是一个用来生成PostScript文件的类库。提供了一个生成PostScript文件的简单方法。
💻 C
📖 第 1 页 / 共 5 页
字号:
	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qsf{currentpoint\n");	ps_printf(psdoc, "currentpoint newpath moveto 3 2 roll dup true charpath gsave stroke grestore fill\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qc{currentpoint\n");	ps_printf(psdoc, "currentpoint newpath moveto 3 2 roll dup true charpath clip\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qsc{currentpoint\n");	ps_printf(psdoc, "currentpoint initclip newpath moveto 3 2 roll dup true charpath clip stroke\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qfc{currentpoint\n");	ps_printf(psdoc, "currentpoint initclip newpath moveto 3 2 roll dup true charpath clip fill\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qfsc{currentpoint\n");	ps_printf(psdoc, "currentpoint initclip newpath moveto 3 2 roll dup true charpath gsave stroke grestore clip fill\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/qi{currentpoint\n");	ps_printf(psdoc, "3 2 roll\n");	ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B");	ps_printf(psdoc, "/tr{currentpoint currentpoint 5 4 roll add moveto}B");	ps_printf(psdoc, "/rt{moveto}B");	ps_printf(psdoc, "/#copies{1}B\n");	ps_printf(psdoc, "/PslibPageBeginHook{pop pop pop pop pop}B\n");	ps_printf(psdoc, "/PslibPageEndHook{pop}B\n");	ps_printf(psdoc, "\n");	ps_printf(psdoc, "/reencdict 12 dict def /ReEncode { reencdict begin\n");	ps_printf(psdoc, "/newcodesandnames exch def /newfontname exch def /basefontname exch def\n");	ps_printf(psdoc, "/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def\n");	ps_printf(psdoc, "basefontdict { exch dup /FID ne { dup /Encoding eq\n");	ps_printf(psdoc, "{ exch dup length array copy newfont 3 1 roll put }\n");	ps_printf(psdoc, "{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall\n");	ps_printf(psdoc, "newfont /FontName newfontname put newcodesandnames aload pop\n");	ps_printf(psdoc, "128 1 255 { newfont /Encoding get exch /.notdef put } for\n");	ps_printf(psdoc, "newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat\n");	ps_printf(psdoc, "newfontname newfont definefont pop end } def\n");	ps_printf(psdoc, "end\n");	ps_printf(psdoc, "%%%%EndProcSet\n");	ps_printf(psdoc, "%%%%BeginProcSet: colorsep\n");	ps_printf(psdoc, "%%!\n");	ps_printf(psdoc, "%% Colour separation.\n");	ps_printf(psdoc, "%% Ask dvips to do 4 pages. In bop-hook, cycle\n");	ps_printf(psdoc, "%% round CMYK color spaces.\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% Sebastian Rahtz 30.9.93\n");	ps_printf(psdoc, "%% checked 7.1.94\n");	ps_printf(psdoc, "%% from Green Book, and Kunkel Graphic Design with PostScript\n");	ps_printf(psdoc, "%% (Green Book Listing 9-5, on page 153.)\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% This work is placed in the public domain\n");	ps_printf(psdoc, "/seppages  0  def \n");	ps_printf(psdoc, "userdict begin\n");	ps_printf(psdoc, "/Min {%% 3 items on stack\n");	ps_printf(psdoc, "2 copy lt { pop }{ exch pop } ifelse\n");	ps_printf(psdoc, "2 copy lt { pop }{ exch pop } ifelse\n");	ps_printf(psdoc, "} def\n");	ps_printf(psdoc, "/SetGray {\n");	ps_printf(psdoc, " 1 exch sub systemdict begin adjustdot setgray end	\n");	ps_printf(psdoc, "} def\n");	ps_printf(psdoc, "/sethsbcolor {systemdict begin\n");	ps_printf(psdoc, "  sethsbcolor currentrgbcolor end\n");	ps_printf(psdoc, "  userdict begin setrgbcolor end}def \n");	ps_printf(psdoc, "\n");	ps_printf(psdoc, "/ToCMYK\n");	ps_printf(psdoc, "%% Red book p 305\n");	ps_printf(psdoc, "  {\n");	ps_printf(psdoc, "%% subtract each colour from 1\n");	ps_printf(psdoc, "  3 { 1 exch sub 3 1 roll } repeat\n");	ps_printf(psdoc, "%% define percent of black undercolor\n");	ps_printf(psdoc, "%% find minimum (k)\n");	ps_printf(psdoc, "  3 copy  Min \n");	ps_printf(psdoc, "%% remove undercolor\n");	ps_printf(psdoc, "  blackUCR sub\n");	ps_printf(psdoc, "  dup 0 lt {pop 0} if \n");	ps_printf(psdoc, "  /percent_UCR exch def \n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% subtract that from each colour\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "  3 { percent_UCR sub 3 1 roll } repeat \n");	ps_printf(psdoc, "%% work out black itself\n");	ps_printf(psdoc, "  percent_UCR 1.25 mul %% 1 exch sub\n");	ps_printf(psdoc, "%% stack should now have C M Y K\n");	ps_printf(psdoc, "} def \n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% crop marks\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "/cX 18 def \n");	ps_printf(psdoc, "/CM{gsave TR 0 cX neg moveto 0 cX lineto stroke\n");	ps_printf(psdoc, "cX neg 0 moveto cX 0 lineto stroke grestore}def \n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "/bop-hook{cX dup TR\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% which page are we producing\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "   seppages 1 add \n");	ps_printf(psdoc, "    /seppages exch def\n");	ps_printf(psdoc, "     seppages 5 eq { /seppages  1  def } if\n");	ps_printf(psdoc, "     seppages 1 eq { \n");	ps_printf(psdoc, "      /ColourName (CYAN) def \n");	ps_printf(psdoc, "      CYAN setupcolor    \n");	ps_printf(psdoc, "      /WhichColour 3 def } if \n");	ps_printf(psdoc, "   seppages 2 eq { \n");	ps_printf(psdoc, "      /ColourName (MAGENTA) def \n");	ps_printf(psdoc, "      MAGENTA setupcolor \n");	ps_printf(psdoc, "     /WhichColour 2 def } if\n");	ps_printf(psdoc, "   seppages 3 eq { \n");	ps_printf(psdoc, "      /ColourName (YELLOW) def\n");	ps_printf(psdoc, "      YELLOW setupcolor  \n");	ps_printf(psdoc, "      /WhichColour 1 def } if \n");	ps_printf(psdoc, "   seppages 4 eq { \n");	ps_printf(psdoc, "      /ColourName (BLACK) def \n");	ps_printf(psdoc, "      BLACK setupcolor   \n");	ps_printf(psdoc, "      /WhichColour 0 def } if \n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% crop marks\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "gsave .3 setlinewidth \n");	ps_printf(psdoc, "3 -7 moveto\n");	ps_printf(psdoc, "/Helvetica findfont 6 scalefont setfont\n");	ps_printf(psdoc, "ColourName show\n");	ps_printf(psdoc, "0 0 CM \n");	ps_printf(psdoc, "vsize cX 2 mul sub dup hsize cX 2 mul sub dup isls{4 2 roll}if 0 CM \n");	ps_printf(psdoc, "exch CM 0 \n");	ps_printf(psdoc, "exch CM \n");	ps_printf(psdoc, "grestore 0 cX -2 mul TR isls\n");	ps_printf(psdoc, "{cX -2 mul 0 TR}if\n");	ps_printf(psdoc, "	  } def end\n");	ps_printf(psdoc, "%% \n");	ps_printf(psdoc, "/separations 48 dict def\n");	ps_printf(psdoc, "separations begin\n");	ps_printf(psdoc, "   /cmykprocs [ %%def\n");	ps_printf(psdoc, "       %% cyan\n");	ps_printf(psdoc, "    { pop pop  pop SetGray  }\n");	ps_printf(psdoc, "       %% magenta\n");	ps_printf(psdoc, "    { pop pop exch pop SetGray  }\n");	ps_printf(psdoc, "       %% yellow\n");	ps_printf(psdoc, "    { pop 3 1 roll pop pop SetGray  }\n");	ps_printf(psdoc, "       %% black\n");	ps_printf(psdoc, "    { 4 1 roll pop pop pop SetGray  }\n");	ps_printf(psdoc, "   ] def\n");	ps_printf(psdoc, "   /rgbprocs [ %%def\n");	ps_printf(psdoc, "       %% cyan\n");	ps_printf(psdoc, "    { ToCMYK pop pop pop SetGray }\n");	ps_printf(psdoc, "       %% magenta\n");	ps_printf(psdoc, "    { ToCMYK pop pop exch pop SetGray }\n");	ps_printf(psdoc, "       %% yellow\n");	ps_printf(psdoc, "    { ToCMYK pop 3 1 roll pop pop SetGray }\n");	ps_printf(psdoc, "       %% black\n");	ps_printf(psdoc, "    { ToCMYK 4 1 roll pop pop pop SetGray  }\n");	ps_printf(psdoc, "   ] def\n");	ps_printf(psdoc, "   /testprocs [ %%def\n");	ps_printf(psdoc, "       %% cyan\n");	ps_printf(psdoc, "    { ToCMYK pop pop pop  }\n");	ps_printf(psdoc, "       %% magenta\n");	ps_printf(psdoc, "    { ToCMYK pop pop exch pop  }\n");	ps_printf(psdoc, "       %% yellow\n");	ps_printf(psdoc, "    { ToCMYK pop 3 1 roll pop pop  }\n");	ps_printf(psdoc, "       %% black\n");	ps_printf(psdoc, "    { ToCMYK 4 1 roll pop pop pop   }\n");	ps_printf(psdoc, "   ] def\n");	ps_printf(psdoc, "   /screenangles [ %%def\n");	ps_printf(psdoc, "       105  %% cyan\n");	ps_printf(psdoc, "       75    %% magenta\n");	ps_printf(psdoc, "       0      %% yellow\n");	ps_printf(psdoc, "       45    %% black\n");	ps_printf(psdoc, "   ] def\n");	ps_printf(psdoc, "end  %% separations\n");	ps_printf(psdoc, "\n");	ps_printf(psdoc, "%% setupcolortakes 0, 1, 2, or 3 as its argument,\n");	ps_printf(psdoc, "%% for cyan, magenta, yellow, and black.\n");	ps_printf(psdoc, "/CYAN 0 def           /MAGENTA 1 def\n");	ps_printf(psdoc, "/YELLOW 2 def         /BLACK 3 def\n");	ps_printf(psdoc, "/setupcolor{ %%def\n");	ps_printf(psdoc, "   userdict begin\n");	ps_printf(psdoc, "       dup separations /cmykprocs get exch get\n");	ps_printf(psdoc, "       /setcmykcolor exch def\n");	ps_printf(psdoc, "       dup separations /rgbprocs get exch get\n");	ps_printf(psdoc, "       /setrgbcolor exch def\n");	ps_printf(psdoc, "       dup separations /testprocs get exch get\n");	ps_printf(psdoc, "       /testrgbcolor exch def\n");	ps_printf(psdoc, "       separations /screenangles get exch get\n");	ps_printf(psdoc, "       currentscreen\n");	ps_printf(psdoc, "           exch pop 3 -1 roll exch\n");	ps_printf(psdoc, "       setscreen\n");	ps_printf(psdoc, "       /setscreen { pop pop pop } def\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% redefine setgray so that it only shows on the black separation\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "      /setgray {\n");	ps_printf(psdoc, "       WhichColour 0 eq\n");	ps_printf(psdoc, "       {systemdict begin adjustdot setgray end} \n");	ps_printf(psdoc, "       {pop systemdict begin 1 setgray end}\n");	ps_printf(psdoc, "       ifelse}def \n");	ps_printf(psdoc, "   end\n");	ps_printf(psdoc, "} bind def\n");	ps_printf(psdoc, "\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% from Kunkel\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "/adjustdot { dup 0 eq { } { dup 1 exch sub .1 mul add} ifelse } def\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% redefine existing operators\n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% Percent of undercolor removal\n");	ps_printf(psdoc, "/magentaUCR .3 def  \n");	ps_printf(psdoc, "/yellowUCR .07 def  \n");	ps_printf(psdoc, "/blackUCR .4 def \n");	ps_printf(psdoc, "%%\n");	ps_printf(psdoc, "%% Correct yellow and magenta\n");	ps_printf(psdoc, "/correctMY {rgb2cym\n");	ps_printf(psdoc, "  1 index yellowUCR mul sub 3 1 roll\n");	ps_printf(psdoc, "  1 index magentaUCR mul sub 3 1 roll\n");	ps_printf(psdoc, "  3 1 roll rgb2cym}def\n");	ps_printf(psdoc, "%% \n");	ps_printf(psdoc, "%%(bluely green ) =\n");	ps_printf(psdoc, "%%CYAN setupcolor\n");	ps_printf(psdoc, "%%.1 .4 .5  testrgbcolor =\n");	ps_printf(psdoc, "%%MAGENTA setupcolor\n");	ps_printf(psdoc, "%%.1 .4 .5  testrgbcolor =\n");	ps_printf(psdoc, "%%YELLOW setupcolor\n");	ps_printf(psdoc, "%%.1 .4 .5  testrgbcolor =\n");	ps_printf(psdoc, "%%BLACK setupcolor\n");	ps_printf(psdoc, "%%.1 .4 .5  testrgbcolor =\n");	ps_printf(psdoc, "%%quit\n");	ps_printf(psdoc, "%%%%EndProcSet\n");	/* The fontenc vector is placed outside the PslibDict dictionary */	{	int i, j;	ENCODING *fontenc;	fontenc = &fontencoding[0];	ps_printf(psdoc, "/fontenc-%s [\n", fontenc->name);	for(i=0; i<32; i++) {		for(j=0; j<8; j++) {			if((fontenc->vec[i*8+j] != NULL) && (*(fontenc->vec[i*8+j]) != '\0'))				ps_printf(psdoc, "8#%03o /%s ", i*8+j, fontenc->vec[i*8+j]);		}		ps_printf(psdoc, "\n");	}	ps_printf(psdoc, "] def\n");	}	ps_printf(psdoc, "/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse\n");	if(psdoc->Creator)		ps_printf(psdoc, "[ /Creator (%s \\(%s\\))\n", psdoc->Creator, "pslib " LIBPS_DOTTED_VERSION);	else		ps_printf(psdoc, "[ /Creator (%s)\n", "pslib " LIBPS_DOTTED_VERSION);	if(psdoc->CreationDate) {		ps_printf(psdoc, "  /Creation-Date (%s)\n", psdoc->CreationDate);	}	if(psdoc->Title)		ps_printf(psdoc, "  /Title (%s)\n", psdoc->Title);	if(psdoc->Author)		ps_printf(psdoc, "  /Author (%s)\n", psdoc->Author);	if(psdoc->Keywords)		ps_printf(psdoc, "  /Keywords (%s)\n", psdoc->Keywords);	if(psdoc->Subject)		ps_printf(psdoc, "  /Subject (%s)\n", psdoc->Subject);	ps_printf(psdoc, "/DOCINFO pdfmark\n");	psdoc->beginprologwritten = ps_true;}/* }}} *//* ps_write_ps_endprolog() {{{ */static void ps_write_ps_endprolog(PSDoc *psdoc) {	ps_printf(psdoc, "%%%%EndProlog\n");	ps_leave_scope(psdoc, PS_SCOPE_PROLOG);	psdoc->endprologwritten = ps_true;}/* }}} *//* ps_write_ps_setup() {{{ */static void ps_write_ps_setup(PSDoc *psdoc) {	ps_printf(psdoc, "%%%%BeginSetup\n");	ps_printf(psdoc, "PslibDict begin\n");	if(psdoc->copies > 1)		ps_printf(psdoc, "/#copies %d def\n", psdoc->copies);	ps_printf(psdoc, "%%%%EndSetup\n");	psdoc->setupwritten = ps_true;}/* }}} *//* ps_write_ps_header() {{{ * Write the PostScript header */static void ps_write_ps_header(PSDoc *psdoc) {	if(psdoc->headerwritten == ps_true)		return;	if(psdoc->commentswritten == ps_false)		ps_write_ps_comments(psdoc);	if(psdoc->beginprologwritten == ps_false)		ps_write_ps_beginprolog(psdoc);	if(psdoc->endprologwritten == ps_false)		ps_write_ps_endprolog(psdoc);	if(psdoc->setupwritten == ps_false)		ps_write_ps_setup(psdoc);	psdoc->headerwritten = ps_true;}/* }}} *//* ps_setcolor() {{{ * Outputs PostScript commands to set the color, but checks before * if it was already set. whichcolor is either PS_COLORTYPE_FILL * or PS_COLORTYPE_STROKE. The function only outputs something if * [fill|stroke]colorinvalid is set. [fill|stroke]colorinvalid is set * when the color is set by PS_setcolor() or this function has set * the fill or stroke color. */static void ps_setcolor(PSDoc *psdoc, int whichcolor) {	PSColor *currentcolor = NULL;	if(ps_check_scope(psdoc, PS_SCOPE_PATTERN)) {		if(psdoc->pattern->painttype = 2) {			ps_error(psdoc, PS_Warning, _("Setting color inside a pattern of PaintType 2 is not allowed."), __FUNCTION__);			return;		}	}	switch(whichcolor) {		case PS_COLORTYPE_FILL:			if(psdoc->agstates[psdoc->agstate].fillcolorinvalid) {				psdoc->agstates[psdoc->agstate].strokecolorinvalid = ps_true;				psdoc->agstates[psdoc->agstate].fillcolorinvalid = ps_false;				currentcolor = &(psdoc->agstates[psdoc->agstate].fillcolor);			}			break;		case PS_COLORTYPE_STROKE:			if(psdoc->agstates[psdoc->agstate].strokecolorinvalid) {				psdoc->agstates[psdoc->agstate].fillcolorinvalid = ps_true;				psdoc->agstates[psdoc->agstate].strokecolorinvalid = ps_false;				currentcolor = &(psdoc->agstates[psdoc->agstate].strokecolor);			}			break;	}	if(currentcolor) {		switch(currentcolor->colorspace) {			case PS_COLORSPACE_GRAY:				ps_printf(psdoc, "%f setgray\n", currentcolor->c1);				break;			case PS_COLORSPACE_RGB:				ps_printf(psdoc, "%.4f %.4f %.4f setrgbcolor\n", currentcolor->c1, currentcolor->c2, currentcolor->c3);				break;			case PS_COLORSPACE_CMYK:				ps_printf(psdoc, "%.4f %.4f %.4f %.4f setcmykcolor\n", currentcolor->c1, currentcolor->c2, currentcolor->c3, currentcolor->c4);				break;			case PS_COLORSPACE_PATTERN: {				PSPattern *pspattern = _ps_get_pattern(psdoc, (int) currentcolor->pattern);				if(NULL == pspattern) {					ps_error(psdoc, PS_RuntimeError, _("PSPattern is null."));					return;				}				if(pspattern->painttype == 1) {					ps_printf(psdoc, "%s setpattern\n", pspattern->name);				} else {					ps_printf(psdoc, "[/Pattern [/");					switch(currentcolor->prevcolorspace) {						case PS_COLORSPACE_GRAY:							ps_printf(psdoc, "DeviceGray]] setcolorspace\n");							ps_printf(psdoc, "%.4f %s setcolor\n", currentcolor->c1, pspattern->name);							break;						case PS_COLORSPACE_CMYK:							ps_printf(psdoc, "DeviceCMYK]] setcolorspace\n");							ps_printf(psdoc, "%.4f %.4f %.4f %.4f %s setcolor\n", currentcolor->c1, currentcolor->c2, currentcolor->c3, currentcolor->c4, pspattern->name);							break;						case PS_COLORSPACE_RGB:							ps_printf(psdoc, "DeviceRGB]] setcolorspace\n");							ps_printf(psdoc, "%.4f %.4f %.4f %s setcolor\n", currentcolor->c1, currentcolor->c2, currentcolor->c3, pspattern->name);							break;						case PS_COLORSPACE_SPOT: {							PSSpotColor *spotcolor;							spotcolor = _ps_get_spotcolor(psdoc, (int) currentcolor->c1);							if(!spotcolor) {								ps_error(psdoc, PS_RuntimeError, _("Could not find spot color."));								return;							}							ps_printf(psdoc, "Separation (%s)\n", spotcolor->name);							switch(spotcolor->colorspace) {								case PS_COLORSPACE_GRAY:									ps_printf(psdoc, "  /DeviceGray { 1 %f sub mul 1 exch sub }\n", spotcolor->c1);									break;								case PS_COLORSPACE_RGB: {									float max;									max = (spotcolor->c1 > spotcolor->c2) ? spotcolor->c1 : spotcolor->c2;									max = (max > spotcolor->c3) ? max : spotcolor->c3;									ps_printf(psdoc, "  /DeviceRGB { 1 exch sub dup dup %f exch sub %f mul add exch dup dup %f exch sub %f mul add exch dup %f exch sub %f mul add }\n", max, spotcolor->c1, max, spotcolor->c2, max, spotcolor->c3);									break;								}								case PS_COLORSPACE_CMYK:										ps_printf(psdoc, "  /DeviceCMYK { dup %f mul exch dup %f mul exch dup %f mul exch %f mul }\n", spotcolor->c1, spotcolor->c2, spotcolor->c3, spotcolor->c4);									break;							}							ps_printf(psdoc, "]] setcolorspace\n");							break;						}						default:							ps_error(psdoc, PS_Warning, _("Current stroke/fill color is not RGB, CMYK, Gray or spot while setting a pattern of paint type 1."));					}				}				break;			}			case PS_COLORSPACE_SPOT: {				PSSpotColor *spotcolor;				spotcolor = _ps_get_spotcolor(psdoc, (int) currentcolor->c1);				if(!spotcolor) {					ps_error(psdoc, PS_RuntimeError, _("Could not find spot color."));					return;				}

⌨️ 快捷键说明

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