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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
restricted bool inXasyMode=false;
bool diagnostics=false;
void report(string text)
{
if(diagnostics)
write(text);
}
void report(transform t)
{
if(diagnostics)
write(t);
}
void report(int i)
{
if(diagnostics)
write(i);
}
void initXasyMode()
{
size(0,0);
inXasyMode=true;
}
void exitXasyMode()
{
inXasyMode=false;
}
private picture[] tempStore;
private picture newPic;
void startScript()
{
tempStore.push(currentpicture.copy());
newPic=new picture;
currentpicture=newPic;
}
void endScript()
{
if(tempStore.length < 1) {
abort("endScript() without matching beginScript()");
} else {
currentpicture=tempStore.pop();
add(currentpicture,newPic.fit(),group=false);
}
shipped=false;
}
struct indexedTransform {
int index;
transform t;
bool active;
void operator init(int index, transform t, bool active=true) {
this.index=index;
this.t=t;
this.active=active;
}
}
struct framedTransformStack {
struct transact {
transform t;
bool active;
void operator init(transform t, bool active=true) {
this.t=t;
this.active=active;
}
void operator init(indexedTransform i){
this.t=i.t;
this.active=i.active;
}
void operator init() {
this.t=identity();
this.active=true;
}
}
private transact[] stack;
private int[] frames;
private int stackBase=0;
transform pop() {
if(stack.length == 0)
return identity();
else {
transform popped=stack[0].t;
stack.delete(0);
report("Popped");
report(popped);
return popped;
}
}
transform pop0() {
if(stack.length == 0)
return identity();
else {
static transform zerotransform=(0,0,0,0,0,0);
transform popped=stack[0].active ? stack[0].t : zerotransform;
stack.delete(0);
report("Popped");
report(popped);
return popped;
}
}
void push(transform t, bool Active=true) {
report("Pushed");
report(t);
stack.push(transact(t,Active));
}
void add(... indexedTransform[] tList) {
transact[] toPush;
for(int a=0; a < tList.length; ++a)
toPush[tList[a].index]=transact(tList[a]);
for(int a=0; a < toPush.length; ++a)
if(!toPush.initialized(a))
toPush[a]=transact();
report("Added");
report(toPush.length);
stack.append(toPush);
}
bool empty() {
return stack.length == 0;
}
}
framedTransformStack xformStack;
void deconstruct(picture pic=currentpicture, real magnification=1)
{
deconstruct(pic.fit(),currentpatterns,magnification,xformStack.pop);
}
|