X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdraw%2Fao_text.c;h=be19238838300547236be659398f14c6e1db4547;hb=f9e2f41feac8ccd4e02020cf672366b194d2d60d;hp=7ce2a623888bf2214b0408659f82cbcf8b3adaae;hpb=6f1686d7a1de7543a844aa86a8c1e7968911a329;p=fw%2Faltos diff --git a/src/draw/ao_text.c b/src/draw/ao_text.c index 7ce2a623..be192388 100644 --- a/src/draw/ao_text.c +++ b/src/draw/ao_text.c @@ -12,54 +12,66 @@ * General Public License for more details. */ -#include "ao.h" #include "ao_draw.h" #include "ao_draw_int.h" #include "ao_font.h" - -const struct ao_font ao_font = { - .width = GLYPH_WIDTH, - .height = GLYPH_HEIGHT, - .ascent = GLYPH_ASCENT, - .descent = GLYPH_HEIGHT - GLYPH_ASCENT, -}; +#include +#include void ao_text(const struct ao_bitmap *dst, + const struct ao_font *font, int16_t x, int16_t y, char *string, uint32_t fill, uint8_t rop) { - uint32_t src[GLYPH_HEIGHT]; + int glyph_stride = (font->max_width + 31) / 32; + uint32_t src[glyph_stride * font->max_height]; char c; int h; + int8_t x_off, y_off, advance; + int byte_width; struct ao_bitmap src_bitmap = { .base = src, - .stride = 1, - .width = GLYPH_WIDTH, - .height = GLYPH_HEIGHT }; - y -= GLYPH_ASCENT; - rop = (rop & 3) | 0x4; if ((fill&1) == 0) rop ^= 3; + if (!font->metrics) { + src_bitmap.width = font->max_width; + src_bitmap.height = font->max_width; + src_bitmap.stride = glyph_stride; + x_off = 0; + y_off = font->ascent; + advance = font->max_width; + } while ((c = *string++)) { - const uint8_t *bytes = &glyph_bytes[glyph_pos[(uint8_t) c]]; + const uint8_t *bytes = &font->bytes[font->pos[(uint8_t) c]]; + + if (font->metrics) { + const struct ao_glyph_metrics *m = &font->metrics[(uint8_t) c]; + src_bitmap.width = m->width; + src_bitmap.height = m->height; + src_bitmap.stride = (m->width + 31) / 32; + x_off = m->x_off; + y_off = m->y_off; + advance = m->advance; + byte_width = ((src_bitmap.width + 7) / 8); + } - for (h = 0; h < GLYPH_HEIGHT; h++) - src[h] = bytes[h]; + for (h = 0; h < src_bitmap.height; h++) + memcpy(&src[h * src_bitmap.stride], &bytes[h * byte_width], byte_width); ao_copy(dst, - x, y, GLYPH_WIDTH, GLYPH_HEIGHT, + x + x_off, y - y_off, src_bitmap.width, src_bitmap.height, &src_bitmap, 0, 0, rop); - x += GLYPH_WIDTH; + x += advance; } }