% Copyright 2019 by Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.
%
% Adapted for colors and pdf resources by Hans Hagen. There can be a few more
% optimizations but they are not critital.

\pgfutil@format@is@contexttrue


% The aux files, needed for reading back coordinates
\def\pgfutil@aux@read@hook{%
  \pgfutil@IfFileExists{\jobname.pgf}{\input \jobname.pgf\relax}{}
  \csname newwrite\endcsname\pgfutil@auxout
  \immediate\csname openout\endcsname\pgfutil@auxout\jobname.pgf\relax
}
\def\pgfutil@writetoaux#1{\write\pgfutil@auxout{#1}}

% XColor-like support for ConTeXt

\def\pgfutil@definecolor#1#2#3{\csname pgfutil@emu@#2\endcsname{#1}#3\@nil}

\def\pgfutil@emu@rgb#1#2,#3,#4\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{rgb}{#2,#3,#4}}}
\def\pgfutil@emu@gray#1#2\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{gray}{#2}}}
\def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{\expandafter\def\csname\string\color@#1\endcsname{\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}}
\def\pgfutil@emu@RGB#1#2,#3,#4\@nil{%
    \begingroup
    \pgfmathdivide@{#2}{255}\let\pgfutil@emu@RGB@r\pgfmathresult
    \pgfmathdivide@{#3}{255}\let\pgfutil@emu@RGB@g\pgfmathresult
    \pgfmathdivide@{#4}{255}\let\pgfutil@emu@RGB@b\pgfmathresult
    \edef\pgf@marshal{\def\expandafter\noexpand\csname\string\color@#1\endcsname{%
        \noexpand\xcolor@{}{}{rgb}{\pgfutil@emu@RGB@r,\pgfutil@emu@RGB@g,\pgfutil@emu@RGB@b}}}%
    \expandafter\endgroup\pgf@marshal
}


% no need for x colors (users can load it if needed)
%\pgfutil@definecolor{white}{gray}{1}
%\pgfutil@definecolor{black}{gray}{0}
%\pgfutil@definecolor{gray}{gray}{0.5}
%\pgfutil@definecolor{red}{rgb}{1,0,0}
%\pgfutil@definecolor{green}{rgb}{0,1,0}
%\pgfutil@definecolor{blue}{rgb}{0,0,1}
%\pgfutil@definecolor{cyan}{rgb}{0,1,1}
%\pgfutil@definecolor{magenta}{rgb}{1,0,1}
%\pgfutil@definecolor{yellow}{rgb}{1,1,0}
%\pgfutil@definecolor{orange}{rgb}{1,0.5,0}
%\pgfutil@definecolor{violet}{rgb}{0.5,0,0.5}
%\pgfutil@definecolor{purple}{rgb}{0.75,0,0.25}
%\pgfutil@definecolor{brown}{rgb}{0.75,0.5,0.25}

\def\pgfutil@color#1{%
  \pgfutil@colorlet{.}{#1}%
  \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
  {%
    \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
    \pgfsysprotocol@bufferedtrue%
    \pgfsetcolor{.}%
    \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
  }%
  \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
  \aftergroup\pgfutil@reset@color%
}

\def\pgfutil@extractcolorspec#1#2{%
  \def#2{{#1}}%
}

\def\pgfutil@convertcolorspec#1#2#3{%
  \edef#3{\expandafter\expandafter\expandafter\pgfutil@emu@select\csname\string\color@#1\endcsname}%
}

\def\pgfutil@doifcolorelse#1#2#3{%
  \expandafter\ifx\csname\string\color@#1\endcsname\relax%
    \doifcolorelse{#1}{\let\pgf@next=\pgfutil@firstoftwo}{\let\pgf@next=\pgfutil@secondoftwo}%
  \else
    \let\pgf@next=\pgfutil@firstoftwo%
  \fi%
  \pgf@next{#2}{#3}%
}

\def\pgfutil@reset@color{%
  \pgfsysprotocol@getcurrentprotocol\pgfutil@emu@temp%
  {%
    \pgfsysprotocol@setcurrentprotocol\pgfutil@empty%
    \pgfsysprotocol@bufferedtrue%
    \pgfsetcolor{.}%
    \expandafter\pgfsys@outerinvoke\expandafter{\pgfsysprotocol@currentprotocol}%
  }%
  \pgfsysprotocol@setcurrentprotocol\pgfutil@emu@temp%
}

\expandafter\def\csname\string\color@.\endcsname{\xcolor@{}{}{rgb}{0,0,0}}

\def\pgfutil@colorlet#1#2{%
  \edef\pgf@marshal{#2}%
  \expandafter\pgfutil@in@\expandafter!\expandafter{\pgf@marshal}%
  \ifpgfutil@in@%
    % compute mixture
    {%
      \expandafter\pgfutil@emu@mix\pgf@marshal!white!\@nil%
      \xdef\pgf@marshal{\noexpand\def\expandafter\noexpand\csname\string\color@#1\endcsname{%
          \noexpand\xcolor@{}{}{rgb}{\pgf@sys@tonumber\pgf@xa,\pgf@sys@tonumber\pgf@xb,\pgf@sys@tonumber\pgf@xc}}}%
    }%
    \pgf@marshal%
  \else%
    \expandafter\ifx\csname\string\color@#2\endcsname\relax%
      \pgfutil@registercolor{#2}%
    \fi%
    \edef\pgf@marshal{\noexpand\let\expandafter\noexpand\csname\string\color@#1\endcsname=%
                      \expandafter\noexpand\csname\string\color@#2\endcsname}%
    \pgf@marshal%
  \fi%
}

\def\pgfutil@emu@mix#1!#2!#3!#4\@nil{%
  \expandafter\ifx\csname\string\color@#1\endcsname\relax%
    \pgfutil@registerrgb{#1}%
  \fi%
  \expandafter\ifx\csname\string\color@#3\endcsname\relax%
    \pgfutil@registerrgb{#3}%
  \fi%
  \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#1\endcsname%
  \pgf@ya=\pgf@xa%
  \pgf@yb=\pgf@xb%
  \pgf@yc=\pgf@xc%
  \expandafter\expandafter\expandafter\pgfutil@emu@unpack\csname\string\color@#3\endcsname%
  \c@pgf@counta=#2\relax%
  \c@pgf@countb=100\relax%
  \advance\c@pgf@countb by-\c@pgf@counta\relax%
  \pgf@xa=\c@pgf@countb\pgf@xa%
  \advance\pgf@xa by\c@pgf@counta\pgf@ya%
  \divide\pgf@xa by 100\relax%
  \pgf@xb=\c@pgf@countb\pgf@xb%
  \advance\pgf@xb by\c@pgf@counta\pgf@yb%
  \divide\pgf@xb by 100\relax%
  \pgf@xc=\c@pgf@countb\pgf@xc%
  \advance\pgf@xc by\c@pgf@counta\pgf@yc%
  \divide\pgf@xc by 100\relax%
}

\def\pgfutil@emu@unpack#1#2#3#4#5{%
  \pgfutil@emu@@unpack#5\@nil%
}

\def\pgfutil@emu@@unpack#1,#2,#3\@nil{%
  \pgf@xa=#1pt%
  \pgf@xb=#2pt%
  \pgf@xc=#3pt%
}

\def\pgfutil@emu@select#1#2#3#4#5{#5}

\def\XC@tgt@mod#1{#1}
\def\XC@sdef#1#2{\edef#1{#2}}
\def\XC@mod@cmyk{cmyk}
\def\XC@mod@rgb{rgb}

% goody

\let\colorlet=\pgfutil@colorlet

% latex stuff

\newskip\pgfutil@flushglue
\pgfutil@flushglue=0pt plus 1fil


% pgfutil@minipage

\def\pgfutil@minipage[#1]#2{%
  \hbox to#2\bgroup
    \hsize=#2\relax
    \vbox\bgroup
      \noindentation
}

\def\pgfutil@endminipage{%
    \egroup
  \egroup
}

% global colors

\let\pgfutil@globalcolorsfalse\relax
\let\pgfutil@globalcolorstrue \relax

% font stuff

\def\pgfutil@font@tiny        {\tfxx}
\def\pgfutil@font@scriptsize  {\tfxx}
\def\pgfutil@font@footnotesize{\tfx}
\def\pgfutil@font@small       {\tfx}
\def\pgfutil@font@normalsize  {\tf}
\def\pgfutil@font@large       {\tfa}
\def\pgfutil@font@Large       {\tfb}
\def\pgfutil@font@huge        {\tfc}
\def\pgfutil@font@Huge        {\tfc}
\def\pgfutil@font@itshape     {\it}
\def\pgfutil@font@bfseries    {\bf}
\def\pgfutil@font@normalfont  {\tf}
\def\pgfutil@selectfont       {\tf}

% registers

\newcount\pgfutil@tempcnta
\newcount\pgfutil@tempcntb

\newbox  \pgfutil@tempboxa

\newbox  \pgfutil@voidb@x
\newtoks \pgfutil@toks@

\let\pgfmath@tempdima\pgfutil@tempdima
\let\pgfmath@tempdima\pgfutil@tempdima
\let\pgfmath@tempcnta\pgfutil@tempcnta
\let\pgfmath@tempcntb\pgfutil@tempcntb

% module stuff

\def\pgfutil@usemodule#1{\usemodule[#1]}

% more adaptions

\let\pgfutil@insertatbegincurrentpagefrombox\flushatshipout
\let\pgfutil@insertatbegincurrentpage       \flushatshipout
\def\pgfutil@insertatbegineverypage         #1{\appendtoks#1\to\everyshipout} % space removed after #1

\let\pgfutil@setuppdfresources \relax

\doifmodeelse {mkiv} {

    \def\pgfutil@guessdriver{\def\pgfsysdriver{pgfsys-luatex.def}}

    \def\pgfutil@driver@if@in#1#2{%
        \edef\pgf@marshal{\noexpand\pgfutil@in@{#1}{\preloadedspecials}}%
        \pgf@marshal
        \ifpgfutil@in@
            \def\pgfsysdriver{#2}%
        \fi
    }

    \def\pgf@sys@pdf@pdfbackendset@one#1#2%
      {\normalexpanded{\noexpand\pgf@sys@pdf@pdfbackendset@two\noexpand#1#2\relax}}

    \def\pgf@sys@pdf@pdfbackendset@two#1/#2 #3\relax
      {#1{#2}{#3}}

    \def\pgf@sys@pdf@addtopageresource@pattern   {\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetpattern}
    \def\pgf@sys@pdf@addtopageresource@colorspace{\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetcolorspace}
    \def\pgf@sys@pdf@addtopageresource@extgstate {\pgf@sys@pdf@pdfbackendset@one\pdfbackendsetextgstate}
    \def\pgf@sys@pdf@possible@resources          {\pdfbackendcurrentresources}
    \def\pgf@sys@pdf@check@resources             {}

    \let\pgfutil@registercolor\pgf@context@registercolor
    \let\pgfutil@registerrgb  \pgf@context@registerrgb
    \let\pgfutil@registercmyk \pgf@context@registercmyk
    \let\pgfutil@registergray \pgf@context@registergray

} {
    \def\pgf@sys@pdf@addtopageresource@extgstate  {\appendtoPDFdocumentextgstates }
    \def\pgf@sys@pdf@addtopageresource@colorspace {\appendtoPDFdocumentcolorspaces}
    \def\pgf@sys@pdf@addtopageresource@pattern    {\appendtoPDFdocumentpatterns   }
    \def\pgf@sys@pdf@possible@resources           {\currentPDFresources}
    \def\pgf@sys@pdf@check@resources              {}


    \ifx\pdfoutput\undefined\newcount\pdfoutput\fi
    \ifx\pdfoutput\relax    \newcount\pdfoutput\fi

    \def\pgfutil@guessdriver{
      \ifx\XeTeXversion\@undefined
        \ifx\preloadedspecials\@undefined%
          \ifcase\pdfoutput%
            \def\pgfsysdriver{pgfsys-dvips.def}%
          \else%
            \def\pgfsysdriver{pgfsys-pdftex.def}% pdfTeX & LuaTeX
          \fi%
        \else%
          \pgfutil@driver@if@in{postscript}{pgfsys-dvips.def}
          \pgfutil@driver@if@in{tpd}{pgfsys-pdftex.def}
          \pgfutil@driver@if@in{dpm}{pgfsys-dvipdfm.def}
          \pgfutil@driver@if@in{dpx}{pgfsys-dvipdfmx.def}
          \pgfutil@driver@if@in{xetex}{pgfsys-xetex.def}
          \ifx\pgfsysdriver\relax%
            \PackageWarning{pgf}{I was not able to discern the driver, the
              preloaded specials were \preloadedspecials. I am going to use
              pgfsys-dvips.def}%
            \def\pgfsysdriver{pgfsys-dvips.def}
          \fi%
        \fi
      \else
        \def\pgfsysdriver{pgfsys-xetex.def}% should be right
      \fi
    }

    \def\pgfutil@driver@if@in#1#2{%
      \edef\pgf@marshal{\noexpand\pgfutil@in@{#1}{\preloadedspecials}}%
      \pgf@marshal
      \ifpgfutil@in@
        \def\pgfsysdriver{#2}%
      \fi
    }

    % The cmyk part is from Joseph Wright.
    % See tex.stackexchange.com/questions/27952/cmyk-context-colors-in-tikz
    \def\pgfutil@registercolor#1{%
      \edef\pgf@temp{\PDFcolor{#1}}%
      \edef\pgf@marshal{\noexpand\pgfutil@in@{rg}{\pgf@temp}}%
      \pgf@marshal
      \ifpgfutil@in@
        \expandafter\pgfutil@context@parse@rgb\pgf@temp\pgf@stop{#1}%
      \else
        \edef\pgf@marshal{\noexpand\pgfutil@in@{g}{\pgf@temp}}%
        \pgf@marshal
        \ifpgfutil@in@
          \expandafter\pgfutil@context@parse@gray\pgf@temp\pgf@stop{#1}%
        \else
          \edef\pgf@marshal{\noexpand\pgfutil@in@{k}{\pgf@temp}}%
          \pgf@marshal
          \ifpgfutil@in@
            \expandafter\pgfutil@context@parse@cmyk\pgf@temp\pgf@stop{#1}%
          \else
            \pgferror{Color #1 has an unsupported color model.}%
            \pgfutil@definecolor{#1}{gray}{0}%
          \fi
        \fi
      \fi
    }

    \def\pgfutil@context@parse@gray#1 g#2\pgf@stop#3{%
      \pgfutil@definecolor{#3}{gray}{#1}
    }

    \def\pgfutil@context@parse@rgb#1 #2 #3 rg#4\pgf@stop#5{%
      \pgfutil@definecolor{#5}{rgb}{#1,#2,#3}
    }

    \def\pgfutil@context@parse@cmyk#1 #2 #3 #4k#5\pgf@stop #6{%
      \pgfutil@definecolor{#6}{cmyk}{#1,#2,#3,#4}%
    }

    \def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{%
      \expandafter\def\csname\string\color@#1\endcsname
        {\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}%
    }

    \let\pgfutil@registerrgb  \pgfutil@registercolor
    \let\pgfutil@registercmyk \pgfutil@registercolor
    \let\pgfutil@registergray \pgfutil@registercolor


}

\let\pgf@sys@addpdfresource@extgs@plain      \pgf@sys@pdf@addtopageresource@extgstate
\let\pgf@sys@addpdfresource@patterns@plain   \pgf@sys@pdf@addtopageresource@pattern
\let\pgf@sys@addpdfresource@colorspaces@plain\pgf@sys@pdf@addtopageresource@colorspace
\let\pgf@sys@pdf@check@resources@plain       \pgf@sys@pdf@check@resources

\pgf@sys@addpdfresource@colorspaces@plain{/pgfprgb [/Pattern /DeviceRGB]}

% do something at the end of a job

\appendtoks \the\pgfutil@everybye \to \everybye

\long\def\AtBeginDocument#1{\appendtoks#1\to\everystarttext}%

% pgfcalendar uses translations

\def\pgfutil@translate#1{#1} % \translate works very different in ConTeXt

% e-TeX primitives and beyond

\let\pgfutil@protected\normalprotected
\let\pgfutil@unexpanded\normalunexpanded
% the check for the availability of \expanded primitive is done in pgfkeys
\let\pgfutil@expanded\normalexpanded

\endinput
