blob: 3111519171873284e864aa62ef9ac4c3635f78f8 [file] [log] [blame]
function IShapeElement(){
}
IShapeElement.prototype = {
addShapeToModifiers: function(data) {
var i, len = this.shapeModifiers.length;
for(i=0;i<len;i+=1){
this.shapeModifiers[i].addShape(data);
}
},
isShapeInAnimatedModifiers: function(data) {
var i = 0, len = this.shapeModifiers.length;
while(i < len) {
if(this.shapeModifiers[i].isAnimatedWithShape(data)) {
return true;
}
}
return false;
},
renderModifiers: function() {
if(!this.shapeModifiers.length){
return;
}
var i, len = this.shapes.length;
for(i=0;i<len;i+=1){
this.shapes[i].sh.reset();
}
len = this.shapeModifiers.length;
for(i=len-1;i>=0;i-=1){
this.shapeModifiers[i].processShapes(this._isFirstFrame);
}
},
lcEnum: {
'1': 'butt',
'2': 'round',
'3': 'square'
},
ljEnum: {
'1': 'miter',
'2': 'round',
'3': 'bevel'
},
searchProcessedElement: function(elem){
var elements = this.processedElements;
var i = 0, len = elements.length;
while(i < len){
if(elements[i].elem === elem){
return elements[i].pos;
}
i += 1;
}
return 0;
},
addProcessedElement: function(elem, pos){
var elements = this.processedElements;
var i = elements.length;
while(i){
i -= 1;
if(elements[i].elem === elem){
elements[i].pos = pos;
return;
}
}
elements.push(new ProcessedElement(elem, pos));
},
prepareFrame: function(num) {
this.prepareRenderableFrame(num);
this.prepareProperties(num, this.isInRange);
},
calculateBoundingBox: function(itemsData, boundingBox) {
var i, len = itemsData.length, path;
for(i = 0; i < len; i += 1) {
if(itemsData[i] && itemsData[i].sh) {
this.calculateShapeBoundingBox(itemsData[i], boundingBox)
} else if(itemsData[i] && itemsData[i].it) {
this.calculateBoundingBox(itemsData[i].it, boundingBox)
}
}
},
calculateShapeBoundingBox: function(item, boundingBox) {
var shape = item.sh.v;
var transformers = item.transformers;
var i, len = shape._length, vPoint, oPoint, nextIPoint, nextVPoint, bounds;
if (len <= 1) {
return;
}
for (i = 0; i < len - 1; i += 1) {
vPoint = this.getTransformedPoint(transformers, shape.v[i]);
oPoint = this.getTransformedPoint(transformers, shape.o[i]);
nextIPoint = this.getTransformedPoint(transformers, shape.i[i + 1]);
nextVPoint = this.getTransformedPoint(transformers, shape.v[i + 1]);
this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);
}
if(shape.c) {
vPoint = this.getTransformedPoint(transformers, shape.v[i]);
oPoint = this.getTransformedPoint(transformers, shape.o[i]);
nextIPoint = this.getTransformedPoint(transformers, shape.i[0]);
nextVPoint = this.getTransformedPoint(transformers, shape.v[0]);
this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);
}
},
checkBounds: function(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox) {
this.getBoundsOfCurve(vPoint, oPoint, nextIPoint, nextVPoint);
var bounds = this.shapeBoundingBox;
boundingBox.x = bm_min(bounds.left, boundingBox.x);
boundingBox.xMax = bm_max(bounds.right, boundingBox.xMax);
boundingBox.y = bm_min(bounds.top, boundingBox.y);
boundingBox.yMax = bm_max(bounds.bottom, boundingBox.yMax);
},
getTransformedPoint: function(transformers, point) {
var i, len = transformers.length;
for(i = 0; i < len; i += 1) {
point = transformers[i].mProps.v.applyToPointArray(point[0], point[1], 0);
}
return point;
},
getBoundsOfCurve: function(p0, p1, p2, p3) {
var bounds = [[p0[0],p3[0]], [p0[1],p3[1]]];
for (var a, b, c, t, b2ac, t1, t2, i = 0; i < 2; ++i) {
b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
c = 3 * p1[i] - 3 * p0[i];
b = b | 0;
a = a | 0;
c = c | 0;
if (a === 0) {
if (b === 0) {
continue;
}
t = -c / b;
if (0 < t && t < 1) {
bounds[i].push(this.calculateF(t,p0,p1,p2,p3,i));
}
continue;
}
b2ac = b * b - 4 * c * a;
if (b2ac < 0) {
continue;
}
t1 = (-b + bm_sqrt(b2ac))/(2 * a);
if (0 < t1 && t1 < 1) bounds[i].push(this.calculateF(t1,p0,p1,p2,p3,i));
t2 = (-b - bm_sqrt(b2ac))/(2 * a);
if (0 < t2 && t2 < 1) bounds[i].push(this.calculateF(t2,p0,p1,p2,p3,i));
}
this.shapeBoundingBox.left = bm_min.apply(null, bounds[0]);
this.shapeBoundingBox.top = bm_min.apply(null, bounds[1]);
this.shapeBoundingBox.right = bm_max.apply(null, bounds[0]);
this.shapeBoundingBox.bottom = bm_max.apply(null, bounds[1]);
},
calculateF: function(t, p0, p1, p2, p3, i) {
return bm_pow(1-t, 3) * p0[i]
+ 3 * bm_pow(1-t, 2) * t * p1[i]
+ 3 * (1-t) * bm_pow(t, 2) * p2[i]
+ bm_pow(t, 3) * p3[i];
},
shapeBoundingBox: {
left:0,
right:0,
top:0,
bottom:0,
},
tempBoundingBox: {
x:0,
xMax:0,
y:0,
yMax:0,
width:0,
height:0
}
};