%--------------------------------------------
% $Header: /cvsroot/pgfplots/pgfplots/generic/pgfplots/util/pgfplotscolormap.code.tex,v 1.15 2009/07/21 18:18:48 ludewich Exp $
%
% Package pgfplots
%
% Provides a user-friendly interface to create function plots (normal
% plots, semi-logplots and double-logplots).
%
% It is based on Till Tantau's PGF package.
%
% Copyright 2007-2013 by Christian Feuersänger.
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see .
%
%--------------------------------------------
\input pgfplotscolor.code.tex
\pgfkeyssetvalue{/pgfplots/colormap default colorspace}{auto}
% preset for '/pgfplots/colormap uniform=always
% This is only used for the colormap predefined in this very file.
\def\pgfplots@colormap@uniform@choice{0}%
% This package relies on pgfplots temporary registers and its array
% data structure.
% Internal structure:
% the colormap data structure consists of
% - an array 'pgfpl@cm@#1' of RGB color triples,
% - numbers 'pgfpl@cm@#1@h' and 'pgfpl@cm@#1@invh' for the mesh width
% and inverse mesh width.
% Creates a new colormap.
%
% #1 : the name of the color map as string (not as macro).
% #2 : a as is expected for a shading spec of
% pgf. However, the format allows a little bit more freedom:
% - it supports 'rgb255' in addition to pgf,
% - the length is not required (defaults to 1cm for the first and to
% the last length+h for all others).
% - the semicolons can be omitted.
%
% Example:
% \pgfplotscreatecolormap{my map}{rgb(0cm)=(1,0,0); rgb(1cm)=(0,1,0); rgb255(1.5cm)=(128,5,255); rgb(2cm)=(0,0,1); gray(3cm)=(3); color(4cm)=(green); }
% \pgfplotscreatecolormap{my map}{color=(green); color=(red); color=(blue); color=(yellow)}
\def\pgfplotscreatecolormap#{\pgfplots@createcolormap}%
\def\pgfplots@createcolormap#1#2{%
\pgfkeysinterruptkeyfilter
\edef\pgfplots@createcolormap@name{pgfpl@cm@#1}%
\expandafter\pgfplotsarraynewempty\expandafter{\pgfplots@createcolormap@name}%
\pgfplotsapplistXnewempty\pgfplots@createcolormap@X
%
% '0' = is not uniform
% '1' = is uniform
% '2' = is FORCED to be uniform, i.e. will be reinterpolated
\ifcase\pgfplots@colormap@uniform@choice\relax
% colormap uniform=always (due to compatibility requirements)
\def\b@pgfplotscreatecolormap@isuniform{2}%
\or
% colormap uniform=if requested
\def\b@pgfplotscreatecolormap@isuniform{1}%
\fi
\def\pgfplots@createcolormap@MIN{}% To be computed.
\def\pgfplots@createcolormap@MAX{}% To be computed.
\def\b@pgfplots@createcolormap@pos@mode{a}% [a]uto or [m]anual
\pgfplots@createcolormap@initcolorspace
\let\pgfplots@createcolormap@LAST=\pgfplots@createcolormap@MIN
% PARSE IT:
\let\pgfplots@createcolormap@context=\pgfutil@empty
%%%%%%%%%%%%%%%%%%
% this does also init @H:
\pgflibraryfpuifactive{%
\def\pgfplots@createcolormap@restore@fpu{}%
}{%
\def\pgfplots@createcolormap@restore@fpu{\pgfkeys{/pgf/fpu=false}}%
\pgfkeys{/pgf/fpu=true}%
}%
%\edef\pgfplots@loc@TMPa{#2}% XXX this fails for active chars and
%if key/value options are too special
\def\pgfplots@loc@TMPa{#2}%
\expandafter\pgfplots@createcolormap@startloop\pgfplots@loc@TMPa\pgfplots@EOI
%
\pgfplots@createcolormap@restore@fpu
%
%%%%%%%%%%%%%%%%%%
%
\expandafter\pgfplotsarraycheckempty\expandafter{\pgfplots@createcolormap@name}%
% sanity checking:
\expandafter\pgfplotsarraysizetomacro\expandafter{\pgfplots@createcolormap@name}\to\pgfplots@loc@TMPa
\ifcase\pgfplots@loc@TMPa\relax
\pgfplots@error{Sorry, you need to provide at least two points of a colormap.}%
\or
\pgfplots@error{Sorry, you need to provide at least two points of a colormap.}%
\fi
% Map the input range [MIN,MAX] linearly to [0,1000]
\pgfmathfloatsubtract@{\pgfplots@createcolormap@MAX}{\pgfplots@createcolormap@MIN}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfmathfloatdivide@{\pgfplotscolormaprange@float}{\pgfplots@loc@TMPb}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfmathfloatmultiply@{\pgfplots@loc@TMPb}{\pgfplots@createcolormap@H}%
\let\pgfplots@loc@TMPd=\pgfmathresult
\pgfplots@createcolormap@normalize{\pgfmathresult}%
\expandafter\let\csname\pgfplots@createcolormap@name @h\endcsname=\pgfmathresult
%
\pgfmathfloatreciprocal@{\pgfplots@loc@TMPd}%
\pgfplots@createcolormap@normalize{\pgfmathresult}%
\expandafter\let\csname\pgfplots@createcolormap@name @invh\endcsname=\pgfmathresult
%
% ... and set up the X coordinates if the grid is not uniform:
\expandafter\pgfplotsarraynewempty\expandafter{\pgfplots@createcolormap@name @X}%
\if0\b@pgfplotscreatecolormap@isuniform
% Uncomment the '\iftrue' for testing purposes (to see if a uniform map changes if
% processed as non-uniform):
% \iftrue
\pgfplotsapplistXlet\pgfplots@loc@TMPc=\pgfplots@createcolormap@X
\expandafter\pgfplotsutilforeachcommasep\expandafter{\pgfplots@loc@TMPc}\as\pgfplots@loc@TMPc{%
\ifx\pgfplots@loc@TMPc\pgfutil@empty
\else
% apply the trafo [MIN,MAX] -> [0,1000] here as well:
\pgfmathfloatsubtract@{\pgfplots@loc@TMPc}{\pgfplots@createcolormap@MIN}%
\expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplots@loc@TMPb}%
\pgfplots@createcolormap@normalize{\pgfmathresult}%
\expandafter\pgfplotsarraypushback\expandafter{\pgfmathresult}\to{pgfpl@cm@#1@X}%
\fi
}%
%
\pgfplotscolormapsetadditionalintervalwidth@{#1}%
\else
\expandafter\let\csname\pgfplots@createcolormap@name @X@scale@order@z\endcsname=\pgfutil@empty
\fi
% clear temporary list:
\pgfplotsapplistXnewempty\pgfplots@createcolormap@X
%
\if m\b@pgfplots@createcolormap@pos@mode
% Ah - we have manually provided positions!
% DISABLE the extra interval. You have to enable it explicitly
% by means of 'colormap access/extra interval width=0.1'
\expandafter\def\csname\pgfplots@createcolormap@name @X@scale@order@z\endcsname{0}%
\fi
%
\endpgfplotscolornormalizesequence%
\expandafter\let\csname\pgfplots@createcolormap@name @colspace\endcsname=\pgfplotsretval
\expandafter\let\csname\pgfplots@createcolormap@name @col@comps\endcsname=\pgfplotsretvalb
\c@pgf@counta=\expandafter\pgfplotsarraysizeof\expandafter{\pgfplots@createcolormap@name}\relax
\advance\c@pgf@counta by-1 %
\expandafter\edef\csname\pgfplots@createcolormap@name @lastindex\endcsname{\the\c@pgf@counta}%
%\pgfplots@colormap@showdebuginfofor{#1}%
\pgfplots@colormap@LUA@new{#1}%
\endpgfkeysinterruptkeyfilter
}
\def\pgfplots@createcolormap@normalize#1{%
\pgfmathfloattofixed{#1}%
\pgf@xa=\pgfmathresult pt %
\edef\pgfmathresult{\pgf@sys@tonumber\pgf@xa}% normalize number.
}%
% Allows to customize the width of the additional interval used for
% 'colormap access=piecewise constant'.
%
% #1 colormap name
% #2 the additional interval width for this colormap. Use '0' to disable the additional
% interval. The value is relative to the total width and must be in
% the range 0<=#2<=0.9
\def\pgfplotscolormapsetadditionalintervalwidth#1#2{%
\edef\pgfplots@loc@TMPd{#2}%
\def\pgfplots@loc@TMPc{h}%
\ifx\pgfplots@loc@TMPd\pgfplots@loc@TMPc
% 'h' means: mesh width:
\pgfplotscolormapifisuniform{#1}{%
\expandafter\let\csname pgfpl@cm@#1@X@scale@order@z\endcsname\pgfutil@empty%
}{%
\pgfplotscolormapsetadditionalintervalwidth@{#1}%
}%
\else
\pgfmathparse{#2}%
\pgfplotscolormapifisuniform{#1}{%
\ifdim\pgfmathresult pt>0pt
\pgfplots@error{Uniform colormaps support no configuration of the additional interval width for a colormap (although you can use 0 to turn it off). Please use a non-uniform colormap.}%
\else
% DISABLE the extra interval!
\expandafter\def\csname pgfpl@cm@#1@X@scale@order@z\endcsname{0}%
\fi
}{%
\ifdim\pgfmathresult pt>0pt
\ifdim\pgfmathresult pt>0.9pt
\pgfplots@error{Expected a number 0< X <= 0.9, not \pgfmathresult}%
\else
% compute the 'h'.
%
% Note that 's:=#2' is a fraction 0 h = 1000/s - 1000.
% regarding the '1-#2': I did some mistake in my
% computation and that fixed it :-/
\pgfmathparse{1000/(1-#2)-1000}%
\expandafter\let\csname pgfpl@cm@#1@h\endcsname=\pgfmathresult
\expandafter\let\csname pgfpl@cm@#1@invh\endcsname=\pgfutil@empty% unused!
\pgfplotscolormapsetadditionalintervalwidth@{#1}%
\fi
\else
% DISABLE the extra interval!
\expandafter\def\csname pgfpl@cm@#1@X@scale@order@z\endcsname{0}%
\fi
}%
\fi
%
\ifpgfplots@LUA@supported
\pgfplotsutil@directlua{%
pgfplots.texColorMapSetScaleOrderZ("#1", "\csname pgfpl@cm@#1@X@scale@order@z\endcsname")
}%
\fi
}%
% see \pgfplotscolormapsetadditionalintervalwidth
\def\pgfplotscolormapsetadditionalintervalwidth@#1{%
% 'colormap access=piecewise constant' (order 0) requires a
% special scaling factor. See its consumers for details +
% documentation
\pgfmathparse{1000/(1000+\csname pgfpl@cm@#1@h\endcsname)}%
\expandafter\let\csname pgfpl@cm@#1@X@scale@order@z\endcsname=\pgfmathresult
}%
\def\pgfplots@createcolormap@initcolorspace{%
\pgfplotscolornormalizesequence[
colorspace=\pgfkeysvalueof{/pgfplots/colormap default colorspace},
context message=\pgfplots@createcolormap@context\pgfplots@createcolormap@trace,
]%
}%
\def\pgfplots@createcolormap@seth[#1]{%
\def\pgfplots@createcolormap@context{[#1]}%
\pgfmathparse{#1}%
\let\pgfplots@createcolormap@H=\pgfmathresult
% request for a uniform colormap:
\def\b@pgfplotscreatecolormap@isuniform{3}%
\pgfplots@createcolormap@
}%
\def\pgfplots@createcolormap@startloop{%
\pgfutil@ifnextchar[%
{\pgfplots@createcolormap@seth}%
{%
\let\pgfplots@createcolormap@H=\pgfutil@empty
\pgfplots@createcolormap@
}%
}%
\def\pgfplots@createcolormap@{%
\pgfutil@ifnextchar\pgfplots@EOI{\pgfutil@gobble}%done!
{%
\pgfutil@ifnextchar;{\pgfplots@createcolormap@grabsemicolon}%
{%
\pgfutil@ifnextchar,{\pgfplots@createcolormap@grabcomma}%
{%
\expandafter\pgfutil@ifnextchar\pgfplots@activesemicolon{\pgfplots@createcolormap@grabsemicolon@active}%
{%
\pgfplots@createcolormap@grabnext
}%
}%
}%
}%
}
% Executes '#1' if there are more tokens and '#2' if not.
\def\pgfplots@createcolormap@ifhasmorecolors#1#2{%
\pgfutil@ifnextchar\pgfplots@EOI{%
#2% no more tokens.
}{%
\pgfutil@ifnextchar;{\pgfplots@createcolormap@grabsemicolon@hasnext{#1}{#2}}%
{%
\pgfutil@ifnextchar,{\pgfplots@createcolormap@grabcomma@hasnext{#1}{#2}}%
{%
\expandafter\pgfutil@ifnextchar\pgfplots@activesemicolon{\pgfplots@createcolormap@grabsemicolon@active@hasnext{#1}{#2}}%
{%
#1% has more.
}%
}%
}%
}%
}%
\def\pgfplots@createcolormap@error#1#2\pgfplots@EOI{%
{%
\t@pgfplots@toka={#1#2}%
\t@pgfplots@tokb={#1}%
\pgfplots@error{Illformed colormap specification: I could not read the substring `\the\t@pgfplots@toka' starting at `\the\t@pgfplots@tokb'\pgfplots@createcolormap@trace}%
}%
}%
\def\pgfplots@createcolormap@trace{%
\space(color no \expandafter\pgfplotsarraysizeof\expandafter{\pgfplots@createcolormap@name})
}
\def\pgfplots@createcolormap@grabnext#1={%
\pgfutil@ifnextchar({\pgfplots@createcolormap@grabnext@round{#1}=}{%
\pgfutil@ifnextchar\bgroup{\pgfplots@createcolormap@grabnext@curly{#1}=}{%
\pgfplots@createcolormap@error#1=%
}%
}%
}
\def\pgfplots@createcolormap@grabnext@round#1=(#2){%
\pgfplots@createcolormap@grabnext@@{#1}={#2}%
}%
\def\pgfplots@createcolormap@grabnext@curly#1=#2{%
\pgfplots@createcolormap@grabnext@@{#1}={#2}%
}%
\def\pgfplots@createcolormap@grabnext@@#1=#2{%
\pgfutil@in@({#1}%
\ifpgfutil@in@
% Ah. We have something like 'color(1cm)' before the equal sign.
\pgfplots@createcolormap@grabnext@read@pos#1\pgfplots@EOI%
% now:
%\pgfplots@loc@TMPa = colorspace
%\pgfplots@loc@TMPb = position
%
\else
% Ah. we do not have a position, i.e. we have
% color=(green)
% or something like this.
%
% this here defines \pgfplots@loc@TMPa to contain the
% colorspace:
\pgfkeys@spdef\pgfplots@loc@TMPa{#1}%
%
\pgfplots@createcolormap@grabnext@computenextposition
\let\pgfplots@loc@TMPb=\pgfmathresult% position
\fi
\def\pgfplots@loc@TMPc{#2}%
\pgfplots@createcolormap@grabnext@complete
}%
\def\pgfplots@createcolormap@grabnext@read@pos#1({%
\pgfkeys@spdef\pgfplots@loc@TMPa{#1}% colorspace
\pgfplots@createcolormap@grabnext@read@pos@
}%
\def\pgfplots@createcolormap@grabnext@read@pos@#1){%
\def\pgfplots@loc@TMPb{#1}% position
\def\b@pgfplots@createcolormap@pos@mode{m}% [m]anual
\pgfutil@ifnextchar\pgfplots@EOI{%
% OK
\pgfplots@gobble@until@EOI
}{%
\pgfplots@createcolormap@error#1)%
}%
}%
%%%%%%%%%%
% Splits ' of *' into (\pgfplotsretval,
% \pgfplotsretvalb).
%
% The 'of' part is optional. If it is missing, '\pgfplotsretval'
% contains the entire argument and '\pgfplotsretvalb' is the current
% colormap.
%
% Note that '*' is typically just a colormap name (i.e. without
% '*'), but it _may_ contain key-value lists! They will be returned as-is.
% #1: the string to split
% #2: '1' if '#1' may contain ',' and '0' otherwise
\def\pgfplots@createcolormap@special@split#1#2{%
\pgfutil@in@{of }{#1}%
\ifpgfutil@in@
\pgfplots@createcolormap@special@split@#1\pgfplots@EOI
\else
\if1#2\relax
% do not check it -- commas are allowed here!
\pgfutil@in@false
\else
\pgfutil@in@{,}{#1}%
\fi
\ifpgfutil@in@
% ah - might be something like '5, target pos={1,2,3}'.
% -> define \pgfplotsretval='5' and
% \pgfplotsretvalb=', target pos={1,2,3}':
%
\pgfplots@createcolormap@special@split@command#1\pgfplots@EOI
\t@pgfplots@tokb=\expandafter{\pgfplotsretvalb}%
\pgfkeysgetvalue{/pgfplots/colormap name}\pgfplotsretvalb
\edef\pgfplotsretvalb{\pgfplotsretvalb,\the\t@pgfplots@tokb}%
\else
\pgfkeys@spdef\pgfplotsretval{#1}%
\pgfkeysgetvalue{/pgfplots/colormap name}\pgfplotsretvalb
\fi
\fi
%\message{Split (#1) --> '\pgfplotsretval', '\pgfplotsretvalb'^^J}%
}%
\def\pgfplots@createcolormap@special@split@#1of #2\pgfplots@EOI{%
\pgfkeys@spdef\pgfplotsretval{#1}%
\pgfkeys@spdef\pgfplotsretvalb{#2}%
}
\def\pgfplots@createcolormap@special@split@command#1,#2\pgfplots@EOI{%
\pgfkeys@spdef\pgfplotsretval{#1}%
\pgfkeys@spdef\pgfplotsretvalb{#2}%
}
% Output: \pgfplotsretval will be populated with the resulting
% colormap name.
\def\pgfplots@createcolormap@special@ensure@source@cm#1{%
\edef\pgfplotsretval{#1}%
\pgfplotscolormapifdefined{#1}{}{%
% hm... the colormap does not exist? Perhaps someone used
% style 'colormap/cool'. Try to define it!
\pgfkeysifdefined{/pgfplots/#1/.@cmd}{%
\pgfkeysgetvalue{/pgfplots/colormap name}\pgfplots@color@of@colormap@name@old
\pgfplotsset{#1}%
\pgfkeysgetvalue{/pgfplots/colormap name}\pgfplotsretval
\pgfkeyslet{/pgfplots/colormap name}\pgfplots@color@of@colormap@name@old
}{%
\pgfplots@error{The argument '#1' is no valid colormap.}%
}%
}%
}%
\newif\ifpgfplots@createcolormap@target@pos@includes@limits@min
\newif\ifpgfplots@createcolormap@target@pos@includes@limits@max
% these keys are only evaluated inside of
% \pgfplots@of@colormap@getresult :
\pgfqkeys{/pgfplots/of colormap}{%
source name/.initial=,
target pos/.initial=,
target pos min/.initial=,
target pos min/insert/.is if=pgfplots@createcolormap@target@pos@includes@limits@min,
target pos min*/.style={%
/pgfplots/of colormap/target pos min={#1},
/pgfplots/of colormap/target pos min/insert=true,
},%
target pos max/.initial=,
target pos max*/.style={%
/pgfplots/of colormap/target pos max={#1},
/pgfplots/of colormap/target pos max/insert=true,
},%
target pos max/insert/.is if=pgfplots@createcolormap@target@pos@includes@limits@max,
source pos/.initial=,
source pos/.set if not empty/.code={%
\edef\pgfplots@loc@TMPa{#1}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\else
\pgfkeyslet{/pgfplots/of colormap/source pos}\pgfplots@loc@TMPa
\fi
},
%
@define/.code={%
\pgfplots@error{Please write 'single color' or 'color list' such that pgfplots knows how to interprete values}%
\let\pgfplotsretval=\pgfutil@empty
},
single color/.style={%
/pgfplots/of colormap/@define/.code={%
\pgfplots@createcolormap@special@process@single
},
},
color list/.style={%
/pgfplots/of colormap/@define/.code={%
\pgfplots@createcolormap@special@process@list%
},
},
color list,
%
of colormap/.style={#1},
%
% 'color of colormap={#1}' is a style which boils down to
% '@delegate to@ of colormap={color}{#1}'.
% The same is true for
% colors of colormap
% index of colormap
% indices of colormap
% samples of colormap
%
% All use this implementation:
% #1: how to interprete results. /pgfplots/of colormap/#1 must be
% a valid key (like 'color').
% #2: the argument which can be ' of ' or ''.
% #3: '1' if the source pos may contain ',' and '0' otherwise
@delegate to@ of colormap/.code args={#1#2#3}{%
% Convert 'color of colormap={...}' and its variants into
% 'of colormap={}':
\pgfplots@createcolormap@special@split{#2}{#3}%
\edef\pgfplots@loc@TMPa{%
#1,%
source pos={\pgfplotsretval},%
% \pgfplotsretvalb will contain the colormap name
% --- but it _can_ also contain further key-value pairs!
% Do not add braces here such that further key-value pairs
% can be found:
source name=\pgfplotsretvalb,%
}%
\expandafter\pgfkeysalso\expandafter{\pgfplots@loc@TMPa}%
},
%
color/.style={%
/pgfplots/of colormap/colormap access=map,
/pgfplots/of colormap/single color,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
const color/.style={%
/pgfplots/of colormap/colormap access=piecewise constant,
/pgfplots/of colormap/single color,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
index/.style={%
/pgfplots/of colormap/colormap access=direct,
/pgfplots/of colormap/single color,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
colors/.style={%
/pgfplots/of colormap/colormap access=map,
/pgfplots/of colormap/color list,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
samples/.style={%
/pgfplots/of colormap/colormap access=map,% can be overridden if needed.
/pgfplots/of colormap/@define/.code={%
\pgfplots@createcolormap@special@process@list@sampled%
},
/pgfplots/of colormap/source pos/.set if not empty={#1},
},%
%
const colors/.style={%
/pgfplots/of colormap/colormap access=piecewise constant,
/pgfplots/of colormap/color list,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
indices/.style={%
/pgfplots/of colormap/colormap access=direct,
/pgfplots/of colormap/color list,
/pgfplots/of colormap/source pos/.set if not empty={#1},
},
colormap access/.style={/pgfplots/colormap access={#1}},
source range/.initial=0:1000,
%
sample for/.is choice,
sample for/default/.code={\def\pgfplots@ofcolorbar@sample@for@choice{m}},
sample for/const/.code={\def\pgfplots@ofcolorbar@sample@for@choice{c}},
sample for=default,
%
/pgfplots/of colormap/.unknown/.code={%
\pgfplotsutilifstringequal{#1}{\pgfkeysnovalue}{%
% This here allows to write 'of colormap={initial}'
\pgfplotscolormapifdefined{\pgfkeyscurrentname}{%
\edef\pgfplots@loc@TMPa{%
\noexpand\pgfkeysalso{%
/pgfplots/of colormap/source name={\pgfkeyscurrentname},
}%
}%
\pgfplots@loc@TMPa
}{%
\pgfplots@error{Unknown key '\pgfkeyscurrentname'. Is this a colormap name? Maybe you need to write \string\pgfplotsset{\pgfkeyscurrentname} first?}%
}%
}{%
\pgfkeysgetvalue{/handlers/.unknown/.@cmd}{\pgfkeys@code}%
\expandafter\pgfkeys@code\pgfkeyscurrentvalue\pgfeov%
}%
},
%
% allow something like 'of colormap={colormap/PuBuGn}':
/pgfplots/of colormap/colormap/.unknown/.code={%
\edef\pgfplots@loc@TMPa{\noexpand\pgfplotsset{colormap/\pgfkeyscurrentname}}%
\pgfplots@loc@TMPa
},%
}
\pgfplotsinvokeforeach{%
color,% defines 'color of colormap'
index,% defines 'index of colormap'
const color,% defines 'const color of colormap'
samples,% defines 'samples of colormap'
}{%
\def\pgfplots@glob@TMPa{#1}%
\ifx\pgfplots@glob@TMPa\pgfutil@empty
\else
\pgfkeysdef{/pgfplots/of colormap/#1 of colormap}{%
\pgfkeysalso{/pgfplots/of colormap/@delegate to@ of colormap={#1}{##1}{0}}%
}%
\fi
}%
\pgfplotsinvokeforeach{%
indices,% defines 'indices of colormap'
colors,% defines 'colors of colormap'
const colors,% defines 'const colors of colormap'
}{%
\def\pgfplots@glob@TMPa{#1}%
\ifx\pgfplots@glob@TMPa\pgfutil@empty
\else
\pgfkeysdef{/pgfplots/of colormap/#1 of colormap}{%
\pgfkeysalso{/pgfplots/of colormap/@delegate to@ of colormap={#1}{##1}{1}}%
}%
\fi
}%
% This is the main implementation of 'of colormap'. It is shared by
% both cycle lists and colormaps.
%
\def\pgfplots@of@colormap@getresult#1{%
\pgfkeysinterruptkeyfilter
\pgfqkeys{/pgfplots/of colormap}{%
% ensure that this here is not inherited from the axis'
% configuration -- reset it:
colormap access=map,%
#1}%
\pgfkeysgetvalue{/pgfplots/of colormap/source name}\pgfplots@loc@TMPa
\edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\else
\pgfkeyslet{/pgfplots/colormap name}\pgfplots@loc@TMPa
\fi
\pgfplots@createcolormap@special@ensure@source@cm{\pgfkeysvalueof{/pgfplots/colormap name}}%
\pgfkeyslet{/pgfplots/colormap name}\pgfplotsretval
%
\pgfqkeys{/pgfplots/of colormap}{@define}%
\endpgfkeysinterruptkeyfilter
}%
\def\pgfplots@createcolormap@special@process@single@error{%
\pgfplots@error{Did not find a suitable input source pos in a 'of colormap' specification. Did you forget the 'source pos'? It can be given as 'colors of colormap=(source pos of name)' or 'of colormap=(source pos=...,..)'}%
\pgfkeyssetvalue{/pgfplots/of colormap/source pos}{0}%
}%
\def\pgfplots@createcolormap@special@process@single@error@comma{%
\pgfplots@error{Found an unexpected comma in 'source pos=\pgfkeysvalueof{/pgfplots/of colormap/source pos}'. Please use one of the styles 'colors', 'indices', or 'const colors' in order to process more than one position}%
\pgfkeyssetvalue{/pgfplots/of colormap/source pos}{0}%
}%
\def\pgfplots@createcolormap@special@process@single{%
\begingroup
\let\pgfplots@color@of@colormap@access=\pgfplots@colormap@access
\pgfkeysgetvalue{/pgfplots/of colormap/source range}\pgfplotspointmetatransformedrange
\ifx\pgfplotspointmetatransformedrange\pgfutil@empty
% evaluated by \pgfplots@color@of@colormap@define...
\let\pgfplotspointmetatransformedrange=\pgfplotscolormaprange
\fi
%
\pgfkeysgetvalue{/pgfplots/of colormap/source pos}\pgfplots@loc@TMPa
\edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\pgfplots@createcolormap@special@process@single@error
\else
\edef\pgfplots@loc@TMPa{%
\noexpand\pgfutil@in@{,}{\pgfplots@loc@TMPa}%
}%
\pgfplots@loc@TMPa
\ifpgfutil@in@
\pgfplots@createcolormap@special@process@single@error@comma
\else
\pgfmathparse{\pgfkeysvalueof{/pgfplots/of colormap/source pos}}%
\pgfkeyslet{/pgfplots/of colormap/source pos}\pgfmathresult
\fi
\fi
%
\pgflibraryfpuifactive{\pgfkeys{/pgf/fpu=false}}{}%
%
\edef\pgfplots@loc@TMPa{%
\noexpand\pgfplots@color@of@colormap@define{\pgfkeysvalueof{/pgfplots/of colormap/source pos}}%
}%
\pgfplots@loc@TMPa
%
\pgfplots@createcolormap@special@process@single@define
\pgfmath@smuggleone\pgfplotsretval
\endgroup
}%
\def\pgfplots@createcolormap@special@process@single@define{%
\pgfkeysgetvalue{/pgfplots/of colormap/target pos}\pgfplots@temp@pos
\ifx\pgfplots@temp@pos\pgfutil@empty
\else
\edef\pgfplots@temp@pos{(\pgfplots@temp@pos)}%
\fi
%
\edef\pgfplotsretval{%
\csname pgfpl@cm@\pgfkeysvalueof{/pgfplots/colormap name}@colspace\endcsname\pgfplots@temp@pos=(\pgfmathresult)%
}%
}%
\let\pgfplots@createcolormap@special@process@single@define@CM=\pgfplots@createcolormap@special@process@single@define%
\def\pgfplots@createcolormap@special@process@list@sanitize@selection{%
\pgfkeysgetvalue{/pgfplots/of colormap/source pos}\pgfplots@loc@TMPa
\edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
% default to a suitable source pos.
\ifnum\pgfplots@pos@size<2
% We have either 0 positions or 1 position.
% This is clearly insufficient and we assume that this
% position argument merely gives the start point for the
% list.
%
% Select all of the input colormap:
\edef\pgfplots@loc@TMPa{%
\noexpand\pgfkeysalso{%
/pgfplots/of colormap/source pos={0,...,\pgfplotscolormaplastindexof{\pgfkeysvalueof{/pgfplots/colormap name}}},%
/pgfplots/of colormap/indices,
}%
}%
\pgfplots@loc@TMPa
\else
% hm... we have no source pos, but we have positions! In
% this case, we _sample_ source pos uniformly with one
% sample for each position!
\pgfkeyslet{/pgfplots/of colormap/source pos}\pgfplots@pos@size
\pgfplots@createcolormap@special@process@list@sampled@define{P}%
\fi
\fi
}
\def\pgfplots@createcolormap@special@process@list@limits{%
\begingroup
%
\pgfkeysgetvalue{/pgfplots/of colormap/target pos}\pgfplots@target
\ifx\pgfplots@target\pgfutil@empty
\else
\pgfkeys{/pgf/fpu=true}%
\pgfkeysgetvalue{/pgfplots/of colormap/target pos min}\pgfplots@target@min
\pgfkeysgetvalue{/pgfplots/of colormap/target pos max}\pgfplots@target@max
\pgfplots@loc@tmpfalse
\ifx\pgfplots@target@min\pgfutil@empty
\else
\pgfmathparse\pgfplots@target@min
\let\pgfplots@target@min=\pgfmathresult
\pgfplots@loc@tmptrue
\fi
\ifx\pgfplots@target@max\pgfutil@empty
\else
\pgfmathparse\pgfplots@target@max
\let\pgfplots@target@max=\pgfmathresult
\pgfplots@loc@tmptrue
\fi
\ifpgfplots@loc@tmp
% Ah - we _have_ limit constraints! Enforce them:
\def\b@pgfplots@isfirst{1}%
\pgfmathfloatcreate{1}{1.0}{324}%
\let\pgfplots@firstpos\pgfmathresult%
\let\pgfplots@lastpos\pgfmathresult%
\pgfplotsapplistXnewempty\pgfplots@createcolormap@trg@accum
\def\pgfplots@loc@TMPa{\pgfplotsforeachungrouped \x in}%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@target}{%
\ifx\x\pgfutil@empty
\else
\pgfmathparse{\x}%
\let\x=\pgfmathresult
\ifx\pgfplots@target@min\pgfutil@empty
\else
\pgfmathfloatlessthan{\x}{\pgfplots@target@min}%
\ifpgfmathfloatcomparison
\let\x=\pgfutil@empty
\fi
\fi
\ifx\pgfplots@target@max\pgfutil@empty
\else
\ifx\x\pgfutil@empty
\else
\pgfmathfloatlessthan{\pgfplots@target@max}{\x}%
\ifpgfmathfloatcomparison
\let\x=\pgfutil@empty
\fi
\fi
\fi
%
\ifx\x\pgfutil@empty
\else
\let\pgfplots@lastpos=\x
\if1\b@pgfplots@isfirst
\let\pgfplots@firstpos=\x
\def\b@pgfplots@isfirst{0}%
\else
\edef\x{,\x}%
\fi
\expandafter\pgfplotsapplistXpushback\expandafter{\x}\to\pgfplots@createcolormap@trg@accum
\fi
\fi
}%
%
\ifpgfplots@createcolormap@target@pos@includes@limits@max
\ifx\pgfplots@target@max\pgfutil@empty
\else
\pgfmathfloatifapproxequalrel{\pgfplots@lastpos}{\pgfplots@target@max}{%
}{%
\let\x=\pgfplots@target@max
\if1\b@pgfplots@isfirst
\def\b@pgfplots@isfirst{0}%
\else
\edef\x{,\x}%
\fi
\expandafter\pgfplotsapplistXpushback\expandafter{\x}\to\pgfplots@createcolormap@trg@accum
}%
\fi
\fi
%
\pgfplotsapplistXlet\pgfplots@target=\pgfplots@createcolormap@trg@accum
%
\ifpgfplots@createcolormap@target@pos@includes@limits@min
\ifx\pgfplots@target@min\pgfutil@empty
\else
\pgfmathfloatifapproxequalrel{\pgfplots@firstpos}{\pgfplots@target@min}{%
}{%
\let\x=\pgfplots@target@min
\if1\b@pgfplots@isfirst
\let\pgfplots@target=\x
\else
\edef\pgfplots@target{\x,\pgfplots@target}%
\fi
}%
\fi
\fi
\fi
\fi
%
\global\let\pgfplots@glob@TMPb=\pgfplots@target
\endgroup
%\message{limit application: \pgfkeysvalueof{/pgfplots/of colormap/target pos} ^^J -->\pgfplots@glob@TMPb^^J}%
\pgfkeyslet{/pgfplots/of colormap/target pos}\pgfplots@glob@TMPb
}%
\def\pgfplots@createcolormap@special@process@list@define@target@array{%
\pgfplots@createcolormap@special@process@list@limits%
%
\pgfkeysgetvalue{/pgfplots/of colormap/target pos}\pgfplots@loc@TMP
\expandafter\pgfplotsarraynew\expandafter\pgfplots@pos@array\expandafter{\pgfplots@loc@TMP}%
%
\pgfplotsarraysizetomacro\pgfplots@pos@array\to\pgfplots@pos@size
}%
% PRECONDITION: Must be invoked within \pgfplots@of@colormap@getresult
\def\pgfplots@createcolormap@special@process@list{%
\begingroup
\pgfkeys{/pgf/fpu=true}%
\pgfplots@createcolormap@special@process@list@define@target@array
%
\pgfplotsapplistXnewempty\pgfplots@createcolormap@special@process@result
%
\gdef\c@pgfplots@elem{0}%
%
\def\pgfplots@createcolormap@special@process@list@append{%
\pgfplots@createcolormap@special@process@single
%
% append separator
\t@pgfplots@toka=\expandafter{\pgfplotsretval}%
\t@pgfplots@tokb=\expandafter{\pgfplots@createcolormap@special@process@list@separator}%
\edef\pgfplotsretval{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
%
\expandafter\pgfplotsapplistXpushback\pgfplotsretval\to\pgfplots@createcolormap@special@process@result
}%
%
\pgfplots@createcolormap@special@process@list@sanitize@selection
%
\pgfkeysgetvalue{/pgfplots/of colormap/source pos}\pgfplots@source
%
\def\pgfplots@loc@TMPa{\pgfplotsforeachungrouped \x in }%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@source}{%
%
\pgfkeyslet{/pgfplots/of colormap/source pos}\x
%
\ifnum\c@pgfplots@elem<\pgfplots@pos@size\relax
\pgfplotsarrayselect\c@pgfplots@elem\of\pgfplots@pos@array\to\pgfplots@loc@TMPa
\pgfkeyslet{/pgfplots/of colormap/target pos}\pgfplots@loc@TMPa
\else
% auto-position:
\pgfkeyslet{/pgfplots/of colormap/target pos}\pgfutil@empty
\fi
%
\pgfplots@createcolormap@special@process@list@append
%
\pgfplotsutil@advancestringcounter@global\c@pgfplots@elem
}%
%
\pgfutil@loop
\ifnum\c@pgfplots@elem<\pgfplots@pos@size\relax
\pgfplotsarrayselect\c@pgfplots@elem\of\pgfplots@pos@array\to\pgfplots@loc@TMPa
\pgfkeysgetvalue{/pgfplots/of colormap/source pos}\x
\pgfplotswarning{too many colormap positions}{index \c@pgfplots@elem\space (value \pgfplots@loc@TMPa)}\pgfeov%
\pgfplotsutil@advancestringcounter@global\c@pgfplots@elem
%
\pgfutil@repeat
%
\pgfplotsapplistXlet\pgfplotsretval=\pgfplots@createcolormap@special@process@result
\global\let\pgfplots@glob@TMPa=\pgfplotsretval
\endgroup
\let\pgfplotsretval=\pgfplots@glob@TMPa
%\message{of colormap with list functionality results in \meaning\pgfplotsretval^^J}%
}%
\def\pgfplots@createcolormap@special@process@list@sampled{%
\begingroup
\pgfkeys{/pgf/fpu=true}%
\pgfplots@createcolormap@special@process@list@define@target@array
%
% no need to reapply it in \pgfplots@createcolormap@special@process@list:
\let\pgfplots@createcolormap@special@process@list@define@target@array=\relax
%
\pgfplots@createcolormap@special@process@list@sampled@define{S}%
\pgfplots@createcolormap@special@process@list
\global\let\pgfplots@glob@TMPa=\pgfplotsretval
\endgroup
\let\pgfplotsretval=\pgfplots@glob@TMPa
}
% Defines
% * 'source range',
% * 'source pos',
% in a way such that it implements 'samples of colormap'
% #1: 'S' if it _must_ satisfy the number of samples and 'P' if it
% _must_ satisfy the positions
\def\pgfplots@createcolormap@special@process@list@sampled@define#1{%
\begingroup
\pgfkeysgetvalue{/pgfplots/of colormap/source pos}\pgfplots@source
%
\def\b@pgfplots@special@interval{0}%
\def\b@pgfplots@special@interval@additional{0}%
\if c\pgfplots@ofcolorbar@sample@for@choice%
% or colormap/sample for=const:
% sample one less and replicate the last color. This
% is to compensate for 'colormap access/extra interval width=0'
% (which is the default for colormaps with positions)
\ifnum\pgfplots@pos@size>1
% ah - we have at least 2 positions and 'extra interval width=0' applies!
\if S#1%
\c@pgf@counta=\pgfplots@source\relax
\advance\c@pgf@counta by1 %
\ifnum\pgfplots@pos@size=\c@pgf@counta
\else
\pgfplotsthrow{too few colormap positions}{\pgfplots@pos@size}{There is an unexpected number of arguments to 'target pos' for 'samples of colormap=(\pgfplots@source)'. Please provide \the\c@pgf@counta\space positions, not \pgfplots@pos@size}\pgfeov%
\fi
\fi
\if S#1%
% this is the case
% samples of colormap={5, target pos={<6 positions>}}
% -> we need to replicate the last color such that we see the rightmost color of the input map
\def\b@pgfplots@special@interval{1}%
% -> we also need one more sample point (one for each position):
\def\b@pgfplots@special@interval@additional{1}%
\else
% we have pgfplots@pos@size=pgfplots@source.
\if1\b@pgfplots@createcolormap@found@more@colors
% there are more positions/colors!? Ok, no need to
% apply it here:
\def\b@pgfplots@special@interval{0}%
\else
\def\b@pgfplots@special@interval{1}%
\fi
\fi
\else
\def\b@pgfplots@special@interval{0}%
\fi
\else
\def\b@pgfplots@special@interval{0}%
\ifnum\pgfplots@pos@size>1
% ah - we have at least 2 positions
\if S#1%
\ifnum\pgfplots@pos@size=\pgfplots@source
\else
\pgfplotsthrow{too few colormap positions}{\pgfplots@pos@size}{There is an unexpected number of arguments to 'target pos' for 'samples of colormap=(\pgfplots@source)'. Please provide \pgfplots@source\space positions, not \pgfplots@pos@size}\pgfeov%
\fi
\fi
\fi
\fi
%
\if1\b@pgfplots@special@interval@additional
\c@pgf@counta=\pgfplots@source\relax
\advance\c@pgf@counta by+1
\edef\pgfplots@source{\the\c@pgf@counta}%
\fi
\if1\b@pgfplots@special@interval
\begingroup
\c@pgf@counta=\pgfplots@source\relax
\advance\c@pgf@counta by-1
%
\pgfplotsapplistXnewempty\pgfplots@createcolormap@trg@accum
\ifnum\c@pgf@counta<2
\pgfmathfloatcreate{0}{0.0}{0}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfmathresult,}\to\pgfplots@createcolormap@trg@accum
\else
\edef\pgfplots@source{\the\c@pgf@counta}%
\pgfplots@domain@to@foreach 0:1000\relax{\pgfplots@source}%
%
\def\pgfplots@loc@TMPa{\pgfplotsforeachungrouped \x in}%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfplotsretval}{%
\expandafter\pgfplotsapplistXpushback\expandafter{\x,}\to\pgfplots@createcolormap@trg@accum
}%
\fi
%
\pgfmathfloatcreate{1}{1.0}{3}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfmathresult}\to\pgfplots@createcolormap@trg@accum
%
\pgfplotsapplistXlet\pgfplots@target=\pgfplots@createcolormap@trg@accum
\global\let\pgfplots@glob@TMPa=\pgfplots@target
\endgroup
%
\let\pgfplotsretval=\pgfplots@glob@TMPa
\else
\pgfplots@domain@to@foreach 0:1000\relax{\pgfplots@source}%
\fi
\pgfmath@smuggleone\pgfplotsretval
\endgroup
\pgfkeyslet{/pgfplots/of colormap/source pos}\pgfplotsretval
\pgfqkeys{/pgfplots/of colormap}{%
source range=0:1000,%
}%
%\message{define sample positions(#1) = \pgfplotsretval^^J}%
}%
\def\pgfplots@createcolormap@special@process@list@separator@CM{ }%
\let\pgfplots@createcolormap@special@process@list@separator=\pgfplots@createcolormap@special@process@list@separator@CM
%%%%%%%%%%
\def\b@pgfplots@createcolormap@found@more@colors{0}%
\def\pgfplots@createcolormap@grabnext@complete{%
\edef\pgfplots@loc@TMPd{%
\noexpand\pgfutil@in@{of color}{\pgfplots@loc@TMPa}%
}%
\pgfplots@loc@TMPd
\ifpgfutil@in@
\def\pgfplots@loc@TMPd{%
\pgfplots@createcolormap@ifhasmorecolors{%
\def\b@pgfplots@createcolormap@found@more@colors{1}%
\pgfplots@createcolormap@grabnext@complete@of@colormap
}{%
\def\b@pgfplots@createcolormap@found@more@colors{0}%
\pgfplots@createcolormap@grabnext@complete@of@colormap
}%
}%
\else
% ok, this is a 'normal' color specification with position,
% colorspace, and color data.
%
\edef\pgfplots@loc@TMPa{%
{\pgfplots@loc@TMPb}% position
{%
\pgfplots@loc@TMPa% colorspace
=\pgfplots@loc@TMPc% color data
}%
}%
\expandafter\pgfplots@createcolormap@nextcolor\pgfplots@loc@TMPa
%
% continue loop:
\def\pgfplots@loc@TMPd{\pgfplots@createcolormap@}%
\fi
%
%
% continue loop:
\pgfplots@loc@TMPd
}%
\def\pgfplots@createcolormap@grabnext@complete@of@colormap{%
% ah - a special one based on another colormap!
% convert it into the standard format:
\begingroup
\let\pgfplotscolormap@at=\pgfplots@loc@TMPb
\let\pgfplotscolormap@argument=\pgfplots@loc@TMPc
\let\pgfplotscolormap@key=\pgfplots@loc@TMPa
%
\pgfplots@createcolormap@grabnext@complete@ofcolormap
\pgfmath@smuggleone\pgfplotsretval
\endgroup
%
\expandafter\pgfplots@createcolormap@\pgfplotsretval
}%
% INPUT:
% \pgfplotscolormap@at
% \pgfplotscolormap@argument
% \pgfplotscolormap@key
% OUTPUT:
% The result of /pgfplots/of colormap/@define.
% For the normal colormap definition, it populates
% \pgfplotsretval with the color specifications as they should
% be processed by the colormap definition code.
\def\pgfplots@createcolormap@grabnext@complete@ofcolormap{%
\t@pgfplots@tokb=\expandafter{\pgfplotscolormap@argument}%
\edef\pgfplotscolormap@keyvalue{%
\if m\b@pgfplots@createcolormap@pos@mode
% ah - we have had manually provided positions before.
% Well, keep them. Otherwise, we will stay at the default
% placement.
target pos={\pgfplotscolormap@at},%
\fi
% ... but can be overriden here:
\pgfplotscolormap@key={\the\t@pgfplots@tokb},%
}%
%
\let\pgfplots@createcolormap@special@process@single@define=\pgfplots@createcolormap@special@process@single@define@CM
\let\pgfplots@createcolormap@special@process@list@separator=\pgfplots@createcolormap@special@process@list@separator@CM
%
% finally, process the keys:
\expandafter\pgfplots@of@colormap@getresult\expandafter{%
\pgfplotscolormap@keyvalue,
}%
%\message{\pgfplotscolormap@key={\pgfplotscolormap@argument} -> '\pgfplotscolormap@keyvalue' -> \pgfplotsretval^^J}%
}%
\def\pgfplots@createcolormap@grabnext@computenextposition{%
% determine next step size automatically:
\expandafter\pgfplotsarraycheckempty\expandafter{\pgfplots@createcolormap@name}%
\ifpgfplotsarrayempty
% first: just use 0.
\pgfmathfloatcreate{0}{0.0}{0}%
\else
% not first:
\ifx\pgfplots@createcolormap@H\pgfutil@empty
% ah; we really have to deduce something. We are at the
% second node:
%\def\pgfmathresult{1cm}%
\pgfmathfloatcreate{1}{2.845274}{1}% 1cm=28.45274pt . Backw compat
\else
\pgfmathfloatadd@\pgfplots@createcolormap@LAST\pgfplots@createcolormap@H
\fi
\fi
}%
\def\pgfplots@createcolormap@grabsemicolon;{\pgfplots@createcolormap@}%
\def\pgfplots@createcolormap@grabcomma,{\pgfplots@createcolormap@}%
\def\pgfplots@createcolormap@grabsemicolon@hasnext#1#2;{\pgfplots@createcolormap@ifhasmorecolors{#1}{#2}}%
\def\pgfplots@createcolormap@grabcomma@hasnext#1#2,{\pgfplots@createcolormap@ifhasmorecolors{#1}{#2}}%
{
\catcode`\;=13
\gdef\pgfplots@createcolormap@grabsemicolon@active;{\pgfplots@createcolormap@}%
\gdef\pgfplots@createcolormap@grabsemicolon@active@hasnext#1#2;{\pgfplots@createcolormap@ifhasmorecolors{#1}{#2}}%
}
\def\pgfplots@createcolormap@nextcolor@tostring#1=#2\pgfplots@EOI#3{%
#1(#3)=(#2)%
}%
% #1: h
% #2: a compound element of the form
% '='
% The format is chosen such that it can be forwarded directly to
% \pgfplotscolornormalizesequencenext
%
% see \pgfplotscolornormalizesequencenext for details
\def\pgfplots@createcolormap@nextcolor#1#2{%
\def\pgfplots@createcolormap@context{\pgfplots@createcolormap@nextcolor@tostring#2\pgfplots@EOI{#1}\pgfplots@createcolormap@trace}%
%
\pgfplotscolornormalizesequencenext{#2}%
\let\pgfplots@createcolormap@col@comps=\pgfplotsretvalb
%
\edef\pgfplots@loc@TMPa{{#1}{\pgfplotsretval}}%
\expandafter\pgfplots@createcolormap@nextcolor@\pgfplots@loc@TMPa%
}%
\def\pgfplots@createcolormap@nextcolor@#1#2{%
%\message{processing color #1=(#2)^^J}%
% compute 'h':
\pgfmathparse{#1}%
\let\pgfplots@createcolormap@MAX=\pgfmathresult
%
\ifx\pgfplots@createcolormap@MIN\pgfutil@empty
% it is the first.
\let\pgfplots@createcolormap@MIN=\pgfmathresult
\let\pgfplots@createcolormap@LAST=\pgfmathresult
\fi
%
\expandafter\pgfmathfloatsubtract@\expandafter{\pgfmathresult}{\pgfplots@createcolormap@LAST}%
\let\pgfplots@createcolormap@H@cur=\pgfmathresult
\pgfplots@createcolormap@check@increasing@mesh@width
\let\pgfplots@createcolormap@LAST=\pgfplots@createcolormap@MAX
\ifx\pgfplots@createcolormap@H\pgfutil@empty
\expandafter\pgfplotsarraycheckempty\expandafter{\pgfplots@createcolormap@name}%
\ifpgfplotsarrayempty
\else
\let\pgfplots@createcolormap@H=\pgfplots@createcolormap@H@cur
\fi
\else
\pgfplots@createcolormap@compute@equalto{\pgfplots@createcolormap@H}{\pgfplots@createcolormap@H@cur}%
\ifpgfmathfloatcomparison
\else
\ifnum\b@pgfplotscreatecolormap@isuniform>1
% force reinterpolation:
\pgfplotscreatecolormap@reinterpolate{#2}%
\else
% it is NOT uniform!
\def\b@pgfplotscreatecolormap@isuniform{0}%
%
\pgfmathfloatmintwo{\pgfplots@createcolormap@H@cur}{\pgfplots@createcolormap@H}%
\let\pgfplots@createcolormap@H=\pgfmathresult
\fi
\fi
\fi
%\message{found current H@cur = \pgfplots@createcolormap@H@cur\space (\pgfplots@createcolormap@LAST) -> H=\pgfplots@createcolormap@H^^J}%
%
% remember positions:
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@createcolormap@MAX,}\to\pgfplots@createcolormap@X
%
\edef\pgfplots@loc@TMPa{\noexpand\pgfplotsarraypushback{#2}\noexpand\to}%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@createcolormap@name}%
\edef\pgfplots@createcolormap@last{#2}%
}%
\def\pgfplots@createcolormap@check@increasing@mesh@width{%
\expandafter\pgfplotsarraycheckempty\expandafter{\pgfplots@createcolormap@name}%
\ifpgfplotsarrayempty
\else
\pgfmathfloatifflags{\pgfplots@createcolormap@H@cur}{1}{%
% ok, H>0
}{%
\pgfmathfloattofixed{\pgfplots@createcolormap@H@cur}%
\pgfplots@error{Colormaps must have increasing positions. The provided colormap has mesh width '\pgfmathresult' at \pgfplots@createcolormap@context. Please assign increasing positions}%
}%
\fi
}%
\def\pgfplots@createcolormap@compute@equalto#1#2{%
%\begingroup
%\pgfmathfloatcreate{1}{1.0}{-4}%
%\let\pgfmathfloat@relthresh=\pgfmathresult
\pgfmathfloatequalto@{#1}{#2}%
%\xdef\pgfplots@glob@TMPa{%
% \noexpand\def\noexpand\pgfmathresult{\pgfmathresult}%
% \ifpgfmathfloatcomparison
% \noexpand\pgfmathfloatcomparisontrue
% \else
% \noexpand\pgfmathfloatcomparisonfalse
% \fi
%}%
%\endgroup
%\pgfplots@glob@TMPa
%\message{equalto (#1,#2) = \pgfmathresult^^J}%
}%
\def\pgfplotscreatecolormap@reinterpolate#1{%
\pgfmathfloatdivide@{\pgfplots@createcolormap@H@cur}{\pgfplots@createcolormap@H}%
% after this group, \pgfmathresult is
% - empty if no reinterpolation is possible,
% - non-empty if reinterpolation IS possible. In this
% case, it contains the integer multiple of H.
\begingroup
\pgfmathfloattofixed{\pgfmathresult}%
\afterassignment\pgfplots@createcolormap@nextRGB@consider@reinterpolation
\c@pgf@counta=\pgfmathresult\relax
\pgfmath@smuggleone\pgfmathresult
\endgroup
\ifx\pgfmathresult\pgfutil@empty
% I can't do that yet.
\else
\let\pgfplots@createcolormap@loop@end=\pgfmathresult
% interpolate missing values using the already fixed H.
% This interpolation procedure is stupid because it works
% only in forward direction - but it works at least.
% For the backwards direction, you can provide the
% meshwidth explicitly at
% \pgfplotscreatecolormap{}{[1pt]}
\pgfplotsforeachungrouped \c@pgfplots@createcolormap in {1,2,...,\pgfplots@createcolormap@loop@end} {%
\pgfmathfloatequalto@{\c@pgfplots@createcolormap}{\pgfplots@createcolormap@loop@end}%
\ifpgfmathfloatcomparison
% omit the last.
\else
\pgfmathparse{\c@pgfplots@createcolormap/\pgfplots@createcolormap@loop@end}%
\let\pgfplots@createcolormap@scale@current=\pgfmathresult
\pgfmathparse{1-\pgfplots@createcolormap@scale@current}%
\let\pgfplots@createcolormap@scale@last=\pgfmathresult
%
\pgfmathfloattofixed\pgfplots@createcolormap@scale@current
\let\pgfplots@createcolormap@scale@current=\pgfmathresult
\pgfmathfloattofixed\pgfplots@createcolormap@scale@last
\let\pgfplots@createcolormap@scale@last=\pgfmathresult
%
\pgfplotscolornormalizesequencezero
\pgfplotscolornormalizesequenceaddweighted
{\pgfplotsretval}%
{\pgfplots@createcolormap@scale@current}%
{#1}%
\pgfplotscolornormalizesequenceaddweighted
{\pgfplotsretval}%
{\pgfplots@createcolormap@scale@last}%
{\pgfplots@createcolormap@last}%
%
%\message{interpolation step \c@pgfplots@createcolormap = \pgfplotsretval^^J}%
\edef\pgfplots@loc@TMPa{%
\noexpand\pgfplotsarraypushback{\pgfplotsretval}%
\noexpand\to}%
\expandafter\pgfplots@loc@TMPa\expandafter{\pgfplots@createcolormap@name}%
\fi
}%
\fi
}%
\def\pgfplots@createcolormap@nextRGB@consider@reinterpolation#1\relax{%
\pgf@xa=#1pt
\ifdim\pgf@xa>0.5pt % we have something like 99.995 or so.
% round up and compute 1 - #1:
\advance\c@pgf@counta by1
\pgf@xa=1pt \advance\pgf@xa by-#1pt
\fi
%
% compute relative error:
\pgf@xb=\the\c@pgf@counta pt
\divide\pgf@xb by10000
%\message{Checking H/h = \pgfplots@createcolormap@H@cur pt/\pgfplots@createcolormap@H pt = \the\c@pgf@counta+-\pgf@sys@tonumber\pgf@xa\space: \the\pgf@xa > \the\pgf@xb\space (relative to \the\c@pgf@counta)?}%
%
\ifdim\pgf@xa>\pgf@xb
\begingroup
\if2\b@pgfplotscreatecolormap@isuniform
\pgfplots@error{Non-uniform colormaps are only supported if you write 'compat=1.14' (or higher). Please adopt the compatibility level and retry. The error occured near '\pgfplots@createcolormap@context'}%
\else
\pgfmathfloattofixed{\pgfplots@createcolormap@H}%
\let\pgfplots@createcolormap@H=\pgfmathresult
\pgfmathfloattofixed{\pgfplots@createcolormap@H@cur}%
\let\pgfplots@createcolormap@H@cur=\pgfmathresult
\pgfplots@error{The provided colormap positions are not multiples of the prescribed mesh width h=\pgfplots@createcolormap@H\space (found one with H/h = \pgfplots@createcolormap@H@cur/\pgfplots@createcolormap@H = \the\c@pgf@counta+-\pgf@sys@tonumber\pgf@xa\space which is no integer). The error occured near `\pgfplots@createcolormap@context'}%
\fi
\endgroup
\let\pgfmathresult=\pgfutil@empty
\else
\ifnum\c@pgf@counta=0
\let\pgfmathresult=\pgfutil@empty
\else
\edef\pgfmathresult{\the\c@pgf@counta}%
\fi
\fi
}%
\def\pgfplots@colormap@LUA@new#1{%
\ifpgfplots@LUA@supported
\begingroup
\pgfplotscolormapserializecomponentstomacro{#1}\pgfplots@values
\pgfplotscolormapserializeXtomacro{#1}\pgfplots@pos
\pgfplotsutil@directlua{%
local colorspace =^^J%
pgfplots.\csname pgfpl@cm@#1@colspace\endcsname;^^J%
if colorspace then^^J%
pgfplots.ColorMaps["#1"] = pgfplots.ColorMap.new(^^J%
\csname pgfpl@cm@#1@h\endcsname,^^J%
colorspace,^^J%
{ \pgfplots@values },^^J
{ \pgfplots@pos },^^J
"\csname pgfpl@cm@#1@X@scale@order@z\endcsname"^^J
);^^J%
else^^J%
io.write("There is no LUA colorspace for '\csname pgfpl@cm@#1@colspace\endcsname' - skipping LUA color map definition of #1\string\n");^^J%
end^^J%
}%
\endgroup
\fi
}%
% Executes '#2' if the colormap named '#1' has a uniform grid and '#3'
% if not.
\def\pgfplotscolormapifisuniform#1#2#3{%
\ifnum0=\pgfplotsarraysizeof{pgfpl@cm@#1@X}\relax
#2\relax
\else
#3\relax
\fi
}%
% Shows debug info about colormap #1 into the console.
\def\pgfplots@colormap@showdebuginfofor#1{%
\message{Debug info for color map '#1':^^J}%
\message{(Transformed) Range: [0:\pgfplotscolormaprange]; ^^J}%
\message{H: \csname pgfpl@cm@#1@h\endcsname; ^^J}%
\message{H:^{-1}: \csname pgfpl@cm@#1@invh\endcsname; ^^J}%
\pgfplotsarraysizetomacro{pgfpl@cm@#1}\to\pgfplots@loc@TMPa
\message{Size: \pgfplots@loc@TMPa; ^^J}%
\message{Colorspace: \csname pgfpl@cm@#1@colspace\endcsname^^JValues (\csname pgfpl@cm@#1@col@comps\endcsname\space components each): ^^J}%
\begingroup
\c@pgf@counta=0
\pgfplotscolormapifisuniform{#1}{%
\pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\elem{%
\pgfmath@basic@multiply@{\the\c@pgf@counta}{\csname pgfpl@cm@#1@h\endcsname}%
\message{\#\the\c@pgf@counta=(\pgfmathresult)=(\elem);^^J}%
\advance\c@pgf@counta by1 %
}%
}{%
\pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\elem{%
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#1@X}\to\pgfmathresult
\message{\#\the\c@pgf@counta=(\pgfmathresult)=(\elem);^^J}%
\advance\c@pgf@counta by1 %
}%
}%
\message{^^J}%
\endgroup
}
% #1: comma-separated list of values for the current entry
% #2: color map name
% #3: the current index into the colormap
% #4: the "x coordinate", i.e. the offset within the colormap
%
% Defines \pgfplotsretval
%
% Example:
% \pgfplotscolormaptodatafile[
% output each nth=1,
% output format=csv,
% ]{viridis}
% {viridis.dat}
\def\pgfplotscolormaptodatafile@elem#1#2#3#4{%
\let\pgfplotsretval=\pgfutil@empty
}%
\begingroup
\catcode`\[=1
\catcode`\]=2
\catcode`\{=12
\catcode`\}=12
\xdef\pgfplots@lbrace[{]%
\xdef\pgfplots@rbrace[}]%
\endgroup
\pgfkeys{
/pgfplots/colormap/output each nth/.initial=1,
/pgfplots/colormap/output format/.is choice,
/pgfplots/colormap/output format/csv/.code={%
\def\pgfplotscolormaptodatafile@head##1{%
\let\pgfplotsretval=\pgfutil@empty
}%
\def\pgfplotscolormaptodatafile@elem##1##2##3##4{%
\edef\pgfplotsretval{##4,##1}%
}%
\def\pgfplotscolormaptodatafile@foot##1{%
\let\pgfplotsretval=\pgfutil@empty
}%
},
/pgfplots/colormap/output format/native/.code={%
\def\pgfplotscolormaptodatafile@head##1{%
\edef\pgfplotsretval{\string\pgfplotsset\pgfplots@lbrace colormap={##1}\pgfplots@lbrace}%
}%
\def\pgfplotscolormaptodatafile@elem##1##2##3##4{%
\edef\pgfplotsretval{\csname pgfpl@cm@##2@colspace\endcsname=(##1)}%
}%
\def\pgfplotscolormaptodatafile@foot##1{%
\edef\pgfplotsretval{\pgfplots@rbrace\pgfplots@rbrace}%
}%
},
/pgfplots/colormap/output format=csv,
}
% An export of a color map.
% #1: options. Can use 'output each nth=2' and 'output format=csv|native'
% #2: a color map
% #3: a data file
\def\pgfplotscolormaptodatafile{\pgfutil@ifnextchar[{\pgfplotscolormaptodatafile@}{\pgfplotscolormaptodatafile@[]}}%
\def\pgfplotscolormaptodatafile@[#1]#2#3{%
\begingroup
\pgfqkeys{/pgfplots/colormap}{#1}%
\pgfkeysgetvalue{/pgfplots/colormap/output each nth}{\pgfplots@eachnth}%
\immediate\openout\w@pgf@writea=#3\relax
\pgfplotscolormaptodatafile@head{#2}%
\ifx\pgfplotsretval\pgfutil@empty
\else
\immediate\write\w@pgf@writea{%
\pgfplotsretval
}%
\fi
\gdef\pgfplots@eachnth@cur{0}%
\pgfplotsarrayforeach{pgfpl@cm@#2}\as\elem{%
\ifnum\pgfplots@eachnth@cur=0\relax
\gdef\pgfplots@eachnth@cur{0}%
\pgfplotscolormapifisuniform{#2}{%
\pgfmath@basic@multiply@{\pgfplotsarrayforeachindex}{\csname pgfpl@cm@#2@h\endcsname}%
}{%
\pgfplotsarrayselect\pgfplotsarrayforeachindex\of{pgfpl@cm@#1@X}\to\pgfmathresult
}%
\edef\pgfplots@loc@TMPa{{\elem}{#2}{\pgfplotsarrayforeachindex}{\pgfmathresult}}%
\expandafter\pgfplotscolormaptodatafile@elem\pgfplots@loc@TMPa
\ifx\pgfplotsretval\pgfutil@empty
\else
\immediate\write\w@pgf@writea{%
\pgfplotsretval
}%
\fi
\fi
\pgfplotsutil@advancestringcounter@global\pgfplots@eachnth@cur%
\ifnum\pgfplots@eachnth@cur=\pgfplots@eachnth\relax
\gdef\pgfplots@eachnth@cur{0}%
\fi
}%
\pgfplotscolormaptodatafile@foot{#2}%
\ifx\pgfplotsretval\pgfutil@empty
\else
\immediate\write\w@pgf@writea{%
\pgfplotsretval
}%
\fi
\immediate\closeout\w@pgf@writea
\endgroup
}
% Defines \pgfplotsretval to contain the mesh width of colormap #1.
% If the color map has a non-uniform grid, it returns the SMALLEST
% encountered mesh width.
\def\pgfplotscolormapgetmeshwidth#1{%
\expandafter\let\expandafter\pgfplotsretval\csname pgfpl@cm@#1@h\endcsname%
}%
% defines macro #2 to contain a serialized variant of the color
% components (only the color components!)
\def\pgfplotscolormapserializecomponentstomacro#1#2{%
\pgfplotscolormapserialize@to@macro{pgfpl@cm@#1}{#2}%
}
\def\pgfplotscolormapserialize@to@macro#1#2{%
\pgfplotsapplistXnewempty\pgfplots@serialize@list@
\pgfplots@loc@tmptrue
\expandafter\pgfplotsarrayforeachungrouped\expandafter{#1}\as\elem{%
\ifpgfplots@loc@tmp
\expandafter\pgfplotsapplistXpushback\expandafter{\expandafter{\elem}}\to\pgfplots@serialize@list@
\pgfplots@loc@tmpfalse
\else
\expandafter\pgfplotsapplistXpushback\expandafter,\expandafter{\elem}\to\pgfplots@serialize@list@
\fi
}%
\pgfplotsapplistXlet#2=\pgfplots@serialize@list@
}%
\def\pgfplotscolormapserialize@to@macro@nobraces#1#2{%
\pgfplotsapplistXnewempty\pgfplots@serialize@list@
\pgfplots@loc@tmptrue
\expandafter\pgfplotsarrayforeachungrouped\expandafter{#1}\as\elem{%
\ifpgfplots@loc@tmp
\expandafter\pgfplotsapplistXpushback\elem\to\pgfplots@serialize@list@
\pgfplots@loc@tmpfalse
\else
\expandafter\pgfplotsapplistXpushback\expandafter,\elem\to\pgfplots@serialize@list@
\fi
}%
\pgfplotsapplistXlet#2=\pgfplots@serialize@list@
}%
\def\pgfplotscolormapserializeXtomacro#1#2{%
\pgfplotscolormapserialize@to@macro@nobraces{pgfpl@cm@#1@X}{#2}%
}%
% Copies the contents of the colormap named '#1' into a macro '#2'.
% Invocation of the macro will then re-create the colormap.
%
% #1: color map name
% #2: a macro name
\def\pgfplotscolormapserializetomacro#1#2{%
\begingroup
\pgfplotscolormapserializecomponentstomacro{#1}\pgfplots@serialize@list
\pgfplotscolormapserializeXtomacro{#1}\pgfplots@serialize@list@X
\toks0={\expandafter\def\csname pgfpl@cm@#1@h\endcsname}%
\toks1={\expandafter\def\csname pgfpl@cm@#1@invh\endcsname}%
\toks2={%
\pgfplotsarraynewempty{pgfpl@cm@#1}%
\expandafter\pgfplotsutilforeachcommasep\pgfplots@loc@TMPa\as\pgfplots@loc@TMPb{%
\ifx\pgfplots@loc@TMPb\pgfutil@empty
\else
\expandafter\pgfplotsarraypushback\pgfplots@loc@TMPb\to{pgfpl@cm@#1}%
\fi
}%
}%
\toks3=\expandafter{\pgfplots@serialize@list}%
\toks4=\expandafter{\expandafter\def\csname pgfpl@cm@#1@colspace\endcsname}%
\toks5=\expandafter{\expandafter\def\csname pgfpl@cm@#1@col@comps\endcsname}%
\toks6=\expandafter{\expandafter\def\csname pgfpl@cm@#1@lastindex\endcsname}%
\toks7={%
\pgfplotsarraynewempty{pgfpl@cm@#1@X}%
\expandafter\pgfplotsutilforeachcommasep\pgfplots@loc@TMPa\as\pgfplots@loc@TMPb{%
\ifx\pgfplots@loc@TMPb\pgfutil@empty
\else
\expandafter\pgfplotsarraypushback\pgfplots@loc@TMPb\to{pgfpl@cm@#1@X}%
\fi
}%
}%
\toks8=\expandafter{\pgfplots@serialize@list@X}%
\xdef\pgfplots@glob@TMPa{%
\the\toks0 {\csname pgfpl@cm@#1@h\endcsname}%
\the\toks1 {\csname pgfpl@cm@#1@invh\endcsname}%
\noexpand\def\noexpand\pgfplots@loc@TMPa{\the\toks3 }%
\the\toks2
\the\toks4 {\csname pgfpl@cm@#1@colspace\endcsname}%
\the\toks5 {\csname pgfpl@cm@#1@col@comps\endcsname}%
\the\toks6 {\csname pgfpl@cm@#1@lastindex\endcsname}%
\noexpand\def\noexpand\pgfplots@loc@TMPa{\the\toks8 }%
\the\toks7
\def\expandafter\noexpand\csname pgfpl@cm@#1@X@scale@order@z\endcsname{\csname pgfpl@cm@#1@X@scale@order@z\endcsname}%
}%
\endgroup
\let#2=\pgfplots@glob@TMPa
}%
% Defines \pgfplotsretval to contain an argument for use in \foreachlist
% which results in all the positions.
%
% [#1:#2] : the desired output domain. The smallest position will be
% mapped to #1, the largest to #2, and all in-between will be mapped
% accordingly.
% #3: the colormap name.
%
% Note that this switch depends on the current value of 'colormap
% access': piecewise constant may use different positions.
%
% On output, \pgfplotsretval will contain the result.
\def\pgfplotscolormapgetpositions[#1:#2]#3{%
\begingroup
\if d\pgfplots@colormap@access
\edef\pgfplotsretval{0,1,...,\pgfplotscolormaplastindexof{#3}}%
\else
\if m\pgfplots@colormap@access
\def\b@pgfplots@extra@interval{0}%
\edef\pgfplots@H{\csname pgfpl@cm@#3@h\endcsname}%
\else
\if c\pgfplots@colormap@access
\pgfplotscolormap@piecewiseconst@prepare@scale{#3}%
\edef\pgfplots@H{\pgf@sys@tonumber\pgf@x}%
\fi
\fi
%
\pgfkeys{/pgf/fpu}%
\pgfplotsapplistXnewempty\pgfplots@resultaccum
\pgfplotscolormapifisuniform{#3}{%
\pgfmathparse{#1 + (#2-#1) * \pgfplots@H/1000}%
\let\next=\pgfmathresult
\pgfmathparse{#2}% + (#2-#1)/1000}%
%
\def\b@pgfplots@isfirst{1}%
\edef\pgfplots@loc@TMPa{\noexpand\pgfplotsforeachungrouped\noexpand \x in {#1,\next,...,\pgfmathresult}}%
\pgfplots@loc@TMPa{%
\if0\b@pgfplots@isfirst
\pgfplotsapplistXpushback,\to\pgfplots@resultaccum
\fi
\expandafter\pgfplotsapplistXpushback\expandafter{\x}\to\pgfplots@resultaccum
\def\b@pgfplots@isfirst{0}%
}%
}{%
\pgfmathparse{(#2-#1)/1000}%
\let\pgfplots@scale=\pgfmathresult
\pgfplotsarrayforeachungrouped{pgfpl@cm@#3@X}\as\pgfplots@loc@TMPc{%
\if m\pgfplots@colormap@access
% colormap access=map
\pgfmathparse{#1 + \pgfplots@loc@TMPc * \pgfplots@scale}%
\else
\if1\b@pgfplots@extra@interval
\pgfmathparse{#1 + \pgfplots@loc@TMPc * \pgfplots@H* \pgfplots@scale}%
\else
% DISABLE additional interval!
% Means: use the input position as usual:
\pgfmathparse{#1 + \pgfplots@loc@TMPc * \pgfplots@scale}%
\fi
\fi
\ifnum\pgfplotsarrayforeachindex>0
\pgfplotsapplistXpushback,\to\pgfplots@resultaccum
\fi
\expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfmathresult}\to\pgfplots@resultaccum
}%
\if1\b@pgfplots@extra@interval
\pgfmathparse{#2}%
\pgfplotsapplistXpushback,\to\pgfplots@resultaccum
\expandafter\pgfmathfloattofixed\expandafter{\pgfmathresult}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfmathresult}\to\pgfplots@resultaccum
\fi
}%
\pgfplotsapplistXlet\pgfplotsretval=\pgfplots@resultaccum
\fi
\pgfmath@smuggleone\pgfplotsretval
\endgroup
}%
% this is a CONSTANT! Do NOT change it!
% Just read it -- just in case \pgfplotscolormaptopdffunction will use
% a different upper bound in the future.
\def\pgfplotscolormappdfmax{1000}%
\def\pgfplotscolormappdfmax@inv{1}%
% Expands to the size of colormap #1 .
\def\pgfplotscolormapsizeof#1{%
\pgfplotscolormapifdefined{#1}{%
\pgfplotsarraysizeof{pgfpl@cm@#1}%
}{%
0%
}%
}%
% Defines \pgfplotsretval to contain the color of color map '#1' at
% index '#2'
\def\pgfplotscolormapgetcolor#1#2{%
\pgfplotsarrayselect{#2}\of{pgfpl@cm@#1}\to\pgfplotsretval
}%
% Expands to the last index of colormap #1 (or -1)
\def\pgfplotscolormaplastindexof#1{%
\pgfplotscolormapifdefined{#1}{%
\csname pgfpl@cm@#1@lastindex\endcsname%
}{%
-1%
}%
}%
% POSTCONDITION:
% 1. for uniform #1:
% \pgf@x contains the MODIFIED mesh width
% \b@pgfplots@extra@interval is 1 if and only if an extra interval
% should be added
% 2. for non-uniform #1:
% \pgf@x is a scaling factor to map input positions to MODIFIED
% positions
% \b@pgfplots@extra@interval is 1 if and only if an extra interval
\def\pgfplotscolormap@piecewiseconst@prepare@scale#1{%
% advance the number of intervals by 1.
\pgfplotscolormapifisuniform{#1}{%
% To this end, we have to compute
% N = n+1
% and
% H = 1000 / (N-1) = 1000/n.
% Store H in \pgf@x:
\expandafter\ifx\csname pgfpl@cm@#1@X@scale@order@z\endcsname\pgfutil@empty%
\c@pgf@countd=\pgfplotscolormapsizeof{#1}\relax
%
\global\pgf@x=1000pt %
\global\divide\pgf@x by\c@pgf@countd
\def\b@pgfplots@extra@interval{1}%
\else
% DISABLE the extra interval!
\global\pgf@x=\csname pgfpl@cm@#1@h\endcsname pt %
\def\b@pgfplots@extra@interval{0}%
\fi
}{%
% the very same idea as for uniform colormaps applies
% for non-uniform maps as well: we create an
% artificial interval at the rightmost end.
% The idea is to think of a temporary map in the range
% [0,1000+ h] where h is the current colormap's
% mesh width.
% Since the domain is [0,1000], we map [0,1000+h]
% linearly into [0,1000].
%
% This here is the scaling factor:
\global\pgf@x=\csname pgfpl@cm@#1@X@scale@order@z\endcsname pt %
% see also
% \pgfplotscolormapfindpiecewiseconst@precomputed for
% comments
\ifdim\pgf@x>0sp %
\def\b@pgfplots@extra@interval{1}%
\else
% disable it
\def\b@pgfplots@extra@interval{0}%
\fi
}%
}%
% #1: colormap name
% #2: yes code
% #3: no code
\def\pgfplotscolormapifrequiresextrainterval#1#2#3{%
\if c\pgfplots@colormap@access
\pgfplotscolormapifisuniform{#1}{%
\expandafter\ifx\csname pgfpl@cm@#1@X@scale@order@z\endcsname\pgfutil@empty%
% no...
#3\relax%
\else
% yes:
#2\relax%
\fi
}{%
\ifdim\csname pgfpl@cm@#1@X@scale@order@z\endcsname pt>0pt
% yes:
#2\relax%
\else
% no:
#3\relax%
\fi
}%
\else
% no:
#3\relax%
\fi
}%
% #1: colormap name
% #2: yes code
% #3: no code
\def\pgfplotscolormapifdrawslastcolor#1#2#3{%
\pgfplotscolormapifrequiresextrainterval{#1}{%
#2\relax%
}{%
\if c\pgfplots@colormap@access
#3\relax%
\else
#2\relax%
\fi
}%
}%
% Writes a PDF function of /FunctionType 3 to \pgfplotsretval
%
% The /Domain argument will be set to [ 0 \pgfplotscolormappdfmax ] and bounds will be
% computed accordingly.
%
% Note that the value depends on 'colormap access'
%
% #1: the colormap
\def\pgfplotscolormaptopdffunction#1{%
\begingroup
\pgfplotscolormapassertexists{#1}%
\pgfplotsapplistXnewempty\pgfplots@resultaccum
\pgfplotsapplistXpushback{
<<
/FunctionType 3
/Domain [0 \pgfplotscolormappdfmax]
/Functions [
}\to\pgfplots@resultaccum%
\c@pgf@counta=0
\c@pgf@countb=\pgfplotsarraysizeof{pgfpl@cm@#1} %
\advance\c@pgf@countb by-1
\def\pgfplots@loc@TMPa{}%
\pgfplotsapplistXnewempty\pgfplots@bounds@accum%
\pgfplotsapplistXnewempty\pgfplots@encode@accum
\ifnum\csname pgfpl@cm@#1@col@comps\endcsname>4
\pgfplots@error{Sorry, processing more than 4 color components (as required for color map #1) is unsupported in this context}%
\fi
%
\def\b@pgfplots@extra@interval{0}%
\if m\pgfplots@colormap@access
% colormap access=map
\def\pgfplots@order{1}%
\global\pgf@x=\csname pgfpl@cm@#1@h\endcsname pt %
\def\pgfplots@C@left{C0}%
\def\pgfplots@C@right{C1}%
\else
\if c\pgfplots@colormap@access
% colormap access=piecewise constant
% This has a dedicated special interval at the rightmost
% end.
% See comments in pgfplotscolormapfindpiecewiseconst@precomputed@
\def\pgfplots@order{0}%
%
\pgfplotscolormap@piecewiseconst@prepare@scale{#1}%
%
% interchange the sequence in the PDF function as it is
% defined as
% y = C0 + x^0 * (C1 - C0) = C1
% -> we want the left interval boundary.
\def\pgfplots@C@left{C1}%
\def\pgfplots@C@right{C0}%
\else
% colormap access=direct
\pgfplots@error{This should never happen}%
% ?
\def\pgfplots@order{0}%
\global\pgf@x=\csname pgfpl@cm@#1@h\endcsname pt %
\def\pgfplots@C@left{C0}%
\def\pgfplots@C@right{C1}%
\fi
\fi
%
\pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\cdata{%
\edef\cdata{%
\expandafter
\expandafter
\csname pgfplotscolormaptopdffunction@convertcdata@\csname pgfpl@cm@#1@col@comps\endcsname\endcsname
\cdata\relax
}%
\ifnum\c@pgf@counta>0
\edef\pgfplots@loc@TMPd{%
<<
/FunctionType 2
/Domain [0 \pgfplotscolormappdfmax]
/\pgfplots@C@left\space [\pgfplots@loc@TMPa] /\pgfplots@C@right\space [\cdata]
/N \pgfplots@order
>>
}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPd}\to\pgfplots@resultaccum
\ifnum\c@pgf@counta<\c@pgf@countb\relax
\pgfplotscolormapifisuniform{#1}{%
\pgf@xa=\pgf@x
\multiply\pgf@xa by\c@pgf@counta\relax
}{%
\pgfplotsarrayselect{\c@pgf@counta}\of{pgfpl@cm@#1@X}\to\pgfplots@loc@TMPc
\if m\pgfplots@colormap@access
% colormap access=map
\pgf@xa=\pgfplots@loc@TMPc pt %
\else
\if1\b@pgfplots@extra@interval
\pgf@xa=\pgfplots@loc@TMPc\pgf@x%
\else
% DISABLE additional interval!
% Means: use the input position as usual:
\pgf@xa=\pgfplots@loc@TMPc pt %
\fi
\fi
}%
\divide\pgf@xa by\pgfplotscolormappdfmax@inv\relax% we want [ 0 1 ] not [0 1000] as domain XXX : why!?
\edef\pgfplots@loc@TMPc{ \pgf@sys@tonumber\pgf@xa}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPc}\to\pgfplots@bounds@accum%
\fi
\pgfplotsapplistXpushback{ 0 1}\to\pgfplots@encode@accum%
\fi
\let\pgfplots@loc@TMPa=\cdata
\advance\c@pgf@counta by1
}%
\if1\b@pgfplots@extra@interval
% add an artificial interval.
\edef\pgfplots@loc@TMPd{%
<<
/FunctionType 2
/Domain [0 \pgfplotscolormappdfmax]
/\pgfplots@C@left\space [\cdata] /\pgfplots@C@right\space [\cdata]
/N \pgfplots@order
>>
}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPd}\to\pgfplots@resultaccum
\advance\c@pgf@counta by-1 %
\pgfplotscolormapifisuniform{#1}{%
\pgf@xa=\pgf@x
\multiply\pgf@xa by\c@pgf@counta\relax
}{%
\pgfplotsarrayselect{\c@pgf@counta}\of{pgfpl@cm@#1@X}\to\pgfplots@loc@TMPc
\pgf@xa=\pgfplots@loc@TMPc\pgf@x%
}%
\divide\pgf@xa by\pgfplotscolormappdfmax@inv\relax% we want [ 0 1 ] not [0 1000] as domain XXX : why!?
\edef\pgfplots@loc@TMPc{ \pgf@sys@tonumber\pgf@xa}%
\expandafter\pgfplotsapplistXpushback\expandafter{\pgfplots@loc@TMPc}\to\pgfplots@bounds@accum%
\pgfplotsapplistXpushback{ 0 1}\to\pgfplots@encode@accum%
\fi
\pgfplotsapplistXlet\pgfplotsretval=\pgfplots@resultaccum
\pgfplotsapplistXlet\pgfplotsbounds=\pgfplots@bounds@accum
\pgfplotsapplistXlet\pgfplotsencode=\pgfplots@encode@accum
\t@pgfplots@toka=\expandafter{\pgfplotsretval}%
\t@pgfplots@tokb=\expandafter{\pgfplotsbounds}%
\t@pgfplots@tokc=\expandafter{\pgfplotsencode}%
\xdef\pgfplots@glob@TMPa{%
\the\t@pgfplots@toka
]
/Bounds [\the\t@pgfplots@tokb]
/Encode [\the\t@pgfplots@tokc]
>>
}%
\endgroup
\let\pgfplotsretval=\pgfplots@glob@TMPa
}%
\expandafter\def\csname pgfplotscolormaptopdffunction@convertcdata@1\endcsname#1\relax{#1}%
\expandafter\def\csname pgfplotscolormaptopdffunction@convertcdata@2\endcsname#1,#2\relax{#1 #2}%
\expandafter\def\csname pgfplotscolormaptopdffunction@convertcdata@3\endcsname#1,#2,#3\relax{#1 #2 #3}%
\expandafter\def\csname pgfplotscolormaptopdffunction@convertcdata@4\endcsname#1,#2,#3,#4\relax{#1 #2 #3 #4}%
% Invokes '#2' if a color map named '#1' exists and '#3' if no such color map exists.
\def\pgfplotscolormapifdefined#1#2#3{\pgfplotsarrayifdefined{pgfpl@cm@#1}{#2}{#3}}%
\def\pgfplotscolormapassertexists#1{%
\pgfplotscolormapifdefined{#1}{}{%
\pgfutil@ifundefined{pgfplotscolormap@errorissued@#1}{%
\pgfplots@error{The colormap `#1' is undefined! Maybe you misspelled it?}%
}{}%
\expandafter\gdef\csname pgfplotscolormap@errorissued@#1\endcsname{1}%
\pgfplotscreatecolormap{#1}{color(0cm)=(blue); color(1cm)=(yellow)}%
}%
}
% Convert a colormap into a PGF shading's color specification for use
% in \pgfdeclare*shading.
%
% #1: the colormap's name.
% #2: the PGF "size" of the shading. It is used to set the right end
% of the color specification.
% #3: a macro which will be filled with the result.
%
% Example:
% \pgfplotscolormaptoshadingspec{my colormap}{4cm}{\output}
% \def\tempb{\pgfdeclarehorizontalshading{myshadingA}{1cm}}
% \expandafter\tempb\expandafter{\temp}
%
% \pgfuseshading{myshadingA}
\def\pgfplotscolormaptoshadingspec#1#2#3{%
\pgfplotscolormapassertexists{#1}%
\begingroup
\def\pgfplots@rgb{rgb}%
\pgfmathparse{#2}%
\expandafter\pgfmathdivide@\expandafter{\pgfmathresult}{\pgfplotscolormaprange}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfmathmultiply@{\csname pgfpl@cm@#1@h\endcsname}{\pgfplots@loc@TMPb}%
\pgf@ya=\pgfmathresult pt
\c@pgf@counta=0
\let#3=\pgfutil@empty
\pgfplotsarrayforeachungrouped{pgfpl@cm@#1}\as\pgfplotscolormaptoshadingspec@TMP{%
\pgfplotscolormapifisuniform{#1}{%
\pgf@yb=\c@pgf@counta\pgf@ya
}{%
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#1@X}\to\pgfplots@loc@TMPd
\pgfmathmultiply@{\pgfplots@loc@TMPd}{\pgfplots@loc@TMPb}%
\pgf@yb=\pgfmathresult pt %
}%
\edef\pgfplots@colspace{\csname pgfpl@cm@#1@colspace\endcsname}%
% FIXME : PGF shadings accept only RGB!
\if1\pgfplotscolormaptoshadingspectorgb
\ifx\pgfplots@colspace\pgfplots@rgb
\else
\pgfutil@ifundefined{pgfpl@cm@#1@warned}{%
\expandafter\gdef\csname pgfpl@cm@#1@warned\endcsname{1}%
\pgfplotswarning{lossy colormap rgb conversion}{#1}{\pgfplots@colspace}\pgfeov%
}{%
}%
\edef\pgf@tempcolor{{\pgfplots@colspace}{\pgfplotscolormaptoshadingspec@TMP}}%
\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgfplotscolormaptoshadingspec@TMP}%
\def\pgfplots@colspace{rgb}%
\fi
\fi
\edef\pgfplots@loc@TMPc{\pgfplots@colspace(\the\pgf@yb)=(\pgfplotscolormaptoshadingspec@TMP)}%
\ifx#3\pgfutil@empty
\t@pgfplots@toka={}%
\else
\t@pgfplots@toka=\expandafter{#3; }%
\fi
\t@pgfplots@tokb=\expandafter{\pgfplots@loc@TMPc}%
\edef#3{\the\t@pgfplots@toka \the\t@pgfplots@tokb }%
\advance\c@pgf@counta by1
}%
\pgfmath@smuggleone#3%
\endgroup
}%
\def\pgfplotscolormaptoshadingspectorgb{1}%
% The same as \pgfplotscolormaptoshadingspec, but this here yields the
% *reversed* sequence.
\def\pgfplotscolormapreversedtoshadingspec#1#2#3{%
\begingroup
\let\pgfplotsarrayforeachungrouped=\pgfplotsarrayforeachreversedungrouped
\pgfplotscolormaptoshadingspec{#1}{#2}{#3}%
\pgfmath@smuggleone#3%
\endgroup
}%
% Expands to the transformed range's right end of every colormap. The left
% end is fixed to '0'.
\def\pgfplotscolormaprange{1000}
\pgfmathfloatcreate{1}{1.0}{3}%
\let\pgfplotscolormaprange@float=\pgfmathresult
\def\pgfplotscolormapgetcolorspace#1{%
\edef\pgfplotsretval{\csname pgfpl@cm@#1@colspace\endcsname}%
}%
\def\pgfplotscolormapgetcolorcomps#1{%
\edef\pgfplotsretval{\csname pgfpl@cm@#1@col@comps\endcsname}%
}%
\def\pgfplotscolormapcolorspaceof#1{%
\csname pgfpl@cm@#1@colspace\endcsname%
}%
\def\pgfplotscolormapcolorcompsof#1{%
\csname pgfpl@cm@#1@col@comps\endcsname%
}%
% Linearly maps the number #4 into the colormap #5 and returns the
% interpolated colors into \pgfmathresult. The result will be a triple
% for an RGB colormap and it will contain four numbers for CMYK. The
% components of the result will be in the range [0:1].
%
% [#1:#2] the number range of the data source (i.e. of #4). This is required to
% map into the colormap.
% [#3] (optional) the quantity
% s := \pgfplotscolormaprange / (#2-#1).
% Precomputing this quantity may save a lot of time because
% divisions are expensive in TeX. You can omit [#3] or
% provide an empty string here.
% #4 the number to map.
% #5 the colormap's name. Must be defined with
% \pgfplotscreatecolormap before.
%
% Example:
% \pgfplotscolormapfind[-1:1]{0.2}{my colormap}
\def\pgfplotscolormapfind[#1:#2]{%
\pgfutil@ifnextchar[{%
\pgfplotscolormapfind@precomputed[#1:#2]%
}{%
\pgfplotscolormapfind@precomputed[#1:#2][]%
}%
}%
\def\pgfplotscolormapfind@precomputed[#1:#2][#3]#4#5{%
\ifpgfplots@LUA@supported
\pgfplotscolormapifisuniform{#5}{%
\edef\pgfmathresult{%
\pgfplotsutil@directlua{%
pgfplots.texColorMapPrecomputed("#5", "#1","#2","#4")
}%
}%
\ifx\pgfmathresult\pgfutil@empty
\pgfplotscolormapfind@precomputed@warn@LUA{#5}%
\pgfplotscolormapfind@precomputed@[#1:#2][#3]{#4}{#5}%
\else
%\message{LUA colormapfind[#1:#2](#4)(#5) = \pgfmathresult^^J}%
\fi
}{%
% FIXME : implement LUA for non-uniform colormaps
\pgfplotscolormapfind@precomputed@[#1:#2][#3]{#4}{#5}%
}%
\else
\pgfplotscolormapfind@precomputed@[#1:#2][#3]{#4}{#5}%
\fi
}
\def\pgfplotscolormapfind@precomputed@warn@LUA#1{%
\expandafter\ifx\csname pgfplotscolormapfind@precomputed@warn@LUA@#1\endcsname\relax
\pgfplotswarning{lua colormap unavailable}{#1}\pgfeov%
\expandafter\gdef\csname pgfplotscolormapfind@precomputed@warn@LUA@#1\endcsname{1}%
\fi
}%
\def\pgfplotscolormapfind@transform[#1:#2][#3]#4#5{%
\edef\pgfplots@loc@TMPa{#1:#2}%
\edef\pgfplots@loc@samerange{0:\pgfplotscolormaprange}%
\ifx\pgfplots@loc@TMPa\pgfplots@loc@samerange
% we have phi(#4) = #4 because #4 in [0:1000].
\pgfmathfloatparsenumber{#4}%
\pgfmathfloattofixed\pgfmathresult
\else
% Step 0: compute #3 if it is missing and write it into \pgfplots@loc@TMPa.
%\message{mapping '#4' into colormap '#5' with range [#1:#2] ... ^^J}%
\pgfmathfloatparsenumber{#1}%
\let\pgfplots@L=\pgfmathresult
%
\def\pgfplots@loc@TMPa{#3}%
\ifx\pgfplots@loc@TMPa\pgfutil@empty
\pgfmathfloatparsenumber{#2}%
\let\pgfplots@R=\pgfmathresult
\pgfmathfloatsubtract@{\pgfplots@R}{\pgfplots@L}%
\let\pgfplots@loc@TMPb=\pgfmathresult
\pgfmathfloatdivide@{\pgfplotscolormaprange@float}{\pgfplots@loc@TMPb}%
\else
\pgfmathfloatparsenumber{#3}%
\fi
\let\pgfplots@loc@TMPa=\pgfmathresult
%
% Step 1: perform lookup. Map #4 into the colormap's range
% using the linear trafo
% phi(#4) = ( #4 - #1 ) / (#2-#1) * colormaprange(#5).
% This, determine the INTERVAL number into which #4 falls.
\pgfmathfloatparsenumber{#4}%
\let\pgfplots@V=\pgfmathresult
\pgfmathfloatsubtract@{\pgfplots@V}{\pgfplots@L}%
\expandafter\pgfmathfloatmultiply@\expandafter{\pgfmathresult}{\pgfplots@loc@TMPa}%
\pgfmathfloattofixed\pgfmathresult
\fi
\ifdim\pgfmathresult pt<0pt %
\def\pgfmathresult{0}%
\else
\ifdim\pgfmathresult pt>1000pt %
\def\pgfmathresult{1000}%
\fi
\fi
}%
\def\pgfplotscolormapfind@precomputed@[#1:#2][#3]#4#5{%
\pgfplotscolormapassertexists{#5}%
\begingroup
\pgfplotscolormapfind@transform[#1:#2][#3]{#4}{#5}%
\let\pgfplotscolormapfind@transformedx=\pgfmathresult
%
% Now, we have it in [0,1000]. Find the correct interval:
\pgfplotscolormapifisuniform{#5}{%
\pgfmathmultiply@{\pgfplotscolormapfind@transformedx}{\csname pgfpl@cm@#5@invh\endcsname}%
\let\pgfplotscolormapfind@transformedx@divh=\pgfmathresult
% assign \pgfplotscolormapfind@intervalno := \pgfmathresult
% without '.0' suffix:
\expandafter\pgfplotscolormap@floor@unforgiving\pgfmathresult\relax
% Step 2: interpolate the desired RGB value using vector valued
% interpolation on the identified interval.
\c@pgf@counta=\pgfplotscolormapfind@intervalno\relax
% color^m(x) = ( (x-x_i)/(x_{i+1} - x_i) ) * (c_{i+1}^m - c_i^m ) + c_i^m
% = ( x/h - i ) * ( c_{i+1}^m - c_{i}^m ) + c_i^m
% = s * c_{i+1}^m + S * c_i^m
%
% s= x_h / h -i
\pgfmathsubtract@{\pgfplotscolormapfind@transformedx@divh}{\pgfplotscolormapfind@intervalno}%
\let\pgfplots@loc@factor=\pgfmathresult
}{%
\pgfplotsarraybinarysearch{pgfpl@cm@#5@X}{\pgfplotscolormapfind@transformedx}{0}{\pgfplotscolormapsizeof{#5}}%
\c@pgf@counta=\pgfplotsretval\relax
\ifnum\c@pgf@counta<0
% as per definition of \pgfplotsarraybinarysearch, a
% negative result indicates the "insertion point" ...
\c@pgf@counta=-\c@pgf@counta
% ... plus one.
\advance\c@pgf@counta by-1
%
% But we do not WANT the insertion point! We want the LEFT
% interval boundary!
\advance\c@pgf@counta by-1
\fi
%
% color^m(x) = ( (x-x_i)/(x_{i+1} - x_i) ) * (c_{i+1}^m - c_i^m ) + c_i^m
% = s * c_{i+1}^m + S * c_i^m
%
% s = (x - x_i) / (x_{i+1} - x_i)
\begingroup
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5@X}\to\pgfplotscolormapfind@rgb@X@left
\advance\c@pgf@counta by1
\ifnum\c@pgf@counta<\pgfplotsarraysizeof{pgfpl@cm@#5} %
% ok, we really have an interval
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5@X}\to\pgfplotscolormapfind@rgb@X@right
%
\pgfmathsubtract@{\pgfplotscolormapfind@rgb@X@right}{\pgfplotscolormapfind@rgb@X@left}%
\let\pgfplotscolormapfind@h=\pgfmathresult
\pgfmathsubtract@{\pgfplotscolormapfind@transformedx}{\pgfplotscolormapfind@rgb@X@left}%
\let\pgfplots@loc@TMPa=\pgfmathresult
\pgfmathdivide@{\pgfplots@loc@TMPa}{\pgfplotscolormapfind@h}%
\let\pgfplots@loc@factor=\pgfmathresult
\else
% irrelevant (not used)
\def\pgfplots@loc@factor{1}%
\fi
\pgfmath@smuggleone\pgfplots@loc@factor
\endgroup
}%
% POSTCONDITION: \c@pgf@counta is the index of the LEFT interval
% and \pgfplots@loc@factor is the factor for the linear interpolation.
%
%\message{mapping [#1,#2] -> [0,\pgfplotscolormaprange] yielded phi(#4) = \pgfplotscolormapfind@transformedx, situated in interval no \the\c@pgf@counta.^^J}%
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5}\to\pgfplotscolormapfind@rgb@LEFT
%
% do the stuff which is specific to linear interpolation:
%
% S = 1 - s
\pgfmathsubtract@{1}{\pgfplots@loc@factor}%
\let\pgfplots@loc@factor@two=\pgfmathresult
%
\advance\c@pgf@counta by1 %
\ifnum\c@pgf@counta<\pgfplotsarraysizeof{pgfpl@cm@#5} %
% Ah: (selected index < length) . That means: we have an interval.
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5}\to\pgfplotscolormapfind@rgb@RIGHT
%\message{After lookup: the corresponding RGB interval boundaries are [\pgfplotscolormapfind@rgb@LEFT: \pgfplotscolormapfind@rgb@RIGHT].^^J}%
%
%
\pgfplotscolorzero{\csname pgfpl@cm@#5@col@comps\endcsname}%
\pgfplotscoloraddweighted
{\csname pgfpl@cm@#5@col@comps\endcsname}%
{\pgfplotsretval}%
{\pgfplots@loc@factor@two}%
{\pgfplotscolormapfind@rgb@LEFT}%
\pgfplotscoloraddweighted
{\csname pgfpl@cm@#5@col@comps\endcsname}%
{\pgfplotsretval}%
{\pgfplots@loc@factor}%
{\pgfplotscolormapfind@rgb@RIGHT}%
\let\pgfmathresult=\pgfplotsretval
\else
% Ah: selected index = last index. Use the rightmost color!
\let\pgfmathresult=\pgfplotscolormapfind@rgb@LEFT
\fi
\pgfmath@smuggleone\pgfmathresult
\endgroup
%\message{-> got finally mapping(#4, #5) = RGB'\pgfmathresult'.}%
}%
% Maps the number #4 into the colormap #5 using piecewise constant
% interpolation. It returns the interpolated colors into \pgfmathresult. The result will be a triple
% for an RGB colormap and it will contain four numbers for CMYK. The
% components of the result will be in the range [0:1].
%
% [#1:#2] the number range of the data source (i.e. of #4). This is required to
% map into the colormap.
% [#3] (optional) the quantity
% s := \pgfplotscolormaprange / (#2-#1).
% Precomputing this quantity may save a lot of time because
% divisions are expensive in TeX. You can omit [#3] or
% provide an empty string here.
% #4 the number to map.
% #5 the colormap's name. Must be defined with
% \pgfplotscreatecolormap before.
%
% Example:
% \pgfplotscolormapfindpiecewiseconst[-1:1]{0.2}{my colormap}
\def\pgfplotscolormapfindpiecewiseconst[#1:#2]{%
\pgfutil@ifnextchar[{%
\pgfplotscolormapfindpiecewiseconst@precomputed[#1:#2]%
}{%
\pgfplotscolormapfindpiecewiseconst@precomputed[#1:#2][]%
}%
}%
\def\pgfplotscolormapfindpiecewiseconst@precomputed[#1:#2][#3]#4#5{%
\ifpgfplots@LUA@supported
\pgfplotscolormapifisuniform{#5}{%
\edef\pgfmathresult{%
\pgfplotsutil@directlua{%
pgfplots.texColorMapFindPiecewiseConst("#5", #1,#2,#4)
}%
}%
\ifx\pgfmathresult\pgfutil@empty
\pgfplotscolormapfindpiecewiseconst@precomputed@warn@LUA{#5}%
\pgfplotscolormapfindpiecewiseconst@precomputed@[#1:#2][#3]{#4}{#5}%
\else
%\message{LUA colormapfindpiecewiseconst[#1:#2](#4)(#5) = \pgfmathresult^^J}%
\fi
}{%
% FIXME : implement LUA for non-uniform colormaps
\pgfplotscolormapfindpiecewiseconst@precomputed@[#1:#2][#3]{#4}{#5}%
}%
\else
\pgfplotscolormapfindpiecewiseconst@precomputed@[#1:#2][#3]{#4}{#5}%
\fi
}
\def\pgfplotscolormapfindpiecewiseconst@precomputed@warn@LUA#1{%
\expandafter\ifx\csname pgfplotscolormapfindpiecewiseconst@precomputed@warn@LUA@#1\endcsname\relax
\pgfplotswarning{lua colormap unavailable}{#1}\pgfeov%
\expandafter\gdef\csname pgfplotscolormapfindpiecewiseconst@precomputed@warn@LUA@#1\endcsname{1}%
\fi
}%
\def\pgfplotscolormapfindpiecewiseconst@precomputed@[#1:#2][#3]#4#5{%
\pgfplotscolormapassertexists{#5}%
\begingroup
\pgfplotscolormapfind@transform[#1:#2][#3]{#4}{#5}%
\let\pgfplotscolormapfind@transformedx=\pgfmathresult
%
% Now, we have it in [0,1000]. Find the correct interval:
% In principle, we could easily find the correct interval. But the
% native approach has one distinct disadvantage: we will never
% assign the rightmost color unless #4=1000! That means that our
% colormap is not used entirely.
%
% I decided to enlarge the colormap artificially such that the
% rightmost color receives its own interval.
%
% To this end, I recompute the coordinates at which colors "live".
% The operations sounds more involved than it is: I simply need a NEW mesh width locally
% inside of this function. The new mesh width H can be computed as
% follows, assuming that the OLD colormap has mesh width h.
%
% H := 1000/ (N-1)
%
% N := n+1
% n := 1000/h + 1 = \pgfplotscolormapsizeof{#5}
%
% what I really need is:
% 1/H = N/1000 = (1000 h^{-1} +1)/ 1000 = h^{-1} + 1/1000
%
\pgfplotscolormapifisuniform{#5}{%
%
\expandafter\ifx\csname pgfpl@cm@#5@X@scale@order@z\endcsname\pgfutil@empty%
% compute 1/H here:
\pgfmathadd@{\csname pgfpl@cm@#5@invh\endcsname}{0.001}%
\let\pgfplots@piecewiseconst@invh=\pgfmathresult%
\else
% disable the extra interval
\expandafter\let\expandafter\pgfplots@piecewiseconst@invh\csname pgfpl@cm@#5@invh\endcsname
\fi
\pgfmathmultiply@{\pgfplotscolormapfind@transformedx}{\pgfplots@piecewiseconst@invh}%
\let\pgfplotscolormapfind@transformedx@divh=\pgfmathresult
% assign \pgfplotscolormapfind@intervalno := \pgfmathresult
% without '.0' suffix:
\expandafter\pgfplotscolormap@floor\pgfmathresult\relax
% Step 2: interpolate the desired RGB value using vector valued
% interpolation on the identified interval.
\c@pgf@counta=\pgfplotscolormapfind@intervalno\relax
}{%
% the same idea can also be applied to non-uniform grids.
% However, it is more involved here.
%
% My idea is that I add an extra interval of length 'h' at the right end of
% the domain, i.e. I enlarge the domain to [0,1000+h].
%
% To this end, I map the input number linearly from
% [0,1000] -> [0,1000+h]
% using k(t) = (1000+h)/1000 * t
%
% Note that k(t) = 1/ pgfpl@cm@#5@X@scale@order@z
%
% and search in the existing X coordinates of the colormap.
% Note that these X coordinates actually do not contain the
% artifical rightmost boundary point at 1000+h. But that is
% ok, we plan to assign COLOR(1000+h) := COLOR(1000) anyway.
%
% Naturally, some values 'k(t)' will be BEYOND '1000'. In this
% case, we simply use the rightmost interval and are done with
% it.
%
% compute k(t):
\ifdim\csname pgfpl@cm@#5@X@scale@order@z\endcsname pt>0pt
\pgfmathadd@{1000}{\csname pgfpl@cm@#5@h\endcsname}%
\pgf@xa=\pgfmathresult pt %
\divide\pgf@xa by1000 %
\edef\pgfplotscolormapfind@map@to@extra@interval{\pgf@sys@tonumber\pgf@xa}%
%
\pgfmathmultiply@{\pgfplotscolormapfind@transformedx}{\pgfplotscolormapfind@map@to@extra@interval}%
\let\pgfplotscolormapfind@transformedx@=\pgfmathresult
\else
% disable the extra interval
\let\pgfplotscolormapfind@transformedx@=\pgfplotscolormapfind@transformedx
\fi
%
% search k(t) in the original X values.
\pgfplotsarraybinarysearch{pgfpl@cm@#5@X}{\pgfplotscolormapfind@transformedx@}{0}{\pgfplotscolormapsizeof{#5}}%
\c@pgf@counta=\pgfplotsretval\relax
\ifnum\c@pgf@counta<0
% as per definition of \pgfplotsarraybinarysearch, a
% negative result indicates the "insertion point" ...
\c@pgf@counta=-\c@pgf@counta
% ... plus one.
\advance\c@pgf@counta by-1
%
% But we do not WANT the insertion point! We want the LEFT
% interval boundary!
\advance\c@pgf@counta by-1
\fi
%\pgfplotscolormapserializeXtomacro{#5}\XXX
%\message{k(\pgfplotscolormapfind@transformedx) = \pgfplotscolormapfind@transformedx@. Searching for value in X=(\XXX) resulted in \pgfplotsretval, and the index to use is \the\c@pgf@counta.^^J}%
}%
%
\ifnum\c@pgf@counta=\pgfplotscolormapsizeof{#5}\relax
% we have artificially increased the "h" (see the comments
% above) -- meaning that this 'if' can happen.
% ->Map the rightmost point to the rightmost interval:
\advance\c@pgf@counta by-1
\fi
%
%\message{mapping [#1,#2] -> [0,\pgfplotscolormaprange] yielded phi = \pgfplotscolormapfind@transformedx, situated in interval no \the\c@pgf@counta/\pgfplotsarraysizeof{pgfpl@cm@#5}.^^J}%
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#5}\to\pgfplotscolormapfind@rgb@LEFT
\let\pgfmathresult=\pgfplotscolormapfind@rgb@LEFT
\pgfmath@smuggleone\pgfmathresult
\endgroup
}
\def\pgfplotscolormap@floor#1.#2\relax{%
\ifdim0.#2pt>0.999pt
% ok, it is ALMOST one more! Take this as rounding inaccuracy
\c@pgf@counta=#1\relax
\advance\c@pgf@counta by1
\edef\pgfplotscolormapfind@intervalno{\the\c@pgf@counta}%
\else
\def\pgfplotscolormapfind@intervalno{#1}%
\fi
}%
\def\pgfplotscolormap@floor@unforgiving#1.#2\relax{%
\def\pgfplotscolormapfind@intervalno{#1}%
}%
% Performs a direct color access into color map '#2' using an index
% '#1'.
%
% #1: an index in the range 0 ... len(#2)-1.
% If it does not match, it will be pruned. If #1 is a real number, it
% will be truncated.
% #2: a color map name.
%
% The resulting RGB value will be written to \pgfmathresult.
\def\pgfplotscolormapgetindex#1#2{%
\pgfplotscolormapassertexists{#2}%
\begingroup
\pgfmathfloatparsenumber{#1}%
\expandafter\pgfmathfloattoint\expandafter{\pgfmathresult}%
%\afterassignment\pgfplots@gobble@until@relax
\c@pgf@counta=\pgfmathresult\relax
\ifnum\c@pgf@counta<0
\c@pgf@counta=0
\else
\pgfplotsarraysizetomacro{pgfpl@cm@#2}\to\pgfplotscolormapgetindex@
\ifnum\c@pgf@counta<\pgfplotscolormapgetindex@\relax
\else
\c@pgf@counta=\pgfplotscolormapgetindex@\relax
\advance\c@pgf@counta by-1
\fi
\fi
\pgfplotsarrayselect\c@pgf@counta\of{pgfpl@cm@#2}\to\pgfmathresult
\pgfmath@smuggleone\pgfmathresult
\endgroup
}
% Invokes one of \pgfplotscolormapfind,
% \pgfplotscolormapfindpiecewiseconst, or \pgfplotscolormapgetindex,
% depending on the value of '/pgfplots/colormap access'.
\def\pgfplotscolormapaccess[#1:#2]{%
\pgfutil@ifnextchar[{%
\pgfplotscolormapaccess@precomputed[#1:#2]%
}{%
\pgfplotscolormapaccess@precomputed[#1:#2][]%
}%
}
\def\pgfplotscolormapaccess@precomputed[#1:#2][#3]#4#5{%
\if m\pgfplots@colormap@access
% colormap access=map
\pgfplotscolormapfind@precomputed[#1:#2][#3]{#4}{#5}%
\else
\if c\pgfplots@colormap@access
% colormap access=piecewise constant
\pgfplotscolormapfindpiecewiseconst@precomputed[#1:#2][#3]{#4}{#5}%
\else
% colormap access=direct
\pgfplotscolormapgetindex{#4}{#5}%
\fi
\fi
}%
\pgfutil@definecolor{mapped color}{rgb}{0,0,0}% make sure this color exists. It will be overwritten if needed.
% ATTENTION: replicated in pgfplots.code.tex :
\pgfplotscreatecolormap{hot}{color(0cm)=(blue); color(1cm)=(yellow); color(2cm)=(orange); color(3cm)=(red)}
\def\pgfplotspointmetatransformedrange{0:1000}
% Defines the 'mapped color' on the basis of
% the current color map.
%
% #1: is the value which should be mapped into the color map; it
% is expected in the range [0,1000] (like point meta).
\def\pgfplotscolormapdefinemappedcolor#1{%
\expandafter\pgfplotscolormapaccess\expandafter[\pgfplotspointmetatransformedrange]%
[1.0]%
{#1}%
{\pgfkeysvalueof{/pgfplots/colormap name}}%
%\message{Color for current point is RGB '\pgfmathresult' (determined using meta 'phi(\pgfplotspointmeta) = \pgfplotspointmetatransformed')^^J}%
\def\pgfplots@loc@TMPb{\pgfutil@definecolor{mapped color}{\csname pgfpl@cm@\pgfkeysvalueof{/pgfplots/colormap name}@colspace\endcsname}}%
\expandafter\pgfplots@loc@TMPb\expandafter{\pgfmathresult}%
}%