1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using Avalonia;
- using Avalonia.Controls;
- using Avalonia.LogicalTree;
- using Avalonia.Media;
- using Avalonia.Media.Imaging;
- using Avalonia.Media.Immutable;
- using Avalonia.Platform;
- using Avalonia.Threading;
- namespace RenderDemo.Pages
- {
- public class WriteableBitmapPage : Control
- {
- private WriteableBitmap _unpremulBitmap;
- private WriteableBitmap _premulBitmap;
- private readonly Stopwatch _st = Stopwatch.StartNew();
- protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
- {
- _unpremulBitmap = new WriteableBitmap(new PixelSize(256, 256), new Vector(96, 96), PixelFormat.Bgra8888, AlphaFormat.Unpremul);
- _premulBitmap = new WriteableBitmap(new PixelSize(256, 256), new Vector(96, 96), PixelFormat.Bgra8888, AlphaFormat.Premul);
- base.OnAttachedToLogicalTree(e);
- }
- protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
- {
- base.OnDetachedFromLogicalTree(e);
- _unpremulBitmap?.Dispose();
- _unpremulBitmap = null;
- _premulBitmap?.Dispose();
- _unpremulBitmap = null;
- }
- public override void Render(DrawingContext context)
- {
- void FillPixels(WriteableBitmap bitmap, byte fillAlpha, bool premul)
- {
- using (var fb = bitmap.Lock())
- {
- var data = new int[fb.Size.Width * fb.Size.Height];
- for (int y = 0; y < fb.Size.Height; y++)
- {
- for (int x = 0; x < fb.Size.Width; x++)
- {
- var color = new Color(fillAlpha, 0, 255, 0);
- if (premul)
- {
- byte r = (byte) (color.R * color.A / 255);
- byte g = (byte) (color.G * color.A / 255);
- byte b = (byte) (color.B * color.A / 255);
- color = new Color(fillAlpha, r, g, b);
- }
- data[y * fb.Size.Width + x] = (int) color.ToUInt32();
- }
- }
- Marshal.Copy(data, 0, fb.Address, fb.Size.Width * fb.Size.Height);
- }
- }
- base.Render(context);
- byte alpha = (byte)((_st.ElapsedMilliseconds / 10) % 256);
- FillPixels(_unpremulBitmap, alpha, false);
- FillPixels(_premulBitmap, alpha, true);
- context.FillRectangle(Brushes.Red, new Rect(0, 0, 256 * 3, 256));
- context.DrawImage(_unpremulBitmap,
- new Rect(0, 0, 256, 256),
- new Rect(0, 0, 256, 256));
- context.DrawImage(_premulBitmap,
- new Rect(0, 0, 256, 256),
- new Rect(256, 0, 256, 256));
- context.FillRectangle(new ImmutableSolidColorBrush(Colors.Lime, alpha / 255d), new Rect(512, 0, 256, 256));
- Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Background);
- }
- }
- }
|