%D \module
%D   [       file=enco-pfr,
%D        version=2000.12.10, % adapted 2005.08.14 to more delayed loading
%D          title=\CONTEXT\ Encoding Macros,
%D       subtitle=PDF Font Resource Inclusion,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%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\pdffontresource\undefined\else\endinput\fi

\writestatus{loading}{Context Encoding Macros (pdf)}

%D This is an experimental module in which we implement
%D font resource inclusion in \PDF. One reason to include
%D font resources is that it enables a search engine to
%D perform a search (I'm told). This feature ws requested by
%D Petr Ferdus from Czech.

%D A simple test file may look like this (watch how we first
%D load the encoding and then the font; previous font
%D definitions are left untouched.)
%D
%D \starttyping
%D % output=pdftex interface=en
%D
%D \useencoding[pfr]
%D \setupbodyfont[csr]
%D
%D \starttext
%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
%D   test \`z \'z \bf test \sl test \bs quite funny \`z \page
%D \stoptext
%D \stoptyping
%D
%D We do our best to include a (often large) font resources
%D only once. The current implementation is not that
%D general which is also due to the fact that \type
%D {\pdffontattr} is expanded instantly and persistent. A
%D more versatile (but also slower) approach is to keep track
%D of the fonts and either flush the information at shipout
%D time, or at the end of the document.

\unprotect

%D \macros
%D   {ifincludepdffontresources}
%D
%D You can turn of this feature using the following switch.

\newif\ifincludepdffontresources \includepdffontresourcestrue

% a problem is that there is always an ec vector added even when
% we switch to texnansi early; this has to do with the fact that
% we need to setup fonts at startup; this a pain when we have
% textless documents, so we should have a way around, i.e. an
% extension to pdftex where we can tag numbers inside user specs
% and attributes.
%
% currently we need to use immediate so we end up with entries

%D The name of the resource is stored in a macro, as is its
%D object reference. A resource is only processed once. When
%D done, the resource name is erased, and we use this fact to
%D prevent redefinition as well as well as reloading. So, a
%D macro defined with \type {\pdffontfileresource} can have
%D three states:
%D
%D \startitemize[packed]
%D \item undefined: not yet loaded, and not yet included
%D \item some value: loaded, but not yet included
%D \item empty: loaded, and already included
%D \stopitemize

\def\pdffontresource    {pdfr:\currentencoding}
\def\pdffontfileresource{pdff:\pdffontresource}

%D A resource is defined in a file prefixed by \type {pdfr-}.
%D The following \PDF\ code is composed by Ondrej Koala Vacha (I
%D probably mispelled this name).
%D
%D \starttyping
%D \startpdffontresource[il2]
%D /CIDInit /ProcSet findresource begin
%D 12 dict begin
%D   begincmap
%D     /CIDSystemInfo
%D       << /Registry (Adobe)
%D          /Ordering (T1UV)
%D          /Supplement 0
%D       >> def
%D     /CMapName /Adobe-Identity-UCS def
%D     /CMapType 1 def
%D     1 begincodespacerange
%D       <00> <FF>
%D     endcodespacerange
%D     %%FontSpecificEncoding
%D     191 beginbfrange
%D       <20> <20> <0020> % space         dec: 32 oct:040 hex:20
%D       .... .... ...... . ........      .... .. ....... ......
%D       <ff> <ff> <00ff> % dotaccent     dec:255 oct:377 hex:ff
%D     endbfrange
%D   endcmap
%D CMapName currentdict /CMap defineresource pop end
%D end
%D \stoppdffontresource
%D \stoptyping
%D
%D We don't preload such huge definitions, and process them
%D run||time to save memory. Therefore, in the encoding
%D vector, we only add an entry like:
%D
%D \starttyping
%D \startencoding [il2]
%D   \usepdffontresource il2
%D \stopencoding
%D \stoptyping
%D
%D This macro is defined as follows.

\def\usepdffontresource #1 %
  {\doifundefinedelse\pdffontfileresource % okay, undefined, so either
     {\setxvalue\pdffontfileresource{#1}} % brand new, or not yet loaded
     {\doifvaluesomething\pdffontfileresource  % only if not loaded in which
        {\setxvalue\pdffontfileresource{#1}}}} % case it's made empty

%D Watch how we check for duplicated loading. The resource
%D itself, when asked for, is included immediately, after which
%D we save its reference. Normally a document will have one
%D such a resource.

% \long\def\startpdffontresource[#1]#2\stoppdffontresource
%   {\doif{#1}\currentencoding
%     {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}

\long\def\startpdffontresource[#1]#2\stoppdffontresource
  {\doif{#1}\currentencoding{\doifdefined\pdffontresource
     {\immediate\pdfobj useobjnum \getvalue{\pdffontresource} stream {#2}}}}

%D The reference to such a vector is to be handled at font
%D definition time, which is why we hook it into the font
%D loading routine. A little bit of indirectness speeds up
%D the process when this feature is disabled and keeps the
%D macros readable.

% \newevery \everyfont \relax

\appendtoksonce \includepdffontresource \to \everyfont

\def\includepdffontresource
  {\ifincludepdffontresources
     \ifx\pdffontattr\undefined
       % we're not using (a recent version of) pdftex
     \else\ifcase\pdfoutput
       % we're not in pdf mode
     \else
       \doincludepdffontresource
     \fi\fi
   \fi}

\def\dododoincludepdffontresource#1% encoding
  {\bgroup
   \def\currentencoding{#1}%
   \doifvaluesomething\pdffontfileresource
     {\startreadingfile
        \readsysfile{pdfr-\getvalue\pdffontfileresource}\donothing\donothing
      \stopreadingfile
      \letgvalue\pdffontfileresource\empty}%
   \egroup}

\beginETEX

\def\doincludepdffontresource
  {\ifcsname\s!ucmap\fontfile\endcsname\else
     \dodoincludepdffontresource
   \fi}

\def\dodoincludepdffontresource
  {% does this font has an encoding specified vector
   \doifsomething\currentencoding % no \ifx
     {% is there a pdf font encoding resource file defined
      \ifcsname\pdffontresource\endcsname
        % (fake) object defined
      \else\ifcsname\pdffontfileresource\endcsname
        % is there a resource already included
        \doifsomething\pdffontfileresource
          {\pdfobj reserveobjnum {}%
           \setxvalue\pdffontresource{\the\pdflastobj}%
           \doglobal\appendetoks
             \noexpand\dododoincludepdffontresource{\currentencoding}%
           \to \everybeforeshipout}% prevent multiple loading
      \fi\fi
      \ifcsname\pdffontresource\endcsname
        \expanded{\pdffontattr\font{/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
        % do it only once for each font
        \letgvalue{\s!ucmap\fontfile}\empty
      \fi}}

\endETEX

\beginTEX

\def\doincludepdffontresource
  {\expandafter\ifcsname\s!ucmap\fontfile\endcsname\relax
     \dodoincludepdffontresource
   \fi}

\def\dodoincludepdffontresource
  {\doifsomething\currentencoding % no \ifx
     {\expandafter\ifx\csname\pdffontresource\endcsname\relax
        \expandafter\ifx\csname\pdffontfileresource\endcsname\relax\else
          \doifsomething\pdffontfileresource
            {\pdfobj reserveobjnum {}%
             \setxvalue\pdffontresource{\the\pdflastobj}%
             \doglobal\appendetoks
               \noexpand\dododoincludepdffontresource{\currentencoding}%
             \to \everybeforeshipout}% prevent multiple loading
        \fi
      \fi
      \expandafter\ifx\csname\pdffontresource\endcsname\relax\else
        \expanded{\pdffontattr\font{/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
        % do it only once for each font
        \letgvalue{\s!ucmap\fontfile}\empty
      \fi}}

\endTEX

%D For the moment, we keep this definition here, if only
%D because \type {\usepdffontencoding} is not defined in the
%D core. In the end, this will go to \type {enco-*.tex}.
%D
%D Test:
%D
%D \starttyping
%D \useencoding[pfr] \usetypescript[palatino][ec] \setupbodyfont[palatino]
%D
%D \starttext
%D fi ff ffi
%D \stoptext
%D \stoptyping

\startencoding [il2] \usepdffontresource il2 \stopencoding
\startencoding [ec]  \usepdffontresource ec  \stopencoding

\protect \endinput
