texlive[45479] Master/tlpkg/tlgs: tlgs: typo etc.

commits+kakuto at tug.org commits+kakuto at tug.org
Fri Oct 6 00:46:10 CEST 2017


Revision: 45479
          http://tug.org/svn/texlive?view=revision&revision=45479
Author:   kakuto
Date:     2017-10-06 00:46:10 +0200 (Fri, 06 Oct 2017)
Log Message:
-----------
tlgs: typo etc.

Modified Paths:
--------------
    trunk/Master/tlpkg/tlgs/README.TEXLIVE
    trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps

Added Paths:
-----------
    trunk/Master/tlpkg/tlgs/lib/cat.ps
    trunk/Master/tlpkg/tlgs/lib/font2pcl.ps
    trunk/Master/tlpkg/tlgs/lib/jobseparator.ps
    trunk/Master/tlpkg/tlgs/lib/stcinfo.ps
    trunk/Master/tlpkg/tlgs/lib/stcolor.ps

Modified: trunk/Master/tlpkg/tlgs/README.TEXLIVE
===================================================================
--- trunk/Master/tlpkg/tlgs/README.TEXLIVE	2017-10-05 22:22:24 UTC (rev 45478)
+++ trunk/Master/tlpkg/tlgs/README.TEXLIVE	2017-10-05 22:46:10 UTC (rev 45479)
@@ -22,7 +22,7 @@
  * A cidfmap file supporting CJK fonts provided by Windows XP and
    newer releases as well as the Japanese IPA fonts was added.
 
- * kanji directory copied from w23tex.
+ * kanji directory copied from w32tex.
 
  * Binaries compiled by Akira Kakuto with --disable-compile-inits.
 

Modified: trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps	2017-10-05 22:22:24 UTC (rev 45478)
+++ trunk/Master/tlpkg/tlgs/Resource/Init/gs_init.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -29,7 +29,7 @@
 % Interpreter library version number
 % NOTE: the interpreter code requires that the first non-comment token
 % in this file be an integer, and that it match the compiled-in version!
-921
+922
 
 % Check the interpreter revision.
 dup revision ne
@@ -137,8 +137,9 @@
 
 currentdict /BATCH known   /BATCH exch def
 currentdict /DELAYBIND known   /DELAYBIND exch def
+currentdict /REALLYDELAYBIND known {/REALLYDELAYBIND true def /DELAYBIND true def}{/REALLYDELAYBIND false def}ifelse
 currentdict /DISKFONTS known   /DISKFONTS exch def
-currentdict /DOINTERPOLATE .knownget { /INTERPOLATE exch def } if
+currentdict /DOINTERPOLATE .knownget { { -1 } { 0 } ifelse /InterpolateControl exch def } if
 currentdict /ESTACKPRINT known   /ESTACKPRINT exch def
 currentdict /FAKEFONTS known   /FAKEFONTS exch def
 currentdict /FIXEDMEDIA known   /FIXEDMEDIA exch def
@@ -145,9 +146,7 @@
 currentdict /FIXEDRESOLUTION known   /FIXEDRESOLUTION exch def
 currentdict /LOCALFONTS known   /LOCALFONTS exch def
 currentdict /JOBSERVER known   /JOBSERVER exch def
-currentdict /NOBIND known   /NOBIND exch def
 /.bind /bind load def
-NOBIND { /bind { } def } if
 currentdict /NOCACHE known   /NOCACHE exch def
 currentdict /NOCCFONTS known   /NOCCFONTS exch def
 currentdict /NOCIE known   /NOCIE exch def
@@ -156,7 +155,7 @@
 currentdict /NOFONTMAP known   /NOFONTMAP exch def
 currentdict /NOFONTPATH known   /NOFONTPATH exch def
 currentdict /NOGC known   /NOGC exch def
-currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if
+currentdict /NOINTERPOLATE .knownget { /InterpolateControl 0 def } if
 currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def
 currentdict /NOOUTERSAVE known   /NOOUTERSAVE exch def
 currentdict /NOPAGEPROMPT known   /NOPAGEPROMPT exch def
