| 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 |
| } |
| }; |