|
| 1 | +#nullable enable |
| 2 | + |
| 3 | +using System.Linq; |
| 4 | +using System.Diagnostics; |
| 5 | + |
| 6 | +namespace Uno.UI.Runtime.Skia.WPF.Extensions.UI.Xaml.Controls |
| 7 | +{ |
| 8 | + internal static class Extensions |
| 9 | + { |
| 10 | + public static System.Windows.Media.Brush? ToWpfBrush(this Windows.UI.Xaml.Media.Brush brush) |
| 11 | + { |
| 12 | + if (brush is Windows.UI.Xaml.Media.SolidColorBrush solidBrush) |
| 13 | + { |
| 14 | + return new System.Windows.Media.SolidColorBrush(solidBrush.Color.ToWpfColor()) { Opacity = solidBrush.Opacity }; |
| 15 | + } |
| 16 | + else if (brush is Windows.UI.Xaml.Media.LinearGradientBrush gradientBrush) |
| 17 | + { |
| 18 | + return new System.Windows.Media.LinearGradientBrush(gradientBrush.GradientStops.ToWpfGradientStopCollection(), gradientBrush.StartPoint.ToWpfPoint(), gradientBrush.EndPoint.ToWpfPoint()) |
| 19 | + { |
| 20 | + MappingMode = gradientBrush.MappingMode.ToWpfBrushMappingMode(), |
| 21 | + Transform = gradientBrush.Transform.ToWpfTransform(), |
| 22 | + RelativeTransform = gradientBrush.RelativeTransform.ToWpfTransform(), |
| 23 | + }; |
| 24 | + } |
| 25 | + else if (brush is Windows.UI.Xaml.Media.ImageBrush imageBrush) |
| 26 | + { |
| 27 | + return new System.Windows.Media.ImageBrush(imageBrush.ImageSource.ToWpfImageSource()) |
| 28 | + { |
| 29 | + AlignmentX = imageBrush.AlignmentX.ToWpfAlignmentX(), |
| 30 | + AlignmentY = imageBrush.AlignmentY.ToWpfAlignmentY(), |
| 31 | + Opacity = imageBrush.Opacity, |
| 32 | + Stretch = imageBrush.Stretch.ToWpfStretch(), |
| 33 | + Transform = imageBrush.Transform.ToWpfTransform(), |
| 34 | + RelativeTransform = imageBrush.RelativeTransform.ToWpfTransform(), |
| 35 | + }; |
| 36 | + } |
| 37 | + |
| 38 | + // TODO: Support more brushes. |
| 39 | + return null; |
| 40 | + } |
| 41 | + |
| 42 | + private static System.Windows.Media.Color ToWpfColor(this Windows.UI.Color color) |
| 43 | + => System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B); |
| 44 | + |
| 45 | + private static System.Windows.Point ToWpfPoint(this Windows.Foundation.Point point) |
| 46 | + => new System.Windows.Point(point.X, point.Y); |
| 47 | + |
| 48 | + private static System.Windows.Media.GradientStopCollection ToWpfGradientStopCollection(this Windows.UI.Xaml.Media.GradientStopCollection gradientStops) |
| 49 | + => new System.Windows.Media.GradientStopCollection(gradientStops.Select(stop => stop.ToWpfGradientStop())); |
| 50 | + |
| 51 | + private static System.Windows.Media.GradientStop ToWpfGradientStop(this Windows.UI.Xaml.Media.GradientStop gradientStop) |
| 52 | + => new System.Windows.Media.GradientStop(gradientStop.Color.ToWpfColor(), gradientStop.Offset); |
| 53 | + |
| 54 | + private static System.Windows.Media.ImageSource? ToWpfImageSource(this Windows.UI.Xaml.Media.ImageSource imageSource) |
| 55 | + { |
| 56 | + if (imageSource is Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapSource) |
| 57 | + { |
| 58 | + new System.Windows.Media.Imaging.BitmapImage(bitmapSource.UriSource); |
| 59 | + } |
| 60 | + |
| 61 | + // TODO: Support more image sources. |
| 62 | + return null; |
| 63 | + } |
| 64 | + |
| 65 | + private static System.Windows.Media.AlignmentX ToWpfAlignmentX(this Windows.UI.Xaml.Media.AlignmentX alignment) |
| 66 | + { |
| 67 | + Debug.Assert((int)System.Windows.Media.AlignmentX.Left == (int)Windows.UI.Xaml.Media.AlignmentX.Left); |
| 68 | + Debug.Assert((int)System.Windows.Media.AlignmentX.Right == (int)Windows.UI.Xaml.Media.AlignmentX.Right); |
| 69 | + Debug.Assert((int)System.Windows.Media.AlignmentX.Center == (int)Windows.UI.Xaml.Media.AlignmentX.Center); |
| 70 | + return (System.Windows.Media.AlignmentX)alignment; |
| 71 | + } |
| 72 | + |
| 73 | + private static System.Windows.Media.AlignmentY ToWpfAlignmentY(this Windows.UI.Xaml.Media.AlignmentY alignment) |
| 74 | + { |
| 75 | + Debug.Assert((int)System.Windows.Media.AlignmentY.Top == (int)Windows.UI.Xaml.Media.AlignmentY.Top); |
| 76 | + Debug.Assert((int)System.Windows.Media.AlignmentY.Center == (int)Windows.UI.Xaml.Media.AlignmentY.Center); |
| 77 | + Debug.Assert((int)System.Windows.Media.AlignmentY.Bottom == (int)Windows.UI.Xaml.Media.AlignmentY.Bottom); |
| 78 | + return (System.Windows.Media.AlignmentY)alignment; |
| 79 | + } |
| 80 | + |
| 81 | + private static System.Windows.Media.Stretch ToWpfStretch(this Windows.UI.Xaml.Media.Stretch stretch) |
| 82 | + { |
| 83 | + Debug.Assert((int)System.Windows.Media.Stretch.None == (int)Windows.UI.Xaml.Media.Stretch.None); |
| 84 | + Debug.Assert((int)System.Windows.Media.Stretch.Fill == (int)Windows.UI.Xaml.Media.Stretch.Fill); |
| 85 | + Debug.Assert((int)System.Windows.Media.Stretch.Uniform == (int)Windows.UI.Xaml.Media.Stretch.Uniform); |
| 86 | + Debug.Assert((int)System.Windows.Media.Stretch.UniformToFill == (int)Windows.UI.Xaml.Media.Stretch.UniformToFill); |
| 87 | + return (System.Windows.Media.Stretch)stretch; |
| 88 | + } |
| 89 | + |
| 90 | + private static System.Windows.Media.Transform ToWpfTransform(this Windows.UI.Xaml.Media.Transform transform) |
| 91 | + { |
| 92 | + if (transform is Windows.UI.Xaml.Media.MatrixTransform matrixTransform) |
| 93 | + { |
| 94 | + return new System.Windows.Media.MatrixTransform( |
| 95 | + m11: matrixTransform.Matrix.M11, |
| 96 | + m12: matrixTransform.Matrix.M12, |
| 97 | + m21: matrixTransform.Matrix.M21, |
| 98 | + m22: matrixTransform.Matrix.M22, |
| 99 | + offsetX: matrixTransform.Matrix.OffsetX, |
| 100 | + offsetY: matrixTransform.Matrix.OffsetY); |
| 101 | + } |
| 102 | + else if (transform is Windows.UI.Xaml.Media.RotateTransform rotateTransform) |
| 103 | + { |
| 104 | + return new System.Windows.Media.RotateTransform( |
| 105 | + angle: rotateTransform.Angle, |
| 106 | + centerX: rotateTransform.CenterX, |
| 107 | + centerY: rotateTransform.CenterY); |
| 108 | + } |
| 109 | + else if (transform is Windows.UI.Xaml.Media.ScaleTransform scaleTransform) |
| 110 | + { |
| 111 | + return new System.Windows.Media.ScaleTransform( |
| 112 | + scaleX: scaleTransform.ScaleX, |
| 113 | + scaleY: scaleTransform.ScaleY, |
| 114 | + centerX: scaleTransform.CenterX, |
| 115 | + centerY: scaleTransform.CenterY); |
| 116 | + } |
| 117 | + else if (transform is Windows.UI.Xaml.Media.SkewTransform skewTransform) |
| 118 | + { |
| 119 | + return new System.Windows.Media.SkewTransform( |
| 120 | + angleX: skewTransform.AngleX, |
| 121 | + angleY: skewTransform.AngleY, |
| 122 | + centerX: skewTransform.CenterX, |
| 123 | + centerY: skewTransform.CenterY); |
| 124 | + } |
| 125 | + else if (transform is Windows.UI.Xaml.Media.TransformGroup transformGroup) |
| 126 | + { |
| 127 | + return new System.Windows.Media.TransformGroup() |
| 128 | + { |
| 129 | + Children = new System.Windows.Media.TransformCollection(transformGroup.Children.Select(g => g.ToWpfTransform())) |
| 130 | + }; |
| 131 | + } |
| 132 | + else if (transform is Windows.UI.Xaml.Media.TranslateTransform translateTransform) |
| 133 | + { |
| 134 | + return new System.Windows.Media.TranslateTransform(translateTransform.X, translateTransform.Y); |
| 135 | + } |
| 136 | + |
| 137 | + return null; |
| 138 | + } |
| 139 | + |
| 140 | + private static System.Windows.Media.BrushMappingMode ToWpfBrushMappingMode(this Windows.UI.Xaml.Media.BrushMappingMode mappingMode) |
| 141 | + { |
| 142 | + Debug.Assert((int)System.Windows.Media.BrushMappingMode.Absolute == (int)Windows.UI.Xaml.Media.BrushMappingMode.Absolute); |
| 143 | + Debug.Assert((int)System.Windows.Media.BrushMappingMode.RelativeToBoundingBox == (int)Windows.UI.Xaml.Media.BrushMappingMode.RelativeToBoundingBox); |
| 144 | + |
| 145 | + return (System.Windows.Media.BrushMappingMode)mappingMode; |
| 146 | + } |
| 147 | + } |
| 148 | +} |
0 commit comments