Provided by: allegro4-doc_4.4.3.1-1_all bug


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


       #include <allegro.h>

       Example exlights


       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

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


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