public static SwitchDrawable Create(SvgSwitch svgSwitch, Rect skOwnerBounds, DrawableBase?parent, IAssetLoader assetLoader, Attributes ignoreAttributes = Attributes.None) { var drawable = new SwitchDrawable(assetLoader) { Element = svgSwitch, Parent = parent, IgnoreAttributes = ignoreAttributes }; drawable.IsDrawable = drawable.CanDraw(svgSwitch, drawable.IgnoreAttributes) && drawable.HasFeatures(svgSwitch, drawable.IgnoreAttributes); if (!drawable.IsDrawable) { return(drawable); } foreach (var child in svgSwitch.Children) { if (!child.IsKnownElement()) { continue; } var hasRequiredFeatures = child.HasRequiredFeatures(); var hasRequiredExtensions = child.HasRequiredExtensions(); var hasSystemLanguage = child.HasSystemLanguage(); if (hasRequiredFeatures && hasRequiredExtensions && hasSystemLanguage) { var childDrawable = DrawableFactory.Create(child, skOwnerBounds, parent, assetLoader, ignoreAttributes); if (childDrawable is { })
public static SP.Picture?ToModel(SvgFragment svgFragment) { var size = SvgExtensions.GetDimensions(svgFragment); var bounds = SP.Rect.Create(size); using var drawable = DrawableFactory.Create(svgFragment, bounds, null, Attributes.None); if (drawable == null) { return(null); } drawable.PostProcess(); if (bounds.IsEmpty) { var drawableBounds = drawable.Bounds; bounds = SP.Rect.Create( 0f, 0f, Math.Abs(drawableBounds.Left) + drawableBounds.Width, Math.Abs(drawableBounds.Top) + drawableBounds.Height); } return(drawable.Snapshot(bounds)); }
public static MarkerDrawable Create(SvgMarker svgMarker, SvgVisualElement pOwner, Point pMarkerPoint, float fAngle, Rect skOwnerBounds, DrawableBase?parent, IAssetLoader assetLoader, Attributes ignoreAttributes = Attributes.None) { var drawable = new MarkerDrawable(assetLoader) { Element = svgMarker, Parent = parent, IgnoreAttributes = Attributes.Display | ignoreAttributes, IsDrawable = true }; if (!drawable.IsDrawable) { return(drawable); } var markerElement = drawable.GetMarkerElement(svgMarker); if (markerElement is null) { drawable.IsDrawable = false; return(drawable); } var skMarkerMatrix = Matrix.CreateIdentity(); var skMatrixMarkerPoint = Matrix.CreateTranslation(pMarkerPoint.X, pMarkerPoint.Y); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixMarkerPoint); var skMatrixAngle = Matrix.CreateRotationDegrees(svgMarker.Orient.IsAuto ? fAngle : svgMarker.Orient.Angle); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixAngle); var strokeWidth = pOwner.StrokeWidth.ToDeviceValue(UnitRenderingType.Other, svgMarker, skOwnerBounds); var refX = svgMarker.RefX.ToDeviceValue(UnitRenderingType.Horizontal, svgMarker, skOwnerBounds); var refY = svgMarker.RefY.ToDeviceValue(UnitRenderingType.Vertical, svgMarker, skOwnerBounds); var markerWidth = svgMarker.MarkerWidth.ToDeviceValue(UnitRenderingType.Other, svgMarker, skOwnerBounds); var markerHeight = svgMarker.MarkerHeight.ToDeviceValue(UnitRenderingType.Other, svgMarker, skOwnerBounds); var viewBoxToMarkerUnitsScaleX = 1f; var viewBoxToMarkerUnitsScaleY = 1f; switch (svgMarker.MarkerUnits) { case SvgMarkerUnits.StrokeWidth: { var skMatrixStrokeWidth = Matrix.CreateScale(strokeWidth, strokeWidth); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixStrokeWidth); var viewBoxWidth = svgMarker.ViewBox.Width; var viewBoxHeight = svgMarker.ViewBox.Height; var scaleFactorWidth = viewBoxWidth <= 0 ? 1 : markerWidth / viewBoxWidth; var scaleFactorHeight = viewBoxHeight <= 0 ? 1 : markerHeight / viewBoxHeight; viewBoxToMarkerUnitsScaleX = Math.Min(scaleFactorWidth, scaleFactorHeight); viewBoxToMarkerUnitsScaleY = Math.Min(scaleFactorWidth, scaleFactorHeight); var skMatrixTranslateRefXY = Matrix.CreateTranslation(-refX * viewBoxToMarkerUnitsScaleX, -refY * viewBoxToMarkerUnitsScaleY); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixTranslateRefXY); var skMatrixScaleXY = Matrix.CreateScale(viewBoxToMarkerUnitsScaleX, viewBoxToMarkerUnitsScaleY); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixScaleXY); } break; case SvgMarkerUnits.UserSpaceOnUse: { var skMatrixTranslateRefXY = Matrix.CreateTranslation(-refX, -refY); skMarkerMatrix = skMarkerMatrix.PreConcat(skMatrixTranslateRefXY); } break; } switch (svgMarker.Overflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: drawable.MarkerClipRect = Rect.Create( svgMarker.ViewBox.MinX, svgMarker.ViewBox.MinY, markerWidth / viewBoxToMarkerUnitsScaleX, markerHeight / viewBoxToMarkerUnitsScaleY); break; } var markerElementDrawable = DrawableFactory.Create(markerElement, skOwnerBounds, drawable, assetLoader, Attributes.Display); if (markerElementDrawable is { })