Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / gfx / path.js @ 12

History | View | Annotate | Download (7.35 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.gfx.path"]){
9
dojo._hasResource["dojox.gfx.path"]=true;
10
dojo.provide("dojox.gfx.path");
11
dojo.require("dojox.gfx.matrix");
12
dojo.require("dojox.gfx.shape");
13
dojo.declare("dojox.gfx.path.Path",dojox.gfx.Shape,{constructor:function(_1){
14
this.shape=dojo.clone(dojox.gfx.defaultPath);
15
this.segments=[];
16
this.tbbox=null;
17
this.absolute=true;
18
this.last={};
19
this.rawNode=_1;
20
this.segmented=false;
21
},setAbsoluteMode:function(_2){
22
this._confirmSegmented();
23
this.absolute=typeof _2=="string"?(_2=="absolute"):_2;
24
return this;
25
},getAbsoluteMode:function(){
26
this._confirmSegmented();
27
return this.absolute;
28
},getBoundingBox:function(){
29
this._confirmSegmented();
30
return (this.bbox&&("l" in this.bbox))?{x:this.bbox.l,y:this.bbox.t,width:this.bbox.r-this.bbox.l,height:this.bbox.b-this.bbox.t}:null;
31
},_getRealBBox:function(){
32
this._confirmSegmented();
33
if(this.tbbox){
34
return this.tbbox;
35
}
36
var _3=this.bbox,_4=this._getRealMatrix();
37
this.bbox=null;
38
for(var i=0,_5=this.segments.length;i<_5;++i){
39
this._updateWithSegment(this.segments[i],_4);
40
}
41
var t=this.bbox;
42
this.bbox=_3;
43
this.tbbox=t?[{x:t.l,y:t.t},{x:t.r,y:t.t},{x:t.r,y:t.b},{x:t.l,y:t.b}]:null;
44
return this.tbbox;
45
},getLastPosition:function(){
46
this._confirmSegmented();
47
return "x" in this.last?this.last:null;
48
},_applyTransform:function(){
49
this.tbbox=null;
50
return dojox.gfx.Shape.prototype._applyTransform.call(this);
51
},_updateBBox:function(x,y,_6){
52
if(_6){
53
var t=dojox.gfx.matrix.multiplyPoint(_6,x,y);
54
x=t.x;
55
y=t.y;
56
}
57
if(this.bbox&&("l" in this.bbox)){
58
if(this.bbox.l>x){
59
this.bbox.l=x;
60
}
61
if(this.bbox.r<x){
62
this.bbox.r=x;
63
}
64
if(this.bbox.t>y){
65
this.bbox.t=y;
66
}
67
if(this.bbox.b<y){
68
this.bbox.b=y;
69
}
70
}else{
71
this.bbox={l:x,b:y,r:x,t:y};
72
}
73
},_updateWithSegment:function(_7,_8){
74
var n=_7.args,l=n.length;
75
switch(_7.action){
76
case "M":
77
case "L":
78
case "C":
79
case "S":
80
case "Q":
81
case "T":
82
for(var i=0;i<l;i+=2){
83
this._updateBBox(n[i],n[i+1],_8);
84
}
85
this.last.x=n[l-2];
86
this.last.y=n[l-1];
87
this.absolute=true;
88
break;
89
case "H":
90
for(var i=0;i<l;++i){
91
this._updateBBox(n[i],this.last.y,_8);
92
}
93
this.last.x=n[l-1];
94
this.absolute=true;
95
break;
96
case "V":
97
for(var i=0;i<l;++i){
98
this._updateBBox(this.last.x,n[i],_8);
99
}
100
this.last.y=n[l-1];
101
this.absolute=true;
102
break;
103
case "m":
104
var _9=0;
105
if(!("x" in this.last)){
106
this._updateBBox(this.last.x=n[0],this.last.y=n[1],_8);
107
_9=2;
108
}
109
for(var i=_9;i<l;i+=2){
110
this._updateBBox(this.last.x+=n[i],this.last.y+=n[i+1],_8);
111
}
112
this.absolute=false;
113
break;
114
case "l":
115
case "t":
116
for(var i=0;i<l;i+=2){
117
this._updateBBox(this.last.x+=n[i],this.last.y+=n[i+1],_8);
118
}
119
this.absolute=false;
120
break;
121
case "h":
122
for(var i=0;i<l;++i){
123
this._updateBBox(this.last.x+=n[i],this.last.y,_8);
124
}
125
this.absolute=false;
126
break;
127
case "v":
128
for(var i=0;i<l;++i){
129
this._updateBBox(this.last.x,this.last.y+=n[i],_8);
130
}
131
this.absolute=false;
132
break;
133
case "c":
134
for(var i=0;i<l;i+=6){
135
this._updateBBox(this.last.x+n[i],this.last.y+n[i+1],_8);
136
this._updateBBox(this.last.x+n[i+2],this.last.y+n[i+3],_8);
137
this._updateBBox(this.last.x+=n[i+4],this.last.y+=n[i+5],_8);
138
}
139
this.absolute=false;
140
break;
141
case "s":
142
case "q":
143
for(var i=0;i<l;i+=4){
144
this._updateBBox(this.last.x+n[i],this.last.y+n[i+1],_8);
145
this._updateBBox(this.last.x+=n[i+2],this.last.y+=n[i+3],_8);
146
}
147
this.absolute=false;
148
break;
149
case "A":
150
for(var i=0;i<l;i+=7){
151
this._updateBBox(n[i+5],n[i+6],_8);
152
}
153
this.last.x=n[l-2];
154
this.last.y=n[l-1];
155
this.absolute=true;
156
break;
157
case "a":
158
for(var i=0;i<l;i+=7){
159
this._updateBBox(this.last.x+=n[i+5],this.last.y+=n[i+6],_8);
160
}
161
this.absolute=false;
162
break;
163
}
164
var _a=[_7.action];
165
for(var i=0;i<l;++i){
166
_a.push(dojox.gfx.formatNumber(n[i],true));
167
}
168
if(typeof this.shape.path=="string"){
169
this.shape.path+=_a.join("");
170
}else{
171
Array.prototype.push.apply(this.shape.path,_a);
172
}
173
},_validSegments:{m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7,z:0},_pushSegment:function(_b,_c){
174
this.tbbox=null;
175
var _d=this._validSegments[_b.toLowerCase()];
176
if(typeof _d=="number"){
177
if(_d){
178
if(_c.length>=_d){
179
var _e={action:_b,args:_c.slice(0,_c.length-_c.length%_d)};
180
this.segments.push(_e);
181
this._updateWithSegment(_e);
182
}
183
}else{
184
var _e={action:_b,args:[]};
185
this.segments.push(_e);
186
this._updateWithSegment(_e);
187
}
188
}
189
},_collectArgs:function(_f,_10){
190
for(var i=0;i<_10.length;++i){
191
var t=_10[i];
192
if(typeof t=="boolean"){
193
_f.push(t?1:0);
194
}else{
195
if(typeof t=="number"){
196
_f.push(t);
197
}else{
198
if(t instanceof Array){
199
this._collectArgs(_f,t);
200
}else{
201
if("x" in t&&"y" in t){
202
_f.push(t.x,t.y);
203
}
204
}
205
}
206
}
207
}
208
},moveTo:function(){
209
this._confirmSegmented();
210
var _11=[];
211
this._collectArgs(_11,arguments);
212
this._pushSegment(this.absolute?"M":"m",_11);
213
return this;
214
},lineTo:function(){
215
this._confirmSegmented();
216
var _12=[];
217
this._collectArgs(_12,arguments);
218
this._pushSegment(this.absolute?"L":"l",_12);
219
return this;
220
},hLineTo:function(){
221
this._confirmSegmented();
222
var _13=[];
223
this._collectArgs(_13,arguments);
224
this._pushSegment(this.absolute?"H":"h",_13);
225
return this;
226
},vLineTo:function(){
227
this._confirmSegmented();
228
var _14=[];
229
this._collectArgs(_14,arguments);
230
this._pushSegment(this.absolute?"V":"v",_14);
231
return this;
232
},curveTo:function(){
233
this._confirmSegmented();
234
var _15=[];
235
this._collectArgs(_15,arguments);
236
this._pushSegment(this.absolute?"C":"c",_15);
237
return this;
238
},smoothCurveTo:function(){
239
this._confirmSegmented();
240
var _16=[];
241
this._collectArgs(_16,arguments);
242
this._pushSegment(this.absolute?"S":"s",_16);
243
return this;
244
},qCurveTo:function(){
245
this._confirmSegmented();
246
var _17=[];
247
this._collectArgs(_17,arguments);
248
this._pushSegment(this.absolute?"Q":"q",_17);
249
return this;
250
},qSmoothCurveTo:function(){
251
this._confirmSegmented();
252
var _18=[];
253
this._collectArgs(_18,arguments);
254
this._pushSegment(this.absolute?"T":"t",_18);
255
return this;
256
},arcTo:function(){
257
this._confirmSegmented();
258
var _19=[];
259
this._collectArgs(_19,arguments);
260
this._pushSegment(this.absolute?"A":"a",_19);
261
return this;
262
},closePath:function(){
263
this._confirmSegmented();
264
this._pushSegment("Z",[]);
265
return this;
266
},_confirmSegmented:function(){
267
if(!this.segmented){
268
var _1a=this.shape.path;
269
this.shape.path=[];
270
this._setPath(_1a);
271
this.shape.path=this.shape.path.join("");
272
this.segmented=true;
273
}
274
},_setPath:function(_1b){
275
var p=dojo.isArray(_1b)?_1b:_1b.match(dojox.gfx.pathSvgRegExp);
276
this.segments=[];
277
this.absolute=true;
278
this.bbox={};
279
this.last={};
280
if(!p){
281
return;
282
}
283
var _1c="",_1d=[],l=p.length;
284
for(var i=0;i<l;++i){
285
var t=p[i],x=parseFloat(t);
286
if(isNaN(x)){
287
if(_1c){
288
this._pushSegment(_1c,_1d);
289
}
290
_1d=[];
291
_1c=t;
292
}else{
293
_1d.push(x);
294
}
295
}
296
this._pushSegment(_1c,_1d);
297
},setShape:function(_1e){
298
dojox.gfx.Shape.prototype.setShape.call(this,typeof _1e=="string"?{path:_1e}:_1e);
299
this.segmented=false;
300
this.segments=[];
301
if(!dojox.gfx.lazyPathSegmentation){
302
this._confirmSegmented();
303
}
304
return this;
305
},_2PI:Math.PI*2});
306
dojo.declare("dojox.gfx.path.TextPath",dojox.gfx.path.Path,{constructor:function(_1f){
307
if(!("text" in this)){
308
this.text=dojo.clone(dojox.gfx.defaultTextPath);
309
}
310
if(!("fontStyle" in this)){
311
this.fontStyle=dojo.clone(dojox.gfx.defaultFont);
312
}
313
},getText:function(){
314
return this.text;
315
},setText:function(_20){
316
this.text=dojox.gfx.makeParameters(this.text,typeof _20=="string"?{text:_20}:_20);
317
this._setText();
318
return this;
319
},getFont:function(){
320
return this.fontStyle;
321
},setFont:function(_21){
322
this.fontStyle=typeof _21=="string"?dojox.gfx.splitFontString(_21):dojox.gfx.makeParameters(dojox.gfx.defaultFont,_21);
323
this._setFont();
324
return this;
325
}});
326
}