public static FragmentDrawable Create(SvgFragment svgFragment, SKRect skViewport, DrawableBase?parent, IAssetLoader assetLoader, HashSet <Uri>?references, DrawAttributes ignoreAttributes = DrawAttributes.None) { var drawable = new FragmentDrawable(assetLoader, references) { Element = svgFragment, Parent = parent, IgnoreAttributes = ignoreAttributes }; drawable.IsDrawable = drawable.HasFeatures(svgFragment, drawable.IgnoreAttributes); if (!drawable.IsDrawable) { return(drawable); } var svgFragmentParent = svgFragment.Parent; var x = svgFragmentParent is null ? 0f : svgFragment.X.ToDeviceValue(UnitRenderingType.Horizontal, svgFragment, skViewport); var y = svgFragmentParent is null ? 0f : svgFragment.Y.ToDeviceValue(UnitRenderingType.Vertical, svgFragment, skViewport); var skSize = SvgExtensions.GetDimensions(svgFragment); if (skViewport.IsEmpty) { skViewport = SKRect.Create(x, y, skSize.Width, skSize.Height); } drawable.CreateChildren(svgFragment, skViewport, drawable, assetLoader, references, ignoreAttributes); drawable.Initialize(skViewport, x, y, skSize); return(drawable); }
public static FragmentDrawable Create(SvgFragment svgFragment, Rect skOwnerBounds, DrawableBase?parent, IAssetLoader assetLoader, Attributes ignoreAttributes = Attributes.None) { var drawable = new FragmentDrawable(assetLoader) { Element = svgFragment, Parent = parent, IgnoreAttributes = ignoreAttributes }; drawable.IsDrawable = drawable.HasFeatures(svgFragment, drawable.IgnoreAttributes); if (!drawable.IsDrawable) { return(drawable); } var svgFragmentParent = svgFragment.Parent; var x = svgFragmentParent is null ? 0f : svgFragment.X.ToDeviceValue(UnitRenderingType.Horizontal, svgFragment, skOwnerBounds); var y = svgFragmentParent is null ? 0f : svgFragment.Y.ToDeviceValue(UnitRenderingType.Vertical, svgFragment, skOwnerBounds); var skSize = SvgModelExtensions.GetDimensions(svgFragment); if (skOwnerBounds.IsEmpty) { skOwnerBounds = Rect.Create(x, y, skSize.Width, skSize.Height); } drawable.CreateChildren(svgFragment, skOwnerBounds, drawable, assetLoader, ignoreAttributes); drawable.IsAntialias = SvgModelExtensions.IsAntialias(svgFragment); drawable.TransformedBounds = skOwnerBounds; drawable.CreateTransformedBounds(); drawable.Transform = SvgModelExtensions.ToMatrix(svgFragment.Transforms); var skMatrixViewBox = SvgModelExtensions.ToMatrix(svgFragment.ViewBox, svgFragment.AspectRatio, x, y, skSize.Width, skSize.Height); drawable.Transform = drawable.Transform.PreConcat(skMatrixViewBox); switch (svgFragment.Overflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: if (skSize.IsEmpty) { drawable.Overflow = Rect.Create( x, y, Math.Abs(drawable.TransformedBounds.Left) + drawable.TransformedBounds.Width, Math.Abs(drawable.TransformedBounds.Top) + drawable.TransformedBounds.Height); } else { drawable.Overflow = Rect.Create(x, y, skSize.Width, skSize.Height); } break; } var clipPathUris = new HashSet <Uri>(); var svgClipPath = svgFragment.GetUriElementReference <SvgClipPath>("clip-path", clipPathUris); if (svgClipPath?.Children is { })