package com.lorentz.SVG.display { import flash.display.BitmapData; import flash.display.Sprite; import flash.display.CapsStyle; import flash.display.DisplayObject; import flash.display.GradientType; import flash.display.JointStyle; import flash.display.Sprite; import flash.display.Graphics; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; import flash.text.AntiAliasType; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.events.Event; import flash.utils.Dictionary; import com.lorentz.SVG.SVGUtil; import com.lorentz.SVG.SVGColor; import com.lorentz.SVG.StringUtil; public class SVGElement extends Sprite implements IDocumentSetable { public var type:String; public var id:String; public var svgClass:String; protected var _svgClipPathChanged:Boolean = false; protected var _svgClipPath:String; public function get svgClipPath():String { return _svgClipPath; } public function set svgClipPath(value:String):void { _svgClipPath = value; _svgClipPathChanged = true; invalidate(); } protected var _style:Object = {}; protected var _finalStyle:Object; //After inherit parent styles public function getStyle(name:String):Object { return _style[name]; } public function getFinalStyle(name:String):Object { return _finalStyle(name); } public function setStyle(name:String, value:String):void { _style[name] = value; invalidate(true); } public function clearStyle(name:String):void { delete _style[name]; invalidate(true); } public function getStyles():Object { return SVGUtil.cloneObject(_style); } public function getFinalStyles():Object { return SVGUtil.cloneObject(_finalStyle); } public function setStyles(objectStyles:Object):void { for(var p:String in objectStyles) _style[p] = objectStyles[p]; invalidate(true); } public function clearStyles():void { _style = {}; invalidate(true); } protected var _content:Sprite; protected var _mask:Sprite; private var _currentViewBox:Rectangle; private var _currentFontSize:Number = Number.NaN; protected var _validateFunctions:Array = []; public function SVGElement(){ initialize(); } public function clone(deep:Boolean = true):SVGElement { var clazz:Class = flash.utils.getDefinitionByName(flash.utils.getQualifiedClassName(this)) as Class; var c:SVGElement = new clazz(); if(deep){ for(var i:int = 0; i0) { for(var j:int = 0; j-1){ var id:String = StringUtil.rtrim(String(_finalStyle.stroke).split("(")[1], ")"); id = StringUtil.ltrim(id, "#"); var grad:Object = document.gradients[id]; var def:Object = document.defs[id]; if(grad!=null){ switch(grad.type){ case GradientType.LINEAR: { calculateLinearGradient(grad); g.lineGradientStyle(grad.type, grad.colors, grad.alphas, grad.ratios, grad.mat, grad.spreadMethod, "rgb"); break; } case GradientType.RADIAL: { calculateRadialGradient(grad); if(grad.r==0) g.lineStyle(w, grad.colors[grad.colors.length-1], grad.alphas[grad.alphas.length-1], true, "none", stroke_linecap, stroke_linejoin); else g.lineGradientStyle(grad.type, grad.colors, grad.alphas, grad.ratios, grad.mat, grad.spreadMethod, "rgb", grad.focalRatio); break; } } } else if(def is SVGPattern){ var bitmap:BitmapData = def.getBitmap(); g.lineBitmapStyle(bitmap); } return; } else if(noStroke) g.lineStyle(); else g.lineStyle(w, color, stroke_opacity, true, "normal", stroke_linecap, stroke_linejoin); } protected function beginFill(g:Graphics=null):void { if(g==null) g = _content.graphics; var fill_str:String = _finalStyle.fill; if(fill_str == "" || fill_str=="none"){ return; } else { var fill_opacity:Number = Number(_finalStyle["opacity"]?_finalStyle["opacity"]: (_finalStyle["fill-opacity"]? _finalStyle["fill-opacity"] : 1)); if(fill_str==null){ g.beginFill(0x000000, fill_opacity); //Initial value to fill is black } else if(fill_str.indexOf("url")>-1){ var id:String = StringUtil.rtrim(fill_str.split("(")[1], ")"); id = StringUtil.ltrim(id, "#"); var grad:Object = document.gradients[id]; var def:Object = document.defs[id]; if(grad!=null){ switch(grad.type){ case GradientType.LINEAR: { calculateLinearGradient(grad); g.beginGradientFill(grad.type, grad.colors, grad.alphas, grad.ratios, grad.mat, grad.spreadMethod, "rgb"); return; } case GradientType.RADIAL: { calculateRadialGradient(grad); if(grad.r==0) g.beginFill(grad.colors[grad.colors.length-1], grad.alphas[grad.alphas.length-1]); else g.beginGradientFill(grad.type, grad.colors, grad.alphas, grad.ratios, grad.mat, grad.spreadMethod, "rgb", grad.focalRatio); return; } } } else if(def is SVGPattern){ var bitmap:BitmapData = def.getBitmap(); g.beginBitmapFill(bitmap); } } else { var color:uint = SVGColor.parseToInt(fill_str); g.beginFill(color, fill_opacity); } } } private function calculateLinearGradient(grad:Object):void { var x1:Number = getUserUnit(grad.x1, SVGUtil.WIDTH); var y1:Number = getUserUnit(grad.y1, SVGUtil.HEIGHT); var x2:Number = getUserUnit(grad.x2, SVGUtil.WIDTH); var y2:Number = getUserUnit(grad.y2, SVGUtil.HEIGHT); grad.mat = SVGUtil.flashLinearGradientMatrix(x1, y1, x2, y2); if(grad.transform) grad.mat.concat(grad.transform); } private function calculateRadialGradient(grad:Object):void { var cx:Number = getUserUnit(grad.cx, SVGUtil.WIDTH); var cy:Number = getUserUnit(grad.cy, SVGUtil.HEIGHT); var r:Number = getUserUnit(grad.r, SVGUtil.WIDTH); var fx:Number = getUserUnit(grad.fx, SVGUtil.WIDTH); var fy:Number = getUserUnit(grad.fy, SVGUtil.HEIGHT); grad.mat = SVGUtil.flashRadialGradientMatrix(cx, cy, r, fx, fy); if(grad.transform) grad.mat.concat(grad.transform); var f:* = { x:fx-cx, y:fy-cy }; grad.focalRatio = Math.sqrt( (f.x*f.x)+(f.y*f.y) )/r; } protected function styleToTextFormat(style:Object):TextFormat { var sFontSize:String = style["font-size"]; var sFont:String = style["font-family"]; var tFormat:TextFormat = new TextFormat(); tFormat.font = sFont == null? "Arial" : sFont; //tFormat.font = "Arial"; tFormat.bold = style["font-weight"] != undefined ? true : false; tFormat.size = getFontSize(sFontSize==null ? "medium" : sFontSize); tFormat.color = SVGColor.parseToInt(style["fill"]) return tFormat; } protected function getFontSize(s:String):Number{ return SVGUtil.getFontSize(s, _currentFontSize, _currentViewBox); } protected function getUserUnit(s:String, viewBoxReference:String):Number { return SVGUtil.getUserUnit(s, _currentFontSize, _currentViewBox, viewBoxReference); } protected final function get $numChildren():int { return super.numChildren; } protected final function $addChild(child:DisplayObject):DisplayObject { return super.addChild(child); } protected final function $addChildAt(child:DisplayObject, index:int):DisplayObject { return super.addChildAt(child, index); } protected final function $removeChild(child:DisplayObject):DisplayObject { return super.removeChild(child); } protected final function $removeChildAt(index:int):DisplayObject { return super.removeChildAt(index); } protected final function $getChildAt(index:int):DisplayObject { return super.getChildAt(index); } protected final function $getChildByName(name:String):DisplayObject { return super.getChildByName(name); } protected final function $getChildIndex(child:DisplayObject):int { return super.getChildIndex(child); } protected final function $setChildIndex(child:DisplayObject, newIndex:int):void { super.setChildIndex(child, newIndex); } protected final function $contains(child:DisplayObject):Boolean { return super.contains(child); } protected final function $swapChildren(child1:DisplayObject, child2:DisplayObject):void { super.swapChildren(child1, child2); } protected final function $swapChildrenAt(index1:int, index2:int):void { super.swapChildrenAt(index1, index2); } override public function get numChildren():int { return _content.numChildren; } override public function addChild(child:DisplayObject):DisplayObject { return _content.addChild(child); } override public function addChildAt(child:DisplayObject, index:int):DisplayObject { return _content.addChildAt(child, index); } override public function removeChild(child:DisplayObject):DisplayObject { return _content.removeChild(child); } override public function removeChildAt(index:int):DisplayObject { return _content.removeChildAt(index); } override public function getChildAt(index:int):DisplayObject { return _content.getChildAt(index); } override public function getChildByName(name:String):DisplayObject { return _content.getChildByName(name); } override public function getChildIndex(child:DisplayObject):int { return _content.getChildIndex(child); } override public function setChildIndex(child:DisplayObject, newIndex:int):void { _content.setChildIndex(child, newIndex); } override public function contains(child:DisplayObject):Boolean { return _content.contains(child); } override public function swapChildren(child1:DisplayObject, child2:DisplayObject):void { _content.swapChildren(child1, child2); } override public function swapChildrenAt(index1:int, index2:int):void { _content.swapChildrenAt(index1, index2); } } }