Do alpha blending more faithfully to GDI+

fixes #4043
This commit is contained in:
CasualPokePlayer 2024-09-19 22:00:55 -07:00
parent 67cba14e38
commit 073ce5fa4d
10 changed files with 262 additions and 118 deletions

View File

@ -18,7 +18,6 @@ namespace BizHawk.Bizware.Graphics
public IDXGIFactory1 Factory1;
public IDXGIFactory2 Factory2;
public ID3D11BlendState BlendNormalState;
public ID3D11BlendState BlendAlphaState;
public ID3D11BlendState BlendDisableState;
public ID3D11SamplerState PointSamplerState;
public ID3D11SamplerState LinearSamplerState;
@ -89,8 +88,6 @@ namespace BizHawk.Bizware.Graphics
bd.RenderTarget[0].SourceBlend = Blend.One;
bd.RenderTarget[0].DestinationBlend = Blend.Zero;
BlendAlphaState = Device.CreateBlendState(bd);
bd.RenderTarget[0].BlendEnable = false;
BlendDisableState = Device.CreateBlendState(bd);
@ -154,8 +151,6 @@ namespace BizHawk.Bizware.Graphics
BlendNormalState?.Dispose();
BlendNormalState = null;
BlendAlphaState?.Dispose();
BlendAlphaState = null;
BlendDisableState?.Dispose();
BlendDisableState = null;

View File

@ -25,7 +25,6 @@ namespace BizHawk.Bizware.Graphics
private IDXGIFactory1 Factory1 => _resources.Factory1;
private IDXGIFactory2 Factory2 => _resources.Factory2;
private ID3D11BlendState BlendNormalState => _resources.BlendNormalState;
private ID3D11BlendState BlendAlphaState => _resources.BlendAlphaState;
private ID3D11BlendState BlendDisableState => _resources.BlendDisableState;
private ID3D11RasterizerState RasterizerState => _resources.RasterizerState;
@ -186,12 +185,9 @@ namespace BizHawk.Bizware.Graphics
public void ClearColor(Color color)
=> Context.ClearRenderTargetView(CurRenderTarget?.RTV ?? _controlSwapChain.RTV, new(color.R, color.B, color.G, color.A));
public void EnableBlendNormal()
public void EnableBlending()
=> Context.OMSetBlendState(BlendNormalState);
public void EnableBlendAlpha()
=> Context.OMSetBlendState(BlendAlphaState);
public void DisableBlending()
=> Context.OMSetBlendState(BlendDisableState);

View File

@ -27,14 +27,7 @@ namespace BizHawk.Bizware.Graphics
public void ClearColor(Color color)
=> GetCurrentGraphics().Clear(color);
public void EnableBlendNormal()
{
var g = GetCurrentGraphics();
g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.Default;
}
public void EnableBlendAlpha()
public void EnableBlending()
{
var g = GetCurrentGraphics();
g.CompositingMode = CompositingMode.SourceOver;

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Drawing;
using System.Numerics;
namespace BizHawk.Bizware.Graphics
{
@ -51,6 +52,7 @@ namespace BizHawk.Bizware.Graphics
igl.BindPipeline(Pipeline);
SetTexture(null);
SetBlendingParamters(null, true);
igl.BindPipeline(null);
}
}
@ -67,6 +69,18 @@ namespace BizHawk.Bizware.Graphics
Pipeline.SetUniformSampler("uSampler0", texture2D);
}
internal void SetBlendingParamters(ITexture2D secondaryTexture, bool doBlendPass)
{
Pipeline.SetUniformSampler("uSampler1", secondaryTexture);
Pipeline.SetUniform("uBlendEnable", secondaryTexture != null);
Pipeline.SetUniform("uBlendPass", doBlendPass);
if (secondaryTexture != null)
{
Pipeline.SetUniform("uSamplerSize", new Vector2(secondaryTexture.Width, secondaryTexture.Height));
}
}
public void Dispose()
{
foreach (var cachedTex in TextureCache.Values)
@ -94,6 +108,8 @@ namespace BizHawk.Bizware.Graphics
TextureCache.Clear();
}
// ReSharper disable UseRawString
public const string ImGuiVertexShader_d3d11 = @"
//vertex shader uniforms
float4x4 um44Projection;
@ -125,9 +141,10 @@ VS_OUTPUT vsmain(VS_INPUT src)
public const string ImGuiPixelShader_d3d11 = @"
//pixel shader uniforms
bool uSamplerEnable;
Texture2D uTexture0;
sampler uSampler0;
bool uSamplerEnable, uBlendPass, uBlendEnable;
float2 uSamplerSize;
Texture2D uTexture0, uTexture1;
sampler uSampler0, uSampler1;
struct PS_INPUT
{
@ -138,9 +155,37 @@ struct PS_INPUT
float4 psmain(PS_INPUT src) : SV_Target
{
float4 temp = src.vColor0;
if(uSamplerEnable) temp *= uTexture0.Sample(uSampler0,src.vTexcoord0);
return temp;
if (uBlendPass)
{
float4 temp = src.vColor0;
if(uSamplerEnable) temp *= uTexture0.Sample(uSampler0, src.vTexcoord0);
if (uBlendEnable)
{
if (temp.a != 1.0)
{
float4 prev = uTexture1.Sample(uSampler1, src.vPosition.xy / uSamplerSize);
if (temp.a == 0.0)
{
temp = prev;
}
else
{
float alpha = prev.a + temp.a - (prev.a * temp.a);
temp.r = ((temp.r * temp.a) + (prev.r * prev.a * (1.0 - temp.a))) / alpha;
temp.g = ((temp.g * temp.a) + (prev.g * prev.a * (1.0 - temp.a))) / alpha;
temp.b = ((temp.b * temp.a) + (prev.b * prev.a * (1.0 - temp.a))) / alpha;
temp.a = alpha;
}
}
}
return temp;
}
else
{
return uTexture1.Sample(uSampler1, src.vPosition.xy / uSamplerSize);
}
}
";
@ -167,8 +212,9 @@ void main()
public const string ImGuiPixelShader_gl = @"
//opengl 3.2
#version 150
uniform bool uSamplerEnable;
uniform sampler2D uSampler0;
uniform bool uSamplerEnable, uBlendPass, uBlendEnable;
uniform vec2 uSamplerSize;
uniform sampler2D uSampler0, uSampler1;
in vec2 vTexcoord0;
in vec4 vColor0;
@ -177,9 +223,37 @@ out vec4 FragColor;
void main()
{
vec4 temp = vColor0;
if(uSamplerEnable) temp *= texture(uSampler0, vTexcoord0);
FragColor = temp;
if (uBlendPass)
{
vec4 temp = vColor0;
if(uSamplerEnable) temp *= texture(uSampler0, vTexcoord0);
if (uBlendEnable)
{
if (temp.a != 1.0)
{
vec4 prev = texture(uSampler1, gl_FragCoord.xy / uSamplerSize);
if (temp.a == 0.0)
{
temp = prev;
}
else
{
float alpha = prev.a + temp.a - (prev.a * temp.a);
temp.r = ((temp.r * temp.a) + (prev.r * prev.a * (1.0 - temp.a))) / alpha;
temp.g = ((temp.g * temp.a) + (prev.g * prev.a * (1.0 - temp.a))) / alpha;
temp.b = ((temp.b * temp.a) + (prev.b * prev.a * (1.0 - temp.a))) / alpha;
temp.a = alpha;
}
}
}
FragColor = temp;
}
else
{
FragColor = texture(uSampler1, gl_FragCoord.xy / uSamplerSize);
}
}";
}
}

View File

@ -62,13 +62,7 @@ namespace BizHawk.Bizware.Graphics
/// <summary>
/// Enables normal (non-premultiplied) alpha blending.
/// </summary>
void EnableBlendNormal();
/// <summary>
/// Enables alpha blending (non-alpha values are copied from the source fragment).
/// This mimics GDI+ blending
/// </summary>
void EnableBlendAlpha();
void EnableBlending();
/// <summary>
/// Disables blending (alpha values are copied from the source fragment)

