view src/cs/drivers/drv_app/r2d/r2d_i.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/***************************************************************************
                                                                          
  Name        R2DI.h                                                   
                                                                          
  Function    Riviera 2D system : Private API                       
                                                                          
  Date        Modification                                                 
  -----------------------                                                 
  06/12/2001    Create                                                       
 **************************************************************************
  History       
                                                                          
****************************************************************************/


#ifndef __R2DI_H_
#define __R2DI_H_

#include "r2d/r2d.h"
#include "rvf/rvf_api.h"


/***************************************

     CONSTANTS

***************************************/


#if (R2D_ASM == R2D_ON)
//////////////////////////////////////////
//
// R2D ASM API
//

enum{
  R2D_LCDLCD=1,
  R2D_COLORCOLOR=2,
  R2D_COLORLCD=3,
  R2D_LCDCOLOR=4
};

#endif


/***************************************

     TYPES

***************************************/

////////////////////////////////////////
//
//  Misc
//

typedef UINT32 R2D_BOOLEAN; // To avoid veneer bug a bool on 16 bits is introduced

////////////////////////////////////////
//
// Arc region
//

// Region delimited by vectors whose scalar
// product with (sa,sb) and (ea,eb) is (+,+)
// of (-,+) or (+,-)
typedef struct R2D_ARC_REGION
{
	INT32 sa,sb,ea,eb;
    INT16 one_sector;
	BOOLEAN is_null;
} T_R2D_ARC_REGION;

////////////////////////////////////////
//
// Textures
//
typedef struct R2D_FREE_TEXTURE
{
	INT16 refcount;
	INT16 size; // Exponent of a power of 2
	T_R2D_ARGB_COLOR *pattern;
} T_R2D_FREE_TEXTURE;

typedef struct R2D_ANCHORED_TEXTURE
{
	INT16 refcount;
	INT16 size; // Exponent of a power of 2
	UINT32 *pattern;
} T_R2D_ANCHORED_TEXTURE;

///////////////////////////////////////
//
// FRAMEBUFFER
//


typedef struct R2D_FRAMEBUFFER
{
   // Refcounting
     INT16 refcount;
   // List of memory words containing the pixels
     UINT32 *p_memory_words;
   // End of frameBuffer used to prevent out of
   // framebuffer access
   // (It is the last word contained in the framebuffer)
   // (but that word is used for loops and is never drawn)
     UINT32 *p_frame_buffer_end;
   // Kind of framebuffer (LCD or 24 bits)
     T_R2D_FRAMEBUFFER_KIND kind;
   // Dimensions of frameBuffer
     UINT16 width,height;
   // Semaphore for concurrent accesses to the framebuffer
	 T_RVF_MUTEX * mutex;
} T_R2D_FRAMEBUFFER;

// Font cache framebuffer has other fields required to build
// the glyph from a succession of Unicode codes
typedef struct R2D_FONT_CACHE_FRAMEBUFFER
{
   // Refcounting
     INT16 refcount;
   // List of memory words containing the pixels
     UINT32 *p_memory_words;
   // End of frameBuffer used to prevent out of
   // framebuffer access
   // (It is the last word contained in the framebuffer)
     UINT32 *p_frame_buffer_end;
   // Kind of framebuffer (LCD or 24 bits)
     T_R2D_FRAMEBUFFER_KIND kind;
   // Dimensions of frameBuffer
     UINT16 width,height;
   // Semaphore for concurrent accesses to the framebuffer
	 T_RVF_MUTEX * mutex;
} T_R2D_FONT_CACHE_FRAMEBUFFER;


////////////////////////////////////////
//
// LCD API
//

typedef UINT32 (*T_R2D_DRAWING_OP)(UINT32 old,UINT32 value);


typedef T_R2D_DRAWING_OP T_R2D_DRAWING_OPERATORS[10];

////////////////////////////////////////
//
// OBJECTS
//

// Metaclass object describing the classes


typedef struct R2D_CLASS_SHAPE T_R2D_CLASS_SHAPE;
typedef struct R2D_SHAPE T_R2D_SHAPE;

