| function RoundCornersModifier() {} |
| extendPrototype([ShapeModifier], RoundCornersModifier); |
| RoundCornersModifier.prototype.initModifierProperties = function (elem, data) { |
| this.getValue = this.processKeys; |
| this.rd = PropertyFactory.getProp(elem, data.r, 0, null, this); |
| this._isAnimated = !!this.rd.effectsSequence.length; |
| }; |
| |
| RoundCornersModifier.prototype.processPath = function (path, round) { |
| var cloned_path = shape_pool.newElement(); |
| cloned_path.c = path.c; |
| var i, len = path._length; |
| var currentV, currentI, currentO, closerV, newV, newO, newI, distance, newPosPerc, index = 0; |
| var vX, vY, oX, oY, iX, iY; |
| for(i=0;i<len;i+=1) { |
| currentV = path.v[i]; |
| currentO = path.o[i]; |
| currentI = path.i[i]; |
| if(currentV[0]===currentO[0] && currentV[1]===currentO[1] && currentV[0]===currentI[0] && currentV[1]===currentI[1]) { |
| if((i===0 || i === len - 1) && !path.c) { |
| cloned_path.setTripleAt(currentV[0], currentV[1], currentO[0], currentO[1], currentI[0], currentI[1], index); |
| /* cloned_path.v[index] = currentV; |
| cloned_path.o[index] = currentO; |
| cloned_path.i[index] = currentI; */ |
| index += 1; |
| } else { |
| if(i===0) { |
| closerV = path.v[len-1]; |
| } else { |
| closerV = path.v[i-1]; |
| } |
| distance = Math.sqrt(Math.pow(currentV[0]-closerV[0], 2)+Math.pow(currentV[1]-closerV[1], 2)); |
| newPosPerc = distance ? Math.min(distance/2, round)/distance : 0; |
| vX = iX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc; |
| vY = iY = currentV[1]-(currentV[1]-closerV[1])*newPosPerc; |
| oX = vX-(vX-currentV[0])*roundCorner; |
| oY = vY-(vY-currentV[1])*roundCorner; |
| cloned_path.setTripleAt(vX, vY, oX, oY, iX, iY, index); |
| index += 1; |
| |
| if(i === len - 1) { |
| closerV = path.v[0]; |
| } else { |
| closerV = path.v[i+1]; |
| } |
| distance = Math.sqrt(Math.pow(currentV[0]-closerV[0], 2)+Math.pow(currentV[1]-closerV[1], 2)); |
| newPosPerc = distance ? Math.min(distance/2, round)/distance : 0; |
| vX = oX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc; |
| vY = oY = currentV[1]+(closerV[1]-currentV[1])*newPosPerc; |
| iX = vX-(vX-currentV[0])*roundCorner; |
| iY = vY-(vY-currentV[1])*roundCorner; |
| cloned_path.setTripleAt(vX, vY, oX, oY, iX, iY, index); |
| index += 1; |
| } |
| } else { |
| cloned_path.setTripleAt(path.v[i][0], path.v[i][1], path.o[i][0], path.o[i][1], path.i[i][0], path.i[i][1], index); |
| index += 1; |
| } |
| } |
| return cloned_path; |
| }; |
| |
| RoundCornersModifier.prototype.processShapes = function (_isFirstFrame) { |
| var shapePaths; |
| var i, len = this.shapes.length; |
| var j, jLen; |
| var rd = this.rd.v; |
| |
| if(rd !== 0) { |
| var shapeData, newPaths, localShapeCollection; |
| for(i=0;i<len;i+=1) { |
| shapeData = this.shapes[i]; |
| newPaths = shapeData.shape.paths; |
| localShapeCollection = shapeData.localShapeCollection; |
| if(!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) { |
| localShapeCollection.releaseShapes(); |
| shapeData.shape._mdf = true; |
| shapePaths = shapeData.shape.paths.shapes; |
| jLen = shapeData.shape.paths._length; |
| for(j=0;j<jLen;j+=1) { |
| localShapeCollection.addShape(this.processPath(shapePaths[j], rd)); |
| } |
| } |
| shapeData.shape.paths = shapeData.localShapeCollection; |
| } |
| |
| } |
| if(!this.dynamicProperties.length) { |
| this._mdf = false; |
| } |
| }; |
| |
| ShapeModifiers.registerModifier('rd', RoundCornersModifier); |