View File

@ -58,20 +58,13 @@ namespace BizHawk.Bizware.Graphics
GL.Clear(ClearBufferMask.ColorBufferBit);
}
public void EnableBlendNormal()
public void EnableBlending()
{
GL.Enable(EnableCap.Blend);
GL.BlendEquation(GLEnum.FuncAdd);
GL.BlendFuncSeparate(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha, BlendingFactor.One, BlendingFactor.OneMinusSrcAlpha);
}
public void EnableBlendAlpha()
{
GL.Enable(EnableCap.Blend);
GL.BlendEquation(GLEnum.FuncAdd);
GL.BlendFuncSeparate(BlendingFactor.One, BlendingFactor.Zero, BlendingFactor.One, BlendingFactor.OneMinusSrcAlpha);
}
public void DisableBlending()
=> GL.Disable(EnableCap.Blend);

View File

@ -87,7 +87,7 @@ namespace BizHawk.Bizware.Graphics
}
public void EnableBlending()
=> Owner.EnableBlendNormal();
=> Owner.EnableBlending();
public void DisableBlending()
=> Owner.DisableBlending();

View File

@ -116,7 +116,7 @@ namespace BizHawk.Bizware.Graphics
public void EnableBlending()
{
Flush();
Owner.EnableBlendNormal();
Owner.EnableBlending();
}
public void DisableBlending()

View File

