helos1/graphics/unifont.c

57 lines
2.1 KiB
C
Raw Normal View History

2021-10-10 14:39:17 +08:00
#include "unifont.h"
#include "graphics.h"
#include <stddef.h>
size_t strlen(const char *);
void unifont_DrawChar(int posX, int posY, const HelosGraphics_Color *color, uint32_t codepoint) {
const unsigned char *data = unifont_Data + codepoint * UNIFONT_CHAR_WIDTH * UNIFONT_CHAR_HEIGHT * 2 / 8;
bool wide = unifont_IsCharDoublewidth(codepoint);
// HACK Assuming UNIFONT_CHAR_WIDTH is 8
if (wide) {
const uint8_t *line = data;
2021-10-10 14:39:17 +08:00
for (int y = 0; y < UNIFONT_CHAR_HEIGHT; y++) {
for (int x = 0; x < UNIFONT_CHAR_WIDTH; x++)
if (*line & (1u << (7 - x % 8)))
graphics_SetPixel(posX + x, posY + y, color);
line++;
for (int x = 0; x < UNIFONT_CHAR_WIDTH; x++)
if (*line & (1u << (7 - x % 8)))
graphics_SetPixel(posX + x + 8, posY + y, color);
line++;
}
} else {
const uint8_t *line = data;
for (int y = 0; y < UNIFONT_CHAR_HEIGHT; y++, line++) {
for (int x = 0; x < UNIFONT_CHAR_WIDTH; x++)
if (*line & (1u << (7 - x % 8)))
graphics_SetPixel(posX + x, posY + y, color);
2021-10-10 14:39:17 +08:00
}
}
2021-10-10 14:39:17 +08:00
}
void unifont_DrawString(int posX, int posY, const HelosGraphics_Color *color, const uint32_t *codepoints, int count) {
for (const uint32_t *end = codepoints + count; codepoints != end; codepoints++) {
unifont_DrawChar(posX, posY, color, *codepoints);
posX += UNIFONT_CHAR_WIDTH * (unifont_IsCharDoublewidth(*codepoints) ? 2 : 1);
}
}
void unifont_DrawStringUTF16(int posX, int posY, const HelosGraphics_Color *color, const uint16_t *codepoints, int count) {
for (const uint16_t *end = codepoints + count; codepoints != end; codepoints++) {
unifont_DrawChar(posX, posY, color, *codepoints);
posX += UNIFONT_CHAR_WIDTH * (unifont_IsCharDoublewidth(*codepoints) ? 2 : 1);
}
}
void unifont_DrawStringASCII(int posX, int posY, const HelosGraphics_Color *color, const char *codepoints, int count) {
if (count == 0) {
count = strlen(codepoints);
}
for (const char *end = codepoints + count; codepoints != end; codepoints++) {
unifont_DrawChar(posX, posY, color, *codepoints);
//posX += UNIFONT_CHAR_WIDTH * (unifont_IsCharDoublewidth(*codepoints) ? 2 : 1);
posX += UNIFONT_CHAR_WIDTH; // visible ASCII chars are all single-width
}
}