
#include "image.h"

#include <math.h>



//---- DATA ------------------------------------------------------------------//

int image_font[ 5*(128-32) ] =
{
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,0,0 ),
  IMAGE_FONTLINE( 1,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,1 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),

  //- Numbers
  
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,1,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,1,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),

  //- :;<=>?@

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  //- Letters

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 1,1,1,0,0 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,0,1,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,0,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,1 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  //- [\]^_`

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  //- Letters

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 1,1,1,0,0 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,0,1,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,0,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),

  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,1,0 ),
  IMAGE_FONTLINE( 0,1,1,0,1 ),

  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 0,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,0 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,1,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),

  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 0,1,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,1,1,1,1 ),

  //- {|}~

  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),

  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),

  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,0,1,1,0 ),
  IMAGE_FONTLINE( 0,0,1,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),

  IMAGE_FONTLINE( 0,0,0,0,0 ),
  IMAGE_FONTLINE( 0,1,0,0,0 ),
  IMAGE_FONTLINE( 1,0,1,0,1 ),
  IMAGE_FONTLINE( 0,0,0,1,0 ),
  IMAGE_FONTLINE( 0,0,0,0,0 ),

  IMAGE_FONTLINE( 1,1,1,1,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,0,0,0,1 ),
  IMAGE_FONTLINE( 1,1,1,1,1 )

};



//---- IMAGE CLASS -----------------------------------------------------------//

//---- Image

Image::Image( int w, int h )
{
  this->w = w;
  this->h = h;
  buf = new int[ size = w*h ];
}

//---- ~Image

Image::~Image()
{
  delete[] this->buf;
}

//---- clear

void Image::clear( int col )
{
  for( int i=0; i<size; i++ ) buf[i] = col;
}

//---- checks

void Image::checks( )
{
  int i, j;

  int *p = buf;

  for(j=0; j<h; j++) for(i=0; i<w; i++)
  {
    *p++ = (((i>>4)^(j>>4))&1) * 0x222222 + 0xDDDDDD;
  }
}

//---- setOrigin

void Image::setOrigin( float ox, float oy )
{
  this->ox = ox;
  this->oy = oy;
}

//---- fillPolygon

void Image::fillPolygon( Poly *p, int col )
{
  Scanline sl;

  //  Render each scanline

  for( int i=0; i<h; i++ )
  {
    p->getScanline( &sl, i );
    fillScanline( i, &sl, col );
  }
}

//---- fillScanline

void Image::fillScanline( int y, Scanline *sl, int col )
{
  float x1, x2;

  sl->firstPair();

  while( sl->nextPair( &x1, &x2 ) )
  {
    if( x1 < 0 ) x1 = 0;
    if( x2 > w ) x2 = w;

    for( int i=x1+0.9999; i<x2; i++ )
    {
      buf[ y*w + i ] = col;
    }
  }
}

//---- drawPolygon

void Image::drawPolygon( Poly *p, int col )
{
  Scanline sl;

  int i;

  //  Render each scanline

  for( i=0; i<h; i++ )
  {
    p->getScanline( &sl, i );
    drawScanline( i, &sl, col );
  }

  //  Render each vertical scanline

  for( i=0; i<w; i++ )
  {
    p->getVScanline( &sl, i );
    drawVScanline( i, &sl, col );
  }
}

//---- drawScanline

void Image::drawScanline( int y, Scanline *sl, int col )
{
  float x1, x2;

  sl->firstPair();

  while( sl->nextPair( &x1, &x2 ) )
  {
    if( x1 < 0 ) x1 = 0;
    if( x2 > w ) x2 = w;

    buf[ y*w + (int)x1 ] = col;
    buf[ y*w + (int)x2 ] = col;
  }
}

//---- drawVScanline