@ -53,6 +53,8 @@ namespace BizHawk.Bizware.Graphics
}
private readonly HashSet<GCHandle> _gcHandles = [ ];
private ITexture2D _stringTexture;
private IRenderTarget _pass1RenderTarget;
protected virtual float RenderThickness => 1;
@ -63,8 +65,7 @@ namespace BizHawk.Bizware.Graphics
protected bool _hasClearPending;
protected Bitmap _stringOutput;
protected SDGraphics _stringGraphics;
protected ITexture2D _stringTexture;
protected IRenderTarget _renderTarget;
protected IRenderTarget _pass2RenderTarget;
public ImGui2DRenderer(IGL igl, ImGuiResourceCache resourceCache)
{
@ -83,8 +84,10 @@ namespace BizHawk.Bizware.Graphics
public void Dispose()
{
ClearGCHandles();
_renderTarget?.Dispose();
_renderTarget = null;
_pass2RenderTarget?.Dispose();
_pass2RenderTarget = null;
_pass1RenderTarget?.Dispose();
_pass1RenderTarget = null;
_stringTexture?.Dispose();
_stringTexture = null;
_stringGraphics?.Dispose();
@ -160,21 +163,34 @@ namespace BizHawk.Bizware.Graphics
{
None,
DisableBlending,
EnableBlendAlpha,
EnableBlendNormal,
EnableBlending,
DrawString,
}
private void PerformPasses(ImDrawCmdPtr cmd)
{
if (EnableBlending)
{
_pass1RenderTarget.Bind();
_resourceCache.SetBlendingParamters(_pass2RenderTarget, false);
_igl.DrawIndexed((int)cmd.ElemCount, (int)cmd.IdxOffset, (int)cmd.VtxOffset);
_pass2RenderTarget.Bind();
_resourceCache.SetBlendingParamters(_pass1RenderTarget, true);
_igl.DrawIndexed((int)cmd.ElemCount, (int)cmd.IdxOffset, (int)cmd.VtxOffset);
}
else
{
_resourceCache.SetBlendingParamters(null, true);
_igl.DrawIndexed((int)cmd.ElemCount, (int)cmd.IdxOffset, (int)cmd.VtxOffset);
}
}
protected virtual void RenderInternal(int width, int height)
{
if (EnableBlending)
{
_igl.EnableBlendAlpha();
}
else
{
_igl.DisableBlending();
}
// we handle blending programmatically with 2 passes
// therefore, we disable normal blending operations
_igl.DisableBlending();
_igl.BindPipeline(_resourceCache.Pipeline);
_resourceCache.SetProjection(width, height);
@ -229,21 +245,16 @@ namespace BizHawk.Bizware.Graphics
_resourceCache.SetTexture(null);
}
_igl.DrawIndexed((int)cmd.ElemCount, (int)cmd.IdxOffset, (int)cmd.VtxOffset);
PerformPasses(cmd);
tempTex?.Dispose();
break;
}
case DrawCallbackId.DisableBlending:
_igl.DisableBlending();
EnableBlending = false;
break;
case DrawCallbackId.EnableBlendAlpha:
_igl.EnableBlendAlpha();
case DrawCallbackId.EnableBlending:
EnableBlending = true;
break;
case DrawCallbackId.EnableBlendNormal:
_igl.EnableBlendNormal();
break;
case DrawCallbackId.DrawString:
{
var stringArgs = (DrawStringArgs)GCHandle.FromIntPtr(cmd.UserCallbackData).Target!;
@ -264,21 +275,9 @@ namespace BizHawk.Bizware.Graphics
throw new InvalidOperationException("Unexpected bitmap mismatch!");
}
// we want to normal blend the text image rather than alpha blend it (matches GDI+ behavior it seems?)
if (EnableBlending)
{
_igl.EnableBlendNormal();
}
_stringTexture.LoadFrom(new BitmapBuffer(userTex.Bitmap, new()));
_stringTexture.LoadFrom(new BitmapBuffer(_stringOutput, new()));
_resourceCache.SetTexture(_stringTexture);
_igl.DrawIndexed((int)lastCmd.ElemCount, (int)lastCmd.IdxOffset, (int)lastCmd.VtxOffset);
if (EnableBlending)
{
_igl.EnableBlendAlpha();
}
PerformPasses(lastCmd);
ClearStringOutput();
}
@ -294,10 +293,12 @@ namespace BizHawk.Bizware.Graphics
{
var needsRender = _imGuiDrawList.VtxBuffer.Size > 0 || _imGuiDrawList.IdxBuffer.Size > 0 || _hasDrawStringCommand;
var needsClear = needsRender || _hasClearPending;
if (_renderTarget == null || _renderTarget.Width != width || _renderTarget.Height != height)
if (_pass1RenderTarget == null || _pass1RenderTarget.Width != width || _pass1RenderTarget.Height != height)
{
_renderTarget?.Dispose();
_renderTarget = _igl.CreateRenderTarget(width, height);
_pass1RenderTarget?.Dispose();
_pass1RenderTarget = _igl.CreateRenderTarget(width, height);
_pass2RenderTarget?.Dispose();
_pass2RenderTarget = _igl.CreateRenderTarget(width, height);
needsClear = true;
}
@ -314,7 +315,7 @@ namespace BizHawk.Bizware.Graphics
_stringTexture = _igl.CreateTexture(width, height);
}
_renderTarget.Bind();
_pass2RenderTarget.Bind();
_igl.SetViewport(width, height);
if (needsClear)
@ -347,7 +348,7 @@ namespace BizHawk.Bizware.Graphics
ResetDrawList();
}
return _renderTarget;
return _pass2RenderTarget;
}
public void Clear()
@ -375,7 +376,7 @@ namespace BizHawk.Bizware.Graphics
break;
// CompositingMode.SourceOver means enable blending
case false when value == CompositingMode.SourceOver:
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendAlpha, IntPtr.Zero);
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlending, IntPtr.Zero);
_pendingBlendEnable = true;
break;
}
@ -384,6 +385,11 @@ namespace BizHawk.Bizware.Graphics
public void DrawBezier(Color color, Point pt1, Point pt2, Point pt3, Point pt4)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
_imGuiDrawList.AddBezierCubic(
p1: pt1.ToVector(),
p2: pt2.ToVector(),
@ -391,6 +397,11 @@ namespace BizHawk.Bizware.Graphics
p4: pt4.ToVector(),
col: (uint)color.ToArgb(),
thickness: RenderThickness);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void DrawBeziers(Color color, Point[] points)
@ -404,6 +415,11 @@ namespace BizHawk.Bizware.Graphics
var col = (uint)color.ToArgb();
for (var i = 1; i < points.Length; i += 3)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
_imGuiDrawList.AddBezierCubic(
p1: startPt.ToVector(),
p2: points[i + 0].ToVector(),
@ -412,11 +428,21 @@ namespace BizHawk.Bizware.Graphics
col: col,
thickness: RenderThickness);
startPt = points[i + 2];
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
}
public void DrawRectangle(Color color, int x, int y, int width, int height)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
// we don't use AddRect as we want to avoid double drawing at the corners
// as that produces artifacts with alpha blending
@ -428,30 +454,56 @@ namespace BizHawk.Bizware.Graphics
if (width == 1 || height == 1)
{
// width or height of 1 is just a single line
DrawLine(color, x, y, right, bottom);
DrawLineInternal(color, x, y, right, bottom);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
return;
}
// top left to top right
DrawLine(color, x, y, right, y);
DrawLineInternal(color, x, y, right, y);
// top right (and 1 pixel down) to bottom right
DrawLine(color, right, y + 1, right, bottom);
DrawLineInternal(color, right, y + 1, right, bottom);
// bottom right (and 1 pixel left) to bottom left
DrawLine(color, right - 1, bottom, x, bottom);
DrawLineInternal(color, right - 1, bottom, x, bottom);
// bottom left (and 1 pixel up) to top left (and 1 pixel down)
DrawLine(color, x, bottom - 1, x, y + 1);
DrawLineInternal(color, x, bottom - 1, x, y + 1);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void FillRectangle(Color color, int x, int y, int width, int height)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
_imGuiDrawList.AddRectFilled(
p_min: new(x, y),
p_max: new(x + width, y + height),
col: (uint)color.ToArgb());
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void DrawEllipse(Color color, int x, int y, int width, int height)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
var radius = new Vector2(width / 2.0f, height / 2.0f);
_imGuiDrawList.AddEllipse(
center: new(x + radius.X, y + radius.Y),
@ -460,25 +512,34 @@ namespace BizHawk.Bizware.Graphics
rot: 0,
num_segments: 0,
RenderThickness);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void FillEllipse(Color color, int x, int y, int width, int height)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
var radius = new Vector2(width / 2.0f, height / 2.0f);
_imGuiDrawList.AddEllipseFilled(
center: new(x + radius.X, y + radius.Y),
radius: radius,
col: (uint)color.ToArgb());
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void DrawImage(Bitmap image, int x, int y)
{
// use normal blending for images
if (_pendingBlendEnable)
{
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendNormal, IntPtr.Zero);
}
var texture = new ImGuiUserTexture { Bitmap = image, WantCache = false };
var handle = GCHandle.Alloc(texture, GCHandleType.Normal);
_gcHandles.Add(handle);
@ -486,21 +547,10 @@ namespace BizHawk.Bizware.Graphics
user_texture_id: GCHandle.ToIntPtr(handle),
p_min: new(x, y),
p_max: new(x + image.Width, y + image.Height));
if (_pendingBlendEnable)
{
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendAlpha, IntPtr.Zero);
}
}
public void DrawImage(Bitmap image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, bool cache)
{
// use normal blending for images
if (_pendingBlendEnable)
{
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendNormal, IntPtr.Zero);
}
var texture = new ImGuiUserTexture { Bitmap = image, WantCache = cache };
var handle = GCHandle.Alloc(texture, GCHandleType.Normal);
_gcHandles.Add(handle);
@ -512,14 +562,9 @@ namespace BizHawk.Bizware.Graphics
p_max: new(destRect.Right, destRect.Bottom),
uv_min: new(srcX / imgWidth, srcY / imgHeight),
uv_max: new((srcX + srcWidth) / imgWidth, (srcY + srcHeight) / imgHeight));
if (_pendingBlendEnable)
{
_imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendAlpha, IntPtr.Zero);
}
}
public void DrawLine(Color color, int x1, int y1, int x2, int y2)
private void DrawLineInternal(Color color, int x1, int y1, int x2, int y2)
{
var p1 = new Vector2(x1, y1);
var p2 = new Vector2(x2, y2);
@ -553,8 +598,28 @@ namespace BizHawk.Bizware.Graphics
_imGuiDrawList.PathStroke((uint)color.ToArgb(), 0, RenderThickness);
}
public void DrawLine(Color color, int x1, int y1, int x2, int y2)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
DrawLineInternal(color, x1, y1, x2, y2);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void DrawPie(Color color, int x, int y, int width, int height, int startAngle, int sweepAngle)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
var radius = new Vector2(width / 2.0f, height / 2.0f);
var center = new Vector2(x + radius.X, y + radius.Y);
var aMin = (float)(Math.PI / 180 * startAngle);
@ -562,10 +627,20 @@ namespace BizHawk.Bizware.Graphics
_imGuiDrawList.PathEllipticalArcTo(center, radius, 0, aMin, aMax);
_imGuiDrawList.PathLineTo(center);
_imGuiDrawList.PathStroke((uint)color.ToArgb(), ImDrawFlags.Closed, RenderThickness);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public void FillPie(Color color, int x, int y, int width, int height, int startAngle, int sweepAngle)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
var radius = new Vector2(width / 2.0f, height / 2.0f);
var center = new Vector2(x + radius.X, y + radius.Y);
var aMin = (float)(Math.PI / 180 * startAngle);
@ -573,6 +648,11 @@ namespace BizHawk.Bizware.Graphics
_imGuiDrawList.PathEllipticalArcTo(center, radius, 0, aMin, aMax);
_imGuiDrawList.PathLineTo(center);
_imGuiDrawList.PathFillConvex((uint)color.ToArgb());
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
public unsafe void DrawPolygon(Color color, Point[] points)
@ -580,12 +660,22 @@ namespace BizHawk.Bizware.Graphics
var vectorPoints = Array.ConvertAll(points, static p => new Vector2(p.X + 0.5f, p.Y + 0.5f));
fixed (Vector2* p = vectorPoints)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
_imGuiDrawList.AddPolyline(
points: ref *p,
num_points: vectorPoints.Length,
col: (uint)color.ToArgb(),
flags: ImDrawFlags.Closed,
thickness: RenderThickness);
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
}
@ -594,10 +684,20 @@ namespace BizHawk.Bizware.Graphics
var vectorPoints = Array.ConvertAll(points, static p => new Vector2(p.X + 0.5f, p.Y + 0.5f));
fixed (Vector2* p = vectorPoints)
{
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
_imGuiDrawList.AddConcavePolyFilled(
points: ref *p,
num_points: vectorPoints.Length,
col: (uint)color.ToArgb());
if (color.A != 0xFF)
{
_imGuiDrawList.AddDrawCmd();
}
}
}

View File

@ -102,7 +102,7 @@ namespace BizHawk.Bizware.Graphics
protected override void RenderInternal(int width, int height)
{
var rt = (GDIPlusRenderTarget)_renderTarget;
var rt = (GDIPlusRenderTarget)_pass2RenderTarget;
var bmpData = rt.SDBitmap.LockBits(rt.GetRectangle(), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
try
{
@ -172,8 +172,7 @@ namespace BizHawk.Bizware.Graphics
case DrawCallbackId.DisableBlending:
_ = SDL_SetRenderDrawBlendMode(sdlRenderer, SDL_BlendMode.SDL_BLENDMODE_NONE);
break;
case DrawCallbackId.EnableBlendAlpha:
case DrawCallbackId.EnableBlendNormal:
case DrawCallbackId.EnableBlending:
_ = SDL_SetRenderDrawBlendMode(sdlRenderer, SDL_BlendMode.SDL_BLENDMODE_BLEND);
break;
case DrawCallbackId.DrawString: