| @@ -40,6 +40,9 @@ | |||||
| #define ZOOM_FACTOR 1.08f | #define ZOOM_FACTOR 1.08f | ||||
| #define ZOOM_MAX 50 | #define ZOOM_MAX 50 | ||||
| #define GAMMA_FACTOR 1.04f | |||||
| #define GAMMA_MAX 100 | |||||
| #define GAMMA(g) (((g) < 0) ? 1.0 / gammatab[-(g)] : gammatab[(g)]) | |||||
| #define PAD_STEP 0.15 | #define PAD_STEP 0.15 | ||||
| /* libcucul/libcaca contexts */ | /* libcucul/libcaca contexts */ | ||||
| @@ -49,6 +52,7 @@ cucul_t *qq; caca_t *kk; | |||||
| static void print_status(void); | static void print_status(void); | ||||
| static void print_help(int, int); | static void print_help(int, int); | ||||
| static void set_zoom(int); | static void set_zoom(int); | ||||
| static void set_gamma(int); | |||||
| static void load_image(char const *); | static void load_image(char const *); | ||||
| static void unload_image(void); | static void unload_image(void); | ||||
| static void draw_checkers(int, int, int, int); | static void draw_checkers(int, int, int, int); | ||||
| @@ -70,8 +74,9 @@ unsigned int red[256], green[256], blue[256], alpha[256]; | |||||
| #endif | #endif | ||||
| float zoomtab[ZOOM_MAX + 1]; | float zoomtab[ZOOM_MAX + 1]; | ||||
| float gammatab[GAMMA_MAX + 1]; | |||||
| float xfactor = 1.0, yfactor = 1.0, dx = 0.5, dy = 0.5; | float xfactor = 1.0, yfactor = 1.0, dx = 0.5, dy = 0.5; | ||||
| int zoom = 0, fullscreen = 0, mode, ww, wh; | |||||
| int zoom = 0, g = 0, fullscreen = 0, mode, ww, wh; | |||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| { | { | ||||
| @@ -106,7 +111,12 @@ int main(int argc, char **argv) | |||||
| /* Fill the zoom table */ | /* Fill the zoom table */ | ||||
| zoomtab[0] = 1.0; | zoomtab[0] = 1.0; | ||||
| for(i = 0; i < ZOOM_MAX; i++) | for(i = 0; i < ZOOM_MAX; i++) | ||||
| zoomtab[i + 1] = zoomtab[i] * 1.08; | |||||
| zoomtab[i + 1] = zoomtab[i] * ZOOM_FACTOR; | |||||
| /* Fill the gamma table */ | |||||
| gammatab[0] = 1.0; | |||||
| for(i = 0; i < GAMMA_MAX; i++) | |||||
| gammatab[i + 1] = gammatab[i] * GAMMA_FACTOR; | |||||
| /* Load items into playlist */ | /* Load items into playlist */ | ||||
| for(i = 1; i < argc; i++) | for(i = 1; i < argc; i++) | ||||
| @@ -226,10 +236,19 @@ int main(int argc, char **argv) | |||||
| update = 1; | update = 1; | ||||
| set_zoom(zoom - 1); | set_zoom(zoom - 1); | ||||
| break; | break; | ||||
| case 'G': | |||||
| update = 1; | |||||
| set_gamma(g + 1); | |||||
| break; | |||||
| case 'g': | |||||
| update = 1; | |||||
| set_gamma(g - 1); | |||||
| break; | |||||
| case 'x': | case 'x': | ||||
| case 'X': | case 'X': | ||||
| update = 1; | update = 1; | ||||
| set_zoom(0); | set_zoom(0); | ||||
| set_gamma(0); | |||||
| break; | break; | ||||
| case 'k': | case 'k': | ||||
| case 'K': | case 'K': | ||||
| @@ -312,6 +331,7 @@ int main(int argc, char **argv) | |||||
| dx = dy = 0.5; | dx = dy = 0.5; | ||||
| update = 1; | update = 1; | ||||
| set_zoom(0); | set_zoom(0); | ||||
| set_gamma(0); | |||||
| free(buffer); | free(buffer); | ||||
| } | } | ||||
| @@ -391,7 +411,7 @@ int main(int argc, char **argv) | |||||
| if(help) | if(help) | ||||
| { | { | ||||
| print_help(ww - 25, 2); | |||||
| print_help(ww - 26, 2); | |||||
| } | } | ||||
| caca_display(kk); | caca_display(kk); | ||||
| @@ -411,10 +431,11 @@ static void print_status(void) | |||||
| cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | ||||
| cucul_draw_line(qq, 0, 0, ww - 1, 0, ' '); | cucul_draw_line(qq, 0, 0, ww - 1, 0, ' '); | ||||
| cucul_draw_line(qq, 0, wh - 2, ww - 1, wh - 2, '-'); | cucul_draw_line(qq, 0, wh - 2, ww - 1, wh - 2, '-'); | ||||
| cucul_putstr(qq, 0, 0, "q:Quit np:Next/Prev +-x:Zoom " | |||||
| "hjkl:Move d:Dithering a:Antialias"); | |||||
| cucul_putstr(qq, 0, 0, "q:Quit np:Next/Prev +-x:Zoom gG:Gamma " | |||||
| "hjkl:Move d:Dither a:Antialias"); | |||||
| cucul_putstr(qq, ww - strlen("?:Help"), 0, "?:Help"); | cucul_putstr(qq, ww - strlen("?:Help"), 0, "?:Help"); | ||||
| cucul_printf(qq, 3, wh - 2, "cacaview %s", VERSION); | cucul_printf(qq, 3, wh - 2, "cacaview %s", VERSION); | ||||
| cucul_printf(qq, ww - 30, wh - 2, "(gamma: %#.3g)", GAMMA(g)); | |||||
| cucul_printf(qq, ww - 14, wh - 2, "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom); | cucul_printf(qq, ww - 14, wh - 2, "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom); | ||||
| cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK); | cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK); | ||||
| @@ -425,19 +446,21 @@ static void print_help(int x, int y) | |||||
| { | { | ||||
| static char const *help[] = | static char const *help[] = | ||||
| { | { | ||||
| " +: zoom in ", | |||||
| " -: zoom out ", | |||||
| " x: reset zoom ", | |||||
| " ---------------------- ", | |||||
| " hjkl: move view ", | |||||
| " arrows: move view ", | |||||
| " ---------------------- ", | |||||
| " a: antialiasing method ", | |||||
| " d: dithering method ", | |||||
| " b: background mode ", | |||||
| " ---------------------- ", | |||||
| " ?: help ", | |||||
| " q: quit ", | |||||
| " +: zoom in ", | |||||
| " -: zoom out ", | |||||
| " g: decrease gamma ", | |||||
| " G: increase gamma ", | |||||
| " x: reset zoom and gamma ", | |||||
| " ----------------------- ", | |||||
| " hjkl: move view ", | |||||
| " arrows: move view ", | |||||
| " ----------------------- ", | |||||
| " a: antialiasing method ", | |||||
| " d: dithering method ", | |||||
| " b: background mode ", | |||||
| " ----------------------- ", | |||||
| " ?: help ", | |||||
| " q: quit ", | |||||
| NULL | NULL | ||||
| }; | }; | ||||
| @@ -474,6 +497,16 @@ static void set_zoom(int new_zoom) | |||||
| } | } | ||||
| } | } | ||||
| static void set_gamma(int new_gamma) | |||||
| { | |||||
| g = new_gamma; | |||||
| if(g > GAMMA_MAX) g = GAMMA_MAX; | |||||
| if(g < -GAMMA_MAX) g = -GAMMA_MAX; | |||||
| cucul_set_bitmap_gamma(bitmap, (g < 0) ? 1.0 / gammatab[-g] : gammatab[g]); | |||||
| } | |||||
| static void unload_image(void) | static void unload_image(void) | ||||
| { | { | ||||
| #if defined(HAVE_IMLIB2_H) | #if defined(HAVE_IMLIB2_H) | ||||