/* test/rdft_smoke.c — os.meow.reader FreeType 封装 qemu-mipsel 冒烟。 * 在 mipsel 上初始化 rdft → 载入思源黑体/MiSans OTF → 定字号 → 取 CJK/拉丁字形度量 → * blend565 到 RGB565 缓冲 → 校验像素变化 → LRU 缓存 512 上限。可跑于 qemu-mipsel(静态)。 * * 用法:qemu-mipsel ./test/rdft_smoke (缺省用仓库 font/src/MiSans-Regular.otf) */ #include "rdft.h" #include #include #include static int fails = 0; #define CHECK(c, m) do { if (c) { printf(" ok %s\n", m); } else { printf("FAIL %s\n", m); fails++; } } while (0) int main(int argc, char **argv) { const char *font = (argc > 1) ? argv[1] : "/home/Aska/Project/R3ProII/font/src/MiSans-Regular.otf"; rdft *r = NULL; CHECK(rdft_init(&r) == 0, "rdft_init"); CHECK(r != NULL, "rdft non-null"); CHECK(rdft_load_font(r, font) == 0, "rdft_load_font"); CHECK(rdft_ascender(r) > 0, "ascender>0"); printf(" family=%s ascender=%d descender=%d\n", rdft_family(r), rdft_ascender(r), rdft_descender(r)); rdft_set_px(r, 20); /* 字形度量:你(U+4F60)/好(U+597D)/A/空格/软连字符 */ const uint32_t cps[] = { 0x4F60, 0x597D, 'A', ' ', 0x00AD, 0x3002 }; for (int i = 0; i < 6; i++) { int adv = 0, bw = 0, bh = 0, left = 0, top = 0; const uint8_t *bmp = NULL; CHECK(rdft_glyph(r, cps[i], &adv, &bmp, &bw, &bh, &left, &top) == 0, "glyph"); printf(" cp=U+%04X adv=%d bmp=%dx%d left=%d top=%d\n", cps[i], adv, bw, bh, left, top); if (cps[i] == 'A') CHECK(adv > 5, "A advance>5"); if (cps[i] == 0x4F60) CHECK(adv >= 16 && adv <= 22, "CJK adv ~20"); } /* blend565:把「你」字画进一个 RGB565 缓冲(80×80,白底黑字),校验有像素变黑 */ { int W = 80, H = 80; uint16_t *fb = (uint16_t*)malloc((size_t)W * H * 2); for (int i = 0; i < W * H; i++) fb[i] = 0xFFFF; /* 白 */ int adv = 0, bw = 0, bh = 0, left = 0, top = 0; const uint8_t *bmp = NULL; rdft_glyph(r, 0x4F60, &adv, &bmp, &bw, &bh, &left, &top); int baseline = 30; rdft_blend565(fb, W * 2, W, H, 10, baseline, bmp, bw, bh, left, top, 0x0000, 0xFFFF); int dark = 0; for (int i = 0; i < W * H; i++) if (fb[i] != 0xFFFF) dark++; CHECK(dark > 10, "blend produced dark pixels"); free(fb); } /* LRU 缓存上限:请求 600 个不同码点 → used 应 ≤ 512 */ { rdft_cache_set_slots(r, 512); for (uint32_t cp = 0x4E00; cp < 0x4E00 + 600; cp++) { int adv = 0, bw = 0, bh = 0, left = 0, top = 0; const uint8_t *bmp = NULL; rdft_glyph(r, cp, &adv, &bmp, &bw, &bh, &left, &top); } int used = rdft_cache_used(r); printf(" lru used=%d slots=%d\n", used, rdft_cache_slots(r)); CHECK(used <= 512, "lru used <= 512"); CHECK(used >= 1, "lru used >= 1"); } rdft_free(r); printf("rdft_smoke: %s\n", fails ? "FAIL" : "PASS"); return fails ? 1 : 0; }