summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex167
1 files changed, 162 insertions, 5 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex b/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
index 58664dc323d..c45b5a613f0 100644
--- a/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
+++ b/Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
@@ -55,6 +55,7 @@
/pgfplots/surf shading/south west corner/.initial={\pgfpointorigin},%
/pgfplots/surf shading/north east corner/.initial={\pgfqpoint{6cm}{6cm}},%
/pgfplots/surf shading/anchor/.initial=\pgfpointorigin,%
+ /pgfplots/surf shading/shading type/.initial=5,% triangles in form of lattice
/pgfplots/surf shading/precision/.is choice,
/pgfplots/surf shading/precision/pdf/.code={%
% Lossless coordinate output.
@@ -77,6 +78,7 @@
/pgfplots/surf shading/precision/ps},%
/pgfplots/surf shading/precision/ps,%
/pgfplots/surf shading/cols/.initial=,%
+ /pgfplots/surf shading/colorspace/.initial=rgb,% rgb or cmyk
/pgfplots/surf shading/colormap/.initial={%
<<
/FunctionType 2
@@ -124,22 +126,57 @@
0 \pgfplotscolormappdfmax % map [0,2^BitsPerComponent-1] linearly to [0 1] for parametric color data
}%
\def\pgfplotslibrarysurf@count{0}%
+\newcount\c@pgfplotslibrarysurf@no
% driver specific:
\def\pgfplotslibrarysurf@initstream{}
\def\pgfplotslibrarysurf@advancestreamlen#1{}%
\def\pgfplotslibrarysurfstreamstart{%
- \pgfplotsapplistXnewempty\pgfplotslibrarysurf@binarystream@accum
+ \pgfplotslibrarysurf@translate@colorspace
+ \let\pgfplotslibrarysurf@colorspace=\pgfplotsretval
+ \pgfkeysgetvalue{/pgfplots/surf shading/shading type}\pgfplotslibrarysurf@type
+ \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum
\pgfplotslibrarysurf@initstream
\ifx\pgfplotslibrarysurf@filter@encode\pgfutil@empty
\else
\pgfkeysalso{/pgfplots/bin/\pgfplotslibrarysurf@filter@encode}%
\fi
+ \ifcase\pgfplotslibrarysurf@type\relax
+ % 0
+ \pgfplotslibrarysurf@initstream@wrongtype
+ \or% 1
+ \pgfplotslibrarysurf@initstream@wrongtype
+ \or% 2
+ \pgfplotslibrarysurf@initstream@wrongtype
+ \or% 3
+ \or% 4
+ % ok, triangle meshes.
+ \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}%
+ \or% 5 triangles in lattice form. disable edge flag:
+ \let\pgfplotslibrarysurf@edgeflag=\pgfutil@empty
+ \or% 6 coons patches:
+ \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty
+ \global\c@pgfplotslibrarysurf@no=0
+ \def\pgfplotslibrarysurf@cubicpatch@numverts{12}%
+ \let\pgfplotslibrarysurfstreamcoord=\pgfplotslibrarysurfstreamcoord@cubicpatch
+ \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}%
+ \or% 7 full tensor product cubic bezier patches:
+ \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty
+ \global\c@pgfplotslibrarysurf@no=0
+ \def\pgfplotslibrarysurf@cubicpatch@numverts{16}%
+ \let\pgfplotslibrarysurfstreamcoord=\pgfplotslibrarysurfstreamcoord@cubicpatch
+ \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}%
+ \else
+ \pgfplotslibrarysurf@initstream@wrongtype
+ \fi
+}%
+\def\pgfplotslibrarysurf@initstream@wrongtype{%
+ \pgfplots@error{CRITICAL: shader=interp: got unsupported pdf shading type '\pgfplotslibrarysurf@type'. This may correct your pdf!}%
}%
\def\pgfplotslibrarysurfstreamend{%
- \pgfplotsapplistXlet\pgfplotslibrarysurf@binarystream=\pgfplotslibrarysurf@binarystream@accum
- \pgfplotsapplistXnewempty\pgfplotslibrarysurf@binarystream@accum
+ \pgfplotsapplistXgloballet\pgfplotslibrarysurf@binarystream=\pgfplotslibrarysurf@binarystream@accum
+ \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum
}%
% #1: a pgf point.
@@ -195,11 +232,131 @@
\pgfplotsbinaryencodeunsigned\pgfplots@glob@TMPa
%\message{\pgfplotsbinaryresult.}%
\t@pgfplots@tokc=\expandafter{\pgfplotsbinaryresult}%
- \edef\pgfplots@loc@TMPa{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}%
- \expandafter\pgfplotsapplistXpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum
+ \edef\pgfplots@loc@TMPa{\pgfplotslibrarysurf@edgeflag\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}%
+ \expandafter\pgfplotsapplistXglobalpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum
\pgfplotslibrarysurf@advancestreamlen{10}%
}
+\def\pgfplotslibrarysurf@translate@colorspace{%
+ \pgfkeysgetvalue{/pgfplots/surf shading/colorspace}\pgfplots@loc@TMPd
+ \edef\pgfplots@loc@TMPd{\pgfplots@loc@TMPd}%
+ \def\pgfplots@loc@TMPa{rgb}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd
+ \def\pgfplotsretval{RGB}%
+ \else
+ \def\pgfplots@loc@TMPa{cmyk}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd
+ \def\pgfplotsretval{CMYK}%
+ \else
+ \def\pgfplots@loc@TMPa{cmy}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd
+ \def\pgfplotsretval{CMY}%
+ \else
+ \pgfplots@error{Sorry, the 'surfshading' lib failed to recognise the '/pgfplots/surf shading=\pgfplots@loc@TMPd\space choice... maybe you misspelled it?}%
+ \def\pgfplotsretval{RGB}%
+ \fi
+ \fi
+ \fi
+}%
+
+% special routine for coons type patches and cubic tensor product type
+% patches. It has FIRST all vertices,
+% THEN the cdata. Furthermore, it only has 4 CDATA points, but a total
+% of 12 vertices.
+%
+% #1: a pgf point.
+% #2: a color coordinate in the range [0,1000]
+\def\pgfplotslibrarysurfstreamcoord@cubicpatch#1#2{%
+ \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercoordinate%
+ %\pgf@process{#1}% this here causes `{retaining \pgf@x}' messages and pollutes the save stack! Avoid it. See \tracingrestores=2
+ #1%
+ % The idea is to map
+ % the low-level point coordinates LINEARLY into [0,2^{8*<bytes>}].
+ %
+ % This is what the pdf standard expects for surface shadings.
+ %
+ % To do that, we simply map
+ % [-16384,16384] linearly into [0,2^{32}]
+ % and write the resulting integer in big endian binary format to
+ % the pdf low level stream.
+ %
+ % The decode procedure tells the pdf viewer how to invert that
+ % stuff.
+ %
+ \pgf@xa=\pgf@x
+ \pgf@sys@bp@correct\pgf@xa%
+ \pgfplotsbinaryencodedimenmaplinearly\pgf@xa
+%\message{POINT \the\c@pgfplots@scanlineindex: ENCODING(x=\the\pgf@x)=\pgfplotsbinaryresult.}\advance\c@pgfplots@scanlineindex by1
+ \t@pgfplots@toka=\expandafter{\pgfplotsbinaryresult}%
+ \pgf@ya=\pgf@y
+ \pgf@sys@bp@correct\pgf@ya%
+ \pgfplotsbinaryencodedimenmaplinearly\pgf@ya
+%\message{ENCODING(y=\the\pgf@y)=\pgfplotsbinaryresult.}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotsbinaryresult}%
+ \def\pgfplotslibrarysurf@cubicpatch@hascdata{0}%
+ \ifnum\c@pgfplotslibrarysurf@no=0
+ \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}%
+ % prepend edge flag. it is a new patch.
+ \t@pgfplots@toka=\expandafter{\expandafter\pgfplotslibrarysurf@edgeflag\the\t@pgfplots@toka}%
+ \else
+ \ifnum\c@pgfplotslibrarysurf@no=3
+ \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}%
+ \else
+ \ifnum\c@pgfplotslibrarysurf@no=6
+ \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}%
+ \else
+ \ifnum\c@pgfplotslibrarysurf@no=9
+ \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \if1\pgfplotslibrarysurf@cubicpatch@hascdata
+ {%
+ % read fixed point input (in the range [0,1000]).
+ \pgf@xa=#2pt
+ % convert to integer (= *65536):
+ \c@pgf@counta=\pgf@xa
+ % provide map [0,1000] -> [0,2^16-1]
+ \divide\c@pgf@counta by1000
+ % now, we have \c@pgf@counta in [0,2^16]. Simply strip it into
+ % the required range, that's ok.
+ \ifnum\c@pgf@counta<0
+ \c@pgf@counta=0
+ \else
+ \ifnum\c@pgf@counta>65535
+ \c@pgf@counta=65535
+ \fi
+ \fi
+ % Now, we have CDATA in the range [0,65535]
+ \xdef\pgfplots@glob@TMPa{\the\c@pgf@counta}%
+ %\message{ENCODING(C=\pgfplots@glob@TMPa\space for \the\pgf@xa)=}%
+ }%
+ \pgfplotsbinarysetbytes2%
+ \pgfplotsbinaryencodeunsigned\pgfplots@glob@TMPa
+ %\message{\pgfplotsbinaryresult.}%
+ \t@pgfplots@tokc=\expandafter{\pgfplotslibrarysurf@cubicpatch@cdata}%
+ \xdef\pgfplotslibrarysurf@cubicpatch@cdata{%
+ \the\t@pgfplots@tokc
+ \pgfplotsbinaryresult
+ }%
+ \fi
+ \global\advance\c@pgfplotslibrarysurf@no by1
+ %
+ \ifnum\pgfplotslibrarysurf@cubicpatch@numverts=\c@pgfplotslibrarysurf@no %finalize patch.
+ \t@pgfplots@tokc=\expandafter{\pgfplotslibrarysurf@cubicpatch@cdata}%
+ \global\let\pgfplotslibrarysurf@cubicpatch@cdata=\pgfutil@empty
+ \global\c@pgfplotslibrarysurf@no=0
+ \else
+ \t@pgfplots@tokc={}%
+ \fi
+ % edge flag is already in \t@pgfplots@toka (if this is the first
+ % vertex)
+ \edef\pgfplots@loc@TMPa{\the\t@pgfplots@toka\the\t@pgfplots@tokb\the\t@pgfplots@tokc}%
+ \expandafter\pgfplotsapplistXglobalpushback\pgfplots@loc@TMPa\to\pgfplotslibrarysurf@binarystream@accum
+ %\pgfplotslibrarysurf@advancestreamlen{10}%
+}
+
\def\pgfplotslibrarysurfactivateshadefill{%
\pgfplotssys@do@surfshading@fillpaths\pgfplots@loc@TMPa%
\expandafter\pgfutil@addpdfresource@patterns\expandafter{\pgfplots@loc@TMPa}%%