public static MaskDrawable Create(SvgMask svgMask, SKRect skViewport, DrawableBase?parent, IAssetLoader assetLoader, HashSet <Uri>?references, DrawAttributes ignoreAttributes = DrawAttributes.None) { var drawable = new MaskDrawable(assetLoader, references) { Element = svgMask, Parent = parent, IgnoreAttributes = ignoreAttributes, IsDrawable = true }; if (!drawable.IsDrawable) { return(drawable); } var maskUnits = svgMask.MaskUnits; var maskContentUnits = svgMask.MaskContentUnits; var xUnit = svgMask.X; var yUnit = svgMask.Y; var widthUnit = svgMask.Width; var heightUnit = svgMask.Height; // TODO: Pass correct skViewport var skRectTransformed = SvgExtensions.CalculateRect(xUnit, yUnit, widthUnit, heightUnit, maskUnits, skViewport, skViewport, svgMask); if (skRectTransformed is null) { drawable.IsDrawable = false; return(drawable); } var skMatrix = SKMatrix.CreateIdentity(); if (maskContentUnits == SvgCoordinateUnits.ObjectBoundingBox) { var skBoundsTranslateTransform = SKMatrix.CreateTranslation(skViewport.Left, skViewport.Top); skMatrix = skMatrix.PreConcat(skBoundsTranslateTransform); var skBoundsScaleTransform = SKMatrix.CreateScale(skViewport.Width, skViewport.Height); skMatrix = skMatrix.PreConcat(skBoundsScaleTransform); } drawable.CreateChildren(svgMask, skViewport, drawable, assetLoader, references, ignoreAttributes); drawable.Initialize(skRectTransformed.Value, skMatrix); return(drawable); }