Section Header
  
  
    + name        := ABSTRACT_BITMAP;
  
  
    - comment     := "Generic Bitmap.";
    
  
    - external    := `
//
// Font System 1250 bytes.
//
unsigned short __index_font[96]={
0x000,0x007,0x008,0x00B,0x012,0x017,0x021,0x028,0x029,0x02C,0x02F,0x034,
0x039,0x03B,0x03F,0x040,0x044,0x049,0x04C,0x051,0x056,0x05B,0x060,0x065,
0x06A,0x06F,0x074,0x075,0x077,0x07C,0x081,0x086,0x08B,0x097,0x0A0,0x0A7,
0x0AF,0x0B7,0x0BE,0x0C5,0x0CD,0x0D5,0x0D6,0x0DB,0x0E2,0x0E8,0x0F1,0x0F9,
0x101,0x109,0x111,0x11A,0x121,0x12A,0x132,0x13B,0x148,0x150,0x159,0x15F,
0x162,0x166,0x169,0x16E,0x175,0x177,0x17E,0x184,0x18A,0x190,0x196,0x199,
0x19F,0x1A4,0x1A5,0x1A7,0x1AD,0x1AE,0x1B7,0x1BC,0x1C2,0x1C8,0x1CE,0x1D1,
0x1D6,0x1D9,0x1DE,0x1E5,0x1EE,0x1F4,0x1FB,0x1FF,0x204,0x205,0x20A,0x211};
unsigned short __graph_font[0x211]={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x17F8,0x0078,0x0000,
0x0078,0x0200,0x1E40,0x03C0,0x1E78,0x03C0,0x0278,0x0040,0x08E0,0x1110,
0x3FF8,0x1110,0x0E60,0x0030,0x0848,0x0448,0x0230,0x0100,0x0080,0x0C40,
0x1220,0x1210,0x0C00,0x0E00,0x1170,0x1088,0x1188,0x1670,0x0800,0x1400,
0x0078,0x1FC0,0x6030,0x8008,0x8008,0x6030,0x1FC0,0x0050,0x0060,0x0038,
0x0060,0x0050,0x0100,0x0100,0x07C0,0x0100,0x0100,0x2000,0x1000,0x0100,
0x0100,0x0100,0x0100,0x1000,0x7000,0x0E00,0x01C0,0x0038,0x0FF0,0x1008,
0x1008,0x1008,0x0FF0,0x0010,0x0010,0x1FF8,0x1C30,0x1208,0x1108,0x1088,
0x1070,0x0810,0x1008,0x1088,0x1088,0x0F70,0x0300,0x0280,0x0260,0x0210,
0x1FF8,0x09F8,0x1088,0x1088,0x1088,0x0F08,0x0FF0,0x1108,0x1088,0x1088,
0x0F10,0x0008,0x1C08,0x0308,0x00C8,0x0038,0x0F70,0x1088,0x1088,0x1088,
0x0F70,0x08F0,0x1108,0x1108,0x1088,0x0FF0,0x1040,0x2000,0x1040,0x0100,
0x0380,0x06C0,0x0C60,0x0820,0x0280,0x0280,0x0280,0x0280,0x0280,0x0820,
0x0C60,0x06C0,0x0380,0x0100,0x0030,0x0008,0x1708,0x0088,0x0070,0x03C0,
0x0C30,0x1008,0x1008,0x2384,0x2444,0x2444,0x2244,0x25C8,0x1408,0x1430,
0x03C0,0x1800,0x0600,0x0380,0x0260,0x0218,0x0260,0x0380,0x0600,0x1800,
0x1FF8,0x1088,0x1088,0x1088,0x1088,0x1088,0x0F70,0x07E0,0x0810,0x1008,
0x1008,0x1008,0x1008,0x0810,0x0420,0x1FF8,0x1008,0x1008,0x1008,0x1008,
0x1008,0x0810,0x07E0,0x1FF8,0x1088,0x1088,0x1088,0x1088,0x1088,0x1008,
0x1FF8,0x0088,0x0088,0x0088,0x0088,0x0088,0x0008,0x07E0,0x0810,0x1008,
0x1008,0x1008,0x1108,0x0910,0x1F20,0x1FF8,0x0080,0x0080,0x0080,0x0080,
0x0080,0x0080,0x1FF8,0x1FF8,0x0C00,0x1000,0x1000,0x1000,0x0FF8,0x1FF8,
0x0080,0x0140,0x0220,0x0410,0x0808,0x1000,0x1FF8,0x1000,0x1000,0x1000,
0x1000,0x1000,0x1FF8,0x0060,0x0180,0x0600,0x1800,0x0600,0x0180,0x0060,
0x1FF8,0x1FF8,0x0010,0x0060,0x0080,0x0100,0x0600,0x0800,0x1FF8,0x07E0,
0x0810,0x1008,0x1008,0x1008,0x1008,0x0810,0x07E0,0x1FF8,0x0108,0x0108,
0x0108,0x0108,0x0108,0x0090,0x0060,0x07E0,0x0810,0x1008,0x1008,0x1008,
0x1408,0x0810,0x17E0,0x1FF8,0x0108,0x0108,0x0108,0x0108,0x0108,0x0190,
0x0E60,0x1000,0x0C70,0x1088,0x1088,0x1088,0x1108,0x1108,0x0E30,0x0008,
0x0008,0x0008,0x0008,0x1FF8,0x0008,0x0008,0x0008,0x0008,0x07F8,0x0800,
0x1000,0x1000,0x1000,0x1000,0x0800,0x07F8,0x0018,0x0060,0x0180,0x0600,
0x1800,0x0600,0x0180,0x0060,0x0018,0x0038,0x00C0,0x0700,0x1800,0x0700,
0x00C0,0x0038,0x00C0,0x0700,0x1800,0x0700,0x00C0,0x0038,0x1818,0x0420,
0x0240,0x0180,0x0180,0x0240,0x0420,0x1818,0x0018,0x0020,0x0040,0x0080,
0x1F00,0x0080,0x0040,0x0020,0x0018,0x1808,0x1608,0x1108,0x1088,0x1068,
0x1018,0xFFF8,0x8008,0x8008,0x0038,0x01C0,0x0E00,0x7000,0x8008,0x8008,
0xFFF8,0x0010,0x0008,0x0004,0x0008,0x0010,0x4000,0x4000,0x4000,0x4000,
0x4000,0x4000,0x4000,0x0008,0x0010,0x0E80,0x1140,0x1140,0x1140,0x1140,
0x0F80,0x1000,0x1FF8,0x0880,0x1040,0x1040,0x1040,0x0F80,0x0F80,0x1040,
0x1040,0x1040,0x1040,0x0880,0x0F80,0x1040,0x1040,0x1040,0x0880,0x1FF8,
0x0F80,0x1240,0x1240,0x1240,0x1240,0x0B80,0x0040,0x1FF0,0x0048,0x0F80,
0x9040,0x9040,0x9040,0x8880,0x7FC0,0x1FF8,0x0080,0x0040,0x0040,0x1F80,
0x1FC8,0x8000,0x7FC8,0x1FF8,0x0200,0x0300,0x0480,0x0840,0x1000,0x1FF8,
0x1FC0,0x0080,0x0040,0x0040,0x1F80,0x0080,0x0040,0x0040,0x1F80,0x1FC0,
0x0080,0x0040,0x0040,0x1F80,0x0F80,0x1040,0x1040,0x1040,0x1040,0x0F80,
0xFFC0,0x0880,0x1040,0x1040,0x1040,0x0F80,0x0F80,0x1040,0x1040,0x1040,
0x0880,0xFFC0,0x1FC0,0x0080,0x0040,0x0980,0x1240,0x1240,0x1240,0x0C80,
0x0040,0x0FF0,0x1040,0x0FC0,0x1000,0x1000,0x0800,0x1FC0,0x00C0,0x0300,
0x0C00,0x1000,0x0C00,0x0300,0x00C0,0x00C0,0x0700,0x1800,0x0700,0x00C0,
0x0700,0x1800,0x0700,0x00C0,0x1040,0x0880,0x0700,0x0700,0x0880,0x1040,
0x80C0,0x8300,0x4C00,0x3000,0x0C00,0x0300,0x00C0,0x1840,0x1640,0x1140,
0x10C0,0x0200,0x0200,0x7DF0,0x8008,0x8008,0xFFF8,0x8008,0x8008,0x7DF0,
0x0200,0x0200,0x0030,0x0008,0x0008,0x0010,0x0020,0x0020,0x0018};
`;
Section Inherit
  
  
    - parent_object:OBJECT := 
  
Section Public
  
  
    - get_y_line y:INTEGER :ABSTRACT_BMP_LINE <-
  
  
  
  
 Data.
  
  
  
 Image size.
  
    + height:INTEGER;       
  
    + width:INTEGER;        
  
  
    - x_max:INTEGER <- 
  
    - y_max:INTEGER <- 
    
  
 Clipping :
  
    + clip_x0:INTEGER; 
  
    + clip_y0:INTEGER;
  
    + clip_x1:INTEGER;
  
    + clip_y1:INTEGER;
  
  
 Current position.
  
    + spot_x:INTEGER;  
  
    + spot_y:INTEGER;
  
  
 Current color.
  
    + rgbcolor    :UINTEGER_32; 
         Format: RRGGBB in hexadecimal
  
    + rgbbackcolor:UINTEGER_32;
  
    + transparent :BOOLEAN;
  
  
    + mode:UINTEGER_8 :=  
         Set mode. 
  
  
 Ref. `X.h'
  
    - mode_copy:UINTEGER_8 := 
  
    - mode_xor :UINTEGER_8 := 
  
  
    - set_mode m:UINTEGER_8 <-
    
  
 Macro colors
  
  
    - black:UINTEGER_32 := 
  
    - white:UINTEGER_32 := 
  
    - red:UINTEGER_32   := 
  
    - green:UINTEGER_32 := 
  
    - blue:UINTEGER_32  := 
  
    - yellow:UINTEGER_32:= 
  
    - purple:UINTEGER_32:= 
  
    - cyan:UINTEGER_32  := 
  
    - gray:UINTEGER_32  := 
  
    - brown:UINTEGER_32 :=   
  
  
  
    - pixel_geometry:PIXEL <- 
  
  
  
 Creation. 
  
  
    - create (w,h:INTEGER) :SELF <-
    
  
    - make (w,h:INTEGER) <-
    
  
    - create (w,h:INTEGER) at offset_begin:UINTEGER_32 bytes_per_line lx:INTEGER :SELF <-   
    
  
    - make (w,h:INTEGER) at offset_begin:UINTEGER_32 bytes_per_line lx:INTEGER <-
  
Section Public
  
  
  
 Low level.
  
   
    
  
    - pixel_hard (x,y:INTEGER) color col:UINTEGER_32 <-
    
  
    - line_h_hard (x,y:INTEGER) until x1:INTEGER color col:UINTEGER_32 <-
      
  
    - line_h_hard (x,y:INTEGER) until x1:INTEGER image line:ABSTRACT_BMP_LINE offset ofs:INTEGER <-
    
  
    - get_pixel_hard (x,y:INTEGER) :PIXEL <-
    
Section Public  
  
  
    - color col:UINTEGER_32 <-
  
  
    - backcolor col:UINTEGER_32 <-
    
  
    - transparent_on <-
    
  
    - transparent_off <-
    
  
    - clipping (x0,y0:INTEGER) to (x1,y1:INTEGER) <-
    
  
    - clipping_off <-
    
  
    - move_to (pos_x,pos_y:INTEGER) <-
    
  
  
 GetPixel
  
  
  
    - get_pixel:BOOLEAN <-
  
         Load Spot pixel.
    
  
    - get_pixel_to (x,y:INTEGER) :BOOLEAN<-
    
  
  
 PutPixel
  
  
  
    - pixel:BOOLEAN <-
    
  
    - pixel_to (x,y:INTEGER) :BOOLEAN <-
    
  
    - pixel_color col:UINTEGER_32 :BOOLEAN <-
    
  
    - pixel_to (x,y:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
  
 Line
  
  
  
    - line_h (x,y:INTEGER) until x_end:INTEGER image line:ABSTRACT_BMP_LINE :BOOLEAN <-
    
  
    - line_h_until x:INTEGER :BOOLEAN <-
      
  
    - line_h_until x1:INTEGER color col:UINTEGER_32 :BOOLEAN <-
    
  
    - line_h (x0,y0:INTEGER) until x1:INTEGER :BOOLEAN <-
    
  
  
    - line_h (x0,y0:INTEGER) until x1:INTEGER color col:UINTEGER_32 :BOOLEAN <-
    
  
    - line_v_until y:INTEGER :BOOLEAN <-
    
  
    - line_v_until y1:INTEGER color col:UINTEGER_32 :BOOLEAN <-
    
  
    - line_v (x0,y0:INTEGER) until y1:INTEGER :BOOLEAN <-
    
  
    - line_v (x0,y0:INTEGER) until y1:INTEGER color col:UINTEGER_32 :BOOLEAN <-
    
  
  
:UINTEGER_8 CalculCode(:INTEGER_64 X,:INTEGER_64 Y,:INTEGER_64 Xmin,:INTEGER_64 Ymin,:INTEGER_64 Xmax,:INTEGER_64 Ymax)
  
{ return( (XXmax)<<1)|((YYmax)<<3) );
  
};
  
  
************************
  
* CLIPPING DE LINE BUGGE -> Blocage !!!
  
************************
  
 
    
  
    - line_to (x2,y2:INTEGER) :BOOLEAN <-
    
  
    - line_to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
  
    - line (x1,y1:INTEGER) to (x2,y2:INTEGER) :BOOLEAN <-
    
  
  
    - line (x1,y1:INTEGER) to (x2,y2:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
        
  
  
 Rectangle
  
  
  
    - rectangle_to (x1,y1:INTEGER) :BOOLEAN <-
      
  
    - rectangle_to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
    - rectangle (x0,y0:INTEGER) to (x1,y1:INTEGER) :BOOLEAN <-
    
  
    - rectangle (x0,y0:INTEGER) to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
    - rectangle_fill_to (x,y:INTEGER) :BOOLEAN <-
      
  
    - rectangle_fill (x0,y0:INTEGER) to (x1,y1:INTEGER) :BOOLEAN <-
    
  
    - rectangle_fill (x0,y0:INTEGER) to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
  
 Circle
  
  
Section Public  
  
  
    - circle_fill_rayon r:INTEGER <-
    
  
    - circle_fill (x,y:INTEGER) rayon r:INTEGER <-
    
  
    - circle_fill (x,y:INTEGER) rayon r:INTEGER color col:UINTEGER_32 <-
  
  
    - circle_rayon r:INTEGER <-
    
  
    - circle (x,y:INTEGER) rayon r:INTEGER <-
    
  
    - circle (x,y:INTEGER) rayon r:INTEGER color col:UINTEGER_32 <-
    
  
  
 Spline
  
  
Section Public  
  
  
    - spline_w1 (px0,py0:INTEGER) w2 (px1,py1:INTEGER) to (x1,y1:INTEGER) :BOOLEAN <-
    
  
    - spline_w1 (px0,py0:INTEGER) w2 (px1,py1:INTEGER) to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
  
    - spline (x0,y0:INTEGER) w1 (px0,py0:INTEGER) w2 (px1,py1:INTEGER) to (x1,y1:INTEGER) :BOOLEAN <-
    
  
  
    - spline (x0,y0:INTEGER) w1 (px0,py0:INTEGER) w2 (px1,py1:INTEGER) to (x1,y1:INTEGER) color col:UINTEGER_32 :BOOLEAN <-
    
  
*****************************************************************************
  
*                         POLYGONE COMPLEXE                                 *
  
* V.4.0 : Il n'y a plus de contrainte de sens comme dans la version 3.0     *
  
*         Nouvelle algo made in `moi'...                                    *
  
