% \iffalse meta-comment
%
%Copyright (c) 2018-2019 David Purton <dcpurton@marshwiggle.net>
%
%This work may be distributed and/or modified under the conditions of
%the LaTeX Project Public License, either version 1.3c of this license
%or (at your option) any later version. The latest version of this
%license is in
%   http://www.latex-project.org/lppl.txt
%and version 1.3c or later is part of all distributions of LaTeX
%version 2005/12/01 or later.
%
%<*driver>
\documentclass[a4paper]{l3doc}
\usepackage{microtype}
\usepackage{pgf-cmykshadings}
\usepackage{tikz}
\usepackage{listings}
\lstset{frame=single,basicstyle=\footnotesize\ttfamily}
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \changes{v1.0}{2018/10/17}{First public release}
% \changes{v1.2}{2019/11/05}{Deprecate package}
%
% \title{The \pkg{pgf-cmykshadings} package}
% \author{David Purton\thanks{Email: \url{dcpurton@marshwiggle.net}}}
% \date{2019/11/05 v1.2}
%
% \maketitle
%
% \begin{abstract}
%   \textbf{Note: This package is now deprecated. Support for CMYK and grayscale
%   shadings was added to \pkg{pgf} in version 3.1.3. Attempting to load it with
%   recent versions of \pkg{pgf} only changes the default shading colour model
%   with the \pkg{xcolor} |natural| colour model to CMYK. This documentation
%   applies to versions of \pkg{pgf} prior to 3.1.3.}\medskip
%
%   The \pkg{pgf-cmykshadings} package provides support for CMYK and grayscale
%   shadings for the \pkg{pgf} package. By default \pkg{pgf} only supports RGB
%   shadings. \pkg{pgf-cmykshadings} attempts to produce shadings consistent
%   with the currently selected \pkg{xcolor} colour model. The |rgb|, |cmyk|,
%   and |gray| colour models from the \pkg{xcolor} package are supported.
% \end{abstract}
%
% \tableofcontents
%
% \begin{documentation}
%
% \section{Introduction}
%
% The \pkg{pgf} package, and other packages built on top of it, only support RGB
% shadings (colour gradients). This means that printing applications requiring
% CMYK shadings can not easily be produced. It also can lead to unexpected
% colour mismatches in documents when attempting to define a shading from
% colours defined in CMYK. This can occur when the |natural| colour model of the
% \pkg{xcolor} package is in use and colours like cyan and magenta are defined
% as CMYK. An attempt to produce a shading using these colours will be
% silently converted to RGB, but RGB cyan and RGB magenta look significantly
% different from CMYK cyan and magenta. This is a significant cause of
% confusion for end users.
%
% The following example illustrates this problem and the corresponding solution
% provided by the \pkg{pgf-cmykshadings} package.
%
% \begin{quote}
% \iffalse
%<*example>
% \fi
\begin{lstlisting}
\begin{tikzpicture}
  \fill[cyan] (0,0) rectangle (1,1);
  \shade[left color=cyan, right color=magenta]
    (1.25,0) rectangle (3.75,1);
  \fill[magenta] (4,0) rectangle (5,1);
