diff options
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.tex | 167 |
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}%% |