diff --git a/CHANGES b/CHANGES index 4a5e142d7..a8593d2cc 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Emulation fixes: - GBA Video: Fix scanline cache with scale factor change edge cases - GBA DMA: Fix DMA0-2 lengths (fixes mgba.io/i/1344) - GB Video: Fix window y changing mid-window (fixes mgba.io/i/1345) + - GB Video: Fix more window edge cases (fixes mgba.io/i/1346) Other fixes: - Qt: More app metadata fixes - Qt: Fix load recent from archive (fixes mgba.io/i/1325) diff --git a/cinema/gb/window/rfs-hud/baseline_0000.png b/cinema/gb/window/rfs-hud/baseline_0000.png new file mode 100644 index 000000000..a4199c67a Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0000.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0001.png b/cinema/gb/window/rfs-hud/baseline_0001.png new file mode 100644 index 000000000..a4199c67a Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0001.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0002.png b/cinema/gb/window/rfs-hud/baseline_0002.png new file mode 100644 index 000000000..d8c767203 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0002.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0003.png b/cinema/gb/window/rfs-hud/baseline_0003.png new file mode 100644 index 000000000..d8c767203 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0003.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0004.png b/cinema/gb/window/rfs-hud/baseline_0004.png new file mode 100644 index 000000000..d8c767203 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0004.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0005.png b/cinema/gb/window/rfs-hud/baseline_0005.png new file mode 100644 index 000000000..d8c767203 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0005.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0006.png b/cinema/gb/window/rfs-hud/baseline_0006.png new file mode 100644 index 000000000..7489e9768 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0006.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0007.png b/cinema/gb/window/rfs-hud/baseline_0007.png new file mode 100644 index 000000000..7489e9768 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0007.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0008.png b/cinema/gb/window/rfs-hud/baseline_0008.png new file mode 100644 index 000000000..7489e9768 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0008.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0009.png b/cinema/gb/window/rfs-hud/baseline_0009.png new file mode 100644 index 000000000..7489e9768 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0009.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0010.png b/cinema/gb/window/rfs-hud/baseline_0010.png new file mode 100644 index 000000000..334806217 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0010.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0011.png b/cinema/gb/window/rfs-hud/baseline_0011.png new file mode 100644 index 000000000..334806217 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0011.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0012.png b/cinema/gb/window/rfs-hud/baseline_0012.png new file mode 100644 index 000000000..334806217 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0012.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0013.png b/cinema/gb/window/rfs-hud/baseline_0013.png new file mode 100644 index 000000000..334806217 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0013.png differ diff --git a/cinema/gb/window/rfs-hud/baseline_0014.png b/cinema/gb/window/rfs-hud/baseline_0014.png new file mode 100644 index 000000000..7c444e005 Binary files /dev/null and b/cinema/gb/window/rfs-hud/baseline_0014.png differ diff --git a/cinema/gb/window/rfs-hud/test.mvl b/cinema/gb/window/rfs-hud/test.mvl new file mode 100644 index 000000000..7b25a4ba0 Binary files /dev/null and b/cinema/gb/window/rfs-hud/test.mvl differ diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 169dadf74..4960b395c 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -224,25 +224,22 @@ static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) { return; } - if (renderer->lastY >= renderer->wy) { + if (renderer->lastY >= oldWy) { if (!after) { renderer->currentWy -= renderer->lastY; renderer->hasWindow = true; } else if (!before) { if (!renderer->hasWindow) { - if (renderer->lastY > renderer->wy) { - renderer->currentWy = GB_VIDEO_VERTICAL_PIXELS; - } else { - renderer->currentWy = renderer->lastY - renderer->wy; - if (renderer->lastY == renderer->wy && renderer->lastX > renderer->wx) { - ++renderer->currentWy; - } + renderer->currentWy = renderer->lastY - renderer->wy; + if (renderer->lastY >= renderer->wy && renderer->lastX > renderer->wx) { + ++renderer->currentWy; } } else { renderer->currentWy += renderer->lastY; } } else if (renderer->wy != oldWy) { renderer->currentWy += oldWy - renderer->wy; + renderer->hasWindow = true; } } } @@ -508,7 +505,10 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i if (GBRegisterLCDCIsBgEnable(softwareRenderer->lcdc) || softwareRenderer->model >= GB_MODEL_CGB) { int wy = softwareRenderer->wy + softwareRenderer->currentWy; int wx = softwareRenderer->wx + softwareRenderer->currentWx - 7; - if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy <= y && wx <= endX) { + if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy == y && wx <= endX) { + softwareRenderer->hasWindow = true; + } + if (softwareRenderer->hasWindow && wx <= endX) { if (wx > 0 && !softwareRenderer->d.disableBG) { GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, wx, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy); }