supp-eps.mkii / last modification: 2020-01-30 14:15
%D \module
%D   [       file=supp-eps,
%D        version=1998.05.06,
%D          title=\CONTEXT\ Support Macros,
%D       subtitle=\EPS\ tools,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\ifx \undefined \writestatus \input supp-mis.tex \relax \fi

%D The macros in this module are rather old and were originally
%D part of the figure inclusion macros. When \PDFTEX\ started
%D to support \PDF\ inclusion, where some accompanying macros
%D were put in \type{supp-pdf}, I considered it more suitable
%D to give the \EPS\ macros their own module.

\writestatus{loading}{ConTeXt Support Macros / EPS}

%D \macros
%D   {dogetEPSboundingbox}
%D
%D The predecessors of the following macro's are derived from
%D Thomas Rockicky's macro's. They are rewritten to a more
%D compact form, made a bit more robust and also handle the
%D \type{HiResBoundingBox} and \type{ExactBoundingBox} that
%D are sometimes present.
%D
%D A bounding box has the form:
%D
%D \starttyping
%D %%BoundingBox: llx lly urx ury
%D \stoptyping
%D
%D Before we scan the file, we have to reset special
%D characters and set some others. The percentage symbol also
%D needs special treatment. When a bounding box is
%D encountered, we keep on scanning until no more directives
%D are found, i.e. a line is found that does not start with a
%D percentage symbol. We also abort scanning after finding a
%D high resolution bounding box.
%D
%D This method also works inside verbatim mode (like when we
%D are typesetting sources and putting eps coded logos into
%D a heading. Temporary restoring the \CATCODES\ is done in
%D the calling routine.
%D
%D The creator as well as external support for specials are
%D analyzed as well and their status is available in \type
%D {\EPScreator} and \type {\EPSshading}. The boundingbox
%D components are available in \type {\EPSllx} etc.

\unprotect

\def\EPSllx{0} \let\MPllx\EPSllx % just in case these
\def\EPSlly{0} \let\MPlly\EPSlly % are used while running
\def\EPSurx{0} \let\MPurx\EPSurx % in fast mode we set
\def\EPSury{0} \let\MPury\EPSury % them to 0.

\chardef\EPSfound  =0
\chardef\EPScreator=0
\chardef\EPSspecial=0
\chardef\EPSstatus =0

\let\EPScreatorstring\empty

\newtoks\extraEPSpreambleresets
\newtoks\extraEPSpreambleparsers

\def\dofinishEPSfile{\dofinishfile} % no \let, can be overloaded

\def\dogetEPSboundingbox#1#2#3#4#5%
  {\bgroup
   \global\chardef\EPSfound  \zerocount
   \global\chardef\EPScreator\zerocount
   \global\chardef\EPSspecial\zerocount
   \global\chardef\EPSstatus \zerocount
   \global\let\EPScreatorstring\empty
   \the\extraEPSpreambleresets
   \uncatcodespecials
   \catcode`\^^M=\@@ignore
   \def\doprocessEPSline
     {\advance\scratchcounter\plusone
      \expandafter\checkEPSboundingbox\fileline\empty\empty:.:.\end}%
   \scratchcounter\zerocount
   \doprocessfile\scratchread{#1}\doprocessEPSline
   \egroup
   % Using \EPSllx bp instead of \dimen0=1bp and \EPSllx\dimen0 is more accurate (.005pt).
   \ifnum\EPSfound>\zerocount
     #2\dimexpr\EPSllx\onebasepoint   \relax
     #3\dimexpr\EPSlly\onebasepoint   \relax
     #4\dimexpr\EPSurx\onebasepoint-#2\relax
     #5\dimexpr\EPSury\onebasepoint-#3\relax
   \else
     #2\zeropoint
     #3\zeropoint
     #4\zeropoint
     #5\zeropoint
   \fi
  %\message{[bbox #1: \EPSllx\space\EPSurx\space\EPSlly\space\EPSury]}\wait
   \global\let\MPllx\EPSllx \global\let\MPlly\EPSlly
   \global\let\MPurx\EPSurx \global\let\MPury\EPSury}

\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup

\def\EPSboundingboxtag     {BoundingBox}
\def\EPShiresboundingboxtag{HiResBoundingBox}
\def\EPSexactboundingboxtag{ExactBoundingBox}
\def\EPScreatortag         {Creator}
\def\EPSmetaposttag        {MetaPost}
\def\EPSmetapostspecialtag {MetaPostSpecial}
\def\EPSmetapostspecialstag{MetaPostSpecials}
\def\EPSpagetag            {Page}

\let\EPSspecialstring \empty
\let\EPSspecialcontent\empty

% new metapost construct (hires bb followed by creator + version)
%
%!PS
%%BoundingBox: -71 -1 651 496
%%HiResBoundingBox: -70.9945 -0.5 650.5 495.24907
%%Creator: MetaPost 0.901
%%CreationDate: 2005.06.02:1633
%%Pages: 1

\long\def\checkEPSboundingbox#1#2#3:#4:.#5\end
  {\if\string#1\letterpercent
     \if\string#2\letterpercent
       \edef\EPSspecialstring{#3}%
       \edef\EPSspecialcontent{#4}%
       \ifx\EPSspecialstring\EPScreatortag
         \getEPScreatorspec
       \else\ifx\EPSspecialstring\EPSboundingboxtag
         \getEPSboundingboxspec
         \global\chardef\EPSfound\plusone
       \else\ifx\EPSspecialstring\EPShiresboundingboxtag
         \getEPSboundingboxspec
         \global\chardef\EPSfound\plustwo
          \scratchcounter\zerocount
       \else\ifx\EPSspecialstring\EPSexactboundingboxtag
         \getEPSboundingboxspec
         \global\chardef\EPSfound\plustwo
         \scratchcounter\zerocount
       \else\ifx\EPSspecialstring\EPSmetapostspecialtag % only before finish!
         \global\chardef\EPSspecial\plusone % ah, we've met some MP extensions
       \else\ifx\EPSspecialstring\EPSmetapostspecialstag % only before finish!
         \global\chardef\EPSspecial\plusone % ah, we've met some MP extensions
       \else\ifx\EPSspecialstring\EPSpagetag
         \global\chardef\EPSstatus \plusone % we passed MP font defs
       \else
         \the\extraEPSpreambleparsers
       \fi\fi\fi\fi\fi\fi\fi
     \fi
   \else\ifnum\EPSfound>\zerocount
     % bb found
     \ifnum\EPScreator=\plusone % that is, we are dealing with MP output
       \ifcase\EPSstatus
         % we've run into MP fontdefs
       \or
         \dofinishEPSfile
       \fi
     \else\ifnum\scratchcounter>\plusthree
       % too late for mps creator (we don't want to run into crap data)
       \dofinishEPSfile
     \else
     \fi\fi
   \fi\fi}

\def\getEPSboundingboxspec
  {\edef\EPSspecialstring{\EPSspecialcontent\space . . . . }%
   \expandafter\dogetEPSboundingboxspec\EPSspecialstring\end}

\def\dogetEPSboundingboxspec#1 #2 #3 #4 #5\end
  {\gdef\EPSllx{#1}%
   \ifx\EPSllx\empty
     \dogetEPSboundingboxspec#2 #3 #4 #5\end
   \else
     \gdef\EPSlly{#2}%
     \gdef\EPSurx{#3}%
     \gdef\EPSury{#4}%
  \fi}

\def\getEPScreatorspec
  {\edef\EPSspecialstring{\EPSspecialcontent\space . .}%
   \expandafter\dogetEPScreatorspec\EPSspecialstring\end}

\def\dogetEPScreatorspec#1#2 #3\end
  {\edef\EPScreatorstring{#1#2}%
   \global\chardef\EPScreator\ifx\EPScreatorstring\EPSmetaposttag\plusone\else\zerocount\fi\relax}

\def\dogetEPSpreambledata#1% can be combined with \extraEPSpreambleparsers
  {\bgroup
   \let\dofinishEPSfile\relax % dirty trick, read past all bboxes
   \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
   \egroup}

\protect \endinput