%-------------------------------------------- % $Header: /cvsroot/pgfplots/pgfplots/generic/pgfplots/libs/pgflibrarysurfshading.code.tex,v 1.18 2009/06/26 17:56:58 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/2008 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 . % %-------------------------------------------- %-------------------------------------------------- % \pgfqkeys{/pgfplots/surf shading}{ % cols=3, % % test colormap 1, % } % \pgfplotslibrarysurfstreamstart % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{0pt}{10pt}}{0} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{100pt}{10pt}}{100} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{180pt}{10pt}}{30} % % % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{0pt}{100pt}}{300} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{110pt}{90pt}}{1000} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{190pt}{110pt}}{600} % % % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{0pt}{200pt}}{0} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{110pt}{200pt}}{100} % \pgfplotslibrarysurfstreamcoord{\pgfqpoint{190pt}{200pt}}{60} % \pgfplotslibrarysurfstreamend % \fbox{% % \pgfplotslibrarysurfdraw % }% %-------------------------------------------------- \pgfkeys{% % the extends need to provided as \pgfpoint... The boundary box % won't be computed manually! /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 % % can only have values '' (empty) for binary encoding or % ASCIIHexEncode for base 16 encoding. Use this if some driver % cannot produce binary encoding. This is undocumented; for use in % emergency only. /pgfplots/surf shading/pdf stream filter/.initial=,% % /pgfplots/surf shading/precision/.is choice, /pgfplots/surf shading/precision/pdf/.code={% % Lossless coordinate output. \def\pgfplotslibrarysurf@bitspercoordinate{32}% \def\pgfplotslibrarysurf@bytespercoordinate{4}% \def\pgfplotslibrarysurf@filter@encode{}% raw binary. \def\pgfplotslibrarysurf@filter@decode{}% },% /pgfplots/surf shading/precision/ps/.code={% % quantized coordinate output (introduces quantization error). \def\pgfplotslibrarysurf@bitspercoordinate{24}% \def\pgfplotslibrarysurf@bytespercoordinate{3}% % doesn't improve behavior of pdf2ps: %\def\pgfplotslibrarysurf@filter@encode{ASCIIHexEncode}% %\def\pgfplotslibrarysurf@filter@decode{ASCIIHexDecode}% \def\pgfplotslibrarysurf@filter@encode{}% raw binary. \def\pgfplotslibrarysurf@filter@decode{}% },% /pgfplots/surf shading/precision/postscript/.style={% /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 /Domain [0 1] /C0 [0 0 1] /C1 [1 0 0] /N 1 >> },% /pgfplots/surf shading/test colormap 1/.style={% /pgfplots/surf shading/colormap={ << /FunctionType 3 /Domain [0 1] /Functions [ << /FunctionType 2 /Domain [0 1] /C0 [0 0 1] /C1 [1 1 0] /N 1 >> << /FunctionType 2 /Domain [0 1] /C0 [1 1 0] /C1 [1 0.5 0] /N 1 >> << /FunctionType 2 /Domain [0 1] /C0 [1 0.5 0] /C1 [1 0 0] /N 1 >> ] /Bounds [ 0.3 0.6 ] /Encode [0 1 0 1 0 1] %/Range [0 1 0 1 0 1] INCOMPATIBLE WITH ACROBAT 6.0 >> }% },% }% \def\pgfplotslibrarysurf@corner@sw{\pgfkeysvalueof{/pgfplots/surf shading/south west corner}} \def\pgfplotslibrarysurf@corner@ne{\pgfkeysvalueof{/pgfplots/surf shading/north east corner}}% \def\pgfplotslibrarysurf@decode{% -16383.999992 16384 % see the docs of \pgfplotsbinaryencodedimenmaplinearly -16383.999992 16384 % 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{% \edef\pgfplots@loc@TMPa{\pgfkeysvalueof{/pgfplots/surf shading/pdf stream filter}}% \ifx\pgfplots@loc@TMPa\pgfutil@empty \else \let\pgfplotslibrarysurf@filter@encode=\pgfplots@loc@TMPa \let\pgfplotslibrarysurf@filter@decode=\pgfplotslibrarysurf@filter@encode \fi } \def\pgfplotslibrarysurf@advancestreamlen#1{}% \def\pgfplotslibrarysurfstreamstart{% \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 \def\pgfplotslibrarysurf@filter@encode{binary encoding}% \fi \pgfkeysalso{/pgfplots/bin/\pgfplotslibrarysurf@filter@encode}% \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 corrupt your pdf!}% }% \def\pgfplotslibrarysurfstreamend{% \pgfplotsapplistXgloballet\pgfplotslibrarysurf@binarystream=\pgfplotslibrarysurf@binarystream@accum \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum }% % #1: a pgf point. % #2: a color coordinate in the range [0,1000] \def\pgfplotslibrarysurfstreamcoord#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*}]. % % 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}% {% % 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{\pgfplotsbinaryresult}% \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*}]. % % 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}%% } %-------------------------------------------------- % \def\pgfplotslibrarysurfdraw{% % % \pgftext[at=\pgfqpoint{0pt}{0pt}]% % {\pgfplotssys@do@surfshading}% % }% %-------------------------------------------------- \def\pgfplotslibrarysurfdrawinpicture{% \begingroup \pgftransformshift{\pgfplotslibrarysurf@corner@sw}% \pgftext[at=\pgfqpoint{0pt}{0pt},left,bottom] {% \pgfplotslibrarysurfdraw % this does NOT work because I can't undo the box' shift: %\pgfplotssys@do@surfshading }% \endgroup } \pgfplotsiffileexists{pgflibrarypgfplots.surfshading.\pgfsysdriver}{% \input pgflibrarypgfplots.surfshading.\pgfsysdriver\relax \def\pgflibrarysurfshadingifactive#1#2{#1}% }{% \def\pgfplotslibrarysurfdraw{% \pgfplots@error{Sorry, surfshading (shader=interp) is NOT available for the selected driver `\pgfsysdriver'.}% }% \def\pgflibrarysurfshadingifactive#1#2{#2}% } \endinput