summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-02-24 18:22:07 +0000
committerKarl Berry <karl@freefriends.org>2008-02-24 18:22:07 +0000
commitac768be5ab2e638802806ac364ca4402e8e9935e (patch)
treebf26e0d972206f02cda2535e35dd8c2a33c04eaa /Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
parentbc195e7c0fe9d96cd9b6c0230da50da6fc28de26 (diff)
pgf 2.0, third try
git-svn-id: svn://tug.org/texlive/trunk@6747 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex209
1 files changed, 209 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex b/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
new file mode 100644
index 00000000000..86c7e5691b4
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
@@ -0,0 +1,209 @@
+% Copyright 2006 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/systemlayer/pgfsyssoftpath.code.tex,v 1.6 2008/01/23 13:15:28 tantau Exp $
+
+
+% This package provides the pgf system path abstraction layer. This
+% layer is used to construct paths first ``abstractly.'' These
+% abstract paths can still be modified, before they are ``made
+% concrete.''
+%
+% An abstract path consists of a sequence of basic building blocks,
+% each of which is a tuple consisting of two numbers (specifying a
+% coordinate) and a token. Possible tokens are:
+%
+% 1. moveto
+% 2. lineto
+% 3. rectcorner
+% 4. rectsize
+% 5. curvetosupporta
+% 6. curvetosupportb
+% 7. curveto
+% 8. closepath
+% 9. specialround
+%
+% A curveto must always be preceeded by a curvetosupporta and a
+% curvetosupportb. A non-empty path must always begin with a
+% moveto. The coordinates of a closepath are non-specified, currently,
+% but they might be set to the coordinate of the path segment start,
+% in the future.
+
+
+% Access to the current path:
+%
+% Lots of stuff is added to the current path and it can get very long
+% (containing literally tens of thousands of tokens). For such macros,
+% adding things using a simple "g@addtomacro" takes more and more
+% time, resulting in quadratic runtime. To avoid this, ideally, one
+% would collect things in an array and then use a divide and conquer
+% merger. A simple intermediate solution is the following, implemented
+% here: We have the path and two buffers. New tokens are added to the
+% first buffer, which is quite small. When it overflow, its contents
+% is added to the second buffer, which is large. If that buffer
+% overflow, the contents is finally added to the main path (which can
+% have arbitrary length). Whenever the main path is set or read, the
+% buffers are flushed.
+%
+% Because of this buffering, it is imperative that the main path is
+% accessed only vie appropriate interface macros.
+
+
+
+% The current path
+\let\pgfsyssoftpath@thepath=\pgfutil@empty
+\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+\newcount\pgfsyssoftpath@smallbuffer@items
+\newcount\pgfsyssoftpath@bigbuffer@items
+
+\def\pgfsyssoftpath@flushbuffers{%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+}
+
+% Getting and setting the current path
+\def\pgfsyssoftpath@getcurrentpath#1{%
+ \pgfsyssoftpath@flushbuffers%
+ \let#1=\pgfsyssoftpath@thepath%
+}
+
+\def\pgfsyssoftpath@setcurrentpath#1{%
+ \global\let\pgfsyssoftpath@thepath=#1%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+}
+
+
+% Invoking the current path (slightly optimized)
+\def\pgfsyssoftpath@invokecurrentpath{%
+ \pgfsyssoftpath@thepath%
+ \pgfsyssoftpath@bigbuffer%
+ \pgfsyssoftpath@smallbuffer%
+}
+
+\def\pgfsyssoftpath@flushcurrentpath{%
+ \pgfsyssoftpath@invokecurrentpath%
+ \pgfsyssoftpath@setcurrentpath\pgfutil@empty%
+}
+
+% Add an item at the end
+\def\pgfsyssoftpath@addtocurrentpath#1{%
+ \global\advance\pgfsyssoftpath@smallbuffer@items by1\relax%
+ \ifnum\pgfsyssoftpath@smallbuffer@items<40\relax% good number?
+ \expandafter\gdef\expandafter\pgfsyssoftpath@smallbuffer\expandafter{\pgfsyssoftpath@smallbuffer#1}%
+ \else%
+ \pgfsyssoftpath@smalloverflow{#1}%
+ \fi%
+}
+\def\pgfsyssoftpath@smalloverflow#1{%
+ \global\advance\pgfsyssoftpath@bigbuffer@items by1\relax%
+ \ifnum\pgfsyssoftpath@smallbuffer@items<30\relax% good number?
+ \expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@bigbuffer%
+ \expandafter\expandafter\expandafter{\expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer#1}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+ \else%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\pgfsyssoftpath@thepath%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\pgfsyssoftpath@thepath
+ \expandafter\pgfsyssoftpath@bigbuffer\pgfsyssoftpath@smallbuffer#1}%
+ \global\let\pgfsyssoftpath@smallbuffer=\pgfutil@empty
+ \global\let\pgfsyssoftpath@bigbuffer=\pgfutil@empty
+ \global\pgfsyssoftpath@bigbuffer@items0\relax%
+ \global\pgfsyssoftpath@smallbuffer@items0\relax%
+ \fi%
+}
+
+
+
+\def\pgfsyssoftpath@lastmoveto{{0pt}{0pt}}
+
+\newif\ifpgfsyssoftpathmovetorelevant
+\pgfsyssoftpathmovetorelevanttrue
+
+% Add a moveto element to the current path
+\def\pgfsyssoftpath@moveto#1#2{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@movetotoken{#1}{#2}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+ \ifpgfsyssoftpathmovetorelevant%
+ \xdef\pgfsyssoftpath@lastmoveto{{#1}{#2}}%
+ \fi%
+}
+
+% Add a lineto element to the current path
+\def\pgfsyssoftpath@lineto#1#2{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@linetotoken{#1}{#2}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Add curveto elements to the current path
+\def\pgfsyssoftpath@curveto#1#2#3#4#5#6{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@curvetosupportatoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@curvetosupportbtoken{#3}{#4}%
+ \noexpand\pgfsyssoftpath@curvetotoken{#5}{#6}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Add rectanlge elements to the current path
+\def\pgfsyssoftpath@rect#1#2#3#4{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@rectcornertoken{#1}{#2}%
+ \noexpand\pgfsyssoftpath@rectsizetoken{#3}{#4}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Add closepath element to the current path
+\def\pgfsyssoftpath@closepath{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@closepathtoken\pgfsyssoftpath@lastmoveto%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Add special element to the current path
+\def\pgfsyssoftpath@specialround#1#2{%
+ \edef\pgfsyssoftpath@temp{{%
+ \noexpand\pgfsyssoftpath@specialroundtoken{#1}{#2}%
+ }}%
+ \expandafter\pgfsyssoftpath@addtocurrentpath\pgfsyssoftpath@temp%
+}
+
+% Marshallers
+\def\pgfsyssoftpath@movetotoken#1#2{\pgfsys@moveto{#1}{#2}}
+\def\pgfsyssoftpath@linetotoken#1#2{\pgfsys@lineto{#1}{#2}}
+\def\pgfsyssoftpath@rectcornertoken#1#2#3#4#5{\pgfsys@rect{#1}{#2}{#4}{#5}} % #3 = \pgfsyssoftpath@rectsizetoken
+\def\pgfsyssoftpath@curvetosupportatoken#1#2#3#4#5#6#7#8{\pgfsys@curveto{#1}{#2}{#4}{#5}{#7}{#8}}
+\def\pgfsyssoftpath@closepathtoken#1#2{\pgfsys@closepath}
+\let\pgfsyssoftpath@specialroundtoken=\pgfutil@gobbletwo
+
+
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% End: