Browse Source

* Gamma support in cacaview (through the g/G key).

tags/v0.99.beta14
Sam Hocevar sam 18 years ago
parent
commit
57d897a7bf
1 changed files with 51 additions and 18 deletions
  1. +51
    -18
      src/cacaview.c

+ 51
- 18
src/cacaview.c View File

@@ -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)


Loading…
Cancel
Save