Skip to content

Commit 69a824c

Browse files
feat: SoftwareBitmap
1 parent ba33ee0 commit 69a824c

File tree

6 files changed

+535
-33
lines changed

6 files changed

+535
-33
lines changed

src/Uno.UWP/Generated/3.0.0.0/Windows.Graphics.Imaging/SoftwareBitmap.cs

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
#pragma warning disable 114 // new keyword hiding
33
namespace Windows.Graphics.Imaging
44
{
5-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
5+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
66
[global::Uno.NotImplemented]
77
#endif
8-
public partial class SoftwareBitmap : global::System.IDisposable
8+
public partial class SoftwareBitmap : global::System.IDisposable
99
{
1010
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
11-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
11+
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__", "__MACOS__")]
1212
public double DpiY
1313
{
1414
get
@@ -35,8 +35,8 @@ public double DpiX
3535
}
3636
}
3737
#endif
38-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
39-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
38+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
39+
[global::Uno.NotImplemented( "NET461", "__WASM__", "__NETSTD_REFERENCE__")]
4040
public global::Windows.Graphics.Imaging.BitmapAlphaMode BitmapAlphaMode
4141
{
4242
get
@@ -45,8 +45,8 @@ public double DpiX
4545
}
4646
}
4747
#endif
48-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
49-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
48+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
49+
[global::Uno.NotImplemented( "NET461", "__WASM__", "__NETSTD_REFERENCE__")]
5050
public global::Windows.Graphics.Imaging.BitmapPixelFormat BitmapPixelFormat
5151
{
5252
get
@@ -55,8 +55,8 @@ public double DpiX
5555
}
5656
}
5757
#endif
58-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
59-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
58+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
59+
[global::Uno.NotImplemented("__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__")]
6060
public bool IsReadOnly
6161
{
6262
get
@@ -65,8 +65,8 @@ public bool IsReadOnly
6565
}
6666
}
6767
#endif
68-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
69-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
68+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
69+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
7070
public int PixelHeight
7171
{
7272
get
@@ -75,8 +75,8 @@ public int PixelHeight
7575
}
7676
}
7777
#endif
78-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
79-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
78+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
79+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
8080
public int PixelWidth
8181
{
8282
get
@@ -85,17 +85,17 @@ public int PixelWidth
8585
}
8686
}
8787
#endif
88-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
89-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
90-
public SoftwareBitmap( global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height)
88+
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || __MACOS__
89+
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__", "__MACOS__")]
90+
public SoftwareBitmap( global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height)
9191
{
9292
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "SoftwareBitmap.SoftwareBitmap(BitmapPixelFormat format, int width, int height)");
9393
}
9494
#endif
9595
// Forced skipping of method Windows.Graphics.Imaging.SoftwareBitmap.SoftwareBitmap(Windows.Graphics.Imaging.BitmapPixelFormat, int, int)
96-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
97-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
98-
public SoftwareBitmap( global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height, global::Windows.Graphics.Imaging.BitmapAlphaMode alpha)
96+
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || __MACOS__
97+
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__", "__MACOS__")]
98+
public SoftwareBitmap( global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height, global::Windows.Graphics.Imaging.BitmapAlphaMode alpha)
9999
{
100100
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "SoftwareBitmap.SoftwareBitmap(BitmapPixelFormat format, int width, int height, BitmapAlphaMode alpha)");
101101
}
@@ -117,43 +117,43 @@ public SoftwareBitmap( global::Windows.Graphics.Imaging.BitmapPixelFormat format
117117
throw new global::System.NotImplementedException("The member BitmapBuffer SoftwareBitmap.LockBuffer(BitmapBufferAccessMode mode) is not implemented in Uno.");
118118
}
119119
#endif
120-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
121-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
120+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
121+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
122122
public void CopyTo( global::Windows.Graphics.Imaging.SoftwareBitmap bitmap)
123123
{
124124
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "void SoftwareBitmap.CopyTo(SoftwareBitmap bitmap)");
125125
}
126126
#endif
127127
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
128-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
128+
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__", "__MACOS__")]
129129
public void CopyFromBuffer( global::Windows.Storage.Streams.IBuffer buffer)
130130
{
131131
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "void SoftwareBitmap.CopyFromBuffer(IBuffer buffer)");
132132
}
133133
#endif
134134
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
135-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
135+
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__NETSTD_REFERENCE__", "__MACOS__")]
136136
public void CopyToBuffer( global::Windows.Storage.Streams.IBuffer buffer)
137137
{
138138
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "void SoftwareBitmap.CopyToBuffer(IBuffer buffer)");
139139
}
140140
#endif
141-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
142-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
141+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
142+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
143143
public global::Windows.Graphics.Imaging.SoftwareBitmap GetReadOnlyView()
144144
{
145145
throw new global::System.NotImplementedException("The member SoftwareBitmap SoftwareBitmap.GetReadOnlyView() is not implemented in Uno.");
146146
}
147147
#endif
148-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
149-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
148+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
149+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
150150
public void Dispose()
151151
{
152152
global::Windows.Foundation.Metadata.ApiInformation.TryRaiseNotImplemented("Windows.Graphics.Imaging.SoftwareBitmap", "void SoftwareBitmap.Dispose()");
153153
}
154154
#endif
155-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
156-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
155+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
156+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
157157
public static global::Windows.Graphics.Imaging.SoftwareBitmap Copy( global::Windows.Graphics.Imaging.SoftwareBitmap source)
158158
{
159159
throw new global::System.NotImplementedException("The member SoftwareBitmap SoftwareBitmap.Copy(SoftwareBitmap source) is not implemented in Uno.");
@@ -173,15 +173,15 @@ public void Dispose()
173173
throw new global::System.NotImplementedException("The member SoftwareBitmap SoftwareBitmap.Convert(SoftwareBitmap source, BitmapPixelFormat format, BitmapAlphaMode alpha) is not implemented in Uno.");
174174
}
175175
#endif
176-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
177-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
176+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
177+
[global::Uno.NotImplemented("NET461", "__WASM__", "__NETSTD_REFERENCE__")]
178178
public static global::Windows.Graphics.Imaging.SoftwareBitmap CreateCopyFromBuffer( global::Windows.Storage.Streams.IBuffer source, global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height)
179179
{
180180
throw new global::System.NotImplementedException("The member SoftwareBitmap SoftwareBitmap.CreateCopyFromBuffer(IBuffer source, BitmapPixelFormat format, int width, int height) is not implemented in Uno.");
181181
}
182182
#endif
183-
#if __ANDROID__ || __IOS__ || NET461 || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
184-
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
183+
#if false || false || NET461 || __WASM__ || false || __NETSTD_REFERENCE__ || false
184+
[global::Uno.NotImplemented("NET461", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__")]
185185
public static global::Windows.Graphics.Imaging.SoftwareBitmap CreateCopyFromBuffer( global::Windows.Storage.Streams.IBuffer source, global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height, global::Windows.Graphics.Imaging.BitmapAlphaMode alpha)
186186
{
187187
throw new global::System.NotImplementedException("The member SoftwareBitmap SoftwareBitmap.CreateCopyFromBuffer(IBuffer source, BitmapPixelFormat format, int width, int height, BitmapAlphaMode alpha) is not implemented in Uno.");
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using System.Diagnostics.CodeAnalysis;
5+
using System.Numerics;
6+
using Android.Graphics;
7+
using Uno.UI;
8+
using Windows.Foundation;
9+
using Java.Nio;
10+
using System.Runtime.InteropServices.WindowsRuntime;
11+
using System.Runtime.InteropServices;
12+
13+
namespace Windows.Graphics.Imaging
14+
{
15+
partial class SoftwareBitmap : IDisposable
16+
{
17+
private readonly Bitmap bitmap;
18+
19+
internal SoftwareBitmap(Bitmap bitmap, bool isReadOnly = false)
20+
{
21+
this.bitmap = bitmap;
22+
IsReadOnly = isReadOnly;
23+
}
24+
25+
public BitmapAlphaMode BitmapAlphaMode =>
26+
this.bitmap.IsPremultiplied
27+
? Imaging.BitmapAlphaMode.Premultiplied
28+
: Imaging.BitmapAlphaMode.Straight;
29+
30+
public BitmapPixelFormat BitmapPixelFormat =>
31+
Windows.Graphics.Imaging.BitmapPixelFormat.Rgba8;
32+
33+
public bool IsReadOnly { get; }
34+
35+
public int PixelHeight =>
36+
bitmap.Height;
37+
38+
public int PixelWidth =>
39+
bitmap.Width;
40+
41+
internal Bitmap Bitmap => bitmap;
42+
43+
public SoftwareBitmap GetReadOnlyView() =>
44+
new SoftwareBitmap(bitmap, true);
45+
46+
public void CopyTo(global::Windows.Graphics.Imaging.SoftwareBitmap bitmap)
47+
{
48+
if (bitmap.IsReadOnly)
49+
{
50+
throw new ArgumentException("Destionanion is ReadOnly", nameof(bitmap));
51+
}
52+
53+
using (var canvas = new Android.Graphics.Canvas(bitmap.Bitmap))
54+
{
55+
var sourceRect = new Android.Graphics.Rect(0, 0, this.Bitmap.Width, this.Bitmap.Height);
56+
var destRect = new Android.Graphics.Rect(0, 0, bitmap.Bitmap.Width, bitmap.Bitmap.Height);
57+
canvas.DrawBitmap(this.Bitmap, sourceRect, destRect, null);
58+
}
59+
}
60+
61+
public static SoftwareBitmap Copy(SoftwareBitmap source) =>
62+
new SoftwareBitmap(source.bitmap.Copy(null,true), false);
63+
64+
public static global::Windows.Graphics.Imaging.SoftwareBitmap CreateCopyFromBuffer(global::Windows.Storage.Streams.IBuffer source, global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height)
65+
{
66+
return CreateCopyFromBuffer(source, format, width, height, global::Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied);
67+
}
68+
69+
public static global::Windows.Graphics.Imaging.SoftwareBitmap CreateCopyFromBuffer(global::Windows.Storage.Streams.IBuffer source, global::Windows.Graphics.Imaging.BitmapPixelFormat format, int width, int height, global::Windows.Graphics.Imaging.BitmapAlphaMode alpha)
70+
{
71+
// Get pixels
72+
var pixels = source.ToArray();
73+
if (format != BitmapPixelFormat.Rgba8
74+
&& format != BitmapPixelFormat.Bgra8)
75+
{
76+
throw new NotSupportedException($"The {format} pixels format is not supported.");
77+
}
78+
79+
static void Swap(ref byte foo, ref byte bar)
80+
{
81+
(foo, bar) = (bar, foo);
82+
}
83+
84+
if (format == BitmapPixelFormat.Bgra8)
85+
{
86+
//Android Store Argb8888 as rbga
87+
var byteCount = pixels.Length;
88+
for (int i = 0; i < byteCount; i += 4)
89+
{
90+
//Swap R and B chanal
91+
Swap(ref pixels[i], ref pixels[i + 2]);
92+
}
93+
}
94+
var destination = Bitmap.CreateBitmap((int)width, (int)height, Bitmap.Config.Argb8888);
95+
96+
destination.SetPremultiplied(alpha == BitmapAlphaMode.Premultiplied);
97+
98+
using var buffer = ByteBuffer.Wrap(pixels);
99+
destination.CopyPixelsFromBuffer(buffer);
100+
101+
return new SoftwareBitmap(destination);
102+
}
103+
104+
public void Dispose()
105+
{
106+
bitmap?.Dispose();
107+
}
108+
}
109+
}

0 commit comments

Comments
 (0)