// Font.cpp - implementation of FontAtlas (copied into src/graphics) #include "graphics/Font.h" #include 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); }