From c0c8c6682449c9a72a57ff5093e7ad23a2832d2c Mon Sep 17 00:00:00 2001 From: Blue Date: Sun, 24 Jan 2021 11:40:39 +0100 Subject: [PATCH] Winform GDI: Handle y ranges This is badly handled and X still left --- ProjectPSX.WinForms/UI/Window.cs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/ProjectPSX.WinForms/UI/Window.cs b/ProjectPSX.WinForms/UI/Window.cs index c0707ea..9089768 100644 --- a/ProjectPSX.WinForms/UI/Window.cs +++ b/ProjectPSX.WinForms/UI/Window.cs @@ -63,7 +63,6 @@ namespace ProjectPSX { FormBorderStyle = FormBorderStyle.FixedDialog; KeyUp += new KeyEventHandler(vramViewerToggle); - screen.Size = _640x480; screen.Margin = new Padding(0); screen.MouseDoubleClick += new MouseEventHandler(toggleDebug); @@ -144,14 +143,12 @@ namespace ProjectPSX { [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Render(int[] vram) { //Console.WriteLine($"x1 {displayX1} x2 {displayX2} y1 {displayY1} y2 {displayY2}"); - int horizontalStart = 0; + int horizontalEnd = horizontalRes; - int verticalStart = 0; int verticalEnd = verticalRes; if (isVramViewer) { horizontalEnd = 1024; - verticalStart = 0; verticalEnd = 512; Marshal.Copy(vram, 0, display.BitmapData, 0x80000); @@ -166,17 +163,14 @@ namespace ProjectPSX { using var deviceContext = new GdiDeviceContext(screen.Handle); Gdi32.StretchBlt(deviceContext, 0, 0, screen.Width, screen.Height, - display.DeviceContext, horizontalStart, verticalStart, horizontalEnd, verticalEnd, + display.DeviceContext, 0, 0, horizontalEnd, verticalEnd, RasterOp.SRCCOPY); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void blit24bpp(int[] vramBits) { - int range = (240 - (displayY2 - displayY1)) / 2; - - int yRangeOffset; - if (range < 0) yRangeOffset = 0; - else yRangeOffset = range; + int yRangeOffset = (240 - (displayY2 - displayY1)) >> (verticalRes == 480 ? 0 : 1); + if (yRangeOffset < 0) yRangeOffset = 0; for (int y = yRangeOffset; y < verticalRes - yRangeOffset; y++) { int offset = 0; @@ -213,11 +207,8 @@ namespace ProjectPSX { private void blit16bpp(int[] vramBits) { //Console.WriteLine($"x1 {displayX1} x2 {displayX2} y1 {displayY1} y2 {displayY2}"); //Console.WriteLine($"Display Height {display.Height} Width {display.Width}"); - int range = (240 - (displayY2 - displayY1)) / 2; - - int yRangeOffset; - if (range < 0) yRangeOffset = 0; - else yRangeOffset = range; + int yRangeOffset = (240 - (displayY2 - displayY1)) >> (verticalRes == 480 ? 0 : 1); + if (yRangeOffset < 0) yRangeOffset = 0; for (int y = yRangeOffset; y < verticalRes - yRangeOffset; y++) { for (int x = 0; x < horizontalRes; x++) { @@ -251,6 +242,7 @@ namespace ProjectPSX { this.horizontalRes = horizontalRes; this.verticalRes = verticalRes; + clearDisplay(); //Console.WriteLine($"setDisplayMode {horizontalRes} {verticalRes} {is24BitDepth}"); } @@ -285,9 +277,15 @@ namespace ProjectPSX { screen.Size = _640x480; } isVramViewer = !isVramViewer; + clearDisplay(); } } + private unsafe void clearDisplay() { + Span span = new Span(display.BitmapData.ToPointer(), 0x80000); + span.Clear(); + } + public void Play(byte[] samples) { buffer.AddSamples(samples, 0, samples.Length);