84 lines
2.5 KiB
C
84 lines
2.5 KiB
C
//
|
|
// 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);
|
|
}
|
|
} |