public VgVisualDoc CreateVgVisualDoc(VgDocument svgdoc, VgVisualDocHost docHost) { // //reset some value _containerWidth = 500; _containerHeight = 500; _emHeight = 17; _waitingList.Clear(); // _svgdoc = svgdoc; _activeSheet1 = svgdoc.CssActiveSheet; _vgVisualDoc = new VgVisualDoc(docHost); _defsList = _vgVisualDoc._defsList; _styleList = _vgVisualDoc._styleList; _registeredElemsById = _vgVisualDoc._registeredElemsById; //--------------------------- //create visual tree for svg nodes SvgElement rootElem = svgdoc.Root; VgVisualElement vgVisualRootElem = new VgVisualElement(WellknownSvgElementName.RootSvg, null, _vgVisualDoc); _vgVisualDoc.VgRootElem = vgVisualRootElem;//** int childCount = rootElem.ChildCount; for (int i = 0; i < childCount; ++i) { CreateSvgVisualElement(vgVisualRootElem, rootElem.GetChild(i)); } //resolve int j = _waitingList.Count; BuildDefinitionNodes(); for (int i = 0; i < j; ++i) { //resolve VgUseVisualElement useNodeVisElem = (VgUseVisualElement)_waitingList[i]; if (useNodeVisElem.HRefSvgRenderElement == null) { //resolve SvgUseSpec useSpec = (SvgUseSpec)useNodeVisElem._visualSpec; if (_registeredElemsById.TryGetValue(useSpec.Href.Value, out VgVisualElement result)) { useNodeVisElem.HRefSvgRenderElement = result; } else { } } } return(_vgVisualDoc); }
void BuildDefinitionNodes() { int j = _defsList.Count; if (_lastestBuiltDefIndex >= j) { return; } VgVisualElement definitionRoot = new VgVisualElement(WellknownSvgElementName.Defs, null, _vgVisualDoc); for (int i = _lastestBuiltDefIndex; i < j; ++i) { SvgElement defsElem = _defsList[i]; _lastestBuiltDefIndex++; //get definition content int childCount = defsElem.ChildCount; for (int c = 0; c < childCount; ++c) { SvgElement child = defsElem.GetChild(c); switch (child.WellknowElemName) { default: { switch (child.ElemName) { case "filter": break; default: break; } } break; case WellknownSvgElementName.Filter: case WellknownSvgElementName.Ellipse: case WellknownSvgElementName.Rect: case WellknownSvgElementName.Polygon: case WellknownSvgElementName.Circle: case WellknownSvgElementName.Polyline: case WellknownSvgElementName.Path: case WellknownSvgElementName.Text: case WellknownSvgElementName.ClipPath: case WellknownSvgElementName.Marker: CreateSvgVisualElement(definitionRoot, child); break; } } } }
VgVisualElement CreateRadialGradient(VgVisualElement parentNode, SvgElement elem, SvgRadialGradientSpec spec) { //<radialGradient id="a" cx="59.6" cy="54.845" r="55.464" fx="27.165" fy="53.715" gradientUnits="userSpaceOnUse"> // <stop stop-color="#FFEB3B" offset="0" /> // <stop stop-color="#FBC02D" offset="1" /> //</radialGradient> //create linear gradient texure (or brush) VgVisualElement radialGrd = new VgVisualElement(WellknownSvgElementName.RadialGradient, spec, _vgVisualDoc); //read attribute RegisterElementById(elem, radialGrd); int childCount = elem.ChildCount; for (int i = 0; i < childCount; ++i) { SvgElement child = elem.GetChild(i); if (child.WellknowElemName == WellknownSvgElementName.Stop) { //color stop //TODO: implement this.... SvgColorStopSpec stopSpec = child.ElemSpec as SvgColorStopSpec; if (stopSpec != null) { if (spec.StopList == null) { //TODO spec.StopList = new List <SvgColorStopSpec>(); } spec.StopList.Add(stopSpec); } } else { } } return(radialGrd); }
VgVisualElement CreateLinearGradient(VgVisualElement parentNode, SvgElement elem, SvgLinearGradientSpec spec) { //https://developer.mozilla.org/en-US/docs/Web/SVG/Element/linearGradient //Categories Gradient element //Permitted content Any number of the following elements, in any order: //Descriptive elements //<animate>, <animateTransform>, <set>, <stop> //Attributes //Section //Global attributes //Section // Core attributes // Presentation attributes // Xlink attributes // class // style // externalResourcesRequired //Specific attributes //Section // gradientUnits // gradientTransform // x1 // y1 // x2 // y2 // spreadMethod // xlink:href VgVisualElement linearGrd = new VgVisualElement(WellknownSvgElementName.LinearGradient, spec, _vgVisualDoc); //read attribute RegisterElementById(elem, linearGrd); int childCount = elem.ChildCount; for (int i = 0; i < childCount; ++i) { SvgElement child = elem.GetChild(i); if (child.ElemName == "stop") { //color stop //TODO: implement this.... SvgColorStopSpec stopSpec = child.ElemSpec as SvgColorStopSpec; if (stopSpec != null) { if (spec.StopList == null) { //TODO spec.StopList = new List <SvgColorStopSpec>(); } spec.StopList.Add(stopSpec); } } else { } } return(linearGrd); }
VgVisualElement CreateSvgVisualElement(VgVisualElement parentNode, SvgElement elem) { VgVisualElement vgVisElem = null; bool skipChildrenNode = false; switch (elem.WellknowElemName) { default: throw new NotSupportedException(); //----------------- case WellknownSvgElementName.Unknown: return(null); case WellknownSvgElementName.FeColorMatrix: vgVisElem = CreateFeColorMatrix(parentNode, elem, (SvgFeColorMatrixSpec)elem.ElemSpec); //no more child parentNode.AddChildElement(vgVisElem); return(vgVisElem); case WellknownSvgElementName.Filter: vgVisElem = CreateFilterElem(parentNode, elem, (SvgFilterSpec)elem.ElemSpec); break; case WellknownSvgElementName.RadialGradient: //TODO: add radial grapdient support //this version not support linear gradient return(CreateRadialGradient(parentNode, elem, (SvgRadialGradientSpec)elem.ElemSpec)); case WellknownSvgElementName.LinearGradient: //TODO: add linear grapdient support //this version not support linear gradient return(CreateLinearGradient(parentNode, elem, (SvgLinearGradientSpec)elem.ElemSpec)); case WellknownSvgElementName.Defs: _defsList.Add(elem); return(null); case WellknownSvgElementName.Style: _styleList.Add(elem); return(null); case WellknownSvgElementName.Marker: vgVisElem = CreateMarker(parentNode, (SvgMarkerSpec)elem.ElemSpec); break; case WellknownSvgElementName.Mask: vgVisElem = CreateMask(parentNode, (SvgMaskSpec)elem.ElemSpec); break; case WellknownSvgElementName.Svg: vgVisElem = new VgVisualElement(WellknownSvgElementName.Svg, (SvgVisualSpec)elem.ElemSpec, _vgVisualDoc); break; case WellknownSvgElementName.Rect: vgVisElem = CreateRect(parentNode, (SvgRectSpec)elem.ElemSpec); break; case WellknownSvgElementName.Image: vgVisElem = CreateImage(parentNode, (SvgImageSpec)elem.ElemSpec); break; case WellknownSvgElementName.Polyline: vgVisElem = CreatePolyline(parentNode, (SvgPolylineSpec)elem.ElemSpec); break; case WellknownSvgElementName.Polygon: vgVisElem = CreatePolygon(parentNode, (SvgPolygonSpec)elem.ElemSpec); break; case WellknownSvgElementName.Ellipse: vgVisElem = CreateEllipse(parentNode, (SvgEllipseSpec)elem.ElemSpec); break; case WellknownSvgElementName.Circle: vgVisElem = CreateCircle(parentNode, (SvgCircleSpec)elem.ElemSpec); break; case WellknownSvgElementName.Line: vgVisElem = CreateLine(parentNode, (SvgLineSpec)elem.ElemSpec); break; case WellknownSvgElementName.ClipPath: vgVisElem = CreateClipPath(parentNode, (SvgVisualSpec)elem.ElemSpec); break; case WellknownSvgElementName.Group: vgVisElem = CreateGroup(parentNode, (SvgVisualSpec)elem.ElemSpec); break; //--------------------------------------------- case WellknownSvgElementName.Path: vgVisElem = CreatePath(parentNode, (SvgPathSpec)elem.ElemSpec, elem); skipChildrenNode = true; //*** break; case WellknownSvgElementName.Text: vgVisElem = CreateTextElem(parentNode, elem, (SvgTextSpec)elem.ElemSpec); skipChildrenNode = true; //*** break; case WellknownSvgElementName.Use: vgVisElem = CreateUseElement(parentNode, (SvgUseSpec)elem.ElemSpec); skipChildrenNode = true; break; } if (vgVisElem == null) { //TODO: review here return(null); } //----------------------------------- vgVisElem.DomElem = elem; if (elem.ElemId != null) { //replace duplicated item ??? _registeredElemsById[elem.ElemId] = vgVisElem; } vgVisElem.SetController(elem); #if DEBUG if (skipChildrenNode && !vgVisElem.dbugHasParent) { } #endif //----------------------------------- if (!skipChildrenNode) { parentNode.AddChildElement(vgVisElem); int childCount = elem.ChildCount; for (int i = 0; i < childCount; ++i) { CreateSvgVisualElement(vgVisElem, elem.GetChild(i)); } } return(vgVisElem); }