diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-12 23:46:03 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-12 23:46:03 +0000 |
commit | 873660d1a83ece926fe7206288dda9c36b349c1b (patch) | |
tree | a48f77125c309a355b5d0eb58d6b24446abe9d62 /Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex | |
parent | 2939242967231097459df0fc3150fabc2f639111 (diff) |
generic 1
git-svn-id: svn://tug.org/texlive/trunk@613 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex | 763 |
1 files changed, 763 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex b/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex new file mode 100644 index 00000000000..22b257f7448 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex @@ -0,0 +1,763 @@ +\ProvidesPackageRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/systemlayer/pgfsys.code.tex,v 1.9 2005/10/18 18:03:38 tantau Exp $ + +% Copyright 2005 by Till Tantau <tantau@cs.tu-berlin.de>. +% +% This program can be redistributed and/or modified under the terms +% of the GNU Public License, version 2. + + + + +% +% The following conversion functions are used to convert from TeX +% dimensions to postscript/pdf points. +% +{\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}} + +\def\pgf@sys@tonumber#1{\expandafter\Pgf@geT\the#1} + +\def\pgf@sys@bp@correct#1{#1=0.99627#1} + +\def\pgf@sys@bp#1{% + {% + \pgf@x=#1\relax% + \pgf@x=0.99627\pgf@x% + \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}% + \toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% + \xdef\pgfsysprotocol@currentprotocol{\the\toks@}% + }% +} +\def\pgf@sys@pt#1{% + {% + \pgf@x=#1\relax% + \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}% + \toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% + \xdef\pgfsysprotocol@currentprotocol{\the\toks@}% + }% +} + +% internal dimensions that are always present when pgsys is loaded. +\newdimen\pgf@x +\newdimen\pgf@y +\newdimen\pgf@xa +\newdimen\pgf@ya +\newdimen\pgf@xb +\newdimen\pgf@yb +\newdimen\pgf@xc +\newdimen\pgf@yc + + +% The following \if decides, whether even-odd filling and clipping is +% to be used or normal the non-zero winding number rule. See the +% pdf-documentation for details on what these rules are. + +\newif\ifpgfsys@eorule + + + +% In the following dummy definitions of the pgf system commands are +% given. The individual drivers must overwrite these definitions, +% preferably all of them. If some system command is used that has not +% been overwritten, the command fails with a warning. +% +% In some cases, some pgf system commands are just shorthands for a +% series of more complicated commands. In this case, a default +% implementation is given in this file, but a driver may choose to +% overwrite this default implementation with a more effecient +% version. For example, a closestroke is the same as a closepath +% followed by a stroking, but in pdf there is a special shorthand for +% this. So, the pdf driver overwrites \pgfsys@closestroke, while the +% postscript driver does not. +% +% The commands for which default implementations are available are +% given at the end. + +\def\pgf@sys@fail#1{% + \expandafter\ifx\csname pgf@sys@fail@#1\endcsname\@empty% + \else% + \expandafter\global\expandafter\let\csname pgf@sys@fail@#1\endcsname=\@empty% + \PackageWarning{pgf}{% + Your graphic driver \pgfsysdriver\space does not supported #1. This warning is given only once}% + \fi% +} + + + +\def\pgfsys@invoke{\pgf@sys@fail{invoking specials}} +% This command is used whenever some literal text needs to be inserted +% into the resulting .pdf, .ps, or .dvi file. Note that most +% \pgfsys@xxxx commands will not directly call this command, but, +% rather, use the protocolling mechanism to record their literal +% text. It is then left to the discretion of the protocolling +% mechansim to insert the literal text at some appropriate, later +% time. +% +% This command should only be called when \pgfsys@beginpicture has +% been called previously and when the picture has not been suspended +% using \pgfsys@beginhbox. + + +\def\pgfsys@outerinvoke{\pgfsys@invoke} +% This command can be used to insert protocolled graphic commands +% outside any picture. This is extremely dangerous, but sometimes +% useful. By default, this command does the same as inside pictures. + + + +% +% +% Path construction commands +% +% + +\def\pgfsys@moveto#1#2{\pgf@sys@fail{path constructions}} +% This command is used to start a path at a specific point (#1bp,#2bp) +% or to move the current point of the current path to (#1bp,#2bp) +% without drawing anything upon stroking (the current path is +% `interrupted'). +% +% Here (and in the following) the coordinates are in TeX's big points +% (bp), unless the coordinate system has been scaled. A big point is +% 1/72 inches. Note that TeX's point pt is 1/72.27 inches. +% +% Example: +% +% \pgfsys@moveto{10}{10} +% \pgfsys@lineto{0}{0} +% \pgfsys@stroke +% +% This will draw a line from (10bp,10bp) to the origin of the picture. + +\def\pgfsys@lineto#1#2{\pgf@sys@fail{path constructions}} +% Continue the current path to (#1bp,#2bp) with a line. + +\def\pgfsys@curveto#1#2#3#4#5#6{\pgf@sys@fail{path constructions}} +% Continue the current path with a bezier curver to (#5bp,#6bp). The +% control points of the curve are at (#1bp,#2bp) and (#3bp,#4bp). + +\def\pgfsys@rect#1#2#3#4{\pgf@sys@fail{path constructions}} +% Append a rectangle to the current path whose lower left corner is at +% (#1bp,#2bp) and whose width/height is given by (#3bp,#4bp). +% +% This command can be `mapped back' to moveto and lineto commands, but +% it is included since pdf has a special, quick version of this command. + +\def\pgfsys@closepath{\pgf@sys@fail{path constructions}} +% Close the current path. This results in joining the current point of +% the path with the point specified by the last moveto +% operation. Typically, this is preferable over using lineto to the +% last point specified by a moveto, since the line starting at this +% point and the line ending at this point will be smoothly joined by +% closepath. +% +% Example: +% +% \pgfsys@moveto{0}{0} +% \pgfsys@lineto{10}{10} +% \pgfsys@lineto{0}{10} +% \pgfsys@closepath +% \pgfsys@stroke +% +% versus +% +% \pgfsys@moveto{0}{0} +% \pgfsys@lineto{10}{10} +% \pgfsys@lineto{0}{10} +% \pgfsys@lineto{0}{0} +% \pgfsys@stroke +% +% The difference between the above will be that in the second triangle +% the corner at the origin will be wrong; it will just be the overlay +% of two lines going in different directions, not a sharp pointed +% corner. + + + + + + +% +% +% Stroking and filling commands +% +% + +\def\pgfsys@stroke{\pgf@sys@fail{path usage}} +% Stroke the current path (as if it were drawn with a pen). A number +% of so-called graphic state parameters influence this, which can be +% set in different ways: +% +% - linewidth +% The `thickness' of the line. A width of 0 is the thinnest width +% renderable on the device. On a high-resolution printer this may +% become invisible and should be avoided. A good choice is 0.4pt, +% which is the default. +% +% - stroke color +% This special color is used for stroking. If it is not set, the +% current color is used. +% +% - cap +% The cap describes how the endings of lines a drawn. A round cap +% adds a little half circle to these endings. A butt cap ends the +% lines exactly at the end (or start) point without anything +% added. A rectangular cap ends the lines like the butt cap, but the +% lines protrude over the endpoint by the line thickness. (See also +% the pdf or postscript manual). If the path has been closed, no cap +% is drawn. +% +% - join +% This describes how a bend (a join) in a path is rendered. A round +% join draws bends using small arcs. A bevel join just draws the two +% lines and then fills the join minimally so that it becomes +% convex. A miter join extends the lines so that they form a single +% sharp corner, but only up to a certain miter limit. (See the pdf +% or postscript manual once more). +% +% - dash +% The line may be dashed according to a dashing pattern. +% +% - clipping area +% If a clipping area is established, only those parts of the path +% that are inside the clipping area will be drawn. +% +% In addition to stroking a path, the path may also be used for +% clipping after it has been stroked. This will happen if the +% \pgfsys@clipnext is used prior to this command, see there for +% details. + +\def\pgfsys@fill{\pgf@sys@fail{path usage}} +% This command fills the area surrounded by the current path. If the +% path has not yet been closed, it is closed prior to filling. The +% path itself is not stroked. For self-intersecting paths or paths +% consisting of multiple parts, the nonzero winding number rule is +% used to determine whether a point is inside or outside the +% path, except if \ifpgfsys@eorule holds -- in which case the even-odd +% rule should be used. (See the pdf or postscript manual for details.) +% +% The following graphic state parameters influence the filling: +% +% - fill color +% If the fill color is not especially set, the current color is +% used. +% +% - clipping area +% If a clipping area is established, only those parts of the filling +% area that are inside the clipping area will be drawn. +% +% In addition to filling the path, the path will also be used for +% clipping if \pgfsys@clipnext is used prior to this command. + +\def\pgfsys@fillstroke{\pgf@sys@fail{path usage}} +% First, the path is filled, then the path is stroked. If the fill and +% stroke colors are the same (or if they are not specified and the +% current color is used), this yields almost the same as a +% \pgfsys@fill. However, due to the line thickness of the stroked +% path, the fillstroked area will be slightly larger. +% +% In addition to stroking and filling the path, the path will also be +% used for clipping if \pgfsys@clipnext is used prior to this command. + +\def\pgfsys@clipnext{\pgf@sys@fail{path usage}} +% This command should be issued after a path has been constructed, but +% before it has been stroked and/or filled or discarded. When the +% command is used, the next stroking/filling/discarding command will +% first be executed normally. Then, afterwards, the just-used path +% will be used for subsequent clipping. If there has already been a +% clipping region, this region is intersected with the new clipping +% path (the clipping cannot get bigger). The nonzero winding number +% rule is used to determine whether a point is inside or outside the +% clipping area or the even-odd rule, depending on whether +% \ifpgfsys@eorule holds. + +\def\pgfsys@discardpath{\pgf@sys@fail{path usage}} +% Normally, this command should `throw away' the current path. +% However, after \pgfsys@clipnext has been called, the current path +% should subsequently be used for clipping. See \pgfsys@clipnext for +% details. + + + + + +% +% +% Stroking options +% +% +\def\pgfsys@setlinewidth#1{\pgf@sys@fail{setting the line width}} +% Sets the width of lines, when stroked, to #1bp. + +\def\pgfsys@buttcap{\pgf@sys@fail{setting the line cap}} +% Sets the cap to a butt cap. See \pgfsys@stroke. + +\def\pgfsys@roundcap{\pgf@sys@fail{setting the line cap}} +% Sets the cap to a round cap. See \pgfsys@stroke. + +\def\pgfsys@rectcap{\pgf@sys@fail{setting the line cap}} +% Sets the cap to a rectangular cap. See \pgfsys@stroke. + +\def\pgfsys@miterjoin{\pgf@sys@fail{setting the line join}} +% Sets the join to a miter join. See \pgfsys@stroke. + +\def\pgfsys@setmiterlimit#1{\pgf@sys@fail{setting the line cap}} +% Sets the miter limit of lines to #1. See the pdf or postscript +% documentation. + +\def\pgfsys@roundjoin{\pgf@sys@fail{setting the line cap}} +% Sets the join to a round join. See \pgfsys@stroke. + +\def\pgfsys@beveljoin{\pgf@sys@fail{setting the line cap}} +% Sets the join to a bevel join. See \pgfsys@stroke. + +\def\pgfsys@setdash#1#2{\pgf@sys@fail{setting the dashing pattern}} +% Sets the dashing patter. #1 should be a list of lengths given in big +% points (bp) separated by spaces. #2 should be a single value given +% in bp. +% +% The list of values in #1 is used to determine the lengths of the +% `on' phases of the dashing and of the `off' phases. For example, if +% #1 is `3 4', then the dashing pattern is `3bp on followed by 4bp +% off, followed by 3bp on, followed by 4bp off, and so on'. A pattern +% of `.5 4 3 1.5' means `.5bp on, 4bp off, 3bp on, 1.5bp off, .5bp on, +% ...'. If the number of entries is odd, the last one is used twice, +% so `3' means `3bp on, 3bp off, 3bp on, 3bp off,...'. An empty list +% means `always on'. +% +% The second argument determines the `phase' of the pattern. For +% example, for a pattern of `3 4' and a phase of `1', the pattern +% would start: `2bp on, 4bp off, 3bp on, 4bp off, 3bp on, 4bp off...'. + + + + +% +% +% Opacity stuff +% +% + +\def\pgfsys@stroke@opacity#1{\pgf@sys@fail{opacity}} +% Sets the opacity of stroking operations. 1 means fully opaque, 0 +% means fully transparent. + +\def\pgfsys@fill@opacity#1{\pgf@sys@fail{opacity}} +% Sets the opacity of filling operations. 1 means fully opaque, 0 +% means fully transparent. + + + + +% +% +% Color stuff +% +% + +\def\pgfsys@color@rgb@stroke#1#2#3{\pgf@sys@fail{color}} +% Sets the color used for stroking operations to the given rgb tuple +% (numbers between 0 and 1). +% +% Example: Make stroked text dark red: \pgfsys@color@rgb@stroke{0.5}{0}{0} +% +% The special stroking color is only used if the stroking color has +% been set since the last \color command. Thus, each \color command +% should reset both the stroking and filling colors. + +\def\pgfsys@color@rgb@fill#1#2#3{\pgf@sys@fail{color}} +% Sets the color used for filling operations to the given rgb tuple +% (numbers between 0 and 1). This color may be different from the +% stroking color. + +\def\pgfsys@color@rgb#1#2#3{\pgfsys@color@rgb@stroke{#1}{#2}{#3}\pgfsys@color@rgb@fill{#1}{#2}{#3}} +% Sets the color used for filling and stroking operations. This is a +% ``low-level'' version of the \color command. It is currently only +% used by the plain tex version to support colors. + +\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgf@sys@fail{color}} +% Sets the color used for stroking operations to the given cymk tuple +% (numbers between 0 and 1). + +\def\pgfsys@color@cmyk@fill#1#2#3#4{\pgf@sys@fail{color}} +% Sets the color used for filling operations to the given cymk tuple +% (numbers between 0 and 1). + +\def\pgfsys@color@cmyk#1#2#3#4{\pgfsys@color@cmyk@stroke{#1}{#2}{#3}{#4}\pgfsys@color@cmyk@fill{#1}{#2}{#3}{#4}} +% Sets the color used for filling and stroking operations. + +\def\pgfsys@color@cmy@stroke#1#2#3{\pgf@sys@fail{color}} +% Sets the color used for stroking operations to the given cym tuple +% (numbers between 0 and 1). + +\def\pgfsys@color@cmy@fill#1#2#3{\pgf@sys@fail{color}} +% Sets the color used for filling operations to the given cym tuple +% (numbers between 0 and 1). + +\def\pgfsys@color@cmy#1#2#3{\pgfsys@color@cmy@stroke{#1}{#2}{#3}\pgfsys@color@cmy@fill{#1}{#2}{#3}} +% Sets the color used for filling and stroking operations. + +\def\pgfsys@color@gray@stroke#1{\pgf@sys@fail{color}} +% Sets the color used for stroking operations to the given gray level +% (number between 0 and 1). + +\def\pgfsys@color@gray@fill#1{\pgf@sys@fail{color}} +% Sets the color used for filling operations to the given gray level +% (number between 0 and 1). + +\def\pgfsys@color@gray#1{\pgfsys@color@gray@stroke{#1}\pgfsys@color@gray@fill{#1}} +% Sets the color used for filling and stroking operations. + +\newif\ifpgfsys@color@reset@inorder +% This if decides whether the color resetting of the +% \pgfsys@color@reset command may assume that all color commands are +% given ``in order.'' This means that this command will not be called, +% say, at the beginning of a box that is later inserted at a point +% where a fill color was actively set. This may allow the command to +% produce more compact code when it ``knows'' that no special fill or +% stroke color has been set. +\pgfsys@color@reset@inordertrue + + +\def\pgfsys@color@reset{} +% This command will be called when the \color command is used. It +% should purge any internal settings of stroking and filling +% color. After this call, till the next use of a command like +% \pgfsys@color@rgb@fill, the current color installed by the \color +% command should be used. + +\def\pgfsys@color@unstacked#1{} +% This slightly obscure command causes the color stack to be +% tricked. When called, this command should set the current color to +% #1 without causing any change in the color stack. + + + +% +% +% Coordinate system transformations +% +% + +\def\pgfsys@transformcm#1#2#3#4#5#6{\pgf@sys@fail{transformations}} +% Perform a concatenation of the low-level current transformation +% matrix with the matrix given by the values #1 to #6. The +% transformation matrix is a transformation on a homogeneous +% 2D-coordinate system. See the pdf or postscript manual for details. + + + + +% +% +% Graphic state saving and restoring. +% +% + +\def\pgfsys@beginscope{\pgf@sys@fail{scoping}} +% Saves the current graphic state on a graphic state stack. All +% changes to the graphic state parameters mentioned for \pgfsys@stroke +% and \pgfsys@fill will be local to the current graphic state and will +% the old values will be restored after endscope is used. +% +% WARNING: pdf and postscript differ with respect to the question of +% whether the current path is part of the graphic state or not. For +% this reason, you should never use this command unless the path is +% currently empty. For example, it might be a good idea to use +% discardpath prior to calling this command. + +\def\pgfsys@endscope{\pgf@sys@fail{scoping}} +% Restores the last saved graphic state. + + + + +% +% +% Special commands +% +% + +\def\pgfsys@imagesuffixlist{} +% A list of suffixes, separated by `:', that will be tried when +% searching for an image. + + + +% +% +% Special commands +% +% + + +\def\pgfsys@definemask{\pgf@sys@fail{masking}} +% This command declares a mask for usage with images. It works similar +% to \pgfsys@defineimage: Certain macros are set when the command is +% called. The result should be to set the macro \pgf@mask to a pdf +% object count that can subsequently be used as a soft mask. The +% following macros will be set when this command is invoked: +% +% - \pgf@filename +% File name of the mask to be defined. +% +% - \pgf@maskmatte +% The so-called matte of the mask (see the pdf documentation for +% details). The matte is a color specification consisting of 1, 3 or +% 4 numbers between 0 and 1. The number of numbers depends on the +% number of color channels in the image (not in the mask!). It will +% be assumed that the image has been preblended with this color. + + + + +% +% +% Shading commands +% +% + +\def\pgfsys@horishading#1#2#3{\pgf@sys@fail{shadings}} +% Declares a horizontal shading for later use. The effect of this +% command should be the definition of a macro called `@pgfshading#1!' +% (or \csname @pdfshading#1!\endcsname, to be precise). When invoked, +% this new macro should insert a shading at the current position. +% +% #1 is the name of the shading, which is also used in the output +% macro name. #2 is the height of the shading and must be given as a +% TeX dimension like `2cm' or `10pt'. #3 is a shading color +% specification as specified in the pgfuserguide. The shading +% specification implicitly fixes the width of the shading. +% +% When `@pgfshading#1!' is invoked, it should insert a box of height +% #2 and the width implicit in the shading declaration. + +\def\pgfsys@vertshading#1#2#3{\pgf@sys@fail{shadings}} +% Like horishading, only for vertical shadings. This time, the height +% of the shading is implicit in #3 and the width is given as #2. + +\def\pgfsys@radialshading#1#2#3{\pgf@sys@fail{shadings}} +% Declares a radial shading. Like the previous macros, this command +% should setup the macro `@pgfshading#1!', which upon invocation +% should insert a radial shading whose size is implicit in #3. +% +% The parameter #2 is a pgf point specification if the starting point +% of the shading. See the pgfuserguide for details. + +\def\pgfsys@shadingoutsidepgfpicture#1{% + #1% +} +% This command gets the definition of a shading (@pgfshadingxxxx!) as +% an argument and should insert this shading into the normal text. +% +% This command has a default implementation. + + +\def\pgfsys@shadinginsidepgfpicture#1{% + \pgf@makehbox{#1}% + \setbox\pgf@hbox=\hbox{\hskip-.5\wd\pgf@hbox\lower.5\ht\pgf@hbox\hbox{\box\pgf@hbox}}% + \pgfqbox{\pgf@hbox}% +} +% This command works like \pgfsys@shadingoutsidepgfpicture, only it is +% called when a shading should be inserted inside a picture. This +% command should insert the shading centered on the origin (which will +% typically have been low-level translated somewhere else.) +% +% This command has a default implementation. + + + + + +% +% +% Commands having a default implementation. These commands only need +% not be implemented by drivers if this results in a better +% preformance. +% +% + + +\def\pgfsys@closestroke{\pgfsys@closepath\pgfsys@stroke} +% This command should have the same effect as first closing the path +% and then stroking it. + + +\def\pgfsys@transformshift#1#2{\pgfsys@transformcm{1}{0}{0}{1}{#1}{#2}} +% This command will change the origin of the low-level coordinate +% system to (#1bp,#2bp). + +\def\pgfsys@transformxyscale#1#2{\pgfsys@transformcm{#1}{0}{0}{#2}{0bp}{0bp}} +% This command will scale the low-level coordinate system (and +% everything that is drawn) by a factor of #1 in x-directed and #2 in +% y-direction. Note that this applies to everything, including +% lines. So a scaled line will have a different width and may even +% have a different width when going along the x-axis and when going +% along the y-axis, if the scaling is different in these directions. + +\def\pgfsys@hbox#1{% + \pgfsys@beginscope% + \wd#1=0pt% + \ht#1=0pt% + \dp#1=0pt% + \box#1% + \pgfsys@endscope% +} +% Called to insert a TeX hbox into a pgfpicture. + +\def\pgfsys@hboxsynced#1{% + {\pgfsys@beginscope\pgflowlevelsynccm\pgfsys@hbox#1\pgfsys@endscope}% +} +% Called to insert a TeX hbox into a pgfpicture, but with the current +% coordiante transformation matrix synced with the canvas +% transformation matrix. +% +% In essence, this command does the same as if you first said +% \pgflowlevelsynccm and then \pgfsys@hbox. However, a driver may +% choose to use a ``TeX-translation'' for the translation part of the +% transformation cm. This will ensure that hyperlinks ``survive'' at +% least translations. + +\def\pgfsys@beginpicture{} +% Called at the beginning of a pgfpicture. Used to setup things. + +\def\pgfsys@endpicture{} +% Called at the end of a pgfpicture. + +\def\pgfsys@typesetpicturebox#1{% + \setlength\pgf@x{\pgf@shift@baseline}% + \advance\pgf@x by-\pgf@picminy\relax% + \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height + \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width + \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}% + \ht#1=\pgf@picmaxy% + \wd#1=\pgf@picmaxx% + \dp#1=0pt% + \leavevmode\raise-\pgf@x\box#1% +} +% Called after a picture has been typeset in box #1. This +% command should insert the box into the normal TeX code. The box #1 +% will still be a ``raw'' box that contains only the \special's. The +% job of this command is to resize and shift this box according to the +% baseline shift and the size of the box. +% +% This command has a default implementation. + +\def\pgfsys@beginpurepicture{\pgfsys@beginpicture} +% This version of the beginpicture command can be used for pictures +% that are guaranteed not to contain any hboxes. In this case, a +% driver might provide a more compact version of the command. + +\def\pgfsys@endpurepicture{\pgfsys@endpicture} +% Called at the end of a ``pure'' pgfpicture. + +\def\pgfsys@defineimage{% + \ifx\pgf@imagewidth\@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi% + \ifx\pgf@imageheight\@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi% + \ifx\pgf@imagepage\@empty\else\edef\pgf@imagepage{page=\pgf@imagepage,}\fi% + \edef\pgf@image{\noexpand\includegraphics[\pgf@imageheight\pgf@imagewidth]{\pgf@filename}}% +} +% Called, when an image should be defined. +% +% This command does not take any parameters. Instead, certain macros +% will be preinstalled with appropriate values when this command is +% invoked. These are: +% +% - \pgf@filename +% File name of the image to be defined. +% +% - \pgf@imagewidth +% Will be set to the desired (scaled) width of the image. +% +% - \pgf@imageheight +% Will be set to the desired (scaled) height of the image. +% +% If this macro and also the height macro are empty, the image +% should have its `natural' size. +% +% If exactly only of them is specified, the undefined value the +% image is scaled so that the aspect ratio is kept. +% +% If both are set, the image is scaled in both directions +% independently, possibly changing the aspect ratio. +% +% +% The following macros presumable mostly make sense for drivers that +% can handle pdf: +% +% - \pgf@imagepage +% The desired page number to be extracted from a multi-page +% `image'. +% +% - \pgf@imagemask +% If set, it will be set to `/SMask x 0 R', where x is the pdf +% object number of a soft mask to be applied to the image. +% +% - \pgf@imageinterpolate +% If set, it will be set to `/Interpolate true' or `/Interpolate +% false', indicating whether the image should be interpolated in +% pdf. +% +% +% The command should now setup the macro \pgf@image such that calling +% this macro will result in typesetting the image. Thus, \pgf@image is +% the `return value' of the command. + + +\def\pgfsys@defobject#1#2#3#4{% + \pgfsysprotocol@getcurrentprotocol\pgfsys@temp% + {% + \pgfsysprotocol@setcurrentprotocol\@empty% + \pgfsysprotocol@bufferedtrue% + #4% + \pgfsysprotocol@getcurrentprotocol\pgfsys@@temp% + \expandafter\global\expandafter\let\csname #1\endcsname=\pgfsys@@temp% + }% + \pgfsysprotocol@setcurrentprotocol\pgfsys@temp% +} +% Declares an object for later use. The idea is that the object can be +% precached in some way and then be rendered more quickly when used +% several times. For example, an arrow head might be defined and +% prerendered in this way. +% +% The parameter #1 is the name for later use. #2 and #3 are pgf points +% specifying a bounding box for the object. #4 is the code for the +% object. The code may only contain protocollable code. + + +\def\pgfsys@useobject#1#2{% + \pgfsysprotocol@getcurrentprotocol\pgfsys@temp% + {% + \pgfsysprotocol@setcurrentprotocol\@empty% + \pgfsysprotocol@bufferedfalse% + #2% + \expandafter\pgfsysprotocol@setcurrentprotocol\csname #1\endcsname% + \pgfsysprotocol@invokecurrentprotocol% + }% + \pgfsysprotocol@setcurrentprotocol\pgfsys@temp% +} +% Renders a previously declared object. The first parameter is the +% name of the the object. The second parameter is extra code that +% should be executed right *before* the object is rendered. Typically, +% this will be some transformation code. + + +\def\pgfsys@begininvisible{\pgfsys@transformcm{1}{0}{0}{1}{2000bp}{2000bp}} +% Between this command and the closing endinvisible, all output should +% be suppressed. Nothing should be drawn at all, which includes all +% paths, images and shadings. + +\def\pgfsys@endinvisible{\pgfsys@transformcm{1}{0}{0}{1}{-2000bp}{-2000bp}} +% Ends the invisibilty section, unless invisibility blocks have been +% nested. In this case, only the `last' one restores visibility. + + + + +% Discern the driver: +\input pgf.cfg + +\PackageInfo{pgfsys}{Driver file for pgf: \pgfsysdriver} +\InputIfFileExists{\pgfsysdriver}{}{% + \PackageError{pgfsys}{Driver file ``\pgfsysdriver'' not found.}{}} + +\endinput |