%-------------------------------------------- % $Header: /cvsroot/pgfplots/pgfplots/generic/pgfplots/sys/pgflibrarysurfshading.pgfsys-pdftex.def,v 1.1 2009/06/11 07:14:52 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 . % %-------------------------------------------- % The lowlevel call for surface shadings. It uses a pattern type 2 % dictionary as fill color and has thus several things to do. This is % a little bit more complicated than using the '/sh' operator (as % other pgf shadings do): the surface shading must be positioned % exactly at the requested coordinates, otherwise it is quite useless. % % Since shadings are *not* affected by changes in the canvas % transformation matrix (shifts, rotations etc), it is necessary to % pack the shading into a separate xform object which is then rotated % and translated correctly. % % There is just one more transformation necessary: the shift inside of % the xform. This shift is done using changes in the canvas % transformation matrix and it is UNDONE in the /Matrix argument of % the pattern dictionary. This last step can't be done with the /sh % operator which is why I am using pattern dictionaries. \def\pgfplotslibrarysurfdraw{% \begingroup %\pgfinterruptpicture% needed? \setbox\pgfutil@tempboxa=\hbox{% \pgfpicture \pgfplotssys@do@surfshading@fillpaths\pgfplots@loc@TMPa% \global\let\pgfplots@glob@TMPa=\pgfplots@loc@TMPa \pgfpathrectanglecorners {\pgfplotslibrarysurf@corner@sw} {\pgfplotslibrarysurf@corner@ne}% \pgfplotslibrarysurfusepath \endpgfpicture }% \immediate\pdfxform resources{ /Pattern << \pgfplots@glob@TMPa >> % write the pattern resource dictionary }\pgfutil@tempboxa \leavevmode \pdfrefxform\pdflastxform %\endpgfinterruptpicture \endgroup } % To be used inside of a pgfpicture. % % #1: a macro name. The contents of this macro needs to be written % into the pdf pattern dictionary contained in the pdf resources of % the current context. The current context is either the current page % or an xform object. % % \def\pgfplotssys@do@surfshading@fillpaths#1{% \ifx\pgfplotslibrarysurf@filter@decode\pgfutil@empty \else % Unfortunately, there is a bug in pdftex/luatex: if we % provide a /Filter as attr, and pdftex compresses the stream, % it overwrites the /Filter argument -- and the viewer cannot % decode the stream. We have to deactivate compression here: \pdfcompresslevel=0 \fi \def\pgfplots@loc@TMPa{% % stream length will be computed automatically /ShadingType \pgfplotslibrarysurf@type\space /BitsPerCoordinate \pgfplotslibrarysurf@bitspercoordinate\space /BitsPerComponent \pgfplotslibrarysurf@bitspercomponent\space \if5\pgfplotslibrarysurf@type /VerticesPerRow \pgfkeysvalueof{/pgfplots/surf shading/cols} \else /BitsPerFlag 8 \fi /ColorSpace /Device\pgfplotslibrarysurf@colorspace /Decode [\pgfplotslibrarysurf@decode] \ifpgfplotslibrarysurf@usecolormap /Function \pgfkeysvalueof{/pgfplots/surf shading/colormap} \fi \ifx\pgfplotslibrarysurf@filter@decode\pgfutil@empty \else /Filter /\pgfplotslibrarysurf@filter@decode\space \fi }% % % \pgfplots@loc@TMPb := final boolean luaBinaryEncoding; \pgfutil@IfUndefined{directlua}{% \def\pgfplots@loc@TMPb{0}% }{% \ifx\pgfplotslibrarysurf@filter@decode\pgfutil@empty % ah - we have binary encoding (the standard). \def\pgfplots@loc@TMPb{1}% \else % ah - base 16 ASCII encoding: \def\pgfplots@loc@TMPb{0}% \fi }% \if0\pgfplots@loc@TMPb % no lua binary encoding. Use standard pdftex operations: \immediate\pdfobj stream attr {% \pgfplots@loc@TMPa } {% \pgfplotslibrarysurf@binarystream }% \edef\pgfplots@loc@TMPa{\the\pdflastobj}% \else % special handling for luatex binary encoding (see docs for \pgfplotsbinarytoluabinary): \pgfplotsbinarytoluabinary{\pgfplotslibrarysurf@binarystream}% \edef\pgfplots@loc@TMPa{% \directlua{% tex.print(pdf.immediateobj(\pgfplotsDQ stream\pgfplotsDQ , pgfplotsretval, \pgfplotsDQ \pgfplots@loc@TMPa\pgfplotsDQ )); pgfplotsretval=nil; }% }% \fi \pgf@process{\pgfpointdiff{\pgfplotslibrarysurf@corner@sw}{\pgfkeysvalueof{/pgfplots/surf shading/anchor}}}% \pgf@sys@bp@correct\pgf@x% \pgf@sys@bp@correct\pgf@y% \immediate\pdfobj {<< /Type /Pattern /PatternType 2 % /Matrix [\pgf@pt@aa\space\pgf@pt@ab\space\pgf@pt@ba\space\pgf@pt@bb\space\pgf@sys@tonumber\pgf@pt@x\space\pgf@sys@tonumber\pgf@pt@y] % FIXME: INCORPORATE TIKZ CM /Matrix [1 0 0 1 \pgf@sys@tonumber\pgf@x\space \pgf@sys@tonumber\pgf@y] %226.533 518.141] %-------------------------------------------------- % /ExtGState % << % /LW 2 % /OP true % /OPM 1 % >> %-------------------------------------------------- /Shading \pgfplots@loc@TMPa\space 0 R >>}% \edef#1{% /pgfpatPlotsurface\pgfplotslibrarysurf@count\space \the\pdflastobj\space 0 R }% \pgfsys@setpatterncolored{Plotsurface\pgfplotslibrarysurf@count}% \pgfplotsutil@advancestringcounter@global\pgfplotslibrarysurf@count } \endinput % vi: ft=tex