📄 pslib.c
字号:
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 + -