diff --git a/src/graphics/renderers/GameRenderer.cpp b/src/graphics/renderers/GameRenderer.cpp index 47436a8..b03b1d4 100644 --- a/src/graphics/renderers/GameRenderer.cpp +++ b/src/graphics/renderers/GameRenderer.cpp @@ -431,6 +431,8 @@ void GameRenderer::renderPlayingState( // Pause overlay (skip when visuals are suppressed, e.g., countdown) if (!suppressPauseVisuals && game->isPaused() && !showExitConfirmPopup) { SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + + // Draw blur effect around the grid (keep in logical coordinates) for (int i = -4; i <= 4; ++i) { float spread = static_cast(std::abs(i)); Uint8 alpha = Uint8(std::max(8.f, 32.f - spread * 4.f)); @@ -443,14 +445,41 @@ void GameRenderer::renderPlayingState( }; SDL_RenderFillRect(renderer, &blurRect); } - SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + + // Switch to window coordinates for the full-screen overlay and text + SDL_Rect oldViewport; + SDL_GetRenderViewport(renderer, &oldViewport); + float oldScaleX, oldScaleY; + SDL_GetRenderScale(renderer, &oldScaleX, &oldScaleY); + + SDL_SetRenderViewport(renderer, nullptr); + SDL_SetRenderScale(renderer, 1.0f, 1.0f); + + // Draw full screen overlay SDL_SetRenderDrawColor(renderer, 0, 0, 0, 180); - SDL_FRect pauseOverlay{0, 0, logicalW, logicalH}; + SDL_FRect pauseOverlay{0, 0, winW, winH}; SDL_RenderFillRect(renderer, &pauseOverlay); - pixelFont->draw(renderer, logicalW * 0.5f - 80, logicalH * 0.5f - 20, "PAUSED", 2.0f, {255, 255, 255, 255}); - pixelFont->draw(renderer, logicalW * 0.5f - 120, logicalH * 0.5f + 30, "Press P to resume", 0.8f, {200, 200, 220, 255}); + // Draw centered text + // Note: We multiply font scale by logicalScale to maintain consistent size + // since we reset the renderer scale to 1.0 + const char* pausedText = "PAUSED"; + float pausedScale = 2.0f * logicalScale; + int pW = 0, pH = 0; + pixelFont->measure(pausedText, pausedScale, pW, pH); + pixelFont->draw(renderer, (winW - pW) * 0.5f, (winH - pH) * 0.5f - (20 * logicalScale), pausedText, pausedScale, {255, 255, 255, 255}); + + const char* resumeText = "Press P to resume"; + float resumeScale = 0.8f * logicalScale; + int rW = 0, rH = 0; + pixelFont->measure(resumeText, resumeScale, rW, rH); + pixelFont->draw(renderer, (winW - rW) * 0.5f, (winH - pH) * 0.5f + (40 * logicalScale), resumeText, resumeScale, {200, 200, 220, 255}); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + + // Restore previous render state + SDL_SetRenderViewport(renderer, &oldViewport); + SDL_SetRenderScale(renderer, oldScaleX, oldScaleY); } // Exit confirmation popup styled like other retro panels