typedef void (*T_R2D_shape_release_funct)(T_R2D_SHAPE *self);
typedef void (*T_R2D_shape_draw_funct)(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
typedef void (*T_R2D_shape_fill_funct)(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
typedef T_R2D_SHAPE_PTR (*T_R2D_shape_clone_funct)(T_RVF_MB_ID bank,T_R2D_SHAPE *self);
typedef void (*T_R2D_shape_translate_funct)(T_R2D_SHAPE *self,INT16 dx,INT16 dy);
typedef BOOLEAN (*T_R2D_shape_point_testing_funct)(T_R2D_SHAPE *self,INT16 x,INT16 y);


struct R2D_CLASS_SHAPE
{
  void *parent_class;
  T_R2D_shape_release_funct release;
  T_R2D_shape_draw_funct draw;
  T_R2D_shape_fill_funct fill;
  T_R2D_shape_clone_funct clone;
  T_R2D_shape_translate_funct translate;
  T_R2D_shape_point_testing_funct point_in_shape;
};

////////////////////////////////////////
//
// SHAPES OBJECTS
//

struct R2D_SHAPE
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
};

typedef struct R2D_RECT
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
  INT16 ul_x,ul_y,br_x,br_y;
} T_R2D_RECTANGLE;

typedef struct R2D_CIRCLE
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
  INT16 x,y,r;
} T_R2D_CIRCLE;

typedef T_R2D_RECTANGLE T_R2D_ELLIPSE;

typedef struct R2D_ROUNDRECT
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
  INT16 ul_x,ul_y,br_x,br_y;
  INT16 h,v;
} T_R2D_ROUND_RECTANGLE;

typedef struct R2D_ARC
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
  INT16 ul_x,ul_y,br_x,br_y;
  INT16 start_angle,stop_angle;
} T_R2D_ARC;

typedef struct R2D_TEXT
{
  INT16 refcount;
  const T_R2D_CLASS_SHAPE *p_r2d_class;
  INT16 x,y;
  T_R2D_UTF16 *p_text;
} T_R2D_TEXT;


////////////////////////////////////////
//
// GRAPHIC CONTEXT
//

typedef struct R2D_GC
{
   // Refcounting
     INT16 refcount;
   // The framebuffer
     T_R2D_FRAMEBUFFER_PTR p_frame_buffer;
   // Clip rectangle (in graphic context coordinates)
     T_R2D_SHAPE *p_clipping_shape;
   // Clipping shape in scanning coordinates
	 T_R2D_SHAPE *p_s_clipping_shape;
   // Foreground pixel value
   //  (on 24 bits per pixel. Conversion done on the fly
   //  according to the kind of framebuffer)
     T_R2D_ARGB_COLOR foreground_color;
   // Cache for computed pixel value corresponding
   // to previous color. Used for LCD with dithering off
   // to speed drawing
     UINT32 foreground_pixel_value;
   // Cache for foreground dithering used when dithering ON
     UINT32 *p_foreground_dithered_cache;
   // Background pixel value
   //  (on 24 bits per pixel. Conversion done on the fly
   //  according to the kind of framebuffer)
     T_R2D_ARGB_COLOR background_color;
   // Cache for computed pixel value corresponding
   // to previous color. Used for LCD with dithering off
   // to speed drawing
     UINT32 background_pixel_value;
   // Cache for dithering used when dithering ON
     UINT32 *p_background_dithered_cache;
   // Background texture
	 T_R2D_ANCHORED_TEXTURE *background_texture;
   // Pen position
     INT16 pen_x,pen_y;
   // pen_size in pixels
     INT16 pen_size;
   // Drawing mode
     INT16 drawing_mode;
   // Drawing operator for above drawing mode
	 T_R2D_DRAWING_OP drawing_op;
   // Context origin (H coordinates of upper-left corner of screen)
     INT16 org_x,org_y;
   // Context origin (S coordinates for texture of the point corresponding
   //                 to (0,0) H coordinates)
	 INT16 s_org_x,s_org_y;
   // Dash state
     BOOLEAN dash;
   // Text face
     T_R2D_TEXT_FACE text_face;
   // Text style
   //  (List of types requested by the user)
     T_R2D_TEXT_STYLE text_style;
   // Internal text style
   //  (list of style effect which must be computed since
   //  there are not embedded into the fonts)
     T_R2D_TEXT_STYLE internal_text_style;
   // Text size
     T_R2D_TEXT_SIZE text_size;
   // Font framebuffer
     T_R2D_FRAMEBUFFER *font_frame_buffer;
   // Font metrics pointer
     INT32 *font_metrics;
   // Font transcoding table
	 INT32 *font_table;
   // Script mode (left to right by defaulr)
	 T_R2D_SCRIPT_MODE script_mode;
} T_R2D_GC;

////////////////////////////////////////
//
// FONT CONFIG
//

typedef INT32 *T_R2D_FONT_METRICS;
typedef INT32 *T_R2D_FONT_TABLE;

typedef struct R2D_FONT_DESCRIPTION
{
	T_R2D_FONT_TABLE table;
	T_R2D_FONT_METRICS metrics;
	T_R2D_FRAMEBUFFER_PTR framebuffer;
	BOOLEAN compute_bold;
} T_R2D_FONT_DESCRIPTION;


/***************************************

     FUNCTIONS

***************************************/

////////////////////////////////////////
//
//    TOOL
//    MACROS
//

// One should never call following function directly
// because when refcount is reaching 0 an object
// has generally subobject torelease before releasing
// itself

// Decrement refcount and autodelete if required
#define r2d_release(p) { \
    if (p) \
    { \
      if ((((T_R2D_REFCOUNT*)(p))->refcount)>0) { \
       ((T_R2D_REFCOUNT*)(p))->refcount--; \
       if ((((T_R2D_REFCOUNT*)(p))->refcount==0)) \
          R2D_FREE(p); \
	  } \
    } \
   }


// Return refcount of an object
#define R2D_REFCOUNT(p) (((T_R2D_REFCOUNT*)(p))->refcount)

// Compute dithered value
// lightness is either the gray intensity (for monochrome)
// or the component intensity.
// It is coded on at most 8 bits
#if (R2D_DITHERING == R2D_ON)

  #define r2d_dithering_group_and_lightness() \
  lightness = lightness >> (8 - R2D_DITHERING_DIMENSION - R2D_PIXEL_DEPTH); \
        dithering_group=lightness >> R2D_DITHERING_DIMENSION; \
 \
        lightness=lightness & R2D_DITHERED_MASK;

  #define r2d_dithered_value(x,y) \
  \
        dvalue=dithering_group; \
        if (lightness>=r2d_get_dithering_matrix_entry(r2d_g_dithering_matrix,x,y)) \
          dvalue+=1; \
\
        if (dvalue) \
          dvalue--;
#else
  #define r2d_dithering_group_and_lightness()
  #define r2d_dithered_value(x,y)
#endif

extern INT32 r2d_ptree_find(INT32 *tree,INT32 unicode);

void r2d_arc_region_x_reflect(T_R2D_ARC_REGION *rgn);
void r2d_arc_region_y_reflect(T_R2D_ARC_REGION *rgn);
void r2d_arc_region_diagonal_reflect(T_R2D_ARC_REGION *rgn);
BOOLEAN r2d_check_is_in_arc_region(INT16 x,INT16 y,T_R2D_ARC_REGION *rgn);
INT32 r2d_get_point_side(INT16 x,INT16 y,INT32 sa,INT32 sb);

////////////////////////////////////////
//
//    LCD
//    FUNCTIONS
//

extern void r2d_convert_foreground_color(T_R2D_GC *gc,UINT32 color);
extern void r2d_convert_background_color(T_R2D_GC *gc,UINT32 color);
extern BOOLEAN r2d_lcd_foreground_pixel(UINT32 lcd_value,T_R2D_GC_PTR src_gc);
extern UINT32 r2d_color_to_lcd(UINT32 pixel_value,INT16 x,INT16 y);
extern UINT32 r2d_lcd_to_color(UINT32 color);