*         Il faut juste faire attention à appeler dans l'ordre suivant :    *
  
*         => poly_move_to poly_line_to ... poly_trace                       *
  
*                                                                           *
  
* Rmq. : Il reste des optimisations à faire pour le tri (qsort) et utiliser *
  
*        des MAP_FAST_ARRAY capable de s'agrandir dynamiquement ...        *
  
*                                                                           *
  
*                                                           BeN inside      *
  
*****************************************************************************
  
Section Public  
  
  
    - poly_move_to (x,y:INTEGER) <-
    
  
    - poly_line_to (x1,y1:INTEGER) <-
    
  
    - poly_spline_w1 (px0,py0:INTEGER) w2 (px1,py1:INTEGER) to (x1,y1:INTEGER) <-
    
  
    - poly_ellipse (x,y:INTEGER) rays (ray_x,ray_y:INTEGER) <-
    
  
    - poly_trace <-
    
  
    - poly_trace_color col:UINTEGER_32 <-
    
  
    - put_bitmap bmp:ABSTRACT_BITMAP to (x,y:INTEGER) <-
  
  
    - put_bitmap bmp:ABSTRACT_BITMAP to (x,y:INTEGER) scale (scale_x,scale_y:REAL_16_16) <-  
    
Section Public
  
  
 For demo ... :-)
  
  
    - font_width string:ABSTRACT_STRING :INTEGER <-
    
  
    - font_width_letter char:CHARACTER :INTEGER <-
  
  
    - font_width string:ABSTRACT_STRING size n:INTEGER :INTEGER <-
    
  
    - font_width string:ABSTRACT_STRING at beg:INTEGER to end:INTEGER :INTEGER <-
    
  
    - print_char c:CHARACTER to (x,y:INTEGER) :INTEGER <-
    
  
    - print string:ABSTRACT_STRING at b:INTEGER to e:INTEGER to (x,y:INTEGER) :INTEGER <-
  
  
    - print string:ABSTRACT_STRING to (x,y:INTEGER) :INTEGER <-