@@ -170,12 +169,12 @@
 currentdict /ORIENT1 known not { /ORIENT1 //true def } if
 currentdict /OSTACKPRINT known   /OSTACKPRINT exch def
 currentdict /OUTPUTFILE known	% obsolete
-currentdict /WINKANJI known /WINKANJI exch def
-currentdict /NOWINKANJI known /NOWINKANJI exch def
  { /OutputFile /OUTPUTFILE load def
    currentdict /OUTPUTFILE .undef
  } if
 currentdict /QUIET known   /QUIET exch def
+currentdict /WINKANJI known /WINKANJI exch def
+currentdict /NOWINKANJI known /NOWINKANJI exch def
 % DELAYSAFER is effectively the same as newer NOSAFER
 currentdict /DELAYSAFER known { /DELAYSAFER //true def /NOSAFER //true def } if
 /SAFER currentdict /NOSAFER known {
@@ -186,7 +185,6 @@
 }
 ifelse def
 currentdict /SHORTERRORS known   /SHORTERRORS exch def
-currentdict /STRICT known   /STRICT exch def
 currentdict /TTYPAUSE known   /TTYPAUSE exch def
 currentdict /WRITESYSTEMDICT known   /WRITESYSTEMDICT exch def
 currentdict /RENDERTTNOTDEF known /RENDERTTNOTDEF exch def
@@ -196,9 +194,11 @@
 } if
 
 % We rely on PSFitPage to actually implement EPSFitPage
-currentdict /EPSFitPage known { /PSFitPage //true def } if
+% But we need EPSCrop to be true, to actually issue a PageSize request, so set it here
+% in case the user forgets.
+currentdict /EPSFitPage known { /PSFitPage //true def /EPSCrop //true def} if
 % This is a "convenience" option that sets a combination of EPSFitPage, PDFFitPage and PSFitPage
-currentdict /FitPage known { /EPSFitPage //true def /PDFFitPage //true def /PSFitPage //true def } if
+currentdict /FitPage known { /EPSFitPage //true def /EPSCrop //true def /PDFFitPage //true def /PSFitPage //true def } if
 
 % Acquire environment variables.
 currentdict /DEVICE known not
@@ -303,7 +303,7 @@
 } .bind odef
 
 % If we're delaying binding, remember everything that needs to be bound later.
-DELAYBIND NOBIND not and
+DELAYBIND
  { .currentglobal //false .setglobal
    systemdict /.delaybind 2000 array .forceput
    .setglobal
@@ -1755,13 +1755,13 @@
     { dup type /operatortype eq
        { % This might be a real operator, so bind might cause a typecheck,
          % but we've made the error a no-op temporarily.
-         .bind		% do a real bind even if NOBIND is set
+         .bind
        }
       if pop pop
     } forall
    put
  } def
-NOBIND DELAYBIND or not { .bindoperators } if
+DELAYBIND not { .bindoperators } if
 
 % Establish a default environment.
 
@@ -1885,7 +1885,10 @@
 % Trap this and produce a reasonable error message.
 { setdevice }		% does an erasepage
 INITDEBUG { exec //false } { .internalstopped } ifelse {
-  (**** Unable to open the initial device, quitting.) = flush 1 .quit
+  (%stderr) (w) file dup
+  (**** Unable to open the initial device, quitting.\n) writestring
+  flushfile
+  1 .quit
 } if
 
 % If the media size is fixed, update the current page device dictionary.
@@ -2112,6 +2115,118 @@
 % If we are running in SAFER mode, lock things down
 SAFER { .setsafeglobal } if
 
+/UndefinePostScriptOperators {
+
+%% This list is of Display PostScript operators. We believe that Display PostScript
+%% was never fully implemented and the only known user, GNUStep, is no longer
+%% using it. So lets remove it.
+[
+/condition /currentcontext /detach /.fork /join /.localfork /lock /monitor /notify
+/wait /yield /.currentscreenphase /.setscreenphase /.image2 /eoviewclip /initviewclip
+/viewclip /viewclippath /defineusername
+%% NeXT DPS extensions
+/currentalpha /setalpha /.alphaimage /composite /compositerect /dissolve /sizeimagebox /.sizeimageparams
+]
+{systemdict exch .forceundef} forall
+
+%% This list is of operators which no longer appear to be used, and which we do not believe
+%% to have any real use. For now we will undefine the operstors so they cannot easily be used
+%% but can be easily restored (just delete the name from the list in the array). In future
+%% we may remove the operator and the code implementation entirely.
+[
+/.bitadd /.charboxpath /.cond /.countexecstack /.execstack /.runandhide /.popdevicefilter
+/.execfile /.filenamesplit /.file_name_parent
+/.setdefaultmatrix /.isprocfilter /.unread /.psstringencode
+/.buildsampledfunction /.isencapfunction /.currentaccuratecurves /.currentcurvejoin /.currentdashadapt /.currentdotlength
+/.currentlimitclamp /.dotorientation /.setaccuratecurves /.setcurvejoin /.setdashadapt /.setdotorientation
+/.setlimitclamp /.currentscreenlevels /.dashpath /.pathbbox /.identeq /.identne /.tokenexec /.forgetsave /.pantonecallback
+
+%% Used by our own test suite files
+%%/.setdotlength % Bug687720.ps
+]
+{systemdict exch .forceundef} forall
+
+%% This list of operators are used internally by various parts of the Ghostscript startup code.
+%% Since each operator is a potential security vulnerability, and any operator listed here
+%% is not required once the initislisation is complete and functions are bound, we undefine
+%% the ones that aren't needed at runtime.
+[
+/.callinstall /.callbeginpage /.callendpage
+/.currentstackprotect /.setstackprotect /.errorexec /.finderrorobject /.installsystemnames /.bosobject /.fontbbox
+/.type1execchar /.type2execchar /.type42execchar /.setweightvector /.getuseciecolor /processcolors /.includecolorspace
+/.execn /.instopped /.stop /.stopped /.setcolorrendering /.setdevicecolorrendering /.buildcolorrendering1 /.builddevicecolorrendering1
+/.TransformPQR_scale_WB0 /.TransformPQR_scale_WB1 /.TransformPQR_scale_WB2 /.currentoverprintmode /.copydevice2
+/.devicename /.doneshowpage /flushpage /.getbitsrect /.getdevice /.getdefaultdevice /.getdeviceparams /.gethardwareparams
+/makewordimagedevice /.outputpage /.putdeviceparams /.setdevice /.currentshowpagecount
+/.setpagedevice /.currentpagedevice /.knownundef /.setmaxlength /.rectappend /.initialize_dsc_parser /.parse_dsc_comments
+/.fillCIDMap /.fillIdentityCIDMap /.buildcmap /.filenamelistseparator /.libfile /.getfilename
+/.file_name_combine /.file_name_is_absolute /.file_name_separator /.file_name_directory_separator /.file_name_current /.filename
+/.peekstring /.writecvp /.subfiledecode /.setupUnicodeDecoder /.jbig2makeglobalctx /.registerfont /.parsecff
+/.getshowoperator /.getnativefonts /.beginform /.endform /.get_form_id /.repeatform /.reusablestream /.rsdparams
+/.buildfunction /.currentfilladjust2 /.setfilladjust2 /.sethpglpathmode /.currenthpglpathmode
+/.currenthalftone /.sethalftone5 /.image1 /.imagemask1 /.image3 /.image4
+/.getiodevice /.getdevparms /.putdevparams /.bbox_transform /.matchmedia /.matchpagesize /.defaultpapersize
+/.oserrno /.setoserrno /.oserrorstring /.getCPSImode
+/.getscanconverter /.setscanconverter /.type1encrypt /.type1decrypt/.languagelevel /.setlanguagelevel /.eqproc /.fillpage /.buildpattern1 /.saslprep
+/.buildshading1 /.buildshadin2 /.buildshading3 /.buildshading4 /.buildshading5 /.buildshading6 /.buildshading7 /.buildshadingpattern
+/.argindex /.bytestring /.namestring /.stringbreak /.stringmatch /.globalvmarray /.globalvmdict /.globalvmpackedarray /.globalvmstring
+/.localvmarray /.localvmdict /.localvmpackedarray /.localvmstring /.systemvmarray /.systemvmdict /.systemvmpackedarray /.systemvmstring /.systemvmfile /.systemvmlibfile
+/.systemvmSFD /.settrapparams /.currentsystemparams /.currentuserparams /.getsystemparam /.getuserparam /.setsystemparams /.setuserparams
+/.checkpassword /.locale_to_utf8 /.currentglobal /.gcheck /.imagepath
+
+% Used by our own test suite files
+%/.fileposition %image-qa.ps
+%/.makeoperator /.setCPSImode % gs_cet.ps
+
+% Either our code uses these in ways which mean they can't be undefined, or they are used directly by
+% test files/utilities, or engineers expressed a desire to keep them visible.
+%
+%/currentdevice /.sort /.buildfont0 /.buildfont1 /.buildfont2 /.buildfont3 /.buildfont4 /.buildfont9 /.buildfont10 /.buildfont11
+%/.buildfotn32 /.buildfont42 /.type9mapcid /.type11mapcid /.swapcolors
+%/currentdevice  /.quit /.setuseciecolor /.needinput /.setoverprintmode /.special_op /.dicttomark /.knownget
+%/.FAPIavailable /.FAPIpassfont /.FAPIrebuildfont /.FAPIBuildGlyph /.FAPIBuildChar /.FAPIBuildGlyph9
+%/.tempfile /.numicc_components /.set_outputintent  /.max /.min /.shfill /.vmreclaim /.getpath /.setglobal
+%/.setdebug /.mementolistnewblocks /getenv
+]
+{systemdict exch .forceundef} forall
+
+//systemdict /UndefinePostScriptOperators .forceundef
+} bind def
+
+/UndefinePDFOperators {
+%% This list of operators are used internally by various parts of the Ghostscript PDF interpreter.
+%% Since each operator is a potential security vulnerability, and any operator listed here
+%% is not required once the initislisation is complete and functions are bound, we undefine
+%% the ones that aren't needed at runtime.
+[
+/.pdfawidthshow /.pdfwidthshow /.currentblackptcomp /.setblackptcomp
+/.setfillcolor /.setfillcolorspace /.setstrokecolor /.setstrokecolorspace /.currentrenderingintent /.setrenderingintent
+/.currenttextrenderingmode /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading
+/.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling
+/.settextlinematrix /.currenttextlinematrix /.currenttextmatrix /.settextmatrix /.currentblendmode
+/.currentopacityalpha /.currentshapealpha /.currenttextknockout
+/.pushextendedgstate /.popextendedgstate /.begintransparencytextgroup
+/.endtransparencytextgroup /.begintransparencymaskgroup /.begintransparencymaskimage /.endtransparencymask /.image3x
+/.abortpdf14devicefilter /.pdfinkpath /.pdfFormName /.setstrokeconstantalpha
+/.setfillconstantalpha /.setalphaisshape /.currentalphaisshape
+/.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise
+/.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling
+
+% Used by our own test suite files
+%/.pushpdf14devicefilter    % transparency-example.ps
+%/.poppdf14devicefilter     % transparency-example.ps
+%/.setopacityalpha          % transparency-example.ps
+%/.setshapealpha            % transparency-example.ps
+%/.endtransparencygroup     % transparency-example.ps
+
+% undefining these causes errors/incorrect output
+%/.settextrenderingmode /.setblendmode /.begintransparencygroup /.settextknockout /check_r6_password /.setstrokeoverprint /.setfilloverprint
+%/.currentstrokeoverprint /.currentfilloverprint /.currentfillconstantalpha /.currentstrokeconstantalpha
+]
+{systemdict exch .forceundef} forall
+//systemdict /UndefinePDFOperators .forceundef
+} bind def
+
 % If we delayed binding, make it possible to do it later.
 /.bindnow {
   currentuserparams /IdiomRecognition .knownget {
@@ -2125,6 +2240,8 @@
   //systemdict /.delaybind {} .forceput	% reclaim the space
   //systemdict /.bindnow .forceundef	% ditto
   put
+%  //systemdict /UndefinePostScriptOperators get exec
+%  //systemdict /UndefinePDFOperators get exec
   //systemdict /.forcecopynew .forceundef	% remove temptation
   //systemdict /.forcedef .forceundef		% ditto
   //systemdict /.forceput .forceundef		% ditto
@@ -2240,6 +2357,13 @@
 currentdict /.shadingtypes .undef
 currentdict /.wheredict .undef
 currentdict /.renderingintentdict .undef
+
+%% If we are using DELAYBIND we have to defer the undefinition
+%% until .bindnow.
+DELAYBIND not {
+  //systemdict /UndefinePostScriptOperators get exec
+  //systemdict /UndefinePDFOperators .forceundef
+} if
 end
 
 % Clean up VM, and enable GC. Use .vmreclaim to force the GC.
@@ -2252,11 +2376,28 @@
   systemdict /.forceput .undef		% ditto
   systemdict /.forceundef .undef	% ditto
 } if
+
+DELAYBIND REALLYDELAYBIND not and {
+(\n *** WARNING - the DELAYBIND command has been deprecated, and will be\n) print
+(               removed in the next version. For now you can restore\n) print
+(               the behaviour by using -dREALLYDEALYBIND but if you\n) print
+(               require continued use of this command you should contact\n) print
+(               the Ghostscript developers. Commercial customers of\n) print
+(               Artifex should email their support contact, free users\n) print
+(               are encouraged to talk to us on the #ghostscript IRC\n) print
+(               channel on irc.freenode.net.\n\n) print
+/DELAYBIND /undefined signalerror
+} if
+
 % Move superexec to internaldict if superexec is defined.
-currentdict /superexec .knownget {
+systemdict /superexec .knownget {
   1183615869 internaldict /superexec 3 -1 roll put
-  currentdict /superexec .undef
+  systemdict /superexec .undef
 } if
+
+%% Can't remove this one until the last minute :-)
+systemdict /.undef .undef
+
 WRITESYSTEMDICT not { systemdict readonly pop } if
 (END GC) VMDEBUG
 

Added: trunk/Master/tlpkg/tlgs/lib/cat.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/cat.ps	                        (rev 0)
+++ trunk/Master/tlpkg/tlgs/lib/cat.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -0,0 +1,74 @@
+% Copyright (C) 2001-2012 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
+% CA  94903, U.S.A., +1(415)492-9861, for further information.
+%
+%
+% $Id: cat.ps 8331 2008-02-05 11:07:00Z kens $
+%
+% Appends one file to another. Primarily used to overcome the
+% 'copy' limitation of Windows command shell for ps2epsi
+%
+% the files to be appended are given by the environament
+% variables %infile% and %outfile%. %infile% is appended to
+% %outfile%
+%
+
+/datastring 1024 string def
+
+{
+        (outfile) getenv
+        {
+                /outfilename exch def
+                (infile) getenv
+                {
+                        /infilename exch def
+
+                        infilename status
+                        {
+                                pop pop pop pop outfilename status
+                                {
+                                        pop pop pop pop
+                                        infilename (r) file /infile exch def
+                                        outfilename (a+) file /outfile exch def
+                                        {
+                                                infile datastring readstring
+                                                {
+                                                        outfile exch writestring
+                                                }
+                                                {
+                                                        dup length 0 gt
+                                                        {outfile exch writestring} {pop} ifelse
+                                                        exit
+                                                } ifelse
+                                        } loop
+                                        infile closefile
+                                        outfile closefile
+                                }
+                                {
+                                        (Failed to find file ) print outfilename ==
+                                } ifelse
+                        }
+                        {
+                                (Failed to find file ) print infilename ==
+                        } ifelse
+                }
+                {
+                        (Couldn't find %infile% environment variable) ==
+                } ifelse
+        }
+        {
+                (Couldn't find %outfile% environment variable) ==
+        }
+        ifelse
+} bind
+exec

Added: trunk/Master/tlpkg/tlgs/lib/font2pcl.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/font2pcl.ps	                        (rev 0)
+++ trunk/Master/tlpkg/tlgs/lib/font2pcl.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -0,0 +1,604 @@
+% Copyright (C) 2001-2012 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
+% CA  94903, U.S.A., +1(415)492-9861, for further information.
+%
+
+% font2pcl.ps
+% Write out a font as a PCL bitmap font.
+
+/pcldict 60 dict def
+
+% Write out the current font as a PCL bitmap font.
+% The current transformation matrix defines the font size and orientation.
+
+/WriteResolution? false def	% true=use "resolution bound font" format,
+                                % false=use older format
+
+/LJ4 false def			% true=use LJ4 Typeface code
+                                % false=use LJIIP/IID/IIIx Typeface code
+
+pcldict begin		% internal procedures
+
+/findstring	% <string> <substring> findstring <bool>
+ { search { pop pop pop true } { pop false } ifelse
+ } def
+
+        % Determine which set of keywords is present in a string.
+        % The last keyword set must be empty.
+
+/keysearch	% <string> <array of arrays of keywords> keysearch <index>
+ { 0 1 2 index length 1 sub
+    { 2 copy get true exch
+       {	% Stack: <string> <a.a.k.> <index> <bool> <keyword>
+         4 index exch findstring and
+       }
+      forall
+       { 0 exch getinterval exit
+       }
+      if pop
+    }
+   for
+   exch pop length	% invalid index if missing
+ } def
+
+        % Determine the device height of a string in quarter-dots.
+
+/charheight		% <string> charheight <int>
+ { gsave newpath 0 0 moveto false charpath
+   pathbbox exch pop exch sub exch pop 0 exch grestore
+   dtransform add abs 4 mul cvi
+ } def
+
+        % Compute an integer version of the transformed FontBBox.
+
+/inflate		% <num> inflate <num>
+ { dup 0 gt { ceiling } { floor } ifelse
+ } def
+/ixbbox			% - ixbbox <llx> <lly> <urx> <ury>
+ { /FontBBox load aload pop		% might be executable or literal
+   4 2 roll transform exch truncate cvi exch truncate cvi
+   4 2 roll transform exch inflate cvi exch inflate cvi
+ } def
+
+        % Determine the original font of a possibly transformed font.
+        % Since some badly behaved PostScript files construct transformed
+        % fonts "by hand", we can't just rely on the OrigFont pointers.
+        % Instead, if a font with the given name exists, and if its
+        % entries for FontType and UniqueID match those of the font we
+        % obtain by following the OrigFont chain, we use that font.
+
+/origfont
+ {  { dup /OrigFont known not { exit } if /OrigFont get } loop
+   FontDirectory 1 index /FontName get .knownget
+    {		% Stack: origfont namedfont
+      1 index /FontType get 1 index /FontType get eq
+       { 1 index /UniqueID .knownget
+          { 1 index /UniqueID .knownget
+             { eq { exch } if }
+             { pop }
+            ifelse
+          }
+         if
+       }
+      if pop
+    }
+   if
+ } def
+
+        % Determine the bounding box of the current device's image.
+        % Free variables: row, zerow.
+
+/devbbox		% <rw> <rh> devbbox <ymin> <ymax1> <xmin> <xmax1>
+ {		% Find top and bottom whitespace.
+   dup
+    { dup 0 eq { exit } if 1 sub
+      dup currentdevice exch row copyscanlines
+      zerow ne { 1 add exit } if
+    }
+   loop		% ymax1
+   0
+    { 2 copy eq { exit } if
+      dup currentdevice exch row copyscanlines
+      zerow ne { exit } if
+      1 add
+    }
+   loop		% ymin
+   exch
+                % Find left and right whitespace.
+   3 index 0
+                % Stack: rw rh ymin ymax1 xmin xmax1
+   3 index 1 4 index 1 sub
+    { currentdevice exch row copyscanlines .findzeros
+      exch 4 1 roll .max 3 1 roll .min exch
+    }
+   for		% xmin xmax1
+                % Special check: xmin > xmax1 if height = 0
+   2 copy gt { exch pop dup } if
+   6 -2 roll pop pop
+
+ } def
+
+        % Write values on outfile.
+
+ /w1 { 255 and outfile exch write } def
+ /w2 { dup -8 bitshift w1 w1 } def
+ /wbyte			% <byte> <label> wbyte
+  { VDEBUG { print ( =byte= ) print dup == flush } { pop } ifelse w1
+  } def
+ /wword			% <word16> <label> wword
+  { VDEBUG { print ( =word= ) print dup == flush } { pop } ifelse w2
+  } def
+ /wdword		% <word32> <label> wdword
+  { VDEBUG { print ( =dword= ) print dup == flush } { pop } ifelse
+    dup -16 bitshift w2 w2
+  } def
+
+/style.posture.keys
+ [ { (Italic) } { (Oblique) }
+   { }
+ ] def
+/style.posture.values <010100> def
+
+/style.appearance.width.keys
+ [ { (Ultra) (Compressed) }
+   { (Extra) (Compressed) }
+   { (Extra) (Condensed) }
+   { (Extra) (Extended) }
+   { (Extra) (Expanded) }
+   { (Compressed) }
+   { (Condensed) }
+   { (Extended) }
+   { (Expanded) }
+   { }
+ ] def
+/style.appearance.width.values <04030207070201060600> def
+
+/width.type.keys
+ [ { (Ultra) (Compressed) }
+   { (Extra) (Compressed) }
+   { (Extra) (Condensed) }
+   { (Extra) (Expanded) }
+   { (Compressed) }
+   { (Condensed) }
+   { (Expanded) }
+   { }
+ ] def
+/width.type.values <fbfcfd03fdfe0200> def
+
+/stroke.weight.keys
+ [ { (Ultra) (Thin) }
+   { (Ultra) (Black) }
+   { (Extra) (Thin) }
+   { (Extra) (Light) }
+   { (Extra) (Bold) }
+   { (Extra) (Black) }
+   { (Demi) (Light) }
+   { (Demi) (Bold) }
+   { (Semi) (Light) }
+   { (Semi) (Bold) }
+   { (Thin) }
+   { (Light) }
+   { (Bold) }
+   { (Black) }
+   { }
+ ] def
+/stroke.weight.values <f907fafc0406fe02ff01fbfd030500> def
+
+/vendor.keys
+ [ { (Agfa) }
+   { (Bitstream) }
+   { (Linotype) }
+   { (Monotype) }
+   { (Adobe) }
+   { }
+ ] def
+/vendor.default.index 4 def		% might as well be Adobe
+/old.vendor.values <020406080a00> def
+/new.vendor.values <010203040500> def
+/vendor.initials (CBLMA\000) def
+
+currentdict readonly end pop		% pcldict
+
+% Convert and write a PCL font for the current font and transformation.
+
+% Write the font header.  We split this off only to avoid overflowing
+% the limit on the maximum size of a procedure.
+% Free variables: outfile uury u0y rw rh orientation uh ully
+/writefontheader
+ { outfile (\033\)s) writestring
+   outfile 64 WriteResolution? { 4 add } if
+     Copyright length add write==only
+   outfile (W) writestring
+   WriteResolution? { 20 68 } { 0 64 } ifelse
+     (Font Descriptor Size) wword
+     (Header Format) wbyte
+   1 (Font Type) wbyte
+   FullName style.posture.keys keysearch style.posture.values exch get
+   FullName style.appearance.width.keys keysearch
+     style.appearance.width.values exch get 4 mul add
+   PaintType 2 eq { 32 add } if
+     /style exch def
+   style -8 bitshift (Style MSB) wbyte
+   0 (Reserved) wbyte
+   /baseline uury 1 sub u0y sub def
+     baseline (Baseline Position) wword
+   rw (Cell Width) wword
+   rh (Cell Height) wword
+   orientation (Orientation) wbyte
+   FontInfo /isFixedPitch .knownget not { false } if
+    { 0 } { 1 } ifelse (Spacing) wbyte
+        % Use loop/exit to fake a multiple-exit block.
+    { Encoding StandardEncoding eq { 10 (J) exit } if
+      Encoding ISOLatin1Encoding eq { 11 (J) exit } if
+      Encoding SymbolEncoding eq { 19 (M) exit } if
+      Encoding DingbatsEncoding eq { 10 (L) exit } if
+%      (Warning: unknown Encoding, using ISOLatin1.\n) print flush
+      11 (J) exit
+    }
+   loop
+   0 get 64 sub exch 32 mul add (Symbol Set) wword
+   ( ) stringwidth pop 0 dtransform add abs 4 mul
+     /pitch exch def
+   pitch cvi (Pitch) wword
+   uh 4 mul (Height) wword			% Height
+   (x) charheight (x-Height) wword
+   FullName width.type.keys keysearch
+     width.type.values exch get (Width Type) wbyte
+   style 255 and (Style LSB) wbyte
+   FullName stroke.weight.keys keysearch
+     stroke.weight.values exch get (Stroke Weight) wbyte
+   FullName vendor.keys keysearch
+     dup vendor.initials exch get 0 eq
+      {		% No vendor in FullName, try Notice
+        pop Copyright vendor.keys keysearch
+        dup vendor.initials exch get 0 eq { pop vendor.default.index } if
+      }
+     if
+     /vendor.index exch def
+   0 (Typeface LSB) wbyte		% punt
+   0 (Typeface MSB) wbyte		% punt
+   0 (Serif Style) wbyte		% punt
+   2 (Quality) wbyte
+   0 (Placement) wbyte
+   gsave FontMatrix concat rot neg rotate
+   /ulwidth
+     FontInfo /UnderlineThickness .knownget
+      { 0 exch dtransform exch pop abs }
+      { resolution 100 div }
+     ifelse def
+   FontInfo /UnderlinePosition .knownget
+    { 0 exch transform exch pop negY ulwidth 2 div add }
+    { ully ulwidth add }
+   ifelse u0y sub
+   round cvi 1 .max 255 .min (Underline Position) wbyte
+   ulwidth round cvi 1 .max 255 .min (Underline Thickness) wbyte
+   grestore
+   uh 1.2 mul 4 mul cvi (Text Height) wword
+   (average lowercase character) dup stringwidth
+     pop 0 dtransform add abs
+     exch length div 4 mul cvi (Text Width) wword
+   0
+    { dup Encoding exch get /.notdef ne { exit } if
+      1 add
+    }
+   loop (First Code) wword
+   255
+    { dup Encoding exch get /.notdef ne { exit } if
+      1 sub
+    }
+   loop (Last Code) wword
+   pitch dup cvi sub 256 mul cvi (Pitch Extended) wbyte
+   0 (Height Extended) wbyte
+   0 (Cap Height) wword			% (default)
+   currentfont /UniqueID known { UniqueID } { 0 } ifelse
+     16#c1000000 add (Font Number (Adobe UniqueID)) wdword
+   FontName length 16 .max string
+     dup FontName exch cvs pop
+     outfile exch 0 16 getinterval writestring	% Font Name
+   WriteResolution?
+    { resolution dup (X Resolution) wword (Y Resolution) wword
+    }
+   if
+   outfile Copyright writestring	% Copyright
+ } def
+
+/writePCL		% <fontfile> <resolution> writePCL -
+ {
+   save
+   currentfont begin
+   pcldict begin
+   80 dict begin		% allow for recursion
+     /saved exch def
+     /resolution exch def
+     /outfile exch def
+   matrix currentmatrix dup 4 0 put dup 5 0 put setmatrix
+
+        % Supply some default values so we don't have to check later.
+
+   currentfont /FontInfo known not { /FontInfo 1 dict def } if
+   currentfont /FontName known not { /FontName () def } if
+   /Copyright   FontInfo /Notice .knownget not { () } if   def
+   /FullName
+     FontInfo /FullName .knownget not
+      { FontName dup length string cvs }
+     if def
+
+        % Determine the original font, and its relationship to this one.
+
+   /OrigFont currentfont origfont def
+   /OrigMatrix OrigFont /FontMatrix get def
+   /OrigMatrixInverse OrigMatrix matrix invertmatrix def
+   /ScaleMatrix matrix currentfont OrigFont ne
+    { FontMatrix exch OrigMatrixInverse exch concatmatrix
+    } if
+   def
+   /CurrentScaleMatrix
+     matrix currentmatrix
+     matrix defaultmatrix
+     dup 0 get 1 index 3 get mul 0 lt
+     1 index dup 1 get exch 2 get mul 0 gt or
+       /flipY exch def
+     dup invertmatrix
+     dup concatmatrix
+   def
+   /negY flipY { {neg} } { {} } ifelse def
+
+        % Print debugging information.
+
+   /CDEBUG where { pop } { /CDEBUG false def } ifelse
+   /VDEBUG where { pop } { /VDEBUG false def } ifelse
+   CDEBUG { /VDEBUG true def } if
+   DEBUG
+    { (currentmatrix: ) print matrix currentmatrix ==
+      (defaultmatrix: ) print matrix defaultmatrix ==
+      (flipY: ) print flipY ==
+      (scaling matrix: ) print CurrentScaleMatrix ==
+      (FontMatrix: ) print FontMatrix ==
+      (FontBBox: ) print /FontBBox load ==
+      currentfont OrigFont ne
+       { OrigFont /FontName .knownget { (orig FontName: ) print == } if
+         (orig FontMatrix: ) print OrigMatrix ==
+       } if
+      currentfont /ScaleMatrix .knownget { (ScaleMatrix: ) print == } if
+      gsave
+        FontMatrix concat
+        (combined matrix: ) print matrix currentmatrix ==
+      grestore
+      flush
+    } if
+
+        % Determine the orientation.
+
+   ScaleMatrix matrix currentmatrix dup concatmatrix
+   0 1 3
+    { 1 index 1 get 0 eq 2 index 2 get 0 eq and 2 index 0 get 0 gt and
+       { exit } if
+      pop -90 matrix rotate exch dup concatmatrix
+    }
+   for
+   dup type /integertype ne
+    { (Only rotations by multiples of 90 degrees are supported:\n) print
+      == flush
+      saved end end end restore stop
+    }
+   if
+   /orientation exch def
+   /rot orientation 90 mul def
+   DEBUG { (orientation: ) print orientation == flush } if
+
+   dup dup 0 get exch 3 get negY sub abs 0.5 ge
+    { (Only identical scaling in X and Y is supported:\n) print
+      exch flipY 3 array astore ==
+%
+% .devicename has been deprecated
+%      currentdevice .devicename ==
+%
+      currentpagedevice /Name get ==
+      matrix defaultmatrix == flush
+      saved end end end restore stop
+    }
+   if pop
+
+        % Determine the font metrics, in the PCL character coordinate system,
+        % which has +Y going towards the top of the page.
+
+   gsave
+   FontMatrix concat
+     0 0 transform
+     negY round cvi /r0y exch def
+     round cvi /r0x exch def
+   ixbbox
+     negY /rury exch def  /rurx exch def
+     negY /rlly exch def  /rllx exch def
+     /rminx rllx rurx .min def
+     /rminy rlly negY rury negY .min def
+     /rw rurx rllx sub abs def
+     /rh rury rlly sub abs def
+   gsave rot neg rotate
+     0 0 transform
+     negY round cvi /u0y exch def
+     round cvi /u0x exch def
+   ixbbox
+     negY /uury exch def   /uurx exch def
+     negY /ully exch def   /ullx exch def
+     /uw uurx ullx sub def
+     /uh uury ully sub def
+   grestore
+   DEBUG
+    { (rmatrix: ) print matrix currentmatrix ==
+      (rFontBBox: ) print [rllx rlly rurx rury] ==
+      (uFontBBox: ) print [ullx ully uurx uury] ==
+      flush
+    } if
+   grestore
+
+        % Disable the character cache, to avoid excessive allocation
+        % and memory sandbars.
+
+   mark cachestatus   /upper exch def
+   cleartomark 0 setcachelimit
+
+        % Write the font header.
+
+   writefontheader
+
+        % Establish an image device for rasterizing characters.
+
+   matrix currentmatrix
+     dup 4 rminx neg put
+     dup 5 rminy neg put
+        % Round the width up to a multiple of 8
+        % so we don't get garbage bits in the last byte of each row.
+   rw 7 add -8 and rh <ff 00> makeimagedevice
+     /cdevice exch def
+   nulldevice			% prevent page device switching
+   cdevice setdevice
+
+        % Rasterize each character in turn.
+
+   /raster   rw 7 add 8 idiv   def
+   /row   raster string   def
+   /zerow   row length string   def
+   0 1 Encoding length 1 sub
+    { /cindex exch def
+      Encoding cindex get /.notdef ne
+       { VDEBUG { Encoding cindex get == flush } if
+         erasepage initgraphics
+         0 0 moveto currentpoint transform add
+         ( ) dup 0 cindex put show
+         currentpoint transform add exch sub round cvi
+           /cwidth exch abs def
+         rw rh devbbox
+         VDEBUG
+          { (image bbox: ) print 4 copy 4 2 roll 4 array astore == flush
+          } if
+                % Save the device bounding box.
+                % Note that this is in current device coordinates,
+                % not PCL (right-handed) coordinates.
+         /bqx exch def  /bpx exch def  /bqy exch def  /bpy exch def
+                % Re-render with the character justified to (0,0).
+                % This may be either the lower left or the upper left corner.
+         bpx neg bpy neg idtransform moveto
+         erasepage
+         VDEBUG { (show point: ) print [ currentpoint transform ] == flush } if
+         ( ) dup 0 cindex put show
+                % Find the bounding box.  Note that xmin and ymin are now 0,
+                % xmax1 = xw, and ymax1 = yh.
+         rw rh devbbox
+           /xw exch def
+                % xmin or ymin can be non-zero only if the character is blank.
+           xw 0 eq
+            { pop }
+            { dup 0 ne { (Non-zero xmin! ) print = } { pop } ifelse }
+           ifelse
+           /yh exch def
+           yh 0 eq
+            { pop }
+            { dup 0 ne { (Non-zero ymin! ) print = } { pop } ifelse }
+           ifelse
+
+         /xbw xw 7 add 8 idiv def
+         /xright raster 8 mul xw sub def
+                % Write the Character Code command.
+         outfile (\033*c) writestring
+         outfile cindex write==only
+         outfile (E) writestring
+                % Write the Character Definition command.
+         outfile (\033\(s) writestring
+         yh xbw mul 16 add
+         outfile exch write=only
+                % Record the character position for the .PCM file.
+         /cfpos outfile fileposition 1 add def
+         outfile (W\004\000\016\001) writestring
+         orientation (Orientation) wbyte 0 (Reserved) wbyte
+         rminx bpx add r0x sub (Left Offset) wword
+         flipY { rminy bpy add neg } { rminy bqy add } ifelse r0y sub
+           (Top Offset) wword
+         xw (Character Width) wword
+         yh (Character Height) wword
+         cwidth orientation 2 ge { neg } if 4 mul (Delta X) wword
+                % Write the character data.
+         flipY { 0 1 yh 1 sub } { yh 1 sub -1 0 } ifelse
+          { cdevice exch row copyscanlines
+            0 xbw getinterval
+            CDEBUG
+             { dup
+                { 8
+                   { dup 128 ge { (+) } { (.) } ifelse print
+                     127 and 1 bitshift
+                   }
+                  repeat pop
+                }
+               forall (\n) print
+             }
+            if
+            outfile exch writestring
+          }
+         for
+       }
+       { /bpx 0 def   /bpy 0 def   /bqx 0 def   /bqy 0 def
+         /cwidth 0 def
+         /cfpos 0 def
+       }
+      ifelse
+
+    }
+   for
+
+        % Wrap up.
+
+   upper setcachelimit
+   outfile closefile
+
+   nulldevice			% prevent page device switching
+   saved end end end restore
+
+ } def
+
+% Provide definitions for testing with older or non-custom interpreters.
+
+/.findzeros where { pop (%END) .skipeof } if
+/.findzeros
+ { userdict begin   /zs exch def   /zl zs length def
+   0 { dup zl ge { exit } if dup zs exch get 0 ne { exit } if 1 add } loop
+   zl { dup 0 eq { exit } if dup 1 sub zs exch get 0 ne { exit } if 1 sub } loop
+   exch 3 bitshift exch 3 bitshift
+   2 copy lt
+    { exch zs 1 index -3 bitshift get
+       { dup 16#80 and 0 ne { exit } if exch 1 add exch 1 bitshift } loop pop
+      exch zs 1 index -3 bitshift 1 sub get
+       { dup 1 and 0 ne { exit } if exch 1 sub exch -1 bitshift } loop pop
+    }
+   if end
+ } bind def
+%END
+
+/write=only where { pop (%END) .skipeof } if
+/w=s 128 string def
+/write=only
+ { w=s cvs writestring
+ } bind def
+%END
+
+%**************** Test
+/PCLTEST where {
+  pop
+  /DEBUG true def
+  /CDEBUG true def
+  /VDEBUG true def
+  /Times-Roman findfont 10 scalefont setfont
+  (t.pcf) (w) file
+  300 72 div dup scale
+  300 writePCL
+  flush quit
+} if

Added: trunk/Master/tlpkg/tlgs/lib/jobseparator.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/jobseparator.ps	                        (rev 0)
+++ trunk/Master/tlpkg/tlgs/lib/jobseparator.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -0,0 +1,3 @@
+% Execute the "real" system version of the ^D to separate jobs
+% when -dJOBDSERVER is being used.
+<04> cvn .systemvar exec

Added: trunk/Master/tlpkg/tlgs/lib/stcinfo.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/stcinfo.ps	                        (rev 0)
+++ trunk/Master/tlpkg/tlgs/lib/stcinfo.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -0,0 +1,794 @@
+% Copyright (C) 2001-2012 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
+% CA  94903, U.S.A., +1(415)492-9861, for further information.
+%
+
+% stcinfo.ps
+% Epson Stylus-Color Printer-Driver
+
+% The purpose of this file is to print & show Parameters of the
+% stcolor-driver. If not run on ghostscript/stcolor, it prints
+% something like a color-chart.
+
+% use either existing STCinfo-dictionary, retrieve new one or create dummy
+
+statusdict begin product end
+dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or
+exch (AFPL Ghostscript) eq or{
+
+  currentdevice getdeviceprops .dicttomark
+  dup /Name get (stcolor) eq /STCi_onstc exch def
+  /STCinfo where {/STCinfo get exch pop} if
+  /STCinfo exch def
+
+}{
+
+  /STCinfo 10 dict def
+  STCinfo begin /Name (unknown) def end
+  /STCi_onstc false def
+
+}ifelse
+
+% Next Block are procedures to generate the color-triangles.
+% you may wish to separate them, just look ahead for the name
+% given in the next line to achieve that.
+% Begin: colortri_procedures
+
+% Plot the CIE-XY-triangle (or something like that)
+
+% /colortri_mat   Conversion matrix RGB -> XYZ
+% /colortri_bg    procedure, that takes X/Y-Values and delivers the
+%                 "background color" as RGB-Values, default is:
+%                 {pop pop 0.85 dup dup}
+
+% The default matrix was taken from:
+%             Color spaces FAQ - David Bourgin
+%             Date: 15/6/94 (items 5.3 and 6 updated)
+%             Last update: 29/6/94
+
+   /colortri_mat [ % RGB -> CIE XYZitu601-1 (D65)
+         0.4306 0.3415 0.1784
+         0.2220 0.7067 0.0713
+         0.0202 0.1295 0.9394
+   ] def
+
+   /colortri_bg {pop pop 0.85 dup dup} bind def
+
+% +---------------------------------------------------------------------+
+% | Besides from fixing bugs, nothing should be changed below this line |
+% +---------------------------------------------------------------------+
+
+%  Arbitrary operation on a pair of vectors, *CHANGES* 1st.
+%  invoke: Vaccu Vop op vop
+   /vop {
+      bind 0 1 3 index length 1 sub {
+       3 index 1 index get 3 index 2 index get 3 index exec 4 index 3 1 roll put
+      } for pop pop
+   } bind def
+
+   /vsub { {sub} vop } bind def % subtract two vectors
+   /vmul { {mul} vop } bind def % multiply two vectors
+
+%  Compute sum of vectors elements
+   /vsum {0.0 exch{add}forall} bind def
+
+%  Sum up products of elements
+   /veqn { [ 3 -1 roll {} forall ] exch vmul vsum } bind def
+
+%  Find index of |maximum| in array
+   /imax {
+      dup 0 get abs 0 exch % array i v[i]
+      1 1 4 index length 1 sub {
+         3 index 1 index get abs dup 3 index gt {4 2 roll}if pop pop
+      } for
+      3 -1 roll pop
+   } bind def
+
+%  Procedure to *CHANGE*  RGB-Values into XYZ-Values
+   /rgb2xyz {
+      0 3 6 { colortri_mat exch 3 getinterval 1 index veqn exch } for astore
+   } bind def
+
+% Procedure to *CHANGE* transform rgb->xy
+   /rgb2xy {
+      rgb2xyz
+      dup 0 get 1 index 1 get 2 index vsum % XYZ X Y sum
+      dup 0 ne {
+        exch 1 index div 3 1 roll div      % XYZ y x
+        2 index exch 0 exch put            % xYZ y
+        1 index exch 1 exch put            % xyZ
+      }{
+        pop pop pop dup 0 0 put dup 0 1 put
+      } ifelse
+      0 2 getinterval
+   } bind def
+
+% So here we go with our procedure
+
+/colortri { %Usage: box #pixels
+   save
+   1 index type /arraytype eq {exch 8}{3 1 roll} ifelse % Default scale
+   /colortri_scale exch def
+   /colortri_box   exch def
+
+%  Prepare some useful constants for xy -> RGB conversion
+
+   /colsum [                              % Array with column-sums
+     0 1 2{0 exch 3 1 index 6 add{colortri_mat exch get add}for}for
+   ] def
+
+   /Xrow colortri_mat 0 3 getinterval def % two rows from colortri_mat
+   /Yrow colortri_mat 3 3 getinterval def
+
+%  Avoid allocating new arrays
+   /xcoeff 3 array def
+   /ycoeff 3 array def
+
+% Procedure to derive RGB-Values form X,Y
+   /xy2rgb{ aload pop
+      dup     dup dup ycoeff astore colsum vmul Yrow vsub imax
+      3 index dup dup xcoeff astore colsum vmul Xrow vsub imax
+      3 -1 roll 1 index 1 index gt{
+         xcoeff ycoeff /xcoeff exch def /ycoeff exch def pop 3 -1 roll pop
+      }{
+        3 1 roll pop pop
+      } ifelse
+      1e-6 lt { % No Pivot ?
+         pop colortri_bg xcoeff astore pop
+      }{        % Have a Pivot
+         dup ycoeff exch get neg
+         0 1 2 { dup ycoeff exch get 2 index div ycoeff 3 1 roll put} for
+         pop ycoeff 1 index 0 put
+
+         xcoeff 1 index get
+         0 1 2 {
+            ycoeff 1 index get 2 index mul xcoeff 2 index get add
+            xcoeff 3 1 roll put
+         } for
+         pop xcoeff 1 index 0 put
+         xcoeff imax 1e-6 lt { % no Pivot ?
+           pop pop colortri_bg xcoeff astore pop
+         }{
+           dup 2 index or 3 exch sub
+           xcoeff 1 index get xcoeff 3 index get div neg
+           xcoeff exch 3 index exch put
+           xcoeff 1 index 1 put
+           ycoeff exch get ycoeff 2 index get xcoeff 4 -1 roll get mul add
+           xcoeff 3 1 roll put
+           0 1 2 {
+               xcoeff exch get dup -0.0015 lt exch 1.0015 gt or {
+                 colortri_bg xcoeff astore dup exit
+               } if
+           } for
+           pop pop xcoeff
+         } ifelse
+      } ifelse
+   } bind def
+
+% Compute the displayed range
+   [ 1 1 1 ] rgb2xy
+   dup 0 get /colortri_x0 exch def /colortri_dx colortri_x0 def
+   1 get     /colortri_y0 exch def /colortri_dy colortri_y0 def
+   [[0 0 1][0 1 0][0 1 1][1 0 0][1 0 1][1 1 0]] {
+      rgb2xy
+      dup 0 get
+      dup colortri_x0 lt {/colortri_x0 1 index def}if
+      dup colortri_dx gt {/colortri_dx 1 index def}if
+      pop 1 get
+      dup colortri_y0 lt {/colortri_y0 1 index def}if
+      dup colortri_dy gt {/colortri_dy 1 index def}if
+      pop
+   } forall
+   colortri_dx colortri_x0 sub /colortri_dx exch def
+   colortri_dy colortri_y0 sub /colortri_dy exch def
+%
+
+% determine the scale
+   colortri_box 2 get colortri_box 0 get sub colortri_dx div % fx
+   colortri_box 3 get colortri_box 1 get sub colortri_dy div % fx fy
+   gt { % fy limits
+      colortri_box 3 get colortri_box 1 get sub
+      dup colortri_dx mul colortri_dy div exch
+   }{   % fx limits
+      colortri_box 2 get colortri_box 0 get sub
+      dup colortri_dy mul colortri_dx div
+   } ifelse
+   dtransform abs colortri_scale div cvi /colortri_ny exch def
+              abs colortri_scale div cvi /colortri_nx exch def
+   colortri_nx colortri_scale mul colortri_ny colortri_scale mul
+   idtransform abs exch abs exch
+   colortri_box 0 get colortri_box 2 get 1 index sub 3 index sub 2 div add
+   colortri_box 1 get colortri_box 3 get 1 index sub 3 index sub 2 div add
+   transform .5 add cvi exch .5 add cvi exch itransform
+   translate scale
+
+%  String & indices
+   /colortri_tmp colortri_nx 3 mul string def
+   /colortri_dx colortri_dx colortri_nx 1 sub div def
+   /colortri_dy colortri_dy colortri_ny 1 sub div def
+   /colortri_xy [ colortri_x0 colortri_y0 ] def
+   /colortri_ie colortri_tmp length 3 sub def
+
+   colortri_nx colortri_ny 8 [ colortri_nx 0 0 colortri_ny 0 0 ]
+   {
+     colortri_xy 0 colortri_x0 put
+     0 3 colortri_ie {
+         colortri_tmp exch   % buf ir
+         colortri_xy xy2rgb  % buf ir rgb buf ib
+         2 index 2 index 2 add 2 index 2 get 255 mul cvi put
+         2 index 2 index 1 add 2 index 1 get 255 mul cvi put
+         0     get 255 mul cvi put
+         colortri_xy dup 0 exch 0 get colortri_dx add put
+     }for
+     colortri_xy dup 1 exch 1 get colortri_dy add put
+     colortri_tmp
+   } bind
+   false 3 colorimage
+   restore
+} bind def
+
+% [ newpath clippath pathbbox ]  colortri showpage % standalone usage
+
+% End:   colortri_procedures
+
+% The next section is a group of procedures, that I for myself
+% do no more fully understand, but they do the Job.
+
+% Begin: stcinfo_procedures_1
+
+% fetch a parameter from the dictionary
+/STCiget { STCinfo exch get } bind def
+
+% action upon ProcessColorModel
+/STCimode {
+   /ProcessColorModel STCiget dup
+   /DeviceCMYK eq{pop 2}{/DeviceRGB eq{1}{0}ifelse}ifelse get exec
+} bind def
+
+% print given number of blanks
+/STCipspace {
+   dup 0 gt{ 1 exch 1 exch { pop ( ) print}for }{ pop } ifelse
+} bind def
+
+% print right or left-justified text
+/STCiprint {
+   dup 0 gt { dup 2 index length sub STCipspace } if
+   1 index print
+   dup 0 lt { neg dup 2 index length sub STCipspace } if
+   pop pop
+} bind def
+
+% floating-point to fixed-length-string conversion
+
+/STCicvs { % number -> string
+
+% Prepare the result
+   8 string dup 0 (        ) putinterval
+   exch
+
+% Make it unsigned
+   dup 0 lt {neg(-)}{( )}ifelse 0 get exch
+
+   dup 1000 lt 1 index 0 eq 2 index 0.001 ge or and { % floating point
+     (e+) 0
+   }{                                                 % engineering
+      0 {
+        1 index 1000.0 ge
+          {3 add exch 1000 div exch}
+          {1 index 1 lt {3 sub exch 1000 mul exch}{exit}ifelse}
+        ifelse
+      }loop
+      dup 0 lt {neg(e-)}{(e+)}ifelse exch
+  }ifelse
+
+% string sign num esig e
+
+% always up to three Integer Digits plus sign
+   2 index cvi 3 { % string sign num esig e int ind
+      1 index 10 div cvi dup 10 mul 3 index exch sub cvi
+      (0123456789) exch get 8 index exch 3 index exch put
+      3 -2 roll 1 sub exch pop dup 0 eq 2 index 0 eq or {exit} if
+   } loop exch pop % string sign num esig e ind
+   5 index exch 6 -1 roll put % string num esig e
+
+% print either fraction or exponent
+   dup 0 eq { pop pop dup cvi sub % String fraction
+
+      dup 0.0 ne { % Fraction present
+         0.0005 add 1 index 4 (.) putinterval
+         5 1 7 { % string frac ind
+           exch 10 mul dup cvi exch 1 index sub % string ind ic nfrac
+           exch (0123456789) exch get 3 -1 roll % string nfrac chr ind
+           exch 3 index 3 1 roll put
+         } for
+      } if
+      pop
+
+   }{ 3 -1 roll pop % string esig e
+
+      exch 2 index exch 4 exch putinterval
+      7 -1 6 { % string n i
+         1 index 10 div cvi dup 10 mul 3 index exch sub cvi % string n i n/10
+         (0123456789) exch get 4 index exch 3 index exch put
+         exch pop exch pop
+      } for
+      pop
+   } ifelse
+
+} bind def
+
+% compute colorvalue-steps from transfer & coding
+/STCisteps { % xfer, coding => X-values, Y-Values
+% 2^nbits
+   2 /BitsPerComponent STCiget dup 11 gt { pop 11 } if exp cvi
+
+% X & Y - Arrays (stack: xv:4  yv:3 xfer:2  coding:1 2^ni:0)
+   dup 1 add array 1 index array 5 2 roll
+
+% compute GS-Color-Value according to the coding-array
+
+   1 index null eq { % no coding present
+
+      0 1 2 index 1 sub {
+         dup 6 index exch dup 4 index div put
+         4 index exch dup 3 index 1 sub div put
+      } for
+
+   }{                % coding-array given
+
+      1.0 1 index 1 sub div % y step
+      0                     % current index
+      0 1 4 index 1 sub { % over indices
+         dup 3 index mul
+         {
+            dup 3 index 1 add dup 8 index length ge {pop pop exit} if % i y
+            7 index exch get le {exit} if
+            2 index 1 add 3 1 roll 4 -1 roll pop
+         } loop
+         5 index 3 index get sub
+         5 index 3 index 1 add get 6 index 4 index get sub div
+         2 index add 5 index length 1 sub div
+         2 copy exch dup 0 eq {
+            10 index exch 0.0 put pop
+         }{
+            dup 10 index exch 1 sub get 3 -1 roll add 2 div
+            10 index 3 1 roll put
+         }ifelse
+         7 index 3 1 roll put
+     } for               % over indices
+     pop pop
+   } ifelse
+   4 index 1 index 1.0 put
+
+% Replace the raw y-values by those computed from the transfer-array
+
+   0 1 2 index 1 sub { % over indices, 2nd
+      dup 5 index exch get
+      dup 5 index length 1 sub mul cvi % -> iy
+      5 index 1 index get
+      1 index 1 add 7 index length lt {
+        dup 7 index 3 index 1 add get exch sub
+        3 index 3 index 9 index length 1 sub div sub mul
+        7 index length 1 sub mul add
+      } if
+      exch pop exch pop 5 index 3 1 roll put
+   } for               % over indices, 2nd
+
+   pop pop pop
+} bind def
+
+/STCibar { % Window X-Values proc => Window
+   0 1 3 index length 2 sub {
+     dup 3 index exch get exch
+     1 add 3 index exch get
+     dup 2 index add 2 div 3 index exec % Color to average
+     4 index 2 get 5 index 0 get sub exch 1 index mul 5 index 0 get add 3 1 roll
+     mul 4 index 0 get add 4 index 3 get 5 index 1 get
+     newpath
+     2 index 1 index moveto
+     3 index 1 index lineto
+     3 index 2 index lineto
+     2 index 2 index lineto
+     closepath fill
+     pop pop pop pop
+   } for
+   pop pop
+   0 setgray
+   newpath
+   dup 0 get 1 index 1 get moveto
+   dup 2 get 1 index 1 get lineto
+   dup 2 get 1 index 3 get lineto
+   dup 0 get 1 index 3 get lineto
+   closepath stroke
+   pop
+} bind def
+
+% End:   stcinfo_procedures_1
+
+% Begin: stcinfo_preparation
+
+% Compute used area from clippath
+
+/STCi_clip [
+  newpath clippath pathbbox
+  2 sub 4 1 roll 2 sub 4 1 roll 2 add 4 1 roll 2 add 4 1 roll
+] def
+
+%
+% Perpare the texual messages, assume no stcolor if this fails
+%
+{
+   /STCi_stopped % A Special Mark
+
+% Textual Parameters (an array of pairs of strings)
+   /STCi_l1 0 def
+   /STCi_l2 0 def
+   /STCi_text [
+% Driver-Name & Version
+      (Parameters of)
+         /Name STCiget length /Version STCiget length add 1 add string
+         dup 0 /Name STCiget putinterval dup /Name STCiget length (-)putinterval
+         dup /Name STCiget length 1 add /Version STCiget putinterval
+% Dithering-Algorithm
+      (Dithering)
+         /Dithering STCiget
+         [{( \(Monochrome\))}{( \(RGB\))}{( \(CMYK\))}] STCimode
+         dup length 2 index length add string exch 1 index exch
+         3 index length exch putinterval dup 3 1 roll exch 0 exch putinterval
+% Flags for the algorithm
+      (Flag4-0) 5 string
+         dup 0 /Flag4 STCiget {(T)}{(f)} ifelse putinterval
+         dup 1 /Flag3 STCiget {(T)}{(f)} ifelse putinterval
+         dup 2 /Flag2 STCiget {(T)}{(f)} ifelse putinterval
+         dup 3 /Flag1 STCiget {(T)}{(f)} ifelse putinterval
+         dup 4 /Flag0 STCiget {(T)}{(f)} ifelse putinterval
+
+% Bits Per Pixel & Bits Per Component
+      (BitsPerPixel) 10 string % (nn -> nxnn)
+         /BitsPerPixel STCiget 1 index cvs length % string used
+         dup 2 index exch ( -> ) putinterval 4 add dup 2 add exch 2 index exch
+         [{(1x)}{(3x)}{(4x)}] STCimode putinterval % String used
+         /BitsPerComponent STCiget 2 index 2 index 2 getinterval cvs length add
+         0 exch getinterval
+
+      () ()
+% ColorAdjustMatrix
+      (ColorAdjustMatrix)
+         /ColorAdjustMatrix STCiget dup null eq {
+            pop (default)
+         }{
+            { STCicvs } forall
+            [{ % Monochrome
+               26 string
+               dup  0 6 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 5 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 4 -1 roll putinterval
+             }{ % RGB
+               26 string
+               dup  0 12 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 11 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 10 -1 roll putinterval
+
+               () 26 string
+               dup  0 11 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 10 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18  9 -1 roll putinterval
+
+               () 26 string
+               dup  0 10 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9  9 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18  8 -1 roll putinterval
+             }{
+               35 string
+               dup  0 19 -1 roll  putinterval dup  8 ( ) putinterval
+               dup  9 18 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 17 -1 roll putinterval dup 26 ( ) putinterval
+               dup 27 16 -1 roll putinterval
+
+               () 35 string
+               dup  0 17 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 16 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 15 -1 roll putinterval dup 26 ( ) putinterval
+               dup 27 14 -1 roll putinterval
+
+               () 35 string
+               dup  0 15 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 14 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 13 -1 roll putinterval dup 26 ( ) putinterval
+               dup 27 12 -1 roll putinterval
+
+               () 35 string
+               dup  0 13 -1 roll putinterval dup  8 ( ) putinterval
+               dup  9 12 -1 roll putinterval dup 17 ( ) putinterval
+               dup 18 11 -1 roll putinterval dup 26 ( ) putinterval
+               dup 27 10 -1 roll putinterval
+
+             }
+            ] STCimode
+         } ifelse
+      () ()
+
+% Printer Model
+      (Printer-Model)  /Model STCiget
+
+% Resolution
+      (Resolution) 15 string % (nnnnnxnnnnn DpI)
+         /HWResolution STCiget 0 get cvi 1 index cvs length
+         dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
+         /HWResolution STCiget 1 get cvi exch cvs length add dup 2 index
+         exch ( DpI) putinterval 4 add 0 exch getinterval
+
+% HWsize holds entire Page in Pixels,
+% .HWMargins is [left,bottom,right,top] in Points
+      (Printed Area)   18 string % (nnnnnxnnnnn Pixel)
+         /HWSize STCiget 0 get /.HWMargins STCiget dup 0 get exch 2 get add
+         /HWResolution STCiget 0 get mul 72.0 div sub cvi 1 index cvs length
+         dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
+         /HWSize STCiget 1 get /.HWMargins STCiget dup 1 get exch 3 get add
+         /HWResolution STCiget 1 get mul 72.0 div sub cvi exch cvs length add
+         dup 2 index exch ( Pixel) putinterval 6 add 0 exch getinterval
+
+      () ()
+% WeaveMode
+      (Weave-Mode)
+         /noWeave STCiget {
+           (noWeave)
+         }{
+           /Microweave STCiget {(Microweave)}{(Softweave)}ifelse
+         }ifelse
+% Unidirectional
+      (Unidirectional) /Unidirectional STCiget {(ON)}{(off)} ifelse
+% Output coding
+      (OutputCode)     /OutputCode STCiget
+% number of heads
+      (escp_Band)   /escp_Band   STCiget 3 string cvs
+      (escp_Width)  /escp_Width  STCiget 5 string cvs
+      (escp_Height) /escp_Height STCiget 5 string cvs
+      (escp_Top)    /escp_Top    STCiget 5 string cvs
+      (escp_Bottom) /escp_Bottom STCiget 5 string cvs
+   ] def
+
+%
+% compute the Proper X & Y-Arrays
+%
+   [{  % Monochrome
+     /Ktransfer STCiget /Kcoding STCiget STCisteps
+     /STCi_yv   [ 3 -1 roll ] def
+     /STCi_xv   [ 3 -1 roll ] def
+     /STCi_col  [[0 0 0]] def
+     /STCi_set  [{1.0 exch sub setgray}] def
+    }{ % RGB
+     /Rtransfer STCiget /Rcoding STCiget STCisteps
+     /Gtransfer STCiget /Gcoding STCiget STCisteps
+     /Btransfer STCiget /Bcoding STCiget STCisteps
+     exch 4 -1 roll 6 -1 roll exch 3 -1 roll
+     /STCi_xv [ 5 2 roll ] def
+     /STCi_yv [ 5 2 roll ] def
+     /STCi_col  [[1 0 0] [0 1 0] [0 0 1]] def
+     /STCi_set [
+      {1.0 exch sub 1 exch dup setrgbcolor}
+      {1.0 exch sub dup 1 exch setrgbcolor}
+      {1.0 exch sub dup 1      setrgbcolor}
+      ] def
+    }{ % CMYK
+     /Ctransfer STCiget /Ccoding STCiget STCisteps
+     /Mtransfer STCiget /Mcoding STCiget STCisteps exch 3 1 roll
+     /Ytransfer STCiget /Ycoding STCiget STCisteps exch 4 1 roll
+     /Ktransfer STCiget /Kcoding STCiget STCisteps exch 5 1 roll
+     /STCi_yv  [ 6 2 roll ] def
+     /STCi_xv  [ 6 2 roll ] def
+     /STCi_col [[0 1 1] [1 0 1] [1.0 0.5 0.0] [0 0 0]] def
+     /STCi_set [
+       { 0 0 0 setcmykcolor }
+       { 0 exch 0 0 setcmykcolor }
+       { 0 exch 0 exch 0 setcmykcolor }
+       { 0 exch 0 exch 0 exch setcmykcolor }
+     ] def
+    }
+   ]STCimode
+
+} stopped
+
+{ {/STCi_stopped eq {exit}if}loop true}
+{ {/STCi_stopped eq {exit}if}loop false} ifelse
+
+% End:   stcinfo_preparation
+
+% The Next section does the real job
+
+% Begin: stcinfo_execution
+{
+   (%%[ stcinfo.ps: currentdevice is not supported -> colortri ]%%\n) print
+   STCi_clip  colortri % The default action
+
+}{
+%
+% Print the text
+%
+   0 2 STCi_text length 2 sub { dup 1 add exch
+     STCi_text exch get length dup STCi_l1 gt{/STCi_l1 exch def}{pop}ifelse
+     STCi_text exch get length dup STCi_l2 gt{/STCi_l2 exch def}{pop}ifelse
+   } for
+   /STCi_l2 STCi_l2 neg def
+   0 2 STCi_text length 2 sub {
+     dup 1 add STCi_text exch get exch STCi_text exch get
+     1 index length 0 gt {
+       dup STCi_l1 STCiprint length 0 gt {(: )}{(  )}ifelse print print
+     }{
+       pop pop
+     } ifelse
+     (\n) print
+   } for
+%
+% Deactivate a present ColorAdjust Matrix, if any
+%
+   /ColorAdjustMatrix STCiget null ne STCi_onstc and {
+       mark
+       /ColorAdjustMatrix null
+       currentdevice putdeviceprops pop
+   } if
+%
+% "Show" the text
+%
+   /Times-Roman findfont 10 scalefont setfont
+   /STCi_l1 0 def
+   0 2 STCi_text length 2 sub {
+       STCi_text exch get stringwidth pop dup STCi_l1 gt {
+          /STCi_l1 exch def
+       }{
+          pop
+       } ifelse
+   } for
+   STCi_l1 STCi_clip 0 get add /STCi_l1 exch def
+
+   STCi_clip 3 get 12 sub
+   0 2 STCi_text length 2 sub {
+       STCi_text exch get dup length 0 gt {
+         dup stringwidth pop STCi_l1 exch sub 2 index moveto show
+       }{
+          pop
+       } ifelse
+       12 sub
+   } for
+   pop
+
+   /Courier findfont 10 scalefont setfont
+   /STCi_l2 0 def
+   1 2 STCi_text length 1 sub {
+       STCi_text exch get stringwidth pop dup STCi_l2 gt {
+          /STCi_l2 exch def
+       }{
+          pop
+       } ifelse
+   } for
+
+   STCi_clip 3 get 12 sub
+   1 2 STCi_text length 1 sub {
+       STCi_text exch get dup length 0 gt {
+          STCi_l1 12 add 2 index moveto show
+       }{
+         pop
+       } ifelse
+       12 sub
+   } for
+   pop
+
+%
+%  compute the space for the graph-window
+%
+   STCi_l1 12 add STCi_l2 add 12 add dup STCi_clip 2 get exch sub % Extend
+   [ 3 -1 roll dup 3 index add STCi_clip 3 get dup 5 index sub 3 1 roll ]
+   /STCi_win exch def /STCi_l1 exch def
+
+% The "Axis"
+   newpath
+   STCi_win 0 get STCi_win 1 get 14 add moveto
+   STCi_win 2 get STCi_win 1 get 14 add lineto stroke
+
+   STCi_win 0 get 14 add STCi_win 1 get moveto
+   STCi_win 0 get 14 add STCi_win 3 get lineto stroke
+
+% The Labels
+   /Times-Roman findfont 10 scalefont setfont
+   (Postscript-color) dup stringwidth pop
+   STCi_win 2 get STCi_win 0 get sub 14 sub 1 index sub 2 div exch pop
+   STCi_win 0 get add 14 add STCi_win 1 get 4 add moveto show
+
+   gsave
+     STCi_win 0 get 10 add STCi_win 1 get 14 add translate 90 rotate
+     (Device-color) dup stringwidth pop
+     STCi_win 3 get STCi_win 1 get sub 14 sub 1 index sub 2 div exch pop
+     0 moveto show
+   grestore
+
+% The Graphs
+  gsave
+     STCi_win 0 get 14 add STCi_win 1 get 14 add
+     STCi_win 2 get 2 index sub STCi_win 3 get 2 index sub
+     4 2 roll translate
+     STCi_col 0 1 2 index length 1 sub {
+       1 index 1 index get aload pop setrgbcolor
+       STCi_xv 1 index get STCi_yv 3 -1 roll get
+       newpath
+       1 index 0 get 5 index mul 1 index 0 get 5 index mul moveto
+       1 index 1 get 5 index mul 1 index 0 get 5 index mul lineto
+       1 1 2 index length 1 sub {
+         2 index 1 index       get 6 index mul
+         2 index 2 index       get 6 index mul lineto
+         2 index 1 index 1 add get 6 index mul
+         2 index 2 index       get 6 index mul lineto
+         pop
+       } for
+       stroke pop pop
+     } for
+     pop pop pop
+  grestore
+
+%
+% Find lowest Y from Text or graph
+%
+   STCi_win 1 get  STCi_clip 3 get STCi_text length 2 div 12 mul sub
+   dup 2 index gt { pop } { exch pop } ifelse 12 sub
+
+%
+%  compute the upper bar-window
+%
+   /STCi_win [
+      STCi_clip 0 get 4 -1 roll 36 sub STCi_clip 2 get 1 index 36 add
+   ] def
+
+%
+% Draw the required number of graphs
+%
+   [{  % Monochrome
+      STCi_win STCi_xv 0 get {setgray} STCibar
+    }{ % RGB
+      STCi_win STCi_xv 0 get {0 0 setrgbcolor} STCibar
+      STCi_win dup 1 exch 1 get 47 sub put
+      STCi_win dup 3 exch 3 get 47 sub put
+      STCi_win STCi_xv 1 get {0 0 3 1 roll setrgbcolor} STCibar
+      STCi_win dup 1 exch 1 get 47 sub put
+      STCi_win dup 3 exch 3 get 47 sub put
+      STCi_win STCi_xv 2 get {0 0 3 2 roll setrgbcolor} STCibar
+    }{ % CMYK
+      STCi_win STCi_xv 0 get {0 0 0          setcmykcolor} STCibar
+      STCi_win dup 1 exch 1 get 47 sub put
+      STCi_win dup 3 exch 3 get 47 sub put
+      STCi_win STCi_xv 1 get {0 0 0 4 1 roll setcmykcolor} STCibar
+      STCi_win dup 1 exch 1 get 47 sub put
+      STCi_win dup 3 exch 3 get 47 sub put
+      STCi_win STCi_xv 2 get {0 0 0 4 2 roll setcmykcolor} STCibar
+      STCi_win dup 1 exch 1 get 47 sub put
+      STCi_win dup 3 exch 3 get 47 sub put
+      STCi_win STCi_xv 3 get {0 0 0 4 3 roll setcmykcolor} STCibar
+    }
+   ] STCimode
+
+   STCi_win 1 STCi_clip 1 get put
+   STCi_win dup 3 exch 3 get 47 sub put
+
+%
+% Plot either one or two Color-Triangles
+%
+   /ColorAdjustMatrix STCiget null ne STCi_onstc and {
+     STCi_win 0 get STCi_win 2 get add 2 div
+     [STCi_win 0 get STCi_win 1 get 3 index STCi_win 3 get ] colortri
+     mark /ColorAdjustMatrix dup STCiget currentdevice putdeviceprops pop
+     [1 index STCi_win 1 get STCi_win 2 get STCi_win 3 get ] colortri
+     pop
+   }{
+     STCi_win colortri
+   } ifelse
+   newpath clippath stroke
+} ifelse
+showpage

Added: trunk/Master/tlpkg/tlgs/lib/stcolor.ps
===================================================================
--- trunk/Master/tlpkg/tlgs/lib/stcolor.ps	                        (rev 0)
+++ trunk/Master/tlpkg/tlgs/lib/stcolor.ps	2017-10-05 22:46:10 UTC (rev 45479)
@@ -0,0 +1,169 @@
+% Copyright (C) 2001-2012 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134, San Rafael,
+% CA  94903, U.S.A., +1(415)492-9861, for further information.
+%
+
+% stcolor.ps
+% Epson Stylus-Color Printer-Driver
+
+% The purpose of this file is to configure the stcolor-printer driver
+
+%
+% It is useless and dangerous to interpret the following code with anything
+% else than Ghostscript, so this condition is verified first. If this fails
+% a message is send to the output. If this message bothers you, remove it,
+% but I prefer to know why the device-setup failed.
+
+statusdict begin product end
+dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or
+exch (AFPL Ghostscript) eq or{
+
+% fetch the current device-parameters this is specific for Ghostscript.
+
+  /STCold currentdevice getdeviceprops .dicttomark def
+
+% Any Ghostscript-Driver has a Name, verify that the selected device is
+% stcolor, otherwise nothing than another message will be produced.
+
+  STCold /Name get (stcolor) eq {
+
+%
+% The main thing this file does, is to establish transfer-functions.
+% Here are two predefined arrays for 360x360Dpi and for 720x720DpI.
+% If resolution is 360x720 or 720x360 the average is used. You may
+% want to define other arrays here.
+%
+
+     /STCdeftransfer [ 0.0 1.0 ] def
+
+     /STCKtransfer360 [
+       0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+       0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+       0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+       0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+     ] def
+
+     /STCKtransfer720 [
+       0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+       0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+       0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+       0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+     ] def
+
+% compute the resolution
+
+     STCold /HWResolution get dup
+     0 get exch 1 get mul sqrt /STCdpi exch def
+
+% pick the colormodel
+     STCold /ProcessColorModel get /STCcolor exch def
+
+     mark % prepare stack for "putdeviceprops"
+
+% warn for BitsPerPixel=30 with fsrgb
+     STCcolor /DeviceRGB eq STCold /BitsPerPixel get 32 eq and
+     {
+       (%%[ stcolor.ps: inefficient RGB-setup, recommend BitsPerPixel=24 ]%%\n)
+       print
+      } if
+
+% if the Dithering-Method is default (gscmyk), change it to fscmyk
+% this is achieved by pushing a name/value-pair onto the stack
+% if the selected algorithm uses another ProcessColorModel, it is necessary
+% to change the Value of STCcolor according to the new algorithm.
+
+     STCold /Dithering get (gscmyk) eq
+     {
+        /Dithering (hscmyk) % preferred dithering-method
+     } if % might be necessary to change STCcolor too
+
+%
+% select the array according to the resolution
+%
+     STCdpi 359.0 lt
+     { STCdeftransfer }
+     { STCdpi 361.0 lt
+       { STCKtransfer360 }
+       { STCdpi 719.0 gt
+         { STCKtransfer720 }
+         {
+           STCKtransfer360 length STCKtransfer720 length eq
+           {
+             0 1 STCKtransfer360 length 1 sub
+             {
+               dup dup
+               STCKtransfer360 exch get
+               exch STCKtransfer720 exch get
+               add 2.0 div
+               STCKtransfer360 3 1 roll put
+             } for
+           }if
+           STCKtransfer360
+         } ifelse
+       }ifelse
+     } ifelse
+     /STCtransfer exch def
+
+%
+% Add the arrays. With Version 1.17 and above, it seems to be
+% a good idea, to use the transfer-arrays as coding-arrays too.
+%
+
+%
+% RGB-Model requires inversion of the transfer-arrays
+%
+     STCcolor /DeviceRGB eq
+     {
+        /RGBtransfer STCtransfer length array def
+        0 1 STCtransfer length 1 sub
+        {
+          dup RGBtransfer length 1 sub exch sub exch
+          STCtransfer exch get 1.0 exch sub
+          RGBtransfer 3 1 roll put
+        } for
+
+        /Rtransfer RGBtransfer
+        /Gtransfer RGBtransfer
+        /Btransfer RGBtransfer
+
+        /Rcoding   RGBtransfer
+        /Gcoding   RGBtransfer
+        /Bcoding   RGBtransfer
+
+     }{
+
+       /Ctransfer STCtransfer
+       /Mtransfer STCtransfer
+       /Ytransfer STCtransfer
+       /Ktransfer STCtransfer
+
+       /Ccoding   STCtransfer
+       /Mcoding   STCtransfer
+       /Ycoding   STCtransfer
+       /Kcoding   STCtransfer
+
+     } ifelse
+
+     counttomark 0 ne
+        {currentdevice putdeviceprops pop}{cleartomark}ifelse
+
+% decativate predefined correction
+
+     {} dup dup currenttransfer setcolortransfer
+
+  }{
+    (%%[ stcolor.ps: currentdevice is not stcolor - ignored ]%%\n) print
+  } ifelse
+}{
+  (%%[ stcolor.ps: not interpreted by AFPL Ghostscript - ignored ]%%\n) print
+} ifelse



More information about the tex-live-commits mailing list