Man Linux: Main Page and Category List

NAME

       exlights  -  One  way to do colored lighting effects in a hicolor video
       mode. Allegro game programming library.

SYNOPSIS

       #include <allegro.h>

       Example exlights

DESCRIPTION

       This program shows one way to implement colored lighting effects  in  a
       hicolor video mode. Warning: it is not for the faint of heart!  This is
       by no means the simplest  or  easiest  to  understand  method,  I  just
       thought it was a cool concept that would be worth demonstrating.

       The  basic  approach  is to select a 15 or 16 bit screen mode, but then
       draw onto 24 bit memory bitmaps. Since we only need the bottom  5  bits
       of  each  8  bit  color  in  order to store 15 bit data within a 24 bit
       location, we can fit a light level into the top 3 bits.  The tricky bit
       is  that  these  aren't  actually  24  bit  images  at  all:  they  are
       implemented as 8 bit memory bitmaps, and we just store the red level in
       one  pixel,  green  in the next, and blue in the next, making the total
       image be three times wider than we really wanted.  This  allows  us  to
       use  all  the  normal  256 color graphics routines for drawing onto our
       memory surfaces, most importantly the lookup table translucency,  which
       can  be  used  to combine the low 5 bits of color and the top 3 bits of
       light in a single drawing operation.  Some trickery is needed  to  load
       24  bit  data  into  this  fake  8 bit format, and of course it needs a
       custom routine to convert the resulting image while copying  it  across
       to the hardware screen.

       This  program  chugs  slightly  on my p133, but not significantly worse
       than any double buffering in what amounts  to  a  1920x640,  256  color
       resolution.  The light blending doesn't seem to slow it down too badly,
       so I think this technique would be quite usable on faster machines  and
       in lower resolution hicolor modes. The biggest problem is that although
       you keep the full 15 bit color resolution,  you  only  get  3  bits  of
       light, ie. 8 light levels.  You can do some nice colored light patches,
       but smooth gradients aren't going to work too well :-)

SEE ALSO

       BITMAP(3alleg),         COLOR_MAP(3alleg),         END_OF_MAIN(3alleg),
       PALETTE(3alleg),           SCREEN_H(3alleg),          SCREEN_W(3alleg),
       allegro_error(3alleg),  allegro_init(3alleg),  allegro_message(3alleg),
       bitmap_color_depth(3alleg),   blit(3alleg),   bmp_unwrite_line(3alleg),
       bmp_write_line(3alleg),    circlefill(3alleg),    clear_bitmap(3alleg),
       clear_keybuf(3alleg),    color_map(3alleg),   create_bitmap_ex(3alleg),
       destroy_bitmap(3alleg),  draw_trans_sprite(3alleg),   fixatan2(3alleg),
       fixsqrt(3alleg),           fixtoi(3alleg),          getb_depth(3alleg),
       getg_depth(3alleg),        getpixel(3alleg),        getr_depth(3alleg),
       hsv_to_rgb(3alleg),   install_keyboard(3alleg),  install_mouse(3alleg),
       install_timer(3alleg), itofix(3alleg), key(3alleg), keypressed(3alleg),
       line(3alleg),  load_bitmap(3alleg),  makecol(3alleg),  mouse_x(3alleg),
       mouse_y(3alleg),     poll_mouse(3alleg),      replace_filename(3alleg),
       retrace_count(3alleg),      screen(3alleg),     select_palette(3alleg),
       set_color_conversion(3alleg),                  set_color_depth(3alleg),
       set_gfx_mode(3alleg)