/* * palfile — тест палитровых хелперов: gfx_pal_sync / gfx_pal_fsave / * gfx_pal_fload. Программные проверки (gfx_pal_get_color), MAME — * только хост. * * P1 fsave: сохранить дефолтную палитру 0 → PAL0.PAL (1024 Б). * P2 fload: испортить слоты 1 и 200 → fload(0) вернул 256 и ОБА * слота восстановились (полный файл). * P3 усечённый файл: записать 2 записи (8 Б) → испортить слоты 0,1,2 * → fload вернул 2, слоты 0,1 восстановлены, слот 2 НЕ тронут. * P4 sync: испортить слот 5 палитры 1 → gfx_pal_sync() → слот 5 * палитры 1 == слоту 5 палитры 0. */ #include #include #include #include #include static uint8_t eq(uint8_t p, uint8_t i, uint8_t r, uint8_t g, uint8_t b) { uint8_t rr, gg, bb; gfx_pal_get_color(p, i, &rr, &gg, &bb); return rr == r && gg == g && bb == b; } static void get3(uint8_t p, uint8_t i, uint8_t *rgb) { gfx_pal_get_color(p, i, rgb, rgb + 1, rgb + 2); } int main(void) { uint8_t a[3], c[3], ok; int n; puts("PALFILE: pal sync/fsave/fload"); initgraph(); /* ---- P1: сохранить дефолт ---------------------------------------- */ ok = (gfx_pal_fsave(0, "pal0.pal") == 0); closegraph(); printf("P1 fsave: %s\n", ok ? "PASS" : "FAIL"); if (!ok) return 1; initgraph(); /* ---- P2: полный fload восстанавливает испорченное ----------------- */ get3(0, 1, a); /* эталоны */ get3(0, 200, c); gfx_pal_set(0, 1, 63, 0, 63); /* испортить */ gfx_pal_set(0, 200, 1, 2, 3); n = gfx_pal_fload(0, "pal0.pal"); ok = (n == 256) && eq(0, 1, a[0], a[1], a[2]) && eq(0, 200, c[0], c[1], c[2]); closegraph(); printf("P2 fload: %s (n=%d)\n", ok ? "PASS" : "FAIL", n); initgraph(); /* ---- P3: усечённый файл ------------------------------------------- */ { int fd = creat("pal2.pal", 0); uint8_t two[8]; uint8_t i; /* первые 2 записи из pal0.pal */ for (i = 0; i < 8; i++) two[i] = 0; { int f0 = open("pal0.pal", O_RDONLY); read(f0, two, 8); close(f0); } write(fd, two, 8); close(fd); } get3(0, 0, a); get3(0, 1, c); gfx_pal_set(0, 0, 63, 63, 0); gfx_pal_set(0, 1, 0, 63, 63); gfx_pal_set(0, 2, 7, 7, 7); /* слот 2 портим НАВСЕГДА */ n = gfx_pal_fload(0, "pal2.pal"); ok = (n == 2) && eq(0, 0, a[0], a[1], a[2]) && eq(0, 1, c[0], c[1], c[2]) && eq(0, 2, 7, 7, 7); /* не тронут fload'ом */ closegraph(); printf("P3 trunc: %s (n=%d)\n", ok ? "PASS" : "FAIL", n); initgraph(); /* ---- P4: sync ------------------------------------------------------ */ get3(0, 5, a); gfx_pal_set(1, 5, 1, 1, 1); /* испортить у страницы 1 */ gfx_pal_sync(); ok = eq(1, 5, a[0], a[1], a[2]); closegraph(); printf("P4 sync: %s\n", ok ? "PASS" : "FAIL"); puts("done"); return 0; }