diff options
author | Karl Berry <karl@freefriends.org> | 2013-03-27 23:45:11 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-03-27 23:45:11 +0000 |
commit | cfb1e943eb2782734fb13768cf8242e6a03aa904 (patch) | |
tree | 59470eac1319852a3b8726e3308923e0e1019bb5 /Master/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex | |
parent | 02aa64ea1b6cd28f8217d06507a941c70d39dd9a (diff) |
pgfplots
git-svn-id: svn://tug.org/texlive/trunk@29531 c570f23f-e606-0410-a88d-b1316a301751
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 | 328 |
1 files changed, 276 insertions, 52 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 63f24068c41..e73f87a59d2 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 @@ -1,5 +1,4 @@ %-------------------------------------------- -% $Header: /cvsroot/pgfplots/pgfplots/generic/pgfplots/libs/pgflibrarysurfshading.code.tex,v 1.18 2009/06/26 17:56:58 ludewich Exp $ % % Package pgfplots % @@ -8,7 +7,7 @@ % % It is based on Till Tantau's PGF package. % -% Copyright 2007/2008 by Christian Feuersänger. +% Copyright 2007-2012 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 @@ -49,13 +48,20 @@ %-------------------------------------------------- +\newif\ifpgfplotslibrarysurf@updatebb +\newif\ifpgfplotslibrarysurf@usecolormap +\pgfplotslibrarysurf@updatebbtrue + \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 + % + % If this is true, the embedding picture's bounding box will be updated using + % the shading's bounding box. + % This bounding box may be (highly!) inaccurate for coons shadings and tensor product shadings. + % The 'patch' plot handler disables it and takes control over it explicitly (using interpolation + % points rather than bezier control points). + /pgfplots/surf shading/update BB/.is if=pgfplotslibrarysurf@updatebb, % % can only have values '' (empty) for binary encoding or % ASCIIHexEncode for base 16 encoding. Use this if some driver @@ -84,8 +90,13 @@ /pgfplots/surf shading/precision/postscript/.style={% /pgfplots/surf shading/precision/ps},% /pgfplots/surf shading/precision/ps,% + % columns: /pgfplots/surf shading/cols/.initial=,% - /pgfplots/surf shading/colorspace/.initial=rgb,% rgb or cmyk + /pgfplots/surf shading/colorspace/.initial=rgb,% rgb or cmyk or gray + % + % the colormap. If this key is empty, we assume that individual + % color components are provided for EVERY vertex for which cdata + % is expected. /pgfplots/surf shading/colormap/.initial={% << /FunctionType 2 @@ -121,17 +132,46 @@ >> }% },% + /pgfplots/surf shading/debug text/.initial=\the\c@pgfplotslibrarysurf@no, + /pgfplots/surf shading/every debug coord/.style={ + circle, + draw, + fill=yellow, + }, + /pgfplots/surf shading/debug/.is choice, + /pgfplots/surf shading/debug/false/.code={% + \let\pgfplotslibrarysurfprocesscoordinate=\pgfplotslibrarysurfprocesscoordinate@orig + \let\pgfplotslibrarysurfusepath=\pgfplotslibrarysurfusepath@orig + }, + /pgfplots/surf shading/debug/true/.code={% + \let\pgfplotslibrarysurfprocesscoordinate=\pgfplotslibrarysurfprocesscoordinate@debug + \def\pgfplotslibrarysurfusepath{\pgfusepath{stroke,fill}} + }, + /pgfplots/surf shading/debug/.default=true, }% -\def\pgfplotslibrarysurf@corner@sw{\pgfkeysvalueof{/pgfplots/surf shading/south west corner}} -\def\pgfplotslibrarysurf@corner@ne{\pgfkeysvalueof{/pgfplots/surf shading/north east corner}}% +\def\pgfplotslibrarysurf@corner@sw{\pgfplots@error{This is unavailable until \string\pgfplotslibrarysurfstreamend}} +\let\pgfplotslibrarysurf@corner@ne\pgfplotslibrarysurf@corner@sw +% parametric colors (colormap) are always in [0,1000]. I +% 2 bytes suffice for that range. +\def\pgfplotslibrarysurf@bytespercomponent{2}% +\def\pgfplotslibrarysurf@bitspercomponent{16}% \def\pgfplotslibrarysurf@decode{% -16383.999992 16384 % see the docs of \pgfplotsbinaryencodedimenmaplinearly -16383.999992 16384 % + \pgfplotslibrarysurf@decode@colors +}% +\def\pgfplotslibrarysurf@decode@colors@colormap{% 0 \pgfplotscolormappdfmax % map [0,2^BitsPerComponent-1] linearly to [0 1] for parametric color data }% +\def\pgfplotslibrarysurf@decode@colors@explicit@one@component{% + % this is just one component for explicit color data. + % it will be replicated for every color component. + 0 1 % the target value for color component values. +}% + \def\pgfplotslibrarysurf@count{0}% \newcount\c@pgfplotslibrarysurf@no @@ -148,8 +188,7 @@ \def\pgfplotslibrarysurf@advancestreamlen#1{}% \def\pgfplotslibrarysurfstreamstart{% - \pgfplotslibrarysurf@translate@colorspace - \let\pgfplotslibrarysurf@colorspace=\pgfplotsretval + \pgfplotslibrarysurfstreamstart@init@colors \pgfkeysgetvalue{/pgfplots/surf shading/shading type}\pgfplotslibrarysurf@type \pgfplotsapplistXglobalnewempty\pgfplotslibrarysurf@binarystream@accum \pgfplotslibrarysurf@initstream @@ -157,6 +196,10 @@ \def\pgfplotslibrarysurf@filter@encode{binary encoding}% \fi \pgfkeysalso{/pgfplots/bin/\pgfplotslibrarysurf@filter@encode}% + % + \pgfplotsbinarysetbytes1% + \pgfplotsbinaryencodeunsigned{0}% use this method - it respects any special encodings. + \let\pgfplots@loc@TMPa=\pgfplotsbinaryresult \ifcase\pgfplotslibrarysurf@type\relax % 0 \pgfplotslibrarysurf@initstream@wrongtype @@ -167,7 +210,7 @@ \or% 3 \or% 4 % ok, triangle meshes. - \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}% + \let\pgfplotslibrarysurf@edgeflag=\pgfplots@loc@TMPa \or% 5 triangles in lattice form. disable edge flag: \let\pgfplotslibrarysurf@edgeflag=\pgfutil@empty \or% 6 coons patches: @@ -175,31 +218,92 @@ \global\c@pgfplotslibrarysurf@no=0 \def\pgfplotslibrarysurf@cubicpatch@numverts{12}% \let\pgfplotslibrarysurfstreamcoord=\pgfplotslibrarysurfstreamcoord@cubicpatch - \def\pgfplotslibrarysurf@edgeflag{\pgfplotscharno{0}}% + \let\pgfplotslibrarysurf@edgeflag=\pgfplots@loc@TMPa \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}}% + \let\pgfplotslibrarysurf@edgeflag=\pgfplots@loc@TMPa \else \pgfplotslibrarysurf@initstream@wrongtype \fi + % + % + % we want to establish a bounding box for THIS shading only! Otherwise the pdf XFORM might have a larger bounding box than we want. Is that ok here? Or does it hurt somewhere? + \pgf@getpathsizes{\pgfplots@loc@TMPa}% + \global\let\pgfplotslibrarysurf@pathsizes@before=\pgfplots@loc@TMPa }% + + +\def\pgfplotslibrarysurfstreamstart@init@colors{% + % + \pgfkeysgetvalue{/pgfplots/surf shading/colormap}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \pgfplotslibrarysurf@usecolormapfalse + \else + \pgfplotslibrarysurf@usecolormaptrue + \fi + % + \ifpgfplotslibrarysurf@usecolormap + \let\pgfplotslibrarysurf@decode@colors=\pgfplotslibrarysurf@decode@colors@colormap + \else + \pgfplotscolorspacegetcomponents{\pgfkeysvalueof{/pgfplots/surf shading/colorspace}}% + \c@pgf@counta=0 % + \c@pgf@countb=\pgfplotsretval\relax + % + \def\pgfplotslibrarysurf@decode@colors{}% + \pgfplotslibrarysurf@decode@colors@loop + \fi + % + \pgfplotslibrarysurf@translate@colorspace + \let\pgfplotslibrarysurf@colorspace=\pgfplotsretval +}% + +\def\pgfplotslibrarysurf@decode@colors@loop{% + \ifnum\c@pgf@counta<\c@pgf@countb + % + \edef\pgfplotslibrarysurf@decode@colors{% + \pgfplotslibrarysurf@decode@colors + \pgfplotslibrarysurf@decode@colors@explicit@one@component + }% + \advance\c@pgf@counta by1 % + % + \expandafter\pgfplotslibrarysurf@decode@colors@loop + \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 + % + \pgfplotslibrarysurfstreamend@set@BB +} + +\def\pgfplotslibrarysurfstreamend@set@BB{% + \xdef\pgfplotslibrarysurf@corner@sw{% + \global\pgf@x=\the\pgf@pathminx\space + \global\pgf@y=\the\pgf@pathminy\space + }% + \xdef\pgfplotslibrarysurf@corner@ne{% + \global\pgf@x=\the\pgf@pathmaxx\space + \global\pgf@y=\the\pgf@pathmaxy\space + }% + \pgf@setpathsizes\pgfplotslibrarysurf@pathsizes@before }% +% ATTENTION: see also \pgfplotslibrarysurfstreamcoord@cubicpatch % #1: a pgf point. % #2: a color coordinate in the range [0,1000] \def\pgfplotslibrarysurfstreamcoord#1#2{% \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercoordinate% + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercoordinate}% + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercoordinate}% %\pgf@process{#1}% this here causes `{retaining \pgf@x}' messages and pollutes the save stack! Avoid it. See \tracingrestores=2 - #1% + \pgfplotslibrarysurfprocesscoordinate{#1}% % The idea is to map % the low-level point coordinates LINEARLY into [0,2^{8*<bytes>}]. % @@ -223,9 +327,56 @@ \pgfplotsbinaryencodedimenmaplinearly\pgf@ya %\message{ENCODING(y=\the\pgf@y)=\pgfplotsbinaryresult.}% \t@pgfplots@tokb=\expandafter{\pgfplotsbinaryresult}% - {% + % + \pgfplotslibrarysurf@encode@cdata{#2}% +%\message{\pgfplotsbinaryresult.}% + \t@pgfplots@tokc=\expandafter{\pgfplotsbinaryresult}% + \ifx\pgfplotslibrarysurf@edgeflag\pgfutil@empty + \else + % for shading type 4, the edge flag is given for EVERY + % coordinate (unlike all other shading types). + \pgfplotslibrarysurf@advancestreamlen{1}% + \fi + \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 +} + +% defines \pgfplotsbinaryresult to contain the result of a CDATA +% entry and advances the stream counters. +\def\pgfplotslibrarysurf@encode@cdata#1{% + \ifpgfplotslibrarysurf@usecolormap + \pgfplotslibrarysurf@map@to@FFF@colormap{#1}% + \else + % oh. No cdata. Ok, then encode stuff individually! + % We expect data of the form + % {<comma-separated-components>} + \edef\pgfplots@loc@TMPa{#1}% + \def\pgfplotsretval{}% + \expandafter\pgfplotslibrarysurf@encode@cdata@loop\pgfplots@loc@TMPa,,% + \let\pgfplotsbinaryresult=\pgfplotsretval + \fi +} + +\def\pgfplotslibrarysurf@encode@cdata@loop#1,{% + \def\pgfplots@loc@TMPa{#1}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + % + % + \pgfplotslibrarysurf@map@to@FFF@component{#1}% + \edef\pgfplotsretval{\pgfplotsretval\pgfplotsbinaryresult}% + % + % + % continue loop: + \expandafter\pgfplotslibrarysurf@encode@cdata@loop + \fi +}% + +% Defines \pgfplotsbinaryresult +\def\pgfplotslibrarysurf@map@to@FFF@colormap#1{% + \begingroup % read fixed point input (in the range [0,1000]). - \pgf@xa=#2pt + \pgf@xa=#1pt % % convert to integer (= *65536): \c@pgf@counta=\pgf@xa % provide map [0,1000] -> [0,2^16-1] @@ -242,14 +393,38 @@ % 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% + \endgroup + \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercomponent% \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}% + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercomponent}% +} + +% Defines \pgfplotsbinaryresult +\def\pgfplotslibrarysurf@map@to@FFF@component#1{% + \begingroup + % read fixed point input (in the range [0,1]). + \pgf@xa=#1pt % + % convert to integer (= *65536): + \c@pgf@counta=\pgf@xa + % provide map [0,1] -> [0,2^16-1] + % well, there is nothing to do! it was in [0,1], we multiplied by 65536 implicitly... that's it. + % + % 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)=}% + \endgroup + \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercomponent% + \pgfplotsbinaryencodeunsigned\pgfplots@glob@TMPa + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercomponent}% } \def\pgfplotslibrarysurf@translate@colorspace{% @@ -267,13 +442,61 @@ \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}% + \def\pgfplots@loc@TMPa{gray}% + \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPd + \def\pgfplotsretval{Gray}% + \else + \pgfplots@error{Sorry, the 'surfshading' lib failed to recognise the choice '/pgfplots/surf shading/colorspace=\pgfplots@loc@TMPd'... maybe you misspelled it?}% + \def\pgfplotsretval{RGB}% + \fi \fi \fi \fi }% +\def\pgfplotslibrarysurfusepath{\pgfusepath{fill}} +\let\pgfplotslibrarysurfusepath@orig=\pgfplotslibrarysurfusepath + +% We DO want to protocol the size of the shading. In fact, we NEED a +% bounding box which contains the whole shading, otherwise it will be +% clipped. More precisely, it will be packed into a pdf XForm object +% and that appears to need a correct bounding box. +% +% But we do NOT want to update the picture's bounding box, only that +% of the pdf XForm. The picture's bounding box will be updated as soon +% as we *use* the shading anyway (in +% \pgfplotslibrarysurfdrawinpicture). This here takes care of that detail: +\def\pgfplotslibrarysurf@protocolsizes@#1#2{% + \ifpgf@relevantforpicturesize + \pgfplots@loc@tmptrue + \else + \pgfplots@loc@tmpfalse + \fi + \pgf@relevantforpicturesizefalse + \pgf@protocolsizes{#1}{#2}% + \ifpgfplots@loc@tmp + \pgf@relevantforpicturesizetrue + \fi +}% + +\def\pgfplotslibrarysurfprocesscoordinate#1{% + #1\relax% + \pgfplotslibrarysurf@protocolsizes@{\pgf@x}{\pgf@y}% +}% +\let\pgfplotslibrarysurfprocesscoordinate@orig=\pgfplotslibrarysurfprocesscoordinate% + +\def\pgfplotslibrarysurfprocesscoordinate@debug#1{% + \pgfinterruptpath + \scope + \pgftransformshift{#1}% + \node[/pgfplots/surf shading/every debug coord] at (0pt,0pt) {\pgfkeysvalueof{/pgfplots/surf shading/debug text}};% + \endscope + \endpgfinterruptpath + #1\relax% + \pgfplotslibrarysurf@protocolsizes@{\pgf@x}{\pgf@y}% +}% + +% ATTENTION: see also \pgfplotslibrarysurfstreamcoord % 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 @@ -283,8 +506,10 @@ % #2: a color coordinate in the range [0,1000] \def\pgfplotslibrarysurfstreamcoord@cubicpatch#1#2{% \pgfplotsbinarysetbytes\pgfplotslibrarysurf@bytespercoordinate% + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercoordinate}% + \pgfplotslibrarysurf@advancestreamlen{\pgfplotslibrarysurf@bytespercoordinate}% %\pgf@process{#1}% this here causes `{retaining \pgf@x}' messages and pollutes the save stack! Avoid it. See \tracingrestores=2 - #1% + \pgfplotslibrarysurfprocesscoordinate{#1}% % The idea is to map % the low-level point coordinates LINEARLY into [0,2^{8*<bytes>}]. % @@ -313,6 +538,7 @@ \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% % prepend edge flag. it is a new patch. \t@pgfplots@toka=\expandafter{\expandafter\pgfplotslibrarysurf@edgeflag\the\t@pgfplots@toka}% + \pgfplotslibrarysurf@advancestreamlen{1}% \else \ifnum\c@pgfplotslibrarysurf@no=3 \def\pgfplotslibrarysurf@cubicpatch@hascdata{1}% @@ -327,28 +553,8 @@ \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 + % + \pgfplotslibrarysurf@encode@cdata{#2}% %\message{\pgfplotsbinaryresult.}% \t@pgfplots@tokc=\expandafter{\pgfplotslibrarysurf@cubicpatch@cdata}% \xdef\pgfplotslibrarysurf@cubicpatch@cdata{% @@ -369,7 +575,6 @@ % 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{% @@ -386,9 +591,28 @@ \def\pgfplotslibrarysurfdrawinpicture{% \begingroup - \pgftransformshift{\pgfplotslibrarysurf@corner@sw}% - \pgftext[at=\pgfqpoint{0pt}{0pt},left,bottom] {% + % this statement will modify both the picture's BB and the path's BB + % unless we take control. + % + % Note that the path's BB will eventually be updated into the + % picture's BB as well (meaning that 'overlay' is of no use inside + % of this group). + % + % Implement the 'surf shading/update BB' functionality here: + \let\pgfplots@@protocolsizes=\pgf@protocolsizes + \ifpgfplotslibrarysurf@updatebb + \else + % NO update to any BB. this implies 'overlay' + % *and* disables updates to the path's BB. + \def\pgf@protocolsizes##1##2{\relax}% + \fi + \pgftext[at=\pgfplotslibrarysurf@corner@sw,left,bottom] {% + \begingroup + % inside of this box, we *always* need bounding boxes. + % restore functionality. + \let\pgf@protocolsizes=\pgfplots@@protocolsizes \pgfplotslibrarysurfdraw + \endgroup % this does NOT work because I can't undo the box' shift: %\pgfplotssys@do@surfshading }% |