summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/dvips/pst-bezier/pst-bezier.pro
blob: 560d027a8078b9d913e5c670297ecb7efc3937b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
%% $Id: pst-bezier.pro 87 2009-01-29 10:37:06Z herbert $
%% PostScript prologue for pstricks-add.tex.
%%
%% Version 0.01, 2009/01/29
%%
%% For distribution, see pst-bezier.tex.
%%
%% 
tx@Dict begin

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Auxiliary routines:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% [x1 y1] [x2 y2] -> [ x1+y1  x2+y2 ]
/AddArrays2d {
    [ 3 1 roll %% Get the operands
    2 copy
    0 get exch
    0 get add %% first component finished
    %% second component:
    3 1 roll
    1 get exch
    1 get add ]} bind def

%% [x1 y1] [x2 y2] -> [ x1-x2  y1-y2 ]
/SubArrays2d {
    [ 3 1 roll exch
    2 copy
    0 get exch 0 get sub
    3 1 roll
    1 get exch
    1 get sub ] } bind def

%% [x y] s -> [s*x s*y]
/ScaleArray2d {
    [ 3 1 roll exch
    2 copy
    0 get mul
    3 1 roll
    1 get mul
    ] } bind def


%% << [Array of Bezier splines] /K 1 >> -> empty stack
%% Thereby, a Bezier spline is described by an array:
%% [x0 y0 x1 y1 x2 y2 x3 y3 sl sr]
%% (x0,y0) is the right control point
/pstBCurve {
begin %% LaTeX provides the dictionary (see above comments)
    1 1 Splines length 1 sub {
        /K exch def % K is the index of the spline.
%%
	%% First control point:
        Splines K get 0 get dup %% switch the cases /n and /s...
	/n eq { %% `not specified' -> automatically computed
            Splines K get 0 %% l(k) is going to be set...
		%% | -> p(k-1)+(p(k)-p(k-2))*sl(k)
                Splines K get 4 2 getinterval
                Splines K 2 sub get 4 2 getinterval
                SubArrays2d
                Splines K get 6 get ScaleArray2d
                Splines K 1 sub get 4 2 getinterval
                AddArrays2d
            putinterval %% ...setting l(k)
        } if
        /s eq { %% `symmetric' -> compute from r(k-1)
            Splines K get 0 %% l(k):=
		%% | -> 2*p(k-1)-r(k-1)
                Splines K 1 sub get 4 2 getinterval 2 ScaleArray2d
                Splines K 1 sub get 2 2 getinterval SubArrays2d
            putinterval %%
        } if

	%% Second control point:
        Splines K get 2 get dup %% (cases /n and /s)
	/n eq { %% `not specified' -> automatically computed
            Splines K get 2
		%% | -> p(k)+(p(k+1)-p(k-1))*sr(k)
                Splines K 1 sub get 4 2 getinterval
                Splines K 1 add get 4 2 getinterval
                SubArrays2d
                Splines K get 7 get ScaleArray2d
                Splines K get 4 2 getinterval
                AddArrays2d
            putinterval
        } if
        /s eq { %% `symmetric' -> compute from l(k+1)
            Splines K get 2
		%% | -> 2*p(k)-l(k+1)
                Splines K get 4 2 getinterval 2 ScaleArray2d
                Splines K 1 add get 0 2 getinterval SubArrays2d
            putinterval
        } if
    } for %% all splines.
    %%
    %% The current point is already correctly set by the LaTeX macro.
    %% So get ride of the 0th dummy spline.
    Splines 1 Splines length 1 sub getinterval {%
	aload pop pop pop %% get ride of the array itself and the scaling factor.
       curveto% now the actual spline is on the stack...
    } forall %% splines.
    /Points [ %% now save the points for the showpoints-feature.
        Splines 0 get 4 2 getinterval aload pop
        Splines 1 Splines length 1 sub getinterval { aload pop pop pop } forall
        ]
    end def %% Put points in the top dictionary
  } bind def
end %% tx@Dict