////////////////////////////////////////
//
//    SHAPE LOW LEVEL
//    FUNCTIONS
//

void r2d_release_rectangle(T_R2D_SHAPE *self);
void r2d_draw_rectangle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_rectangle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
T_R2D_SHAPE_PTR r2d_clone_rectangle_shape(T_RVF_MB_ID bank,T_R2D_SHAPE *self);

void r2d_release_circle(T_R2D_SHAPE *self);
void r2d_draw_circle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_circle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
T_R2D_SHAPE_PTR r2d_clone_circle_shape(T_RVF_MB_ID bank,T_R2D_SHAPE *self);

void r2d_release_ellipse(T_R2D_SHAPE *self);
void r2d_draw_ellipse_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_ellipse_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);

void r2d_release_round_rectangle(T_R2D_SHAPE *self);
void r2d_draw_round_rectangle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_round_rectangle_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
T_R2D_SHAPE_PTR r2d_clone_round_rectangle_shape(T_RVF_MB_ID bank,T_R2D_SHAPE *self);

void r2d_release_arc(T_R2D_SHAPE *self);
void r2d_draw_arc_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_arc_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
T_R2D_SHAPE_PTR r2d_clone_arc_shape(T_RVF_MB_ID bank,T_R2D_SHAPE *self);

void r2d_release_text(T_R2D_SHAPE *self);
void r2d_draw_text_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
void r2d_fill_text_shape(T_R2D_SHAPE *self,T_R2D_GC_PTR gc);
T_R2D_SHAPE_PTR r2d_clone_text_shape(T_RVF_MB_ID bank,T_R2D_SHAPE *self);

void r2d_translate_rectangle_shape(T_R2D_SHAPE *self,INT16 dx,INT16 dy);
void r2d_translate_point_shape(T_R2D_SHAPE *self,INT16 dx,INT16 dy);

BOOLEAN r2d_point_in_rectangle_shape(T_R2D_SHAPE *self,INT16 x,INT16 y);
BOOLEAN r2d_point_in_circle_shape(T_R2D_SHAPE *self,INT16 x,INT16 y);
BOOLEAN r2d_point_in_ellipse_shape(T_R2D_SHAPE *self,INT16 x,INT16 y);
BOOLEAN r2d_point_in_round_rectangle_shape(T_R2D_SHAPE *self,INT16 x,INT16 y);
BOOLEAN r2d_point_in_not_supported_shape(T_R2D_SHAPE *self,INT16 x,INT16 y);

////////////////////////////////////////
//
//    FRAMEBUFFER ACCESS
//    FUNCTIONS
//



// Write a pixel at position x,y with graphic context gc
// pixel_value must be compatible with the framebuffer owned
// by the graphic context. No color conversion is done
// here
extern void r2d_write_lcd_pixel(T_R2D_GC *gc,INT16 x,INT16 y,UINT32 pixel_value);
extern void r2d_write_lcd_line(T_R2D_GC* gc,INT16 x,INT16 y,INT16 nb,R2D_BOOLEAN
background);
extern void r2d_arc_write_lcd_line(T_R2D_GC* gc,INT16 x,INT16 y,INT16 org_x,INT16 org_y,INT16 nb,
								   T_R2D_ARC_REGION *rgn,R2D_BOOLEAN
background);


extern T_R2D_DRAWING_OP r2d_get_drawing_op(T_R2D_GC *gc,T_R2D_DRAWING_MODE mode);
#if (R2D_ASM == R2D_ON)
extern UINT32 * r2d_get_asm_drawing_op(T_R2D_GC *gc,T_R2D_DRAWING_MODE mode);

#endif

////////////////////////////////////////
//
//    COLOR
//    FUNCTIONS
//

// color conversion : on the fly dithering and color scaling
// with final conversion to the format used by the LCD if needed
// The dithered matrix or the pixel_value are cached into the gc
// structure
extern void r2d_convert_foreground_color(T_R2D_GC *gc,UINT32 color);
extern void r2d_convert_background_color(T_R2D_GC *gc,UINT32 color);