\end{tikzpicture}
\end{lstlisting}
% \iffalse
%</example>
% \fi
%
%   \begin{minipage}{0.45\linewidth}
%   \pkg{pgf} behaviour:\medskip
%
%   \pgfcmykshadingdefaultfalse
%   \begin{tikzpicture}
%     \fill[cyan] (0,0) rectangle (1,1);
%     \shade[left color=cyan, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}\hfill
%   \begin{minipage}{0.45\linewidth}
%   \pkg{pgf-cmykshadings} behaviour:\medskip
%
%   \pgfcmykshadingdefaulttrue
%   \begin{tikzpicture}
%     \fill[cyan] (0,0) rectangle (1,1);
%     \shade[left color=cyan, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}
% \end{quote}
%
% \section{Acknowledgements}
%
% Substantial parts of the code for the \pkg{pgf-cmykshadings} package are
% taken from the \pkg{pgf} package file |pgfcoreshade.code.tex| along with the
% driver files |pgfsys-*.def| copyright © 2006 Till Tantau and then slightly
% modified to support CMYK and grayscale shadings.
%
% \section{Bug Reports and Feature Requests}
%
% Bug reports and feature requests can be made at the \pkg{pgf-cmykshadings}
% package GitHub respoitory. See
% \url{https://github.com/dcpurton/pgf-cmykshadings}.
%
% \section{Documentation}
%
% \subsection{Basic Usage}
%
% All that is required to use CMYK shadings instead of RGB shadings is to
% include the package in your document preamble:
% \begin{quote}
% \iffalse
%<*example>
% \fi
\begin{lstlisting}
\usepackage{pgf-cmykshadings}
\end{lstlisting}
% \iffalse
%</example>
% \fi
% \end{quote}
% However, there are some caveats in using the package, which are outlined
% below.
%
% \subsubsection{Package options}
%
% \pkg{pgf-cmykshadings} supports the following package options:
%
% \begin{description}
%   \item[\mdseries |cmyk|] (default) to use CMYK shadings when the \pkg{xcolor}
%     package |natural| colour model is in use.
%   \item[\mdseries |rgb|] to use RGB shadings when the \pkg{xcolor} package
%     |natural| colour model is in use.
% \end{description}
%
% \subsubsection{Load order}
%
% \pkg{pgf-cmykshadings} should be loaded \emph{before} any shadings are defined
% otherwise these will be defined as RGB. This means you should load
% \pkg{pgf-cmykshadings} before (for example) \pkg{tikz} and \pkg{beamer}.
%
% If you want to pass custom options to \pkg{xcolor} (e.g., a colour model or
% set of named colours), you should load \pkg{pgf-cmykshadings} \emph{after}
% \pkg{xcolor} or use \cs{PassOptionsToPackage} \emph{before} loading
% \pkg{pgf-cmykshadings}.
%
% \subsubsection{Colour models}
%
% \pkg{pgf-cmykshadings} attempts to produce shadings consistent with the
% currently selected \pkg{xcolor} package colour model. The |rgb|, |cmyk|, and
% |gray| colour models from the \pkg{xcolor} package are supported.
%
% \textbf{Note:} The colour model chosen for a shading is based on the
% \pkg{xcolor} colour model \emph{at the time the shading is created}. This is
% either when \cs{pgfdeclare*shading} is called with no optional argument or
% when \cs{pgfuseshading} is called if \cs{pgfdeclare*shading} was called with
% an optional argument.
%
% If the \pkg{xcolor} package |natural| colour model is in use then the shading
% colour model will be CMYK by default (equivalent to passing the |cmyk| option
% to the \pkg{pgf-cmykshadings} package). RGB shadings can be output by default
% instead by passing the |rgb| option to the \pkg{pgf-cmykshadings} package.
%
% In practice this means that if you are using the |natural| colour model of the
% \pkg{xcolor} package you can still get mismatched colours if you, for example,
% create a shading from green (which is defined as RGB) to magenta (which is
% defined as CMYK). The shading has to pick one colour model and will look
% different to one of the solid colours.
%
% For this reason it is recommended to always load the \pkg{xcolor} package
% before the \pkg{pgf-cmykshadings} package with either the |rgb|, |cmyk|, or
% |gray| options to avoid colour surprises.
%
% \begin{quote}
% \iffalse
%<*example>
% \fi
\begin{lstlisting}
\begin{tikzpicture}
  \fill[green] (0,0) rectangle (1,1);
  \shade[left color=green, right color=magenta]
    (1.25,0) rectangle (3.75,1);
  \fill[magenta] (4,0) rectangle (5,1);
\end{tikzpicture}
\end{lstlisting}
% \iffalse
%</example>
% \fi
%
%   \begin{minipage}{0.45\linewidth}
%   \pkg{xcolor} |natural| colour model:\medskip
%
%   \begin{tikzpicture}
%     \fill[green] (0,0) rectangle (1,1);
%     \shade[left color=green, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}\hfill
%   \begin{minipage}{0.45\linewidth}
%   \pkg{xcolor} |cmyk| colour model:\medskip
%
%   \selectcolormodel{cmyk}
%   \begin{tikzpicture}
%     \fill[green] (0,0) rectangle (1,1);
%     \shade[left color=green, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}\medskip
%
%   \begin{minipage}{0.45\linewidth}
%   \pkg{xcolor} |rgb| colour model:\medskip
%
%   \selectcolormodel{rgb}
%   \begin{tikzpicture}
%     \fill[green] (0,0) rectangle (1,1);
%     \shade[left color=green, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}\hfill
%   \begin{minipage}{0.45\linewidth}
%   \pkg{xcolor} |gray| colour model:\medskip
%
%   \selectcolormodel{gray}
%   \begin{tikzpicture}
%     \fill[green] (0,0) rectangle (1,1);
%     \shade[left color=green, right color=magenta]
%       (1.25,0) rectangle (3.75,1);
%     \fill[magenta] (4,0) rectangle (5,1);
%   \end{tikzpicture}
%   \end{minipage}
% \end{quote}
%
% \subsubsection{Functional shadings}
%
% By nature, the PostScript® code used to generate functional shadings must
% output either RGB or CMYK data. For this reason,
% \cs{pgfdeclarefunctionalshading} is \emph{not} portable across colour models.
%
% Take particular care that the same colour model is in use at declaration time
% and use time for functional shadings declared with an optional argument as
% otherwise the PostScript® data will not match the declared colour space and
% you will end up with a malformed PDF.
%
% This also means that you should \emph{not} use the functional shadings from
% the \pkg{tikz} shading library (|bilinear interpolation|, |color wheel|,
% |color wheel black center|, |color wheel white center|, and |Mandelbrot set|)
% except when the \pkg{xcolor} |rgb| colour model is in use, otherwise you will
% end up with a malformed PDF.
%
% Having said this, it \emph{is} possible to create portable functional shadings
% by providing conditional code to append colour transformations to the
% PostScript® data. A variety of \cs{pgffuncshading*to*} (e.g.,
% \cs{pgffuncshadingrgbtocmyk}) macros along with \cs{ifpgfshadingmodel*} (e.g.,
% \cs{ifpgfshadingmodelcmyk}) conditionals are provided to assist with these
% transformations.
%
% \begin{quote}
% \iffalse
%<*example>
% \fi
\begin{lstlisting}
\pgfdeclarefunctionalshading[black]{twospots}
    {\pgfpointorigin}{\pgfpoint{3.5cm}{3.5cm}}{}{
  2 copy
  45 sub dup mul exch
  40 sub dup mul 0.5 mul add sqrt
  dup mul neg 1.0005 exch exp 1.0 exch sub
  3 1 roll
  70 sub dup mul .5 mul exch
  70 sub dup mul add sqrt
  dup mul neg 1.002 exch exp 1.0 exch sub
  1.0 3 1 roll
  \ifpgfshadingmodelcmyk
    \pgffuncshadingrgbtocmyk
  \fi
  \ifpgfshadingmodelgray
    \pgffuncshadingrgbtogray
  \fi
}
\end{lstlisting}
% \iffalse
%</example>
% \fi
%
% \pgfdeclarefunctionalshading[black]{twospots}
%     {\pgfpointorigin}{\pgfpoint{3.5cm}{3.5cm}}{}{
%   2 copy
%   45 sub dup mul exch
%   40 sub dup mul 0.5 mul add sqrt
%   dup mul neg 1.0005 exch exp 1.0 exch sub
%   3 1 roll
%   70 sub dup mul .5 mul exch
%   70 sub dup mul add sqrt
%   dup mul neg 1.002 exch exp 1.0 exch sub
%   1.0 3 1 roll
%   \ifpgfshadingmodelcmyk
%     \pgffuncshadingrgbtocmyk
%   \fi
%   \ifpgfshadingmodelgray
%     \pgffuncshadingrgbtogray
%   \fi
% }
%
% \begin{minipage}{0.3\linewidth}
%   \pkg{xcolor} |cmyk| model:\medskip
%
%   \selectcolormodel{cmyk}
%   \pgfuseshading{twospots}
% \end{minipage}\hfill
% \begin{minipage}{0.3\linewidth}
%   \pkg{xcolor} |rgb| model:\medskip
%
%   \selectcolormodel{rgb}
%   \pgfuseshading{twospots}
% \end{minipage}\hfill
% \begin{minipage}{0.3\linewidth}
%   \pkg{xcolor} |gray| model:\medskip
%
%   \selectcolormodel{gray}
%   \pgfuseshading{twospots}
% \end{minipage}
% \end{quote}
%
%
% \subsection{Main Interface}
%
% \subsubsection{Declaring shadings}
%
% The four standard \pkg{pgf} functions for declaring shadings are supported
% as documented in the \pkg{pgf} manual.
%
% There is one extension provided by the \pkg{pgf-cmykshadings} package. It is
% possible to specify CMYK colours directly in the colour specification
% argument using a syntax analogous to the RGB, Gray, and named colours
% already supported by the \pkg{pgf} package. i.e.,
% |cmyk(|\meta{position}|)=(|\meta{C}|,|\meta{M}|,|\meta{Y}|,|\meta{K}|)|.
%
% Shadings declared \emph{without} an optional argument are created
% immediately in the currently active \pkg{xcolor} colour model. Shadings
% declared \emph{with} and optional argument are created at the time they are
% actually used (using \cs{pgfuseshading}).
%
% \begin{function}{\pgfdeclarehorizontalshading}
%   \begin{syntax}
%     \cs{pgfdeclarehorizontalshading}\oarg{color list}\marg{shading name}\marg{shading height}\marg{color specification}
%   \end{syntax}
%   Declare a horizontal shading.
% \end{function}
%
% \begin{function}{\pgfdeclareverticalshading}
%   \begin{syntax}
%     \cs{pgfdeclareverticalshading}\oarg{color list}\marg{shading name}\marg{shading width}\marg{color specification}
%   \end{syntax}
%   Declare a vertical shading.
% \end{function}
%
% \begin{function}{\pgfdeclareradialshading}
%   \begin{syntax}
%     \cs{pgfdeclareradialshading}\oarg{color list}\marg{shading name}\marg{center point}\marg{color specification}
%   \end{syntax}
%   Declare a radial shading.
% \end{function}
%
% \begin{function}{\pgfdeclarefunctionalshading}
%   \begin{syntax}
%     \cs{pgfdeclarefunctionalshading}\oarg{color list}\marg{shading name}\marg{lower left corner}\marg{upper right corner}\marg{init code}\marg{type 4 function}
%   \end{syntax}
%   Declare a functional shading.
% \end{function}
%
% \subsubsection{Using shadings}
%
% Shadings are used as documented in the \pkg{pgf} manual.
%
% \begin{function}{\pgfuseshading}
%   \begin{syntax}
%     \cs{pgfuseshading}\marg{shading name}
%   \end{syntax}
%   Use a previously declared shading. If the specified shading was declared
%   with an optional argument, then the shading will be created at this point
%   in the currently active \pkg{xcolor} colour space.
% \end{function}
%
% \begin{function}{\pgfshadepath}
%   \begin{syntax}
%     \cs{pgfshadepath}\marg{shading name}\marg{angle}
%   \end{syntax}
%   Shade the currently active \pkg{pgf} path using the specified shading at
%   the specified angle.
% \end{function}
%
% \begin{function}{\pgfadditionalshadetransform}
%   \begin{syntax}
%     \cs{pgfadditionalshadetransform}\marg{transformation}
%   \end{syntax}
%   This command is used to specify an additional transformation that should
%   be applied to shadings when \cs{pgfshadepath} used.
% \end{function}
%
% \subsubsection{Utility functions}
%
% The following functions are mainly useful for in declaring functional
% shadings.
%
% \begin{function}{\pgfshadecolortorgb}
%   \begin{syntax}
%     \cs{pgfshadecolortorgb}\marg{color name}\marg{macro}
%   \end{syntax}
%   This command takes \meta{color name} as input and stores the colour's
%   red/green/blue components as real numbers between 0.0 and 1.0 separated by
%   spaces (which is exactly what you need if you want to push it on a stack)
%   in \meta{macro}. This macro can then be used inside the \meta{type 4
%   function} argument for \cs{pgfdeclarefunctionalshading}.
%
%   In addition, three macros suffixed with |red|, |green| and |blue| are
%   defined, which store the individual components of \meta{color name}. These
%   can also be used in the \meta{type 4 function} argument.
% \end{function}
%
% \begin{function}{\pgfshadecolortocmyk}
%   \begin{syntax}
%     \cs{pgfshadecolortocmyk}\marg{color name}\marg{macro}
%   \end{syntax}
%   This command is analogous to \cs{pgfshadecolortorgb}, but stores the
%   colour's cyan/magenta/yellow/black components. Four macros suffixed with
%   |cyan|, |magenta|, |yellow|, and |black| are also defined.
% \end{function}
%
% \begin{function}{\pgfshadecolortogray}
%   \begin{syntax}
%     \cs{pgfshadecolortogray}\marg{color name}\marg{macro}
%   \end{syntax}
%   This command is analogous to \cs{pgfshadecolortorgb}, but stores the
%   colour's gray component. Although it's not needed, for consistency a
%   second macro suffixed with |gray| is also defined.
% \end{function}
%
% \begin{function}{\pgffuncshadingrgbtocmyk}
%   \begin{syntax}
%     \cs{pgffuncshadingrgbtocmyk}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top 3 elements on the stack from RGB to CMYK. In combination with the
%   \cs{ifpgfshadingmodelcmyk} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\pgffuncshadingrgbtogray}
%   \begin{syntax}
%     \cs{pgffuncshadingrgbtogray}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top 3 elements on the stack from RGB to grayscale. In combination with the
%   \cs{ifpgfshadingmodelgray} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\pgffuncshadingcmyktorgb}
%   \begin{syntax}
%     \cs{pgffuncshadingcmyktorgb}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top 4 elements on the stack from CMYK to RGB. In combination with the
%   \cs{ifpgfshadingmodelrgb} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\pgffuncshadingcmyktogray}
%   \begin{syntax}
%     \cs{pgffuncshadingcmyktogray}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top 4 elements on the stack from CMYK to grayscale. In combination with
%   the \cs{ifpgfshadingmodelgray} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\pgffuncshadinggraytorgb}
%   \begin{syntax}
%     \cs{pgffuncshadinggraytorgb}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top element on the stack from grayscale to RGB. In combination with the
%   \cs{ifpgfshadingmodelrgb} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\pgffuncshadinggraytocmyk}
%   \begin{syntax}
%     \cs{pgffuncshadinggraytocmyk}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to convert the
%   top element on the stack from grayscale to CMYK. In combination with the
%   \cs{ifpgfshadingmodelcmyk} conditional this macro can be used to make
%   functional shading declarations more portable across colour models.
% \end{function}
%
% \begin{function}{\ifpgfshadingmodelrgb}
%   \begin{syntax}
%     \cs{ifpgfshadingmodelrgb}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
%   \pkg{xcolor} colour model is |rgb| \emph{at the time the shading is
%   created}. This can be used to ensure that the data output in the
%   \meta{type 4 function} correctly matches the active colour model.
% \end{function}
%
% \begin{function}{\ifpgfshadingmodelcmyk}
%   \begin{syntax}
%     \cs{ifpgfshadingmodelcmyk}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
%   \pkg{xcolor} colour model is |cmyk| \emph{at the time the shading is
%   created}. This can be used to ensure that the data output in the
%   \meta{type 4 function} correctly matches the active colour model.
% \end{function}
%
% \begin{function}{\ifpgfshadingmodelgray}
%   \begin{syntax}
%     \cs{ifpgfshadingmodelgray}
%   \end{syntax}
%   Within the \meta{type 4 function} argument of
%   \cs{pgfdeclarefunctionalshading}, this command can be used to test if the
%   \pkg{xcolor} colour model is |gray| \emph{at the time the shading is
%   created}. This can be used to ensure that the data output in the
%   \meta{type 4 function} correctly matches the active colour model.
% \end{function}
%
% \end{documentation}
%
% \begin{implementation}
%
% \section{Implementation}
%
% \subsection{Main Package}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesPackage{pgf-cmykshadings}%
  [2019/11/05
   CMYK and grayscale shadings support for PGF (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{pgf}
%    \end{macrocode}
%
% Set colour model to CMYK by default if version of \pkg{pgf} is at least
% 3.1.3 then |\endinput|.
%
%    \begin{macrocode}
\@ifpackagelater{pgf}{2019/05/14}{%
  \PackageWarning{pgf-cmykshadings}{%
    Package `pgf-cmykshadings' is now deprecated.}%
  \newif\ifpgfcmykshadingdefault
  \DeclareOption{cmyk}{%
    \pgfcmykshadingdefaulttrue
  }
  \DeclareOption{rgb}{%
    \pgfcmykshadingdefaultfalse
  }
  \ExecuteOptions{cmyk}
  \ProcessOptions\relax
  \def\pgf@setup@shading@model{%
    \pgfshadingmodelrgbtrue
    \pgfshadingmodelcmykfalse
    \pgfshadingmodelgrayfalse
    \XC@sdef\pgf@mod@test{\XC@tgt@mod{natural}}%
    \def\pgf@shading@device{/DeviceRGB}%
    \def\pgf@shading@ps@device{setrgbcolor}%
    \def\pgf@shading@functional@range{0 1 0 1 0 1}%
    \def\pgf@shading@model{rgb}%
    \ifx\pgf@mod@test\XC@mod@natural
      \ifpgfcmykshadingdefault
        \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
        \def\pgf@shading@device{/DeviceCMYK}%
        \def\pgf@shading@ps@device{setcmykcolor}%
        \def\pgf@shading@model{cmyk}%
        \pgfshadingmodelrgbfalse
        \pgfshadingmodelcmyktrue
      \else
        \def\pgf@shading@functional@range{0 1 0 1 0 1}%
        \def\pgf@shading@device{/DeviceRGB}%
        \def\pgf@shading@ps@device{setrgbcolor}%
        \def\pgf@shading@model{rgb}%
      \fi
    \fi
    \ifx\pgf@mod@test\XC@mod@cmyk
      \def\pgf@shading@device{/DeviceCMYK}%
      \def\pgf@shading@ps@device{setcmykcolor}%
      \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
      \def\pgf@shading@model{cmyk}%
      \pgfshadingmodelrgbfalse
      \pgfshadingmodelcmyktrue
    \fi
    \ifx\pgf@mod@test\XC@mod@gray
      \def\pgf@shading@device{/DeviceGray}%
      \def\pgf@shading@ps@device{setgray}%
      \def\pgf@shading@functional@range{0 1}%
      \def\pgf@shading@model{gray}%
      \pgfshadingmodelrgbfalse
      \pgfshadingmodelgraytrue
    \fi
    \edef\pgf@sys@driver@dvisvgm{pgfsys-dvisvgm.def}%
    \ifx\pgfsysdriver\pgf@sys@driver@dvisvgm
      \def\pgf@shading@model{rgb}%
    \fi
    \edef\pgf@sys@driver@texforht{pgfsys-tex4ht.def}%
    \ifx\pgfsysdriver\pgf@sys@driver@texforht
      \def\pgf@shading@model{rgb}%
    \fi
  }%
  \endinput}{}
%    \end{macrocode}
%
% \noindent Replace dependence on \cs{pgf@convertrgbstring} and
% \cs{pgf@rgbconv} with generic macros \cs{pgf@convertstring} and
% \cs{pgf@conv}.
%
%    \begin{macrocode}
\def\pgf@parsefunc#1{%
  \edef\temp{{#1}}%
  \expandafter\pgf@convertstring\temp%
  \edef\temp{{\pgf@conv}}%
  \expandafter\pgf@@parsefunc\temp}
%    \end{macrocode}
%
% \noindent Replace RGB parsing macros with new macros selected on the basis
% of the current colour space (\cs{pgf@shading@mode}).
%
%    \begin{macrocode}
\def\pgf@@parsefunc#1{%
  \let\pgf@bounds=\pgfutil@empty%
  \let\pgf@funcs=\pgfutil@empty%
  \let\pgf@psfuncs=\pgfutil@empty%
  \let\pgf@encode=\pgfutil@empty%
  \let\pgf@sys@shading@ranges=\pgfutil@empty%
  \pgf@sys@shading@range@num=0\relax%
  \csname pgf@parsefirst\pgf@shading@model\endcsname[#1; ]%
  \csname pgf@parselastdom\pgf@shading@model\endcsname[#1; ]%
  \csname pgf@parsemid\pgf@shading@model\endcsname[#1; ]%
  \ifx\pgf@bounds\pgfutil@empty%
    \edef\pgf@pdfparseddomain{0 1}%
    \edef\pgf@pdfparsedfunction{\pgf@singlefunc\space}%
  \else%
    \edef\pgf@pdfparseddomain{\pgf@doma\space\pgf@domb}%
    \edef\pgf@pdfparsedfunction{%
      << /FunctionType 3 /Domain [\pgf@doma\space\pgf@domb] /Functions
      [\pgf@funcs\space] /Bounds [\pgf@bounds] /Encode [0 1 \pgf@encode]
      >> }% <<
  \fi%
  \xdef\pgf@psfuncs{\pgf@psfuncs}%
  }
%    \end{macrocode}
%
% \noindent Define RGB parsing macros.
%
%    \begin{macrocode}
\let\pgf@parsefirstrgb\pgf@parsefirst
\let\pgf@parselastdomrgb\pgf@parselastdom
\let\pgf@parsemidrgb\pgf@parsemid
\let\pgf@parserestrgb\pgf@parserest
%    \end{macrocode}
%
% \noindent Define new CMYK parsing macros.
%
%    \begin{macrocode}
\def\pgf@parsefirstcmyk[cmyk(#1)=(#2,#3,#4,#5)#6]{%
  \pgfmathsetlength\pgf@x{#1}%
  \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
  \pgf@sys@bp@correct\pgf@x%
  \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
  \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
  \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
  \edef\pgf@sys@shading@start@cmyk{\pgf@sys@cmyk}%
  \let\pgf@sys@prevcolor=\pgf@sys@shading@start@cmyk%
  \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
  \edef\pgf@prevcolor{\pgf@cmyk}%
  \edef\pgf@firstcolor{\pgf@cmyk}}
\def\pgf@parselastdomcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
  \pgfutil@ifnextchar]{%
    \pgfmathsetlength\pgf@x{#1}%
    \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
    \pgf@max=\pgf@x\relax%
    \pgf@sys@bp@correct\pgf@x%
    \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
    \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
    \edef\pgf@sys@shading@end@cmyk{\pgf@sys@cmyk}%
    \pgfutil@gobble}{\pgf@parselastdomcmyk[}}
\def\pgf@parsemidcmyk[cmyk(#1)=(#2,#3,#4,#5); {\pgf@parserestcmyk[}
\def\pgf@parserestcmyk[cmyk(#1)=(#2,#3,#4,#5); {%
  \advance\pgf@sys@shading@range@num by1\relax%
  \pgfutil@ifnextchar]{%
    \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
    \edef\pgf@singlefunc{\space%
      << /FunctionType 2 /Domain [0 1] /C0
      [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
    \edef\pgf@funcs{\pgf@funcs\space%
      << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
      [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
    \edef\pgf@psfuncs{\pgf@prevx\space
      \pgf@cmyk\space \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
    \pgfmathsetlength\pgf@x{#1}%
    \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
      {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
    \edef\pgf@sys@prevpos{\the\pgf@x}%
    \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
    \pgfutil@gobble}{%
    \pgfmathsetlength\pgf@x{#1}%
    \pgf@getcmyktuplewithmixin{#2}{#3}{#4}{#5}%
    \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
      {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@cmyk}}}%
    \edef\pgf@sys@prevpos{\the\pgf@x}%
    \let\pgf@sys@prevcolor=\pgf@sys@cmyk%
    \edef\pgf@psfuncs{\pgf@prevx\space \pgf@cmyk\space
      \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
    \pgf@sys@bp@correct\pgf@x%
    \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
    \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
    \edef\pgf@encode{\pgf@encode\space0 1}%
    \edef\pgf@singlefunc{\space%
      << /FunctionType 2 /Domain [0 1] /C0
      [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
    \edef\pgf@funcs{\pgf@funcs\space%
      << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
      [\pgf@prevcolor] /C1 [\pgf@cmyk] /N 1 >> }% <<
    \edef\pgf@prevcolor{\pgf@cmyk}%
    \pgf@parserestcmyk[}}
\def\pgf@getcmyktuplewithmixin#1#2#3#4{%
  \pgfutil@definecolor{pgfshadetemp}{cmyk}{#1,#2,#3,#4}%
  \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
  \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
  \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
  \expandafter\pgf@getcmyk@@\pgf@cmykcolor!}
\def\pgf@getcmyk@@#1,#2,#3,#4!{%
  \def\pgf@cmyk{#1 #2 #3 #4}%
  \def\pgf@sys@cmyk{{#1}{#2}{#3}{#4}}%
}
%    \end{macrocode}
%
% \noindent Define new grayscale parsing macros.
%
%    \begin{macrocode}
\def\pgf@parsefirstgray[gray(#1)=(#2)#3]{%
  \pgfmathsetlength\pgf@x{#1}%
  \edef\pgf@sys@shading@start@pos{\the\pgf@x}%
  \pgf@sys@bp@correct\pgf@x%
  \edef\pgf@doma{\pgf@sys@tonumber{\pgf@x}}%
  \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
  \pgf@getgraytuplewithmixin{#2}%
  \edef\pgf@sys@shading@start@gray{\pgf@sys@gray}%
  \let\pgf@sys@prevcolor=\pgf@sys@shading@start@gray%
  \let\pgf@sys@prevpos=\pgf@sys@shading@start@pos%
  \edef\pgf@prevcolor{\pgf@gray}%
  \edef\pgf@firstcolor{\pgf@gray}}
\def\pgf@parselastdomgray[gray(#1)=(#2); {%
  \pgfutil@ifnextchar]{%
    \pgfmathsetlength\pgf@x{#1}%
    \edef\pgf@sys@shading@end@pos{\the\pgf@x}%
    \pgf@max=\pgf@x\relax%
    \pgf@sys@bp@correct\pgf@x%
    \edef\pgf@domb{\pgf@sys@tonumber{\pgf@x}}%
    \pgf@getgraytuplewithmixin{#2}%
    \edef\pgf@sys@shading@end@gray{\pgf@sys@gray}%
    \pgfutil@gobble}{\pgf@parselastdomgray[}}
\def\pgf@parsemidgray[gray(#1)=(#2); {\pgf@parserestgray[}
\def\pgf@parserestgray[gray(#1)=(#2); {%
  \advance\pgf@sys@shading@range@num by1\relax%
  \pgfutil@ifnextchar]{%
    \pgf@getgraytuplewithmixin{#2}%
    \edef\pgf@singlefunc{\space%
      << /FunctionType 2 /Domain [0 1] /C0
      [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
    \edef\pgf@funcs{\pgf@funcs\space%
      << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
      [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
    \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
      \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
    \pgfmathsetlength\pgf@x{#1}%
    \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
      {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
    \edef\pgf@sys@prevpos{\the\pgf@x}%
    \let\pgf@sys@prevcolor=\pgf@sys@gray%
    \pgfutil@gobble}{%
    \pgfmathsetlength\pgf@x{#1}%
    \pgf@getgraytuplewithmixin{#2}%
    \edef\pgf@sys@shading@ranges{\pgf@sys@shading@ranges{%
      {\pgf@sys@prevpos}{\the\pgf@x}{\pgf@sys@prevcolor}{\pgf@sys@gray}}}%
    \edef\pgf@sys@prevpos{\the\pgf@x}%
    \let\pgf@sys@prevcolor=\pgf@sys@gray%
    \edef\pgf@psfuncs{\pgf@prevx\space \pgf@gray\space
      \pgf@prevcolor\space pgfshade \pgf@psfuncs}%
    \pgf@sys@bp@correct\pgf@x%
    \edef\pgf@prevx{\pgf@sys@tonumber{\pgf@x}}%
    \edef\pgf@bounds{\pgf@bounds\space\pgf@sys@tonumber{\pgf@x}}%
    \edef\pgf@encode{\pgf@encode\space0 1}%
    \edef\pgf@singlefunc{\space%
      << /FunctionType 2 /Domain [0 1] /C0
      [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
    \edef\pgf@funcs{\pgf@funcs\space%
      << /FunctionType 2 /Domain [\pgf@doma\space\pgf@domb] /C0
      [\pgf@prevcolor] /C1 [\pgf@gray] /N 1 >> }% <<
    \edef\pgf@prevcolor{\pgf@gray}%
    \pgf@parserestgray[}}
\def\pgf@getgraytuplewithmixin#1{%
  \pgfutil@definecolor{pgfshadetemp}{gray}{#1}%
  \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgfshadetemp}}%
  \pgfutil@extractcolorspec{pgfshadetemp}{\pgf@tempcolor}%
  \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
  \expandafter\pgf@getgray@@\pgf@graycolor!}
\def\pgf@getgray@@#1!{%
  \def\pgf@gray{#1}%
  \def\pgf@sys@gray{{#1}}%
}
%    \end{macrocode}
%
% \noindent Define new colour space agnostic colour specification parsing
% macros. This includes parsing CMYK colour specifications (i.e.,
% |color(|\meta{postition}|)=(|\meta{C}|,|\meta{M}|,|\meta{Y}|,|\meta{K}|)|.
%
%    \begin{macrocode}
\def\pgf@convertstring#1{%
  \def\pgf@conv{}%
  \pgf@convert#1]%
  }
\def\pgf@convert{%
  \pgfutil@ifnextchar]{\pgfutil@gobble}%done!
  {%
    \pgfutil@ifnextchar;{\pgf@grabsemicolor}%
    {%
      \pgfutil@ifnextchar c{\pgf@gobblec}%
      {%
        \pgfutil@ifnextchar g{\pgf@grabgray}%
        {%
          \pgfutil@ifnextchar o{\pgf@grabcolor}%
          {%
            \pgfutil@ifnextchar m{\pgf@grabcmyk}%
            {%
              \pgfutil@ifnextchar r{\pgf@grabrgb}%
                {\pgferror{Illformed shading
                 specification}\pgf@convert}%
            }%
          }%
        }%
      }%
    }%
  }%
}
\def\pgf@grabsemicolor;{%
  \edef\pgf@conv{\pgf@conv; }\pgf@convert}
\def\pgf@gobblec c{\pgf@convert}
%    \end{macrocode}
%\changes{v1.1a}{2018/10/24}{Fix missing percent sign}
%    \begin{macrocode}
\def\pgf@savecolor#1{%
  \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
  \expandafter\pgfutil@convertcolorspec\pgf@tempcolor
    {\pgf@shading@model}{\pgf@color}%
  \expandafter\pgf@convget@\expandafter{\pgf@color}{#1}%
}
\def\pgf@grabrgb rgb(#1)=(#2,#3,#4){%
  \pgfutil@definecolor{pgf@tempcol}{rgb}{#2,#3,#4}%
  \pgf@savecolor{#1}%
}
\def\pgf@grabcmyk myk(#1)=(#2,#3,#4,#5){%
  \pgfutil@definecolor{pgf@tempcol}{cmyk}{#2,#3,#4,#5}%
  \pgf@savecolor{#1}%
}
\def\pgf@grabgray gray(#1)=(#2){%
  \pgfutil@definecolor{pgf@tempcol}{gray}{#2}%
  \pgf@savecolor{#1}%
}
\def\pgf@grabcolor olor(#1)=(#2){%
  \pgfutil@colorlet{pgf@tempcol}{#2}%
  \pgf@savecolor{#1}%
}
\def\pgf@convget@#1#2{%
  \edef\pgf@conv{\pgf@conv \pgf@shading@model(#2)=(#1)}\pgf@convert}
%    \end{macrocode}
%
% \noindent New macros to convert CMYK colours to a format suitable for use in
% the \meta{type 4 function} argument of \cs{pgfdeclarefunctionalshading}.
%
%    \begin{macrocode}
\newdimen\pgf@xd
\def\pgfshadecolortocmyk#1#2{%
  \pgfutil@colorlet{pgf@tempcol}{#1}%
  \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
  \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
  \expandafter\pgfshading@cmyk\pgf@cmykcolor\relax%
  \edef#2{\pgf@sys@tonumber{\pgf@xa}\space\pgf@sys@tonumber{\pgf@xb}\space
    \pgf@sys@tonumber{\pgf@xc}\space\pgf@sys@tonumber{\pgf@xd}\space}%
  \c@pgf@counta\escapechar%
  \escapechar-1\relax%
  \expandafter\edef\csname\string#2cyan\endcsname{%
    \pgf@sys@tonumber{\pgf@xa}\space}%
  \expandafter\edef\csname\string#2magenta\endcsname{%
    \pgf@sys@tonumber{\pgf@xb}\space}%
  \expandafter\edef\csname\string#2yellow\endcsname{%
    \pgf@sys@tonumber{\pgf@xc}\space}%
  \expandafter\edef\csname\string#2black\endcsname{%
    \pgf@sys@tonumber{\pgf@xd}\space}%
  \escapechar\c@pgf@counta
}
\def\pgfshading@cmyk#1,#2,#3,#4\relax{%
  \pgf@xa=#1pt%
  \pgf@xb=#2pt%
  \pgf@xc=#3pt%
  \pgf@xd=#4pt%
}
%    \end{macrocode}
%
% \noindent New macros to convert grayscale colours to a format suitable for
% use in the \meta{type 4 function} argument of
% \cs{pgfdeclarefunctionalshading}.
%
%    \begin{macrocode}
\def\pgfshadecolortogray#1#2{%
  \pgfutil@colorlet{pgf@tempcol}{#1}%
  \pgfutil@extractcolorspec{pgf@tempcol}{\pgf@tempcolor}%
  \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{gray}{\pgf@graycolor}%
  \expandafter\pgfshading@gray\pgf@graycolor\relax
  \edef#2{\pgf@sys@tonumber{\pgf@xa}\space}%
  \c@pgf@counta\escapechar
  \escapechar-1\relax
  \expandafter\edef\csname\string#2gray\endcsname{%
    \pgf@sys@tonumber{\pgf@xa}\space}%
  \escapechar\c@pgf@counta
}
\def\pgfshading@gray#1\relax{%
  \pgf@xa=#1pt%
}
%    \end{macrocode}
%
% \noindent Ensure colour model is set up based on the current \pkg{xcolor}
% colour model when declaring shadings.
%
%    \begin{macrocode}
\def\pgfdeclarehorizontalshading{%
  \pgf@setup@model
  \pgfutil@ifnextchar[%
    \pgf@declarehorizontalshading{\pgf@declarehorizontalshading[]}}
\def\pgfdeclareverticalshading{%
  \pgf@setup@model
  \pgfutil@ifnextchar[%
    \pgf@declareverticalshading{\pgf@declareverticalshading[]}}
\def\pgfdeclareradialshading{%
  \pgf@setup@model
  \pgfutil@ifnextchar[%
    \pgf@declareradialshading{\pgf@declareradialshading[]}}
\def\pgfdeclarefunctionalshading{%
  \pgf@setup@model
  \pgfutil@ifnextchar[%
    \pgf@declarefunctionalshading{\pgf@declarefunctionalshading[]}}
%    \end{macrocode}
%
% \noindent Ensure colour model is set up based on the current \pkg{xcolor}
% colour model when using shadings.
%
%    \begin{macrocode}
\def\pgfuseshading#1{%
  \edef\pgf@shadingname{@pgfshading#1}%
  \edef\pgf@shadingsavedmodel{@pgfshading#1@model}%
  \pgf@tryextensions{\pgf@shadingname}{\pgfalternateextension}%
  \expandafter\pgfutil@ifundefined\expandafter{\pgf@shadingname}%
  {\pgferror{Undefined shading "#1"}}%
  {%
    {%
      \pgf@setup@model
      \pgfutil@globalcolorsfalse
      \def\pgf@shade@adds{}%
      \pgfutil@ifundefined{pgf@deps\pgf@shadingname}%
      {}%
      {%
        \edef\@list{\csname pgf@deps\pgf@shadingname\endcsname}%
        \pgfutil@for\@temp:=\@list\do{%
          {%
            \pgfutil@ifundefined{applycolormixins}%
              {}{\applycolormixins{\@temp}}%
            \pgfutil@extractcolorspec{\@temp}{\pgf@tempcolor}%
            \expandafter\pgfutil@ifundefined\expandafter{%
              \pgf@shadingsavedmodel}%
              {\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{%
                 \pgf@shading@model}{\pgf@color}}%
              {\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{%
                 \pgf@shadingsavedmodel}{\pgf@color}}%
            \xdef\pgf@shade@adds{\pgf@shade@adds,\pgf@color}%
          }%
        }%
      }%
      \expandafter\pgf@strip@shadename\pgf@shadingname!!%
      \pgfutil@ifundefined{@pgfshading\pgf@basename\pgf@shade@adds!}%
      {%
        {%
          \expandafter\def\expandafter\@temp\expandafter{%
            \csname pgf@func\pgf@shadingname\endcsname}%
          \edef\@args{{\pgf@basename\pgf@shade@adds}}%
          \expandafter\expandafter\expandafter\def
          \expandafter\expandafter\expandafter\@@args
          \expandafter\expandafter\expandafter{%
            \csname pgf@args\pgf@shadingname\endcsname}%
          \expandafter\expandafter\expandafter\@temp
            \expandafter\@args\@@args
        }%
      }%
      {}%
      \pgf@invokeshading{%
        \csname @pgfshading\pgf@basename\pgf@shade@adds!\endcsname}%
    }%
  }%
}
%    \end{macrocode}
%
% \noindent Conditionals for use in the \meta{type 4 function} argument of
% \cs{pgfdeclarefunctionalshading} to test for the currently active
% \pkg{xcolor} colour model.
%
%    \begin{macrocode}
\newif\ifpgfshadingmodelrgb
\newif\ifpgfshadingmodelcmyk
\newif\ifpgfshadingmodelgray
%    \end{macrocode}
%
% \noindent Shading colour space property set up based on the currently active
% \pkg{xcolor} colour model.
%
%    \begin{macrocode}
\def\pgf@setup@model{%
  \pgfshadingmodelrgbtrue
  \pgfshadingmodelcmykfalse
  \pgfshadingmodelgrayfalse
  \XC@sdef\pgf@mod@test{\XC@tgt@mod{natural}}%
  \def\pgf@shading@functional@range{0 1 0 1 0 1}%
  \def\pgf@shading@device{/DeviceRGB}%
  \def\pgf@shading@ps@device{setrgbcolor}%
  \def\pgf@shading@model{rgb}%
  \ifx\pgf@mod@test\XC@mod@natural
    \ifpgfcmykshadingdefault
      \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
      \def\pgf@shading@device{/DeviceCMYK}%
      \def\pgf@shading@ps@device{setcmykcolor}%
      \def\pgf@shading@model{cmyk}%
      \pgfshadingmodelrgbfalse
      \pgfshadingmodelcmyktrue
    \else
      \def\pgf@shading@functional@range{0 1 0 1 0 1}%
      \def\pgf@shading@device{/DeviceRGB}%
      \def\pgf@shading@ps@device{setrgbcolor}%
      \def\pgf@shading@model{rgb}%
    \fi
  \fi
  \ifx\pgf@mod@test\XC@mod@cmyk
    \def\pgf@shading@functional@range{0 1 0 1 0 1 0 1}%
    \def\pgf@shading@device{/DeviceCMYK}%
    \def\pgf@shading@ps@device{setcmykcolor}%
    \def\pgf@shading@model{cmyk}%
      \pgfshadingmodelrgbfalse
      \pgfshadingmodelcmyktrue
  \fi
  \ifx\pgf@mod@test\XC@mod@gray
    \def\pgf@shading@functional@range{0 1}%
    \def\pgf@shading@device{/DeviceGray}%
    \def\pgf@shading@ps@device{setgray}%
    \def\pgf@shading@model{gray}%
      \pgfshadingmodelrgbfalse
      \pgfshadingmodelgraytrue
  \fi
%    \end{macrocode}
% \changes{v1.1}{2018/10/19}{Support dvisvgm driver}
%    \begin{macrocode}
  \edef\pgf@sys@driver@dvisvgm{pgfsys-dvisvgm.def}%
  \ifx\pgfsysdriver\pgf@sys@driver@dvisvgm
    \def\pgf@shading@model{rgb}%
  \fi
%    \end{macrocode}
% \changes{v1.1}{2018/10/19}{Support tex4ht driver}
%    \begin{macrocode}
  \edef\pgf@sys@driver@texforht{pgfsys-tex4ht.def}%
  \ifx\pgfsysdriver\pgf@sys@driver@texforht
    \def\pgf@shading@model{rgb}%
  \fi
}
%    \end{macrocode}
%
% \noindent Converters for use in the \meta{type 4 function} argument of
% \cs{pgfdeclarefunctionalshading}. These macros use the same algorithms as
% \pkg{xcolor}.
%
%    \begin{macrocode}
\def\pgffuncshadingrgbtocmyk{%
  1.0 exch sub 3 1 roll
  1.0 exch sub 3 1 roll
  1.0 exch sub 3 1 roll
  3 copy
  2 copy gt { exch } if pop
  2 copy gt { exch } if pop
  dup 3 1 roll sub
  0.0 2 copy lt { exch } if pop
  1.0 2 copy gt { exch } if pop
  4 1 roll
  dup 3 1 roll sub
  0.0 2 copy lt { exch } if pop
  1.0 2 copy gt { exch } if pop
  4 1 roll
  dup 3 1 roll sub
  0.0 2 copy lt { exch } if pop
  1.0 2 copy gt { exch } if pop
  4 1 roll
}
\def\pgffuncshadingrgbtogray{%
  0.11 mul exch 0.59 mul add exch 0.3 mul add
}
\def\pgffuncshadingcmyktorgb{%
  % covert to CMY
  dup 3 1 roll add
  1.0 2 copy gt { exch } if pop
  4 1 roll
  dup 3 1 roll add
  1.0 2 copy gt { exch } if pop
  4 1 roll
  add
  1.0 2 copy gt { exch } if pop
  3 1 roll
  % covert to RGB
  1.0 exch sub
  3 1 roll
  1.0 exch sub
  3 1 roll
  1.0 exch sub
  3 1 roll
}
\def\pgffuncshadingcmyktogray{%
  exch 0.11 mul add exch 0.59 mul add exch 0.3 mul add
  1.0 2 copy gt { exch } if pop
  1.0 exch sub
}
\def\pgffuncshadinggraytorgb{%
  dup dup
}
\def\pgffuncshadinggraytocmyk{%
  0.0 0.0 0.0
  4 3 roll
}
%    \end{macrocode}
%
% \noindent Load the correct driver file.
%
%    \begin{macrocode}
\def\pgfutilgetcmykshadingsdriver{%
  \expandafter\pgfutil@getcmykshadingsdriver\pgfsysdriver[%
}
\def\pgfutil@getcmykshadingsdriver pgfsys-#1[{%
  \edef\pgfsyscmykshadingsdriver{pgfsys-cmykshadings-#1}%
}
\pgfutilgetcmykshadingsdriver
\pgfutil@InputIfFileExists{\pgfsyscmykshadingsdriver}{}{}
%    \end{macrocode}
%
% \noindent Style options to use CMYK shadings by default or not when the
% selected \pkg{xcolor} colour model is |natural|.
%
%    \begin{macrocode}
\newif\ifpgfcmykshadingdefault
\DeclareOption{cmyk}{%
  \pgfcmykshadingdefaulttrue
}
%    \end{macrocode}
% \changes{v1.1}{2018/10/18}{Fix typo for {\ttfamily rgb} option}
%    \begin{macrocode}
\DeclareOption{rgb}{%
  \pgfcmykshadingdefaultfalse
}
\ExecuteOptions{cmyk}
\ProcessOptions\relax
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \subsection{Drivers}
%
% \subsubsection*{pdftex driver}
%
%    \begin{macrocode}
%<*pdftex-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-pdftex.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF pdftex driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \setbox\pgfutil@tempboxa=\hbox to\pgf@max{%
      \vbox to\pgfmathresult pt{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \immediate\pdfxform resources {%
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@doma\space0 \pgf@domb\space0]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \setbox\pgfutil@tempboxa=\hbox to\pgfmathresult pt{%
      \vbox to\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{\pgfpoint{#2}{\pgf@max}}%
    \immediate\pdfxform resources {%
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [0 \pgf@doma\space0 \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \setbox\pgfutil@tempboxa=\hbox to2\pgf@max{%
      \vbox to2\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
    \advance\pgf@xa by \pgf@x
    \advance\pgf@ya by \pgf@y
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@sys@bp@correct{\pgf@y}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \immediate\pdfxform resources {%
      /Shading << /Sh << /ShadingType 3
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@sys@tonumber{\pgf@xa}
        \pgf@sys@tonumber{\pgf@ya}
        \pgf@doma\space
        \pgf@sys@tonumber{\pgf@x}
        \pgf@sys@tonumber{\pgf@y}
        \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [true false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\pdfrefxform\the\pdflastxform}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@functionalshading#1#2#3#4{%
  {%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{#3}%
    \pgf@xb=\pgf@x
    \pgf@yb=\pgf@y
    \advance\pgf@x by-\pgf@xa
    \advance\pgf@y by-\pgf@ya
    \setbox\pgfutil@tempboxa=\hbox to\pgf@x{%
      \vbox to\pgf@y{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgf@sys@bp@correct{\pgf@xb}%
    \pgf@sys@bp@correct{\pgf@yb}%
    \pgf@xc=-\pgf@xa
    \pgf@yc=-\pgf@ya
    % Now build the function
    \pdfobj
    stream
    attr
    {
      /FunctionType 4
      /Domain [\pgf@sys@tonumber{\pgf@xa}\space
        \pgf@sys@tonumber{\pgf@xb}\space
        \pgf@sys@tonumber{\pgf@ya}\space
        \pgf@sys@tonumber{\pgf@yb}]
      /Range [\pgf@shading@functional@range]
    }
    {{#4}}%
    \edef\pgf@temp@num{\the\pdflastobj}%
    \pdfxform resources {%
      /Shading << /Sh << /ShadingType 1
      /ColorSpace \pgf@shading@device\space
      /Matrix [1 0 0 1 \pgf@sys@tonumber{\pgf@xc}\space
        \pgf@sys@tonumber{\pgf@yc}]
      /Domain [\pgf@sys@tonumber{\pgf@xa}\space
        \pgf@sys@tonumber{\pgf@xb}\space
        \pgf@sys@tonumber{\pgf@ya}\space
        \pgf@sys@tonumber{\pgf@yb}]
      /Function \pgf@temp@num\space 0 R
      >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode%
      \noexpand\pdfrefxform\the\pdflastxform%
      \noexpand\pdfrefobj\pgf@temp@num%
    }%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</pdftex-driver>
%    \end{macrocode}
%
% \subsubsection*{xetex driver}
%
%    \begin{macrocode}
%<*xetex-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-xetex.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF xetex driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\input pgfsys-cmykshadings-dvipdfmx.def
%    \end{macrocode}
%
%    \begin{macrocode}
%</xetex-driver>
%    \end{macrocode}
%
% \subsubsection*{luatex driver}
%
%    \begin{macrocode}
%<*luatex-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-luatex.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF luatex driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \setbox\pgfutil@tempboxa=\hbox to\pgf@max{%
      \vbox to\pgfmathresult pt{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \immediate\saveboxresource resources {%
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@doma\space0 \pgf@domb\space0]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\useboxresource\the\lastsavedboxresourceindex}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \setbox\pgfutil@tempboxa=\hbox to\pgfmathresult pt{%
      \vbox to\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{\pgfpoint{#2}{\pgf@max}}%
    \immediate\saveboxresource resources {%
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [0 \pgf@doma\space0 \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\useboxresource\the\lastsavedboxresourceindex}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \setbox\pgfutil@tempboxa=\hbox to2\pgf@max{%
      \vbox to2\pgf@max{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
    \advance\pgf@xa by \pgf@x
    \advance\pgf@ya by \pgf@y
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@sys@bp@correct{\pgf@y}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \immediate\saveboxresource resources {%
      /Shading << /Sh << /ShadingType 3
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@sys@tonumber{\pgf@xa}
        \pgf@sys@tonumber{\pgf@ya}
        \pgf@doma\space
        \pgf@sys@tonumber{\pgf@x}
        \pgf@sys@tonumber{\pgf@y}
        \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [true false] >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\noexpand\useboxresource\the\lastsavedboxresourceindex}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@functionalshading#1#2#3#4{%
  {%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{#3}%
    \pgf@xb=\pgf@x
    \pgf@yb=\pgf@y
    \advance\pgf@x by-\pgf@xa
    \advance\pgf@y by-\pgf@ya
    \setbox\pgfutil@tempboxa=\hbox to\pgf@x{%
      \vbox to\pgf@y{\vfil\pgfsys@invoke{/Sh sh}}\hfil}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgf@sys@bp@correct{\pgf@xb}%
    \pgf@sys@bp@correct{\pgf@yb}%
    \pgf@xc=-\pgf@xa
    \pgf@yc=-\pgf@ya
    % Now build the function
    \pdfextension obj
    stream
    attr
    {
      /FunctionType 4
      /Domain [\pgf@sys@tonumber{\pgf@xa}\space
        \pgf@sys@tonumber{\pgf@xb}\space
        \pgf@sys@tonumber{\pgf@ya}\space
        \pgf@sys@tonumber{\pgf@yb}]
      /Range [\pgf@shading@functional@range]
    }
    {{#4}}%
    \edef\pgf@temp@num{\the\numexpr\pdffeedback lastobj\relax}%
    \saveboxresource resources {%
      /Shading << /Sh << /ShadingType 1
      /ColorSpace \pgf@shading@device\space
      /Matrix [1 0 0 1 \pgf@sys@tonumber{\pgf@xc}\space
        \pgf@sys@tonumber{\pgf@yc}]
      /Domain [\pgf@sys@tonumber{\pgf@xa}\space
        \pgf@sys@tonumber{\pgf@xb}\space
        \pgf@sys@tonumber{\pgf@ya}\space
        \pgf@sys@tonumber{\pgf@yb}]
      /Function \pgf@temp@num\space 0 R
      >> >>}\pgfutil@tempboxa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode%
      \noexpand\useboxresource\the\lastsavedboxresourceindex%
      \noexpand\pdfextension refobj \pgf@temp@num%
    }%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</luatex-driver>
%    \end{macrocode}
%
% \subsubsection*{dvipdfmx driver}
%
%    \begin{macrocode}
%<*dvipdfmx-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-dvipdfmx.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF dvipdfmx driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
      \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space
        width \the\pgf@max\space height \pgfmathresult pt}%
      \special{pdf:put @resources
      <<
        /Shading << /Sh << /ShadingType 2
        /ColorSpace \pgf@shading@device\space
        /Domain [\pgf@pdfparseddomain]
        /Coords [\pgf@doma\space0 \pgf@domb\space0]
        /Function \pgf@pdfparsedfunction
        /Extend [false false] >> >>
      >>}%
      \pgfsys@invoke{/Sh sh}%
      \special{pdf:exobj}}}\@tempa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\the\pgf@max{\vbox to\pgfmathresult pt{%
        \vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
  \global\advance\pgfsys@objnum\@ne%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathparse{#2}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
      \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space
        width \pgfmathresult pt\space height \the\pgf@max}%
      \special{pdf:put @resources
      <<
        /Shading << /Sh << /ShadingType 2
        /ColorSpace \pgf@shading@device\space
        /Domain [\pgf@pdfparseddomain]
        /Coords [0 \pgf@doma\space0 \pgf@domb]
        /Function \pgf@pdfparsedfunction
        /Extend [false false] >> >>
      >>}%
      \pgfsys@invoke{/Sh sh}%
      \special{pdf:exobj}}}\@tempa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\pgfmathresult pt{\vbox to\the\pgf@max{%
        \vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
  \global\advance\pgfsys@objnum\@ne
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
    \advance\pgf@xa by \pgf@x
    \advance\pgf@ya by \pgf@y
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@sys@bp@correct{\pgf@y}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgfutil@tempdima=2\pgf@max
    \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
      \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space
        width \the\pgfutil@tempdima\space height \the\pgfutil@tempdima}%
      \special{pdf:put @resources
      <<
        /Shading << /Sh << /ShadingType 3
        /ColorSpace \pgf@shading@device\space
        /Domain [\pgf@pdfparseddomain]
        /Coords [\pgf@sys@tonumber{\pgf@xa}
          \pgf@sys@tonumber{\pgf@ya}
          \pgf@doma\space \pgf@sys@tonumber{\pgf@x}
          \pgf@sys@tonumber{\pgf@y}
          \pgf@domb]
        /Function \pgf@pdfparsedfunction
        /Extend [true false] >> >>
      >>}%
      \pgfsys@invoke{/Sh sh}%
      \special{pdf:exobj}}}\@tempa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\the\pgfutil@tempdima{\vbox to\the\pgfutil@tempdima{%
        \vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
  \global\advance\pgfsys@objnum\@ne
}
\def\pgfsys@functionalshading#1#2#3#4{%
  {%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{#3}%
    \pgf@xb=\pgf@x
    \pgf@yb=\pgf@y
    \advance\pgf@x by-\pgf@xa%
    \advance\pgf@y by-\pgf@ya%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgf@sys@bp@correct{\pgf@xb}%
    \pgf@sys@bp@correct{\pgf@yb}%
    \pgf@xc=-\pgf@xa
    \pgf@yc=-\pgf@ya
    % Now build the function
    \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
      \special{pdf:stream @pgfstream\the\pgfsys@objnum\space({#4})
        <</FunctionType 4 /Domain [\pgf@sys@tonumber{\pgf@xa}\space
          \pgf@sys@tonumber{\pgf@xb}\space
          \pgf@sys@tonumber{\pgf@ya}\space
          \pgf@sys@tonumber{\pgf@yb}]
        /Range [\pgf@shading@functional@range]>>}}}\@tempa%
    \edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
      \special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space
        width \the\pgf@x\space height \the\pgf@y}%
      \special{pdf:put @resources <</Shading <</Sh <</ShadingType 1
        /ColorSpace \pgf@shading@device\space
        /Matrix [1 0 0 1 \pgf@sys@tonumber{\pgf@xc}\space
          \pgf@sys@tonumber{\pgf@yc}]
        /Domain [\pgf@sys@tonumber{\pgf@xa}\space
          \pgf@sys@tonumber{\pgf@xb}\space
          \pgf@sys@tonumber{\pgf@ya}\space
          \pgf@sys@tonumber{\pgf@yb}]
        /Function @pgfstream\the\pgfsys@objnum>> >> >>}%
      \pgfsys@invoke{/Sh sh}%
      \special{pdf:exobj}}}\@tempa% <<
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \leavevmode\hbox to\the\pgf@x{\vbox to\the\pgf@y{%
        \vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
  \global\advance\pgfsys@objnum\@ne
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</dvipdfmx-driver>
%    \end{macrocode}
%
% \subsubsection*{dvipdfm driver}
%
% \changes{v1.1}{2018/10/18}{Support dvipdfm driver}
%
%    \begin{macrocode}
%<*dvipdfm-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-dvipdfm.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF dvipdfm driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
      \special{pdf: beginxobj @pgfshade#1 width \the\pgf@max\space
        height \the\pgf@y}}}\@temp
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
        \special{pdf: put @resources <<
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@doma\space0 \pgf@domb\space0]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >> >>}}}\@temp% <<
      \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
      \special{pdf: endxobj}}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\the\pgf@max{\vbox to#2{%
        \vfil\special{pdf: usexobj @pgfshade#1}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{\pgfpoint{\pgf@max}{#2}}%
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
      \special{pdf: beginxobj @pgfshade#1 width \the\pgf@y\space
        height \the\pgf@max\space}}}\@temp
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
        \special{pdf: put @resources <<
      /Shading << /Sh << /ShadingType 2
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [0 \pgf@doma\space0 \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [false false] >> >> >>}}}\@temp% <<
      \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
      \special{pdf: endxobj}}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to#2{\vbox to\the\pgf@max{\vfil\special{%
        pdf: usexobj @pgfshade#1}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{\pgfpoint{\pgf@max}{\pgf@max}}%
    \advance\pgf@xa by \pgf@x\relax
    \advance\pgf@ya by \pgf@y\relax
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@sys@bp@correct{\pgf@y}%
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgfutil@tempdima=2\pgf@max\relax
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
      \special{pdf: beginxobj @pgfshade#1 width 
        \the\pgfutil@tempdima\space height \the\pgfutil@tempdima}}}\@temp%
    \edef\@temp{\noexpand\pgfutil@insertatbegincurrentpage{%
        \special{pdf: put @resources <<
      /Shading << /Sh << /ShadingType 3
      /ColorSpace \pgf@shading@device\space
      /Domain [\pgf@pdfparseddomain]
      /Coords [\pgf@sys@tonumber{\pgf@xa} \pgf@sys@tonumber{\pgf@ya}
        \pgf@doma\space \pgf@sys@tonumber{\pgf@x} \pgf@sys@tonumber{\pgf@y}
        \pgf@domb]
      /Function \pgf@pdfparsedfunction
      /Extend [true false] >> >> >>}}}\@temp% <<
      \pgfutil@insertatbegincurrentpage{\special{pdf: content /Sh sh}%
      \special{pdf: endxobj}}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\the\pgfutil@tempdima{\vbox to\the\pgfutil@tempdima{%
        \vfil\special{pdf: usexobj @pgfshade#1}}\hfil}}% 
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}%
%    \end{macrocode}
%
%    \begin{macrocode}
%</dvipdfm-driver>
%    \end{macrocode}
%
% \changes{v1.1}{2018/10/23}{Support PostScript® drivers}
%
% \subsubsection*{dvips driver}
%
%    \begin{macrocode}
%<*dvips-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-dvips.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF dvips driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\input pgfsys-cmykshadings-common-postscript.def
%    \end{macrocode}
%
%    \begin{macrocode}
%</dvips-driver>
%    \end{macrocode}
%
% \subsubsection*{textures driver}
%
%    \begin{macrocode}
%<*textures-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-textures.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF textures driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\input pgfsys-cmykshadings-common-postscript.def
%    \end{macrocode}
%
%    \begin{macrocode}
%</textures-driver>
%    \end{macrocode}
%
% \subsubsection*{vtex driver}
%
%    \begin{macrocode}
%<*vtex-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-vtex.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF vtex driver (DCP)]
%    \end{macrocode}
%
%    \begin{macrocode}
\input pgfsys-cmykshadings-common-postscript.def
%    \end{macrocode}
%
%    \begin{macrocode}
%</vtex-driver>
%    \end{macrocode}
%
% \subsubsection*{PostScript® driver common code}
%
%    \begin{macrocode}
%<*common-ps-driver>
%    \end{macrocode}
%
%    \begin{macrocode}
\ProvidesFile{pgfsys-cmykshadings-common-postscript.def}%
  [2018/10/24
   CMYK and grayscale shadings support for PGF PostScript driver (DCP)]
%    \end{macrocode}
%
% \TeX\space shading macros.
%
%    \begin{macrocode}
\def\pgfsys@horishading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathsetlength\pgf@x{#2}%
    \pgf@xa=\pgf@x
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@y=\pgf@max
    \pgf@sys@bp@correct{\pgf@y}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to \the\pgf@max{%
        \noexpand\vrule width0pt height\the\pgf@xa
        \noexpand\pgfsys@beginpurepicture
          \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@max}{\the\pgf@xa}%
          \noexpand\pgfsys@clipnext
          \noexpand\pgfsys@discardpath
          \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x}
            pgfH\pgf@shading@model\space \pgf@psfuncs\space pop}%
          \hss
        \noexpand\pgfsys@endpurepicture}}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@vertshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgfmathsetlength\pgf@x{#2}%
    \pgf@xa=\pgf@x
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@y=\pgf@max
    \pgf@sys@bp@correct{\pgf@y}%
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to\the\pgf@xa{%
        \noexpand\vrule width0pt height\the\pgf@max
        \noexpand\pgfsys@beginpurepicture
          \noexpand\pgfsys@rect{0pt}{0pt}{\the\pgf@xa}{\the\pgf@max}%
          \noexpand\pgfsys@clipnext
          \noexpand\pgfsys@discardpath
          \noexpand\pgfsys@invoke{\pgf@domb\space \pgf@sys@tonumber{\pgf@x}
            pgfV\pgf@shading@model\space \pgf@psfuncs\space pop}%
          \hss
        \noexpand\pgfsys@endpurepicture}}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@radialshading#1#2#3{%
  {%
    \pgf@parsefunc{#3}%
    \pgf@process{#2}%
    \pgf@sys@bp@correct{\pgf@x}%
    \pgf@sys@bp@correct{\pgf@y}%
    \pgf@xa=2\pgf@max
    \pgf@sys@bp@correct{\pgf@max}%
    \advance\pgf@x by \pgf@max
    \advance\pgf@y by \pgf@max
    \expandafter\xdef\csname @pgfshading#1!\endcsname{\hbox to \the\pgf@xa{%
        \noexpand\vrule width0pt height\the\pgf@xa
        \noexpand\pgfsys@beginpurepicture
          \noexpand\pgfsys@invoke{%
            \pgf@domb\space \pgf@sys@tonumber{\pgf@y}
            \pgf@sys@tonumber{\pgf@x}
            \pgf@sys@tonumber{\pgf@max} pgfR1\pgf@shading@model\space
            \pgf@psfuncs\space \pgf@firstcolor\space \pgf@doma\space
            pgfR2\pgf@shading@model}%
          \hss
        \noexpand\pgfsys@endpurepicture}}%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
\def\pgfsys@functionalshading#1#2#3#4{%
  {%
    \pgf@process{#2}%
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgf@process{#3}%
    \pgf@xb=\pgf@x
    \pgf@yb=\pgf@y
    \advance\pgf@x by-\pgf@xa
    \advance\pgf@y by-\pgf@ya
    \pgf@sys@bp@correct{\pgf@xa}%
    \pgf@sys@bp@correct{\pgf@ya}%
    \pgf@sys@bp@correct{\pgf@xb}%
    \pgf@sys@bp@correct{\pgf@yb}%
    \pgf@xc=-\pgf@xa
    \pgf@yc=-\pgf@ya
    \expandafter\xdef\csname @pgfshading#1!\endcsname{%
      \hbox to\the\pgf@x{\vbox to\the\pgf@y{\vfil
          \noexpand\pgfsys@beginpurepicture
          \noexpand\pgfsys@invoke{%
            \pgf@sys@tonumber{\pgf@xc} \pgf@sys@tonumber{\pgf@yc} translate
            1.1 setlinewidth [] 0 setdash 0 setlinecap
            /pgfproc {#4} bind def
            \pgf@sys@tonumber{\pgf@ya} 1 \pgf@sys@tonumber{\pgf@yb}
            {
              \pgf@sys@tonumber{\pgf@xa} 1 \pgf@sys@tonumber{\pgf@xb}
              { 1 index 2 copy pgfproc \pgf@shading@ps@device\space
                moveto 1.1 0 rlineto stroke }
              for
              pop
            }
            for
          }%
        \noexpand\pgfsys@endpurepicture
      }\hfil}%
    }%
    \expandafter\xdef\csname @pgfshading#1@model!\endcsname{%
      \pgf@shading@model}%
  }%
}
%    \end{macrocode}
%
% PostScript® support code.
%
%    \begin{macrocode}
\g@addto@macro\pgfsys@atbegindocument{%
%    \end{macrocode}
%
% Define RGB PostScript® shading functions.
%
%    \begin{macrocode}
  \pgf@sys@postscript@header{/pgfHrgb { pgfH } bind def}%
  \pgf@sys@postscript@header{/pgfVrgb { pgfV } bind def}%
  \pgf@sys@postscript@header{/pgfR1rgb { pgfR1 } bind def}%
  \pgf@sys@postscript@header{/pgfR2rgb { pgfR2 } bind def}%
%    \end{macrocode}
%
% Define CMYK PostScript® shding functions.
%
%    \begin{macrocode}
  \pgf@sys@postscript@header{/pgfHcmyk{
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfAcmyk} def /pgfdir { dup 0 moveto
        dup 6 index lineto } bind def} bind def}%
  \pgf@sys@postscript@header{/pgfVcmyk{
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfAcmyk} def /pgfdir { dup 0 exch moveto dup 6 index
        exch lineto } bind def} bind def}%
  \pgf@sys@postscript@header{/pgfAcmyk{
      /pgfdiff 10 index round cvi 10 index round cvi sub 2 mul 1 add def
      3 index 8 index sub pgfdiff div % put cyan-step on stack
      3 index 8 index sub pgfdiff div % put magenta-step on stack
      3 index 8 index sub pgfdiff div % put yellow-step on stack
      3 index 8 index sub pgfdiff div % put black-step on stack
      pgfheight 12 index 12 index 12 index 12 index 18 index
      pgfdiff {
        4 index 4 index 4 index 4 index setcmykcolor % Set color
        pgfdir
        stroke
        5 -1 roll 9 index add % cyan += inccyan
        5 -1 roll 8 index add % magenta += incmagenta
        5 -1 roll 7 index add % yellow += incyellow
        5 -1 roll 6 index add % black += incblack
        5 -1 roll .5 sub % x += 0.5
      } repeat
      mark 19 1 roll cleartomark exch pop % leave only start x on stack
    }bind def }%
  \pgf@sys@postscript@header{/pgfR1cmyk{
      newpath dup dup dup 0 360 arc clip newpath
      dup /pgfendx exch def
      /pgfendy exch def
      0.875 setlinewidth
      [] 0 setdash
      /pgfshade {pgfRcmyk} def
      /pgfstartx exch def
      /pgfstarty exch def
      /pgfdiffx pgfendx pgfstartx sub def
      /pgfdiffy pgfendy pgfstarty sub def
      dup /pgfdomb exch def
    }bind def }%
  \pgf@sys@postscript@header{/pgfR2cmyk{
      newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
      setcmykcolor fill pop}bind def }%
  \pgf@sys@postscript@header{/pgfRcmyk{
      /pgfdiff 10 index round cvi 10 index round cvi sub 4 mul 1 add def
      /pgfcircx pgfstartx 11 index pgfdiffx pgfdomb div mul add def
      /pgfcircy pgfstarty 11 index pgfdiffy pgfdomb div mul add def
      /pgfcircxe pgfstartx 10 index pgfdiffx pgfdomb div mul add def
      /pgfcircye pgfstarty 10 index pgfdiffy pgfdomb div mul add def
      /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
      /pgfystep pgfcircye pgfcircy sub pgfdiff div def
      3 index 8 index sub pgfdiff div % put cyan-step on stack
      3 index 8 index sub pgfdiff div % put magenta-step on stack
      3 index 8 index sub pgfdiff div % put yellow-step on stack
      3 index 8 index sub pgfdiff div % put black-step on stack
      11 index 11 index 11 index 11 index 17 index
      pgfdiff {
        4 index 4 index 4 index 4 index setcmykcolor % Set color
        pgfcircx pgfcircy 2 index 0 360 arc closepath
        stroke
        5 -1 roll 8 index add % cyan += inccyan
        5 -1 roll 7 index add % magenta += incmagenta
        5 -1 roll 6 index add % yellow += incyellow
        5 -1 roll 5 index add % black += incblack
        5 -1 roll .25 sub % x += 0.25
        /pgfcircx pgfcircx pgfxstep add def
        /pgfcircy pgfcircy pgfystep add def
      } repeat
      mark 18 1 roll cleartomark exch pop % leave only start x on stack
    }bind def}%
%    \end{macrocode}
%
% Define grayscale PostScript® shding functions.
%
%    \begin{macrocode}
  \pgf@sys@postscript@header{/pgfHgray{
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfAgray} def /pgfdir { dup 0 moveto
        dup 3 index lineto } bind def} bind def}%
  \pgf@sys@postscript@header{/pgfVgray{
      /pgfheight exch def 0.75 setlinewidth [] 0 setdash
      /pgfshade {pgfAgray} def /pgfdir { dup 0 exch moveto dup 3 index
        exch lineto } bind def} bind def}%
  \pgf@sys@postscript@header{/pgfAgray{
      /pgfdiff 4 index round cvi 4 index round cvi sub 2 mul 1 add def
      dup 2 index sub pgfdiff div % put gray-step on stack
      pgfheight 3 index 6 index
      pgfdiff {
        1 index setgray % Set color
        pgfdir
        stroke
        exch 3 index add % gray += incgray
        exch .5 sub % x += 0.5
      } repeat
      mark 7 1 roll cleartomark exch pop % leave only start x on stack
    }bind def }%
  \pgf@sys@postscript@header{/pgfR1gray{
      newpath dup dup dup 0 360 arc clip newpath
      dup /pgfendx exch def
      /pgfendy exch def
      0.875 setlinewidth
      [] 0 setdash
      /pgfshade {pgfRgray} def
      /pgfstartx exch def
      /pgfstarty exch def
      /pgfdiffx pgfendx pgfstartx sub def
      /pgfdiffy pgfendy pgfstarty sub def
      dup /pgfdomb exch def
    }bind def }%
  \pgf@sys@postscript@header{/pgfR2gray{
      newpath 0.5 add pgfcircx pgfcircy 3 2 roll 0 360 arc
      setgray fill pop}bind def }%
  \pgf@sys@postscript@header{/pgfRgray{
      /pgfdiff 4 index round cvi 4 index round cvi sub 4 mul 1 add def
      /pgfcircx pgfstartx 5 index pgfdiffx pgfdomb div mul add def
      /pgfcircy pgfstarty 5 index pgfdiffy pgfdomb div mul add def
      /pgfcircxe pgfstartx 4 index pgfdiffx pgfdomb div mul add def
      /pgfcircye pgfstarty 4 index pgfdiffy pgfdomb div mul add def
      /pgfxstep pgfcircxe pgfcircx sub pgfdiff div def
      /pgfystep pgfcircye pgfcircy sub pgfdiff div def
      dup 2 index sub pgfdiff div % put gray-step on stack
      2 index 5 index
      pgfdiff {
        1 index setgray % Set color
        pgfcircx pgfcircy 2 index 0 360 arc closepath
        stroke
        exch 2 index add % gray += incgray
        exch .25 sub % x += 0.25
        /pgfcircx pgfcircx pgfxstep add def
        /pgfcircy pgfcircy pgfystep add def
      } repeat
      mark 6 1 roll cleartomark exch pop % leave only start x on stack
    }bind def}%
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</common-ps-driver>
%    \end{macrocode}
%
% \end{implementation}
%
% \PrintChanges
