skyscraper8/GUIs/skyscraper8.UI.ImGui/Forms/SdlScottPlotWindow.cs
2025-08-06 22:05:22 +02:00

65 lines
1.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Echo.UserInterface.Backend;
using ScottPlot;
using SDL2;
using SkiaSharp;
using skyscraper8.UI.ImGuiForms;
using testdrid.SdlWrapper;
namespace skyscraper8.UI.ImGui.Forms
{
internal class SdlScottPlotWindow : SdlWindow, IDisposable
{
protected readonly Plot _plot;
private readonly SKBitmap _skBitmap;
private readonly SKCanvas _skCanvas;
public SdlScottPlotWindow(ImGuiDevice imGuiDevice, Plot plot, int width, int height, string title)
: base(imGuiDevice, width, height, title)
{
this._plot = plot;
this._skBitmap = new SKBitmap(new SKImageInfo(width, height, SKColorType.Bgra8888));
this._skCanvas = new SKCanvas(_skBitmap);
}
private byte[] tempBuffer;
private int dataLength;
protected override void RenderInternal(Texture surface)
{
BeforeRender();
_plot.Render(_skCanvas, (int)this._size.X, (int)this._size.Y);
nint data0 = surface.GetData0();
nint pixels = _skBitmap.GetPixels();
if (dataLength == 0)
{
dataLength = _skBitmap.ByteCount;
tempBuffer = new byte[dataLength];
}
Marshal.Copy(pixels, tempBuffer, 0, dataLength);
Marshal.Copy(tempBuffer, 0, data0, dataLength);
}
protected virtual void BeforeRender()
{
}
public void Dispose()
{
_plot.Dispose();
_skBitmap.Dispose();
_skCanvas.Dispose();
}
}
}