You like my 4x4 ordered dithering swagger?
This commit is contained in:
parent
fc7f548c4d
commit
ac88645817
1 changed files with 81 additions and 8 deletions
89
src/test.c
89
src/test.c
|
@ -7,6 +7,71 @@
|
|||
|
||||
#include <cammy/sram.h>
|
||||
|
||||
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; y<CAMMY_SRAM_PHOTO_HEIGHT; y++) {
|
||||
for (x=0; x<CAMMY_SRAM_PHOTO_WIDTH; x++) {
|
||||
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];
|
||||
|
||||
float avg = 255.0 - ((float)r + (float)g + (float)b) / 3;
|
||||
|
||||
uint8_t value = (uint8_t)(avg / 64.0);
|
||||
|
||||
cammy_sram_tile *tile = &frame->photo.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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue