mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 03:48:56 +00:00
Rendering - Moved bitmap management logic & prevent access violations
This commit is contained in:
1 parent
1a7a7e0582
commit
456af693b0
11 files changed
+310
-322
No files matched your search
@@ -64,43 +64,29 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs
|
||||
|
||||
private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e)
|
||||
{
|
||||
Execute.PostToUIThread(() =>
|
||||
Execute.OnUIThreadSync(() =>
|
||||
{
|
||||
// TODO: Remove, frames shouldn't even be rendered if this is the case
|
||||
if (e.Texture.Bitmap.Pixels.Length == 0)
|
||||
return;
|
||||
|
||||
SKImageInfo bitmapInfo = e.Texture.Bitmap.Info;
|
||||
RenderHeight = bitmapInfo.Height;
|
||||
RenderWidth = bitmapInfo.Width;
|
||||
|
||||
if (!(CurrentFrame is WriteableBitmap writeableBitmap) ||
|
||||
writeableBitmap.Width != bitmapInfo.Width ||
|
||||
writeableBitmap.Height != bitmapInfo.Height)
|
||||
// ReSharper disable twice CompareOfFloatsByEqualityOperator
|
||||
if (CurrentFrame is not WriteableBitmap writable || writable.Width != bitmapInfo.Width || writable.Height != bitmapInfo.Height)
|
||||
{
|
||||
CurrentFrame = e.Texture.Bitmap.ToWriteableBitmap();
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
|
||||
using SKImage skImage = SKImage.FromPixels(e.Texture.Bitmap.PeekPixels());
|
||||
SKImageInfo info = new(skImage.Width, skImage.Height);
|
||||
writable.Lock();
|
||||
using (SKPixmap pixmap = new(info, writable.BackBuffer, writable.BackBufferStride))
|
||||
{
|
||||
using (SKImage skiaImage = SKImage.FromPixels(e.Texture.Bitmap.PeekPixels()))
|
||||
{
|
||||
SKImageInfo info = new(skiaImage.Width, skiaImage.Height);
|
||||
writeableBitmap.Lock();
|
||||
using (SKPixmap pixmap = new(info, writeableBitmap.BackBuffer, writeableBitmap.BackBufferStride))
|
||||
{
|
||||
skiaImage.ReadPixels(pixmap, 0, 0);
|
||||
}
|
||||
skImage.ReadPixels(pixmap, 0, 0);
|
||||
}
|
||||
|
||||
writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight));
|
||||
writeableBitmap.Unlock();
|
||||
}
|
||||
}
|
||||
catch (AccessViolationException)
|
||||
{
|
||||
// oops
|
||||
}
|
||||
writable.AddDirtyRect(new Int32Rect(0, 0, writable.PixelWidth, writable.PixelHeight));
|
||||
writable.Unlock();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ namespace Artemis.UI.Screens.Settings.Device
|
||||
|
||||
#region Event handlers
|
||||
|
||||
private void DeviceOnDeviceUpdated(object? sender, EventArgs e)
|
||||
private void DeviceOnDeviceUpdated(object sender, EventArgs e)
|
||||
{
|
||||
NotifyOfPropertyChange(nameof(CanExportLayout));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user