void Image::drawVScanline( int x, Scanline *sl, int col )
{
  float y1, y2;

  sl->firstPair();

  while( sl->nextPair( &y1, &y2 ) )
  {
    if( y1 < 0 ) y1 = 0;
    if( y2 > h ) y2 = h;

    buf[ ((int)y1)*w + x ] = col;
    buf[ ((int)y2)*w + x ] = col;
  }
}

//---- blendCol

int Image::blendCol( int col1, int col2, float a )
{
  if( a < 0 ) a = 0;
  if( a > 1 ) a = 1;

  float aa = 1.f-a;

  int r = ((col1>>16)&255) * aa + ((col2>>16)&255) * a;
  int g = ((col1>> 8)&255) * aa + ((col2>> 8)&255) * a;
  int b = ((col1    )&255) * aa + ((col2    )&255) * a;

  return (r<<16)+(g<<8)+b;
}

//---- fillPolygonAA

void Image::fillPolygonAA( Poly *p, int col )
{
  Scanline sl;

  //  Seperate colours

  int i;

  //  Render each scanline

  for( i=0; i<h; i++ )
  {
    p->getScanline( &sl, i );
    fillScanlineAA( i, &sl, col );
  }

  //  Render each vertical scanline

  for( i=0; i<h; i++ )
  {
    p->getVScanline( &sl, i );
    drawVScanlineAA( i, &sl, col );
  }
}

//---- fillScanlineAA

void Image::fillScanlineAA( int y, Scanline *sl, int col )
{
  float x1, x2;

  sl->firstPair();

  while( sl->nextPair( &x1, &x2 ) )
  {
    if( x1 < 0 ) x1 = 0;
    if( x2 > w-1 ) x2 = w-1;  //  TEMP! (need to deal with edge case)

    for( int i=x1+0.9999; i<x2; i++ )
    {
      buf[ y*w + i ] = col;
    }

    buf[ y*w + (int)x1 ] = blendCol( col, 0x000000, x1 - (int)x1 );
    buf[ y*w + (int)x2 ] = blendCol( 0x000000, col, x2 - (int)x2 );
  }
}

//---- drawVScanlineAA

void Image::drawVScanlineAA( int x, Scanline *sl, int col )
{
  float y1, y2;

  sl->firstPair();

  while( sl->nextPair( &y1, &y2 ) )
  {
    if( y1 < 0 ) y1 = 0;
    if( y2 > h-1 ) y2 = h-1;  //  TEMP! (need to deal with edge case)

    buf[ ((int)y1)*w + x ] = blendCol( col, 0x000000, y1 - (int)y1 );
    buf[ ((int)y2)*w + x ] = blendCol( 0x000000, col, y2 - (int)y2 );
  }
}

//---- drawText

void Image::drawText( int x, int y, char *s, int col )
{
  for( int i=0; s[i]; i++ )
  {
    drawChar( x, y, s[i], col );
    x += 6;
  }
}

//---- drawChar

void Image::drawChar( int x, int y, int c, int col )
{
  int i, j;
  int *p;

  p = buf + y*w + x;

  c -= 32;
  if( c < 0 || c > 128-32 ) c = 127;

  for( j=0; j<5; j++ )
  {
    int a = image_font[ c*5 + j ];

    for( i=0; i<5; i++ )
    {
      if( a & 1 ) *p = col;
      p++;
      a >>= 1;
    }

    p += w-5;
  }
}

//---- textWidth

int Image::textWidth( char *s )
{
  if( !s ) return 0;
  for( int i=0; s[i]; i++ );
  return i*6;
}

//---- textHeight

int Image::textHeight( char *s )
{
  return 6;
}

//---- fillCircle

