public static SymbolDrawable Create(SvgSymbol svgSymbol, float x, float y, float width, float height, SKRect skViewport, DrawableBase?parent, IAssetLoader assetLoader, HashSet <Uri>?references, DrawAttributes ignoreAttributes) { var drawable = new SymbolDrawable(assetLoader, references) { Element = svgSymbol, Parent = parent, IgnoreAttributes = ignoreAttributes }; drawable.IsDrawable = drawable.CanDraw(svgSymbol, drawable.IgnoreAttributes) && drawable.HasFeatures(svgSymbol, drawable.IgnoreAttributes); if (!drawable.IsDrawable) { return(drawable); } if (svgSymbol.CustomAttributes.TryGetValue("width", out var _widthString)) { if (new SvgUnitConverter().ConvertFromString(_widthString) is SvgUnit _width) { width = _width.ToDeviceValue(UnitRenderingType.Horizontal, svgSymbol, skViewport); } } if (svgSymbol.CustomAttributes.TryGetValue("height", out var heightString)) { if (new SvgUnitConverter().ConvertFromString(heightString) is SvgUnit _height) { height = _height.ToDeviceValue(UnitRenderingType.Vertical, svgSymbol, skViewport); } } var svgOverflow = SvgOverflow.Hidden; if (svgSymbol.TryGetAttribute("overflow", out string overflowString)) { if (new SvgOverflowConverter().ConvertFromString(overflowString) is SvgOverflow _svgOverflow) { svgOverflow = _svgOverflow; } } switch (svgOverflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: drawable.Overflow = SKRect.Create(x, y, width, height); break; } drawable.CreateChildren(svgSymbol, skViewport, drawable, assetLoader, references, ignoreAttributes); drawable.Initialize(x, y, width, height); return(drawable); }
public SymbolDrawable(SvgSymbol svgSymbol, float x, float y, float width, float height, SKRect skOwnerBounds, Drawable?root, Drawable?parent, Attributes ignoreAttributes) : base(svgSymbol, root, parent) { IgnoreAttributes = ignoreAttributes; IsDrawable = CanDraw(svgSymbol, IgnoreAttributes) && HasFeatures(svgSymbol, IgnoreAttributes); if (!IsDrawable) { return; } if (svgSymbol.CustomAttributes.TryGetValue("width", out string?_widthString)) { if (new SvgUnitConverter().ConvertFromString(_widthString) is SvgUnit _width) { width = _width.ToDeviceValue(UnitRenderingType.Horizontal, svgSymbol, skOwnerBounds); } } if (svgSymbol.CustomAttributes.TryGetValue("height", out string?heightString)) { if (new SvgUnitConverter().ConvertFromString(heightString) is SvgUnit _height) { height = _height.ToDeviceValue(UnitRenderingType.Vertical, svgSymbol, skOwnerBounds); } } SvgOverflow svgOverflow = SvgOverflow.Hidden; if (svgSymbol.TryGetAttribute("overflow", out string overflowString)) { if (new SvgOverflowConverter().ConvertFromString(overflowString) is SvgOverflow _svgOverflow) { svgOverflow = _svgOverflow; } } switch (svgOverflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: Overflow = SKRect.Create(x, y, width, height); break; } CreateChildren(svgSymbol, skOwnerBounds, root, this, ignoreAttributes); IsAntialias = SvgPaintingExtensions.IsAntialias(svgSymbol); TransformedBounds = SKRect.Empty; CreateTransformedBounds(); Transform = SvgTransformsExtensions.ToSKMatrix(svgSymbol.Transforms); var skMatrixViewBox = SvgTransformsExtensions.ToSKMatrix(svgSymbol.ViewBox, svgSymbol.AspectRatio, x, y, width, height); Transform = Transform.PreConcat(skMatrixViewBox); Fill = null; Stroke = null; // TODO: Transform _skBounds using _skMatrix. TransformedBounds = Transform.MapRect(TransformedBounds); }
public static SymbolDrawable Create(SvgSymbol svgSymbol, float x, float y, float width, float height, Rect skOwnerBounds, DrawableBase?parent, IAssetLoader assetLoader, Attributes ignoreAttributes) { var drawable = new SymbolDrawable(assetLoader) { Element = svgSymbol, Parent = parent, IgnoreAttributes = ignoreAttributes }; drawable.IsDrawable = drawable.CanDraw(svgSymbol, drawable.IgnoreAttributes) && drawable.HasFeatures(svgSymbol, drawable.IgnoreAttributes); if (!drawable.IsDrawable) { return(drawable); } if (svgSymbol.CustomAttributes.TryGetValue("width", out var _widthString)) { if (new SvgUnitConverter().ConvertFromString(_widthString) is SvgUnit _width) { width = _width.ToDeviceValue(UnitRenderingType.Horizontal, svgSymbol, skOwnerBounds); } } if (svgSymbol.CustomAttributes.TryGetValue("height", out var heightString)) { if (new SvgUnitConverter().ConvertFromString(heightString) is SvgUnit _height) { height = _height.ToDeviceValue(UnitRenderingType.Vertical, svgSymbol, skOwnerBounds); } } var svgOverflow = SvgOverflow.Hidden; if (svgSymbol.TryGetAttribute("overflow", out string overflowString)) { if (new SvgOverflowConverter().ConvertFromString(overflowString) is SvgOverflow _svgOverflow) { svgOverflow = _svgOverflow; } } switch (svgOverflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: drawable.Overflow = Rect.Create(x, y, width, height); break; } drawable.CreateChildren(svgSymbol, skOwnerBounds, drawable, assetLoader, ignoreAttributes); drawable.IsAntialias = SvgModelExtensions.IsAntialias(svgSymbol); drawable.TransformedBounds = Rect.Empty; drawable.CreateTransformedBounds(); drawable.Transform = SvgModelExtensions.ToMatrix(svgSymbol.Transforms); var skMatrixViewBox = SvgModelExtensions.ToMatrix(svgSymbol.ViewBox, svgSymbol.AspectRatio, x, y, width, height); drawable.Transform = drawable.Transform.PreConcat(skMatrixViewBox); drawable.Fill = null; drawable.Stroke = null; // TODO: Transform _skBounds using _skMatrix. drawable.TransformedBounds = drawable.Transform.MapRect(drawable.TransformedBounds); return(drawable); }