Files
spacetris/src/graphics/Font.cpp
Gregor Klevze 6d4f3c54ed Add exit-confirm modal (fullscreen dim, centered P2 text) and keyboard shortcuts
Add an in-game exit confirmation modal for Playing state: ESC opens modal and pauses the game; YES resets and returns to Menu; NO hides modal and resumes.
Draw a full-window translucent dim background (reset viewport) so overlay covers any window size / fullscreen.
Use PressStart2P (pixel P2) font for all modal text and center title/body/button labels using measured text widths.
Add FontAtlas::measure(...) to accurately measure text sizes (used for proper centering).
Ensure popup rendering and mouse hit-testing use the same logical/content-local coordinate math so visuals and clicks align.
Add keyboard shortcuts for modal (Enter = confirm, Esc = cancel) and suppress other gameplay input while modal is active.
Add helper scripts for debug build+run: build-debug-and-run.ps1 and build-debug-and-run.bat.
Minor fixes to related rendering & state wiring; verified Debug build completes and modal behavior in runtime.
2025-08-16 19:40:23 +02:00

37 lines
1.7 KiB
C++

// Font.cpp - implementation of FontAtlas (copied into src/graphics)
#include "graphics/Font.h"
#include <SDL3/SDL.h>
bool FontAtlas::init(const std::string& path, int basePt) { fontPath = path; baseSize = basePt; return true; }
void FontAtlas::shutdown() { for (auto &kv : cache) if (kv.second) TTF_CloseFont(kv.second); cache.clear(); }
TTF_Font* FontAtlas::getSized(int ptSize) {
auto it = cache.find(ptSize); if (it!=cache.end()) return it->second;
TTF_Font* f = TTF_OpenFont(fontPath.c_str(), ptSize);
if (!f) return nullptr; cache[ptSize] = f; return f;
}
void FontAtlas::draw(SDL_Renderer* r, float x, float y, const std::string& text, float scale, SDL_Color color) {
if (scale <= 0) return; int pt = int(baseSize * scale); if (pt < 8) pt = 8; TTF_Font* f = getSized(pt); if (!f) return;
SDL_Surface* surf = TTF_RenderText_Blended(f, text.c_str(), text.length(), color); if (!surf) return;
SDL_Texture* tex = SDL_CreateTextureFromSurface(r, surf);
if (tex) { SDL_FRect dst{ x, y, (float)surf->w, (float)surf->h }; SDL_RenderTexture(r, tex, nullptr, &dst); SDL_DestroyTexture(tex); }
SDL_DestroySurface(surf);
}
void FontAtlas::measure(const std::string& text, float scale, int& outW, int& outH) {
outW = 0; outH = 0;
if (scale <= 0) return;
int pt = int(baseSize * scale);
if (pt < 1) pt = 1;
TTF_Font* f = getSized(pt);
if (!f) return;
// Use render-to-surface measurement to avoid dependency on specific TTF_* measurement API variants
SDL_Color dummy = {255,255,255,255};
SDL_Surface* surf = TTF_RenderText_Blended(f, text.c_str(), text.length(), dummy);
if (!surf) return;
outW = surf->w; outH = surf->h;
SDL_DestroySurface(surf);
}