예제 #1
0
        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);
        }
예제 #2
0
        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;
                    }
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }