diff --git a/src/BizHawk.Bizware.Graphics/Renderers/ImGui2DRenderer.cs b/src/BizHawk.Bizware.Graphics/Renderers/ImGui2DRenderer.cs index 99737ce5b5..afe48c4c14 100644 --- a/src/BizHawk.Bizware.Graphics/Renderers/ImGui2DRenderer.cs +++ b/src/BizHawk.Bizware.Graphics/Renderers/ImGui2DRenderer.cs @@ -280,7 +280,11 @@ namespace BizHawk.Bizware.Graphics { ClearStringOutput(); // synthesize an add image command for our string bitmap - _imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendNormal, IntPtr.Zero); + if (!_pendingBlendEnable) + { + // always normal blend the string (it covers the entire image, if it was alpha that'd obscure everything else) + _imGuiDrawList.AddCallback((IntPtr)DrawCallbackId.EnableBlendNormal, IntPtr.Zero); + } DrawImage(_stringOutput, 0, 0); } @@ -405,6 +409,12 @@ namespace BizHawk.Bizware.Graphics 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); @@ -412,10 +422,21 @@ 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); @@ -427,6 +448,11 @@ 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) diff --git a/src/BizHawk.Client.Common/Api/Classes/GuiApi.cs b/src/BizHawk.Client.Common/Api/Classes/GuiApi.cs index 8de444c5ba..e4606f8e6e 100644 --- a/src/BizHawk.Client.Common/Api/Classes/GuiApi.cs +++ b/src/BizHawk.Client.Common/Api/Classes/GuiApi.cs @@ -370,6 +370,8 @@ namespace BizHawk.Client.Common var r = Get2DRenderer(surfaceID); var w = Math.Max(width, 1); var h = Math.Max(height, 1); + // GDI+ had an off by one here, we increment width and height to preserve backwards compatibility + w++; h++; r.DrawRectangle(line ?? _defaultForeground, x, y, w, h); var bg = background ?? _defaultBackground; if (bg != null) r.FillRectangle(bg.Value, x + 1, y + 1, Math.Max(w - 2, 0), Math.Max(h - 2, 0));