altos/draw: Have each font declare ao_glyph_temp as .comm
authorKeith Packard <keithp@keithp.com>
Wed, 8 Mar 2023 23:52:11 +0000 (15:52 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 1 Feb 2024 01:50:19 +0000 (17:50 -0800)
Create temporary glyph drawing space by having every glyph declare how
much space it needs and letting the linker allocate the largest
possible space.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/draw/ao_text.c
src/draw/font-convert

index cc43b362cdde9e43d8d142e90fafe486e05e1cc5..c20f2399d97849d7d3f4dcbf8005fe39bd2d8481 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
+extern uint32_t ao_glyph_temp[];
+
+static struct ao_bitmap        src_bitmap = {
+       .base = ao_glyph_temp,
+};
+
 void
 ao_text(struct ao_bitmap       *dst,
        const struct ao_font    *font,
@@ -28,16 +34,11 @@ ao_text(struct ao_bitmap    *dst,
        uint8_t                 rop)
 {
        int16_t         glyph_stride = ao_stride(font->max_width);
-       uint32_t        src[glyph_stride * font->max_height];
        char            c;
        int             h;
        int16_t         x_off = 0, y_off = 0, advance = 0;
        int16_t         byte_width = 0;
 
-       struct ao_bitmap        src_bitmap = {
-               .base = src,
-       };
-
        rop = (rop & 3) | 0x4;
 
        if ((fill&1) == 0)
@@ -67,7 +68,7 @@ ao_text(struct ao_bitmap      *dst,
                }
 
                for (h = 0; h < src_bitmap.height; h++)
-                       memcpy(&src[h * src_bitmap.stride], &bytes[h * byte_width], (size_t) byte_width);
+                       memcpy(&ao_glyph_temp[h * src_bitmap.stride], &bytes[h * byte_width], (size_t) byte_width);
 
                ao_copy(dst,
                        x + x_off, y - y_off, src_bitmap.width, src_bitmap.height,
index 891331291b6c179235f8748d2d5d9c396deaa57f..8feafe528127fd0f1fc6a529636873a42331830d 100755 (executable)
@@ -195,6 +195,8 @@ void print_font(file out, font_t font, string font_name) {
        fprintf(out, "\t.max_height = %d,\n", max_height);
        fprintf(out, "\t.ascent = %d,\n", font.ascent);
        fprintf(out, "};\n");
+       int max_stride = (max_width + 31) >> 5;
+       fprintf(out, "__asm__(\".balign 4\\n.comm ao_glyph_temp 0x%x\");\n", max_stride * max_height * 4);
 }
 
 string