Crappylos - ("C" code) unoptimized line-of sight tool: supports only 1 pov (point of view)
only 3 functions:
-------------------------------------------------------
add_shrouder(*BITMAP, pov_x, pov_y, x1, y1, x2, y2); // one sided line-segment
add_shrouder(*BITMAP, pov_x, pov_y, int vertices, *points); //clockwise concave polygon
add_2_way_shrouder(*BITMAP, pov_x, pov_y, x1, y1, x2, y2); //works on both sides

Simplelos - (c++) simple line-of sight tool: supports only 1 pov (point of view)
only 4 functions:
-------------------------------------------------------
add_shrouder( x1, y1, x2, y2); // one sided line-segment
add_shrouder(int vertices, *points); //clockwise concave polygon
add_2_way_shrouder( x1, y1, x2, y2); //works on both sides
line_of_sight( *BITMAP, pov_x, pov_y, color);//blit & los & delete shrouders

Monolos - (c++) monochrome line-of-sight and darkness library:
------------------------------------------------------- 

bool recycle_shrouders; // default: false
 
// ******** Main Functions: ********* ********

foo = new Monolos( width, height); // width WILL become a multiple of 32

foo.blit( *BITMAP, dest_x, dest_y, color) //do after los and lighting is done
   // will also flush or recycle shrouders automatically
   // automatically tests for bool darkness and bool los

delete foo; // cleanup

// ********* Shrouder Functions: ******** ********
   // shrouders effect both LOS and Light functions 

foo.add_2_way_shrouder( x1, y1, x2, y2); //works on both sides

foo.add_shrouder( x1, y1, x2, y2); //line segment activates only if
   // observer point forms a clockwise triangle with shrouder line

foo. add_shrouder(int vertices, *points); //clockwise concave polygon

// ********* LOS (line-of-sight) Buffer Functions: ******** ********

foo.line_of_sight( pov_x, pov_y); // draws shrouders
foo.x_ray_vision(int vertices, *points); //convex Polygon 
   //Carves visibility past shrouders

// ********* Lighting Buffer Functions: ******** ********

foo.light(int vertices, *points); //convex polygon; first point is the pov.
foo.light( x, y, radius); //circle
foo.light( x, y, x_radius, y_radius); //ellipse

   //unaffected by shrouders:
foo.penetrating_light(int vertices, *points); // convex polygon
foo.penetrating_light( x, y, radius); //circle
foo.penetrating_light( x, y, x_radius, y_radius); //ellipse

foo.checkerboard_overlay(); //overlay every-other pixel
foo.checkerboard_invert(); // for checkerboard "animations"

foo.dark_pixel(x,y);
foo.dark_line( x1, y1, x2, y2);
foo.dark_rect( x1, y1, x2, y2);  //filled
foo.dark_circle( x1, y1, x2, y2);  //filled
foo.dark_ellipse( x, y, x_radius, y_radius); //filled
foo.dark_polygon(int vertices, *points); //filled

foo._dark_pixel(x,y);  //for pre-clipped drawing
foo._dark_line( x1, y1, x2, y2);
foo._dark_rect( x1, y1, x2, y2);  //filled
foo._dark_circle( x1, y1, x2, y2);  //filled
foo._dark_ellipse( x, y, x_radius, y_radius); //filled
foo._dark_polygon(int vertices, *points); //filled

// ********* Monolos code use ******** ********

0. Once a Monolos is initialized, its size is forever set
1. always add shrouders first
2. using lights will activate darkness
3. Points-of-view must be on the monolos surface
4. Monolos.blit runs faster if the Mololos surface is completely
inside the destination buffer.
5. don’t forget to delete you Monolos objects

// ********* Monolos sample code ******** ********
shrouders only – add_shrouder , line_of_sight

lighting only – add_shrouder , light

shrouders and lighting - add_shrouder , line_of_sight , light

blimp searchlight - add_shrouder , light ,penetrating_light

Low light – checkerboard_overlay , light

Light decay – biglight , checkerboard_overlay, small light

Flies against the night sky – normal rendering, dark_drawing , light