111 lines
2.2 KiB
C
111 lines
2.2 KiB
C
// /**
|
|
// * Copyright (c) 2025 Dominic Masters
|
|
// *
|
|
// * This software is released under the MIT License.
|
|
// * https://opensource.org/licenses/MIT
|
|
// */
|
|
|
|
#include "uitext.h"
|
|
#include "assert/assert.h"
|
|
#include "util/memory.h"
|
|
#include "display/spritebatch.h"
|
|
|
|
void uiTextDrawChar(
|
|
const float_t x,
|
|
const float_t y,
|
|
const char_t c,
|
|
const color_t color,
|
|
const tileset_t *tileset,
|
|
texture_t *texture
|
|
) {
|
|
int32_t tileIndex = (int32_t)(c) - UI_TEXT_CHAR_START;
|
|
if(tileIndex < 0 || tileIndex >= tileset->tileCount) {
|
|
tileIndex = ((int32_t)'@') - UI_TEXT_CHAR_START;
|
|
}
|
|
|
|
assertTrue(
|
|
tileIndex >= 0 && tileIndex <= tileset->tileCount,
|
|
"Character is out of bounds for font tiles"
|
|
);
|
|
|
|
vec4 uv;
|
|
tilesetTileGetUV(tileset, tileIndex, uv);
|
|
|
|
spriteBatchPush(
|
|
texture,
|
|
x, y,
|
|
x + tileset->tileWidth,
|
|
y + tileset->tileHeight,
|
|
color,
|
|
uv[0], uv[1], uv[2], uv[3]
|
|
);
|
|
}
|
|
|
|
void uiTextDraw(
|
|
const float_t x,
|
|
const float_t y,
|
|
const char_t *text,
|
|
const color_t color,
|
|
const tileset_t *tileset,
|
|
texture_t *texture
|
|
) {
|
|
assertNotNull(text, "Text cannot be NULL");
|
|
|
|
float_t posX = x;
|
|
float_t posY = y;
|
|
|
|
char_t c;
|
|
int32_t i = 0;
|
|
while((c = text[i++]) != '\0') {
|
|
if(c == '\n') {
|
|
posX = x;
|
|
posY += tileset->tileHeight;
|
|
continue;
|
|
}
|
|
|
|
if(c == ' ') {
|
|
posX += tileset->tileWidth;
|
|
continue;
|
|
}
|
|
|
|
uiTextDrawChar(posX, posY, c, color, tileset, texture);
|
|
posX += tileset->tileWidth;
|
|
}
|
|
}
|
|
|
|
void uiTextMeasure(
|
|
const char_t *text,
|
|
const tileset_t *tileset,
|
|
int32_t *outWidth,
|
|
int32_t *outHeight
|
|
) {
|
|
assertNotNull(text, "Text cannot be NULL");
|
|
assertNotNull(outWidth, "Output width pointer cannot be NULL");
|
|
assertNotNull(outHeight, "Output height pointer cannot be NULL");
|
|
|
|
int32_t width = 0;
|
|
int32_t height = tileset->tileHeight;
|
|
int32_t lineWidth = 0;
|
|
|
|
char_t c;
|
|
int32_t i = 0;
|
|
while((c = text[i++]) != '\0') {
|
|
if(c == '\n') {
|
|
if(lineWidth > width) {
|
|
width = lineWidth;
|
|
}
|
|
lineWidth = 0;
|
|
height += tileset->tileHeight;
|
|
continue;
|
|
}
|
|
|
|
lineWidth += tileset->tileWidth;
|
|
}
|
|
|
|
if(lineWidth > width) {
|
|
width = lineWidth;
|
|
}
|
|
|
|
*outWidth = width;
|
|
*outHeight = height;
|
|
} |