// Get value at dithering matrix position
#define r2d_get_dithering_matrix_entry(matrix,x,y) \
 *(matrix+(x&1)+(y&1)*2)

// Set element (x,y) of dithering or dithered matrix
extern void r2d_set_dithering_matrix_entry(UINT32 *matrix,UINT32 elem,INT16 x,INT16 y);

extern void r2d_convert_foreground_color_color(T_R2D_GC *gc,UINT32 color);
extern void r2d_convert_background_color_color(T_R2D_GC *gc,UINT32 color);

extern UINT16 r2d_max_color(UINT16 red,UINT16 green, UINT16 blue);
// Get min component
extern UINT16 r2d_min_color(UINT16 red,UINT16 green, UINT16 blue);

extern UINT32 r2d_get_color_pixel_value(T_R2D_GC *gc,INT16 x,INT16 y);

////////////////////////////////////////
//
//    TEXT
//    FUNCTIONS
//

#define r2d_get_char_x(p) (((INT32*)p)[0])

////////////////////////////////////////
//
//    COPY
//    FUNCTIONS
//

#if (R2D_ASM == R2D_OFF)

void           r2d_blit_lcd_to_lcd(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc,
                 T_R2D_SHAPE_PTR src_rectangle, T_R2D_SHAPE_PTR dst_rectangle,
				 R2D_BOOLEAN use_foreground_color);

void           r2d_blit_color_to_color(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc,
                 T_R2D_SHAPE_PTR src_rectangle, T_R2D_SHAPE_PTR dst_rectangle,
				 R2D_BOOLEAN use_foreground_color);

void           r2d_blit_lcd_to_color(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc,
                 T_R2D_SHAPE_PTR src_rectangle, T_R2D_SHAPE_PTR dst_rectangle,
				 R2D_BOOLEAN use_foreground_color);

void           r2d_blit_color_to_lcd(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc,
                 T_R2D_SHAPE_PTR src_rectangle, T_R2D_SHAPE_PTR dst_rectangle,
				 R2D_BOOLEAN use_foreground_color);
#else

void           r2d_blit_asm(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc,
                             T_R2D_SHAPE_PTR src_rectangle, 
							 T_R2D_SHAPE_PTR dst_rectangle,
							 R2D_BOOLEAN use_foreground_color,INT32 srcdst);
#endif


/***************************
  
	 DEFINES

***************************/

/* FOR SEARCH INSIDE PATRICIA TREE */
#define R2D_PTREE_TYPE 3
#define R2D_PTREE_BRANCHING 0
#define R2D_PTREE_PREFIX 1
#define R2D_PTREE_UNICODE_BLOCK 0
#define R2D_PTREE_GLYPH_INDEX 1
#define R2D_PTREE_CONVERSION 2
#define R2D_PTREE_LEFT 2
#define R2D_PTREE_RIGHT 3
#define R2D_PTREE_CONVERSION 2
#define R2D_PTREE_T_LEAF 0
#define R2D_PTREE_SHIFT 4

/* FOR FONT DESCRIPTION */

#define R2D_SMALL_SYSTEM_NORMAL 0
#define R2D_SMALL_SYSTEM_BOLD 1
#define R2D_SMALL_SYSTEM_ITALIC 2
#define R2D_SMALL_SYSTEM_BOLD_ITALIC 3

#define R2D_MEDIUM_SYSTEM_NORMAL 4
#define R2D_MEDIUM_SYSTEM_BOLD 5
#define R2D_MEDIUM_SYSTEM_ITALIC 6
#define R2D_MEDIUM_SYSTEM_BOLD_ITALIC 7

#define R2D_BIG_SYSTEM_NORMAL 8
#define R2D_BIG_SYSTEM_BOLD 9
#define R2D_BIG_SYSTEM_ITALIC 10
#define R2D_BIG_SYSTEM_BOLD_ITALIC 11