void Image::fillCircle( float cx, float cy, float radius, int col)
{
  if(radius <= 0) return;

  if( cx + radius < 0 ) return;
  if( cy + radius < 0 ) return;
  if( cx - radius > w ) return;
  if( cy - radius > h ) return;

  double wx;
  int oy, o;
  double thickness = 0;
  signed char c;

  int x1a, x2a;

  int y1 = cy-radius;
  int y2 = cy+radius;

  double rx = radius;
  double ry = radius;

  int i, j;

  for(j=y1-1; j<=y2+1; j++) if(j>=0 && j<h)
  {
    wx = ry*ry - (j-cy)*(j-cy);

    if(wx > 0)
    {
      wx = rx*sqrt(wx)/ry;
      x1a = cx - wx;
      x2a = cx + wx;
 
      if(x1a < 0) x1a = 0;
      if(x2a < 0) x2a = 0;
      if(x1a > w) x1a = w;
      if(x2a > w) x2a = w;

      for(i=x1a; i<x2a; i++) buf[j*w+i] = col;
    }
  }

}

//---- fillCircleAA

//  There is some overdraw

void Image::fillCircleAA( float cx, float cy, float radius, int col)
{
  if(radius <= 0) return;

  if( cx + radius < 0 ) return;
  if( cy + radius < 0 ) return;
  if( cx - radius > w ) return;
  if( cy - radius > h ) return;

  float wx, wy;
  int oy, o;
  double thickness = 0;
  signed char c;

  float x1a, x2a;
  float y1a, y2a;

  //  Centre square

  int x1 = cx-radius*0.70710678f;
  int x2 = cx+radius*0.70710678f;
  int y1 = cy-radius*0.70710678f;
  int y2 = cy+radius*0.70710678f;

  if( y1 < 0 ) y1 = 0;
  if( y2 < 0 ) y2 = 0;
  if( y1 > h ) y1 = h;
  if( y2 > h ) y2 = h;

  float rx = radius;
  float ry = radius;

  int i, j;

  //  Mid section (horizontal antialiasing)

  for(j=y1; j<=y2; j++) if(j>=0 && j<h)
  {
    wx = ry*ry - (j-cy)*(j-cy);

    if(wx > 0)
    {
      wx = rx*sqrt(wx)/ry;
      x1a = cx - wx;
      x2a = cx + wx;
 
      if(x1a < 0) x1a = 0;
      if(x2a < 0) x2a = 0;
      if(x1a > w) x1a = w;
      if(x2a > w) x2a = w;

      if( x2a > 0 && x1a < w && x2a > x1a )
      {
        buf[ j*w + (int)x1a ] = blendCol( buf[ j*w + (int)x1a ], col, (int)(x1a+1)-x1a );

        for(i=x1a+1; i<x2a; i++) buf[j*w+i] = col;

        if( x2a+1 < w ) buf[ j*w + (int)x2a+1 ] = blendCol( buf[ j*w + (int)x2a+1 ], col, x2a-(int)(x2a) );
      }
    }
  }

  //  Top & bottom

  for(i=x1; i<x2+2; i++) if( i>=0 && i<w )
  {
    wy = rx*rx - (i-cx)*(i-cx);

    if(wy > 0)
    {
      wy = ry*sqrt(wy)/rx;
      y1a = cy - wy;
      y2a = cy + wy;
 
      if(y1a < 0) y1a = 0;
      if(y2a < 0) y2a = 0;
      if(y1a > h) y1a = h;
      if(y2a > h) y2a = h;

      if( y2a > 0 && y1a < h && y2a >= y1a) // && y1a <= y1 && y2a >= y2 )
      {
        if( y1a < y1 ) buf[ w*(int)y1a + i ] = blendCol( buf[ w*(int)y1a + i ], col, (int)(y1a+1)-y1a );

        for(j=y1a+1; j<y1; j++) buf[j*w+i] = col;
        for(j=y2; j<y2a; j++) buf[j*w+i] = col;

        if( y2a+1 >= y2 && y2a+1 < h ) buf[ ((int)y2a+1)*w + i ] = blendCol( buf[ ((int)y2a+1)*w + i ], col, y2a-(int)(y2a) );
      }
    }
  }

}

