diff --git a/src/test.c b/src/test.c index bbae8b3..fe7f627 100644 --- a/src/test.c +++ b/src/test.c @@ -7,6 +7,71 @@ #include +static uint32_t bayer_matrix[256] = { + /* + * Black gamut + */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + /* + * Black to dark gray gradient + */ + 0x00018000, 0x00018000, 0x00018000, 0x00018000, 0x00018000, 0x00018000, + 0x00018020, 0x00018020, 0x00018020, 0x00018020, 0x00018020, 0x00018020, + 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, 0x000180a0, + 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, 0x0001a0a0, + 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, 0x0001a4a0, + 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, 0x0001a4a1, + 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, 0x0001a4a5, + 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, 0x0001a5a5, + 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, 0x0001ada5, + 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, 0x0001ada7, + 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, 0x0001adaf, + 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, 0x0001afaf, + 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, 0x0001df5f, + 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, 0x0001df7f, + 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, 0x0001dfff, + 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, 0x0001ffff, + + /* + * Dark gray to light gray gradient + */ + 0x01028000, 0x01028000, 0x01028000, 0x01028000, 0x01028000, + 0x01028020, 0x01028020, 0x01028020, 0x01028020, 0x01028020, + 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, 0x010280a0, + 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, 0x0102a0a0, + 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, 0x0102a4a0, + 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, 0x0102a4a1, + 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, 0x0102a4a5, + 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, 0x0102a5a5, + 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, 0x0102ada5, + 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, 0x0102ada7, + 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, 0x0102adaf, + 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, 0x0102afaf, + 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, 0x0102df5f, + 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, 0x0102df7f, + 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, 0x0102dfff, + 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, 0x0102ffff, + + /* Light gray to white gradient */ + 0x02038000, 0x02038000, 0x02038000, 0x02038000, 0x02038000, + 0x02038020, 0x02038020, 0x02038020, 0x02038020, 0x02038020, + 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, 0x020380a0, + 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, 0x0203a0a0, + 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, 0x0203a4a0, + 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, 0x0203a4a1, + 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, 0x0203a4a5, + 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, 0x0203a5a5, + 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, 0x0203ada5, + 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, 0x0203ada7, + 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, 0x0203adaf, + 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, 0x0203afaf, + 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, 0x0203df5f, + 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, 0x0203df7f, + 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, 0x0203dfff, + 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff, 0x0203ffff +}; + static void usage(int argc, char **argv, const char *message, ...) { if (message) { va_list args; @@ -34,19 +99,27 @@ static void image_copy(cammy_sram_frame *frame, uint8_t *buf) { for (y=0; yphoto.tiles[y>>3][x>>3]; int tile_x = x & 7, tile_y = y & 7; + uint8_t r = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x], + g = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x+1], + b = buf[4*CAMMY_SRAM_PHOTO_WIDTH*y+4*x+2]; + + uint8_t avg = (uint8_t)(((float)r + (float)g + (float)b) / 3); + uint32_t slot = bayer_matrix[avg]; + uint32_t from = (slot & 0x03000000) >> 24; + uint32_t to = (slot & 0x00030000) >> 16; + uint8_t value; + + if (slot & (0x8000 >> (x & 0x03) >> (y & 0x03))) { + value = to ^ 0x03; + } else { + value = from ^ 0x03; + } + tile->data[2*tile_y] |= (value & 0x01) << (7 - tile_x); tile->data[2*tile_y+1] |= ((value & 0x02) >> 1) << (7 - tile_x); }