// // Created by bruno on 1.2.2025. // #include "font.h" BitmapFont fonts[fontCount]; BitmapFont prepText(SDL_Renderer *renderer, unsigned char pxSize, const char *file) { TTF_Font *gFont = TTF_OpenFont(file, pxSize); BitmapFont out; out.size = pxSize; out.color = (SDL_Color) {255, 255, 255, 255}; const int glyphsPerRow = 16; const int glyphsPerCol = 16; const int atlasWidth = glyphsPerRow * (pxSize + 1); const int atlasHeight = glyphsPerCol * (pxSize + 1); SDL_Surface *atlasSurface = SDL_CreateRGBSurface(0, atlasWidth, atlasHeight, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); out.atlasRect.x = 0; out.atlasRect.y = 0; out.atlasRect.w = atlasWidth; out.atlasRect.h = atlasHeight; SDL_FillRect(atlasSurface, NULL, SDL_MapRGBA(atlasSurface->format, 0, 0, 0, 0)); // transparent for (uint16_t i = 1; i < 256; i++) { SDL_Surface *surf; if (i == 173) { surf = SDL_CreateRGBSurface(0, pxSize, pxSize, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); SDL_FillRect(surf, NULL, SDL_MapRGBA(surf->format, 0, 0, 0, 0)); // transparent } else { char tmpOut[2] = {i, 0}; surf = TTF_RenderText_Solid(gFont, tmpOut, out.color); } int x = (i % glyphsPerRow) * (pxSize + 1); int y = (i / glyphsPerRow) * (pxSize + 1); SDL_Rect dest = {x, y, pxSize, pxSize}; SDL_BlitSurface(surf, NULL, atlasSurface, &dest); out.glyphs[i] = dest; SDL_FreeSurface(surf); } out.atlas = SDL_CreateTextureFromSurface(renderer, atlasSurface); SDL_SetTextureBlendMode(out.atlas, SDL_BLENDMODE_BLEND); SDL_FreeSurface(atlasSurface); TTF_CloseFont(gFont); return out; } void renderText(SDL_Renderer *renderer, BitmapFont font, char *string, uint16_t x, uint16_t y) { SDL_Rect outRect; outRect.x = x; outRect.y = y; outRect.w = font.size; outRect.h = font.size; while (*string) { if (*string == '\n') { outRect.x = x; outRect.y += outRect.h + 4; string++; continue; } SDL_RenderCopy(renderer, font.atlas, &font.glyphs[*string], &outRect); //TODO CONSIDER FONTS IN ONE ATLAS outRect.x += outRect.w + 1; string++; } } void destroyFont(BitmapFont *font) { for (uint16_t i = 1; i < 256; i++) { SDL_DestroyTexture(font->atlas); } }