-
Notifications
You must be signed in to change notification settings - Fork 554
/
Copy pathUWPExtensions.cs
183 lines (155 loc) · 4.62 KB
/
UWPExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
using System;
using Windows.Foundation;
using Windows.UI;
using Windows.Storage.Streams;
#if !HAS_UNO
using SkiaSharp.Views.WinUI.Native;
#endif
#if WINDOWS || WINUI
using Microsoft.UI.Xaml.Media.Imaging;
#else
using Windows.UI.Xaml.Media.Imaging;
#endif
#if WINDOWS || WINUI
namespace SkiaSharp.Views.Windows
#else
namespace SkiaSharp.Views.UWP
#endif
{
#if WINDOWS
public static class WindowsExtensions
#else
public static class UWPExtensions
#endif
{
// Point
public static SKPoint ToSKPoint(this Point point)
{
return new SKPoint((float)point.X, (float)point.Y);
}
public static Point ToPoint(this SKPoint point)
{
return new Point(point.X, point.Y);
}
// Rect
public static SKRect ToSKRect(this Rect rect)
{
return new SKRect((float)rect.Left, (float)rect.Top, (float)rect.Right, (float)rect.Bottom);
}
public static Rect ToRect(this SKRect rect)
{
return new Rect(rect.Left, rect.Top, rect.Right, rect.Bottom);
}
// Size
public static SKSize ToSKSize(this Size size)
{
return new SKSize((float)size.Width, (float)size.Height);
}
public static Size ToSize(this SKSize size)
{
return new Size(size.Width, size.Height);
}
// Color
public static SKColor ToSKColor(this Color color)
{
return new SKColor(color.R, color.G, color.B, color.A);
}
public static Color ToColor(this SKColor color)
{
return Color.FromArgb(color.Alpha, color.Red, color.Green, color.Blue);
}
#if !HAS_UNO
// WriteableBitmap
public static WriteableBitmap ToWriteableBitmap(this SKPicture picture, SKSizeI dimensions)
{
using (var image = SKImage.FromPicture(picture, dimensions))
{
return image?.ToWriteableBitmap();
}
}
public static WriteableBitmap ToWriteableBitmap(this SKImage skiaImage)
{
// TODO: maybe keep the same color types where we can, instead of just going to the platform default
// TODO: remove this as it is old/default logic
//using (var tempImage = SKImage.Create(info))
//using (var pixmap = tempImage.PeekPixels())
//using (var data = SKData.Create(pixmap.GetPixels(), info.BytesSize))
//{
// skiaImage.ReadPixels(pixmap, 0, 0);
// using (var stream = bitmap.PixelBuffer.AsStream())
// {
// data.SaveTo(stream);
// }
//}
var info = new SKImageInfo(skiaImage.Width, skiaImage.Height);
var bitmap = new WriteableBitmap(info.Width, info.Height);
using (var pixmap = new SKPixmap(info, bitmap.GetPixels()))
{
skiaImage.ReadPixels(pixmap, 0, 0);
}
bitmap.Invalidate();
return bitmap;
}
public static WriteableBitmap ToWriteableBitmap(this SKBitmap skiaBitmap)
{
using var pixmap = skiaBitmap.PeekPixels();
using var image = SKImage.FromPixels(pixmap);
var wb = image.ToWriteableBitmap();
GC.KeepAlive(skiaBitmap);
return wb;
}
public static WriteableBitmap ToWriteableBitmap(this SKPixmap pixmap)
{
using (var image = SKImage.FromPixels(pixmap))
{
return image.ToWriteableBitmap();
}
}
public static SKBitmap ToSKBitmap(this WriteableBitmap bitmap)
{
// TODO: maybe keep the same color types where we can, instead of just going to the platform default
var info = new SKImageInfo(bitmap.PixelWidth, bitmap.PixelHeight);
var skiaBitmap = new SKBitmap(info);
using (var pixmap = skiaBitmap.PeekPixels())
{
bitmap.ToSKPixmap(pixmap);
}
return skiaBitmap;
}
public static SKImage ToSKImage(this WriteableBitmap bitmap)
{
// TODO: maybe keep the same color types where we can, instead of just going to the platform default
var info = new SKImageInfo(bitmap.PixelWidth, bitmap.PixelHeight);
var image = SKImage.Create(info);
using (var pixmap = image.PeekPixels())
{
bitmap.ToSKPixmap(pixmap);
}
return image;
}
public static bool ToSKPixmap(this WriteableBitmap bitmap, SKPixmap pixmap)
{
// TODO: maybe keep the same color types where we can, instead of just going to the platform default
if (pixmap.ColorType == SKImageInfo.PlatformColorType)
{
using var image = SKImage.FromPixels(pixmap.Info, bitmap.GetPixels());
return image.ReadPixels(pixmap, 0, 0);
}
else
{
// we have to copy the pixels into a format that we understand
// and then into a desired format
// TODO: we can still do a bit more for other cases where the color types are the same
using (var tempImage = bitmap.ToSKImage())
{
return tempImage.ReadPixels(pixmap, 0, 0);
}
}
}
internal static IntPtr GetPixels(this WriteableBitmap bitmap) =>
bitmap.PixelBuffer.GetByteBuffer();
internal static IntPtr GetByteBuffer(this IBuffer buffer) =>
(IntPtr)BufferExtensions.GetByteBuffer(buffer);
#endif
}
}