%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Module:    ZzTeX PostScript Facilities
%
% Synopsis:  This module contains any and all facilities that rely on
%            PostScript output.
%
% Author:    Paul C. Anagnostopoulos
% Created:   21 January 1994
%
% Copyright 1989--2020 by Paul C. Anagnostopoulos
% under The MIT License (opensource.org/licenses/MIT)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%                       Extra Encoded Characters
%                       ----- ------- ----------


\def \PSbackslash       {\char 134\relax}
\def \PSbar             {\char 138\relax}
\def \PSbullet          {\char 142\relax}
\def \PSbraceleft       {\char 137\relax}
\def \PSbraceright      {\char 139\relax}
\def \PScent            {\char 148\relax}
\def \PScopyright       {\char 145\relax}
\def \PScurrency        {\char 149\relax}
\def \PSdagger          {\char 140\relax}
\def \PSddagger         {\char 141\relax}
\def \PSdollar          {\char 131\relax}
\def \PSgreater         {\char 133\relax}
\def \PSless            {\char 132\relax}
\def \PSordfeminine     {\char 155\relax}
\def \PSordmasculine    {\char 156\relax}
\def \PSparagraph       {\char 143\relax}
\def \PSperthousand     {\char 157\relax}
\def \PSpolishL         {\char "A1\relax}
\def \PSpolishl         {\char "A2\relax}
\def \PSregistered      {\char 146\relax}
\def \PSsection         {\char 144\relax}
\def \PSsterling        {\char 158\relax}
\def \PStrademark       {\char 147\relax}
\def \PSunderscore      {\char 136\relax}
\def \PSudquote         {\char 135\relax}
\def \PSusquote         {\char 160\relax}
\def \PSyen             {\char 159\relax}

%                       Import EPS File
%                       ------ --- ----


% The illustration \special is compatible with DVIPSONE, and with TeXtures
% if clip? is false.
% The scale is interpreted as follows:
%   <= 33.333: normal scale, 1.0 = 100%
%    > 33.333: TeX scale factor, 1000 = 100%

\def \specialimportartfile #1#2#3{%             {name}{scale}{clip?}
  \special{illustration #1 scaled #2
           \if #3clip\fi}}

% This macro is a better variant of the preceding one. The scale
% argument is a true scale specified in points.

\def \specialplaceepsfile #1#2#3{%              {name}{scale}{clip?}
  {\tdimena = #2%
   \if \dimgtrp{\tdimena}{33.333pt}%            % Compensate for bizarre
     \multiply \tdimena by 1000\relax           % design of scaled option.
   \fi
   \special{illustration #1 scaled \thefactor\tdimena
            \if #3\space clip\fi}}}

% This macro is used to import an EPS file for a glyph. The scale
% is specified as a percentage IN POINTS.

\def \specialplaceglyph #1#2#3{%                {name}{percentage}{clip?}
  {\tdimena = #2%
   \divide \tdimena by 100
   \special{illustration #1 scaled \thefactor\tdimena
            \if #3\space clip\fi}}}

%                       Read EPS Bounding Box
%                       ---- --- -------- ---


\definedimen{\zbbxorigin}{0pt}
\definedimen{\zbbyorigin}{0pt}


{\catcode`\%=\catother
\gdef \zpercent {%}
} % \catcode

\edef \zboundingbox {\zpercent\zpercent BoundingBox}
\def \zatend {atend}
\definecount{\zbbstate}{0}


\def \zreadepsbb #1#2#3{%                       {\width}{\height}{file}
  \def \zbbinfo {}%
  \begingroup
    \zsetepscatcodes
    \openin \zreada #3\relax
    \zbbstate = 0
    \loop
      \read \zreada to \zline
      \ifeof \zreada
        \zbbstate = 2
      \else
        \expandafter\zcheckbb \zline:.\zmark
      \fi
    \ifnum \zbbstate < 2 \repeat
    \closein \zreada
  \endgroup
  \zsetbbsizes{#1}{#2}{#3}}

\def \zsetepscatcodes {%
  \catcoderange{0}{"1F}{\catcomment}%
  \catcode `\^^I = \catspace
  \catcode \endlinechar = \catendofline
  \uncatcode{\false}{\false}{\false}%
  \catcode `\: = \catother
  \catcoderange{"7E}{"FF}{\catcomment}}

\long \def \zcheckbb #1:#2#3\zmark{%
  \def \znext {#1}%
  \ifx \znext \zboundingbox
    \zcheckatend #2#3()\zmark
  \fi}

\long \def \zcheckatend #1(#2)#3\zmark{%
  \def \znext {#2}%
  \ifx \znext \zatend
    \zbbstate = 1
  \else
    \gdef \zbbinfo {#1}%
    \ifnum \zbbstate = 0 \zbbstate = 2\fi
  \fi}

\def \zsetbbsizes #1#2#3{%
  \if \emptydefp{\zbbinfo}%
    \warning{missbb}{Art file `#3' has no bounding box}%
    #1 = 20pc #2 = 10pc
  \else
    \expandafter \zcalcbb \zbbinfo \zmark{#1}{#2}%
  \fi}

\def \zcalcbb #1 #2 #3 #4 #5\zmark#6#7{%
  \calculate #6= {#3pt,-,#1pt,+,1pt}%
  \calculate #7= {#4pt,-,#2pt,+,1pt}%
  \global\zbbxorigin = #1pt
  \global\zbbyorigin = #2pt\relax}

%                       Rotate Boxes
%                       ------ -----


\def \rotatebox #1#2{%                                  {\box}{degrees}
  \special{CTM: push rotate #2}%
  \box #1%
  \special{CTM: pop}}

\def \rotatetext #1#2{%                                 {text}{degrees}
  \setbox \zboxa = \hbox{#1}%
  \rotatebox{\zboxa}{#2}}

%                       Colors
%                       ------


\def \colorspecial #1{%
  \if \allowcolor
    \special{#1}%
  \fi}

% These commands are called in the output routine to make sure that
% everything added in the output routine is black.

\def \zoutputbeginblack {%
  \colorspecial{color push gray 0}}

\def \zoutputendblack {%
  \colorspecial{color pop}}

%                       Color Block
%                       ---- ------


\defineblock{\color}{\endcolor}{\false}{}

%~block color Type
% \colorspec = {...}                    % Color specifier.
%~end

\definetoks{\colorspec}


\def \color #1{%                                        {type}
  \beginblockscope{color}%
  \global\increment \colordepth
  \processdesign{\color}{#1}%
  \global\increment \colornumber
  \colorspecial{color push}%
  \the\colorspec\zmark
  \if \vmodep \vpenalty{\breaknever}\fi}

\def \endcolor {%
  \global\decrement \colordepth
  \endblockscope{color}%
  \colorspecial{color pop}}


\def \setcolor #1{%
  \begingroup
  \processdesign{\color}{#1}%
  \the\colorspec\zmark
  \endgroup}

% Color specifiers:

\def \cmykcolor #1 #2 #3 #4\zmark{%                     c m y k\zmark
  \colorspecial{color cmyk #1 #2 #3 #4}}

\def \graycolor #1\zmark{%                              gray\zmark
  \colorspecial{color gray #1}}

\def \rgbcolor #1 #2 #3\zmark{%                         r g b\zmark
  \colorspecial{color rgb #1 #2 #3}}

% Built-in colors:

\def \colorblackdesign {%
  \colorspec = {\graycolor 0}}

\def \colorwhitedesign {%
  \colorspec = {\graycolor 1}}

\def \colorproofnotereddesign {%
  \colorspec = {\rgbcolor .5 0 0}}

% A useful shorthand:

\def \colortext #1#2{%                                  {color}{text}
  \color{#1}#2\endcolor}

%                       TeXtures
%                       --------


\def \TeXtures {%
  \input zztures\relax}
