mirror of
https://github.com/Stone-Red-Code/DesktopMagic.git
synced 2026-09-04 08:56:15 +02:00
Optimize bitmap rendering in PluginWindow
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
<TargetFramework>net8.0-windows7.0</TargetFramework>
|
<TargetFramework>net8.0-windows7.0</TargetFramework>
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||||
<Platforms>AnyCPU;x64</Platforms>
|
<Platforms>AnyCPU;x64</Platforms>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ public partial class PluginWindow : Window, IPluginWindow
|
|||||||
private System.Timers.Timer? reloadDebounceTimer;
|
private System.Timers.Timer? reloadDebounceTimer;
|
||||||
private bool isReloading = false;
|
private bool isReloading = false;
|
||||||
|
|
||||||
|
private WriteableBitmap? writeableBitmap;
|
||||||
|
private BitmapScalingMode lastBitmapScalingMode = BitmapScalingMode.Unspecified;
|
||||||
|
|
||||||
public bool IsRunning { get; private set; } = true;
|
public bool IsRunning { get; private set; } = true;
|
||||||
public PluginMetadata PluginMetadata { get; private set; }
|
public PluginMetadata PluginMetadata { get; private set; }
|
||||||
public string PluginFolderPath { get; private set; }
|
public string PluginFolderPath { get; private set; }
|
||||||
@@ -337,22 +340,52 @@ public partial class PluginWindow : Window, IPluginWindow
|
|||||||
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
|
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BitmapSource BitmapToImageSource(Bitmap bitmap)
|
private void UpdateImageFromBitmap(Bitmap bitmap, BitmapScalingMode scalingMode)
|
||||||
{
|
{
|
||||||
BitmapData bitmapData = bitmap.LockBits(
|
BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||||
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
|
||||||
ImageLockMode.ReadOnly, bitmap.PixelFormat);
|
|
||||||
|
|
||||||
BitmapSource bitmapSource = BitmapSource.Create(
|
try
|
||||||
bitmapData.Width, bitmapData.Height,
|
{
|
||||||
bitmap.HorizontalResolution, bitmap.VerticalResolution,
|
Dispatcher.Invoke(() =>
|
||||||
PixelFormats.Bgra32, null,
|
{
|
||||||
bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);
|
if (lastBitmapScalingMode != scalingMode)
|
||||||
|
{
|
||||||
|
RenderOptions.SetBitmapScalingMode(image, scalingMode);
|
||||||
|
lastBitmapScalingMode = scalingMode;
|
||||||
|
}
|
||||||
|
|
||||||
bitmap.UnlockBits(bitmapData);
|
if (writeableBitmap == null || writeableBitmap.PixelWidth != bitmapData.Width || writeableBitmap.PixelHeight != bitmapData.Height)
|
||||||
|
{
|
||||||
|
writeableBitmap = new WriteableBitmap(
|
||||||
|
bitmapData.Width, bitmapData.Height,
|
||||||
|
bitmap.HorizontalResolution, bitmap.VerticalResolution,
|
||||||
|
PixelFormats.Bgra32, null);
|
||||||
|
image.Source = writeableBitmap;
|
||||||
|
}
|
||||||
|
|
||||||
bitmapSource.Freeze();
|
writeableBitmap.Lock();
|
||||||
return bitmapSource;
|
try
|
||||||
|
{
|
||||||
|
unsafe
|
||||||
|
{
|
||||||
|
Buffer.MemoryCopy(
|
||||||
|
bitmapData.Scan0.ToPointer(),
|
||||||
|
writeableBitmap.BackBuffer.ToPointer(),
|
||||||
|
writeableBitmap.BackBufferStride * writeableBitmap.PixelHeight,
|
||||||
|
bitmapData.Stride * bitmapData.Height);
|
||||||
|
}
|
||||||
|
writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bitmapData.Width, bitmapData.Height));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
writeableBitmap.Unlock();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
bitmap.UnlockBits(bitmapData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_ContentRendered(object? sender, EventArgs e)
|
private void Window_ContentRendered(object? sender, EventArgs e)
|
||||||
@@ -826,14 +859,7 @@ public partial class PluginWindow : Window, IPluginWindow
|
|||||||
_ => BitmapScalingMode.Unspecified
|
_ => BitmapScalingMode.Unspecified
|
||||||
};
|
};
|
||||||
|
|
||||||
// Update Image
|
UpdateImageFromBitmap(result, renderOptions);
|
||||||
BitmapSource frozenSource = BitmapToImageSource(result);
|
|
||||||
|
|
||||||
_ = Dispatcher.BeginInvoke(() =>
|
|
||||||
{
|
|
||||||
RenderOptions.SetBitmapScalingMode(image, renderOptions);
|
|
||||||
image.Source = frozenSource;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user