#define R2D_SMALL_TYPEWRITER_NORMAL 12
#define R2D_SMALL_TYPEWRITER_BOLD 13
#define R2D_SMALL_TYPEWRITER_ITALIC 14
#define R2D_SMALL_TYPEWRITER_BOLD_ITALIC 15

#define R2D_MEDIUM_TYPEWRITER_NORMAL 16
#define R2D_MEDIUM_TYPEWRITER_BOLD 17
#define R2D_MEDIUM_TYPEWRITER_ITALIC 18
#define R2D_MEDIUM_TYPEWRITER_BOLD_ITALIC 19

#define R2D_BIG_TYPEWRITER_NORMAL 20
#define R2D_BIG_TYPEWRITER_BOLD 21
#define R2D_BIG_TYPEWRITER_ITALIC 22
#define R2D_BIG_TYPEWRITER_BOLD_ITALIC 23

#define R2D_SMALL_PROPORTIONAL_NORMAL 24
#define R2D_SMALL_PROPORTIONAL_BOLD 25
#define R2D_SMALL_PROPORTIONAL_ITALIC 26
#define R2D_SMALL_PROPORTIONAL_BOLD_ITALIC 27

#define R2D_MEDIUM_PROPORTIONAL_NORMAL 28
#define R2D_MEDIUM_PROPORTIONAL_BOLD 29
#define R2D_MEDIUM_PROPORTIONAL_ITALIC 30
#define R2D_MEDIUM_PROPORTIONAL_BOLD_ITALIC 31

#define R2D_BIG_PROPORTIONAL_NORMAL 32
#define R2D_BIG_PROPORTIONAL_BOLD 33
#define R2D_BIG_PROPORTIONAL_ITALIC 34
#define R2D_BIG_PROPORTIONAL_BOLD_ITALIC 35


/***************************

     GLOBALS

****************************/

// and for reentrancy they should be read only if possible
// or protected by a semaphore otherwise

#if (R2D_ASM == R2D_ON)
extern T_RVF_MUTEX * r2d_g_blit_mutex;
extern T_R2D_DRAWING_MODE r2d_g_old_mode;
extern R2D_BOOLEAN r2d_g_old_use_foreground;
extern INT32 r2d_g_old_srcdst;
#endif

// Global mutex for access to global variables
extern T_RVF_MUTEX * r2d_g_global_mutex;


// Drawing operators (C version)
extern const T_R2D_DRAWING_OPERATORS r2d_g_lcd_operators,r2d_g_color_operators;

extern UINT32 *r2d_g_asm_lcd_operators[],*r2d_g_asm_color_operators[];

// LCD framebuffer
extern T_R2D_FRAMEBUFFER* r2d_g_framebuffer;

// For fonts 

extern T_R2D_FONT_DESCRIPTION *r2d_g_font_configuration;

// (default pointers for initialization of graphical context)
extern T_R2D_FRAMEBUFFER *r2d_g_default_font_framebuffer;
extern INT32 *r2d_g_default_font_metrics;
extern INT32 *r2d_g_default_font_table;


// Dithering matrix
extern UINT32 *r2d_g_dithering_matrix;

// Class globals
extern const T_R2D_CLASS_SHAPE r2d_class_rectangle;
extern const T_R2D_CLASS_SHAPE r2d_class_circle;
extern const T_R2D_CLASS_SHAPE r2d_class_ellipse;
extern const T_R2D_CLASS_SHAPE r2d_class_round_rectangle;
extern const T_R2D_CLASS_SHAPE r2d_class_arc;
extern const T_R2D_CLASS_SHAPE r2d_class_text;

// Memory bank id
extern T_RVF_MB_ID r2d_mb_id;

// Global LCD graphical context
extern T_R2D_GC_PTR r2d_g_lcd_gc;

// Global flag to check if event required
extern BOOLEAN r2d_g_event_was_sent;

// Global flag to disable refresh
extern INT16 r2d_g_refresh_disabled;

/* global addr id */
extern T_RVF_ADDR_ID r2d_addr_id;


#endif