FreeCalypso > hg > fc-tourmaline
diff src/cs/drivers/drv_app/r2d/r2d.h @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/drivers/drv_app/r2d/r2d.h Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,563 @@ +/** + + @file: r2d.h + + @author Christophe Favergeon + + @version 1.0 + + Purpose: Riviera 2D : Public API + +*/ + +/* + + Date Modification + ------------------------------------ + 06/02/2001 Create + 10/18/2001 Version 0.5 for first integration with Riviera database + 04/30/2002 Version 1.0 + + + (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved +*/ + +/* + History + + Apr-06-2005 MMI-SPR-29655 - xreddymn + Added function r2d_flush_region to allow flushing of portions + of framebuffer to the display + +*/ + + +#ifndef __R2D_H_ +#define __R2D_H_ + +#include "rv/general.h" +#include "rvf/rvf_api.h" +#include "r2d/r2d_config.h" + + +/*************************************** + + IMPORTANT NOTES + +***************************************/ + +// For speed reasons the system is minimizing +// number of checks. + +// So, the user must ensure that some +// conditions are respected before she/he +// calls the drawing subroutines : + +// For rectangle, ellipse etc... one must +// has : br_x > ul_x and br_y > ul_y + +// Rectangles and ellipse where one of +// the dimensions is 0 are not allowed + +// For circle, the radius must be strictly +// positive + + + +/*************************************** + + TYPES / CONSTANTS + +***************************************/ + +//////////////////////////////////////// +// +// GENERAL +// + +typedef enum K_R2D_ERROR +{ + R2D_OK=0, + R2D_MEMORY_ERR=-4, + R2D_UNKNOWN_OP=-5, + R2D_LOCK_ERROR=-6, + R2D_UNLOCK_ERROR=-7 +} T_R2D_ERROR; + +//////////////////////////////////////// +// +// Memory +// +typedef void *T_R2D_REFCOUNT_PTR; + +// Should NEVER be allocated on stack +typedef struct R2D_REFCOUNTING +{ + // Refcounting + INT16 refcount; +} T_R2D_REFCOUNT; + + +//////////////////////////////////////// +// +// Framebuffer +// +typedef enum {R2D_LCD_KIND=1, R2D_FULL_KIND} T_R2D_FRAMEBUFFER_KIND; + +typedef void *T_R2D_FRAMEBUFFER_PTR; + + +//////////////////////////////////////// +// +// Graphic context +// +typedef void *T_R2D_GC_PTR; + +typedef enum K_R2D_DRAWING_MODE { +R2D_COPY_MODE=0, +R2D_OR_MODE, +R2D_AND_MODE, +R2D_XOR_MODE, +R2D_NOT_COPY_MODE, +R2D_NOT_OR_MODE, +R2D_NOT_AND_MODE, +R2D_NOT_XOR_MODE, +R2D_ALPHA_MODE, +R2D_ERASE_MODE +} T_R2D_DRAWING_MODE ; + +typedef enum K_R2D_COLOR_REF +{ +R2D_RED=1, +R2D_BLUE, +R2D_GREEN, +R2D_WHITE, +R2D_BLACK, +R2D_GRAY50 +} T_R2D_COLOR_REF; + +typedef enum K_R2D_TEXT_FACE +{ +R2D_SYSTEM=1, +R2D_TYPEWRITER, +R2D_PROPORTIONAL +} T_R2D_TEXT_FACE; + +typedef enum K_R2D_TEXT_STYLE +{ +R2D_PLAIN=1, +R2D_BOLD=2, +R2D_ITALIC=4, +R2D_UNDERLINED=8, +R2D_STRIKETHROUGH=16 +} T_R2D_TEXT_STYLE; + +typedef enum K_R2D_TEXT_SIZE +{ +R2D_SMALL=1, +R2D_MEDIUM, +R2D_LARGE +} T_R2D_TEXT_SIZE ; + +typedef enum K_R2D_SCRIPT_MODE +{ +R2D_LEFT_TO_RIGHT=1, +R2D_RIGHT_TO_LEFT=2 +} T_R2D_SCRIPT_MODE ; + + +//////////////////////////////////////// +// +// Shapes +// +typedef void *T_R2D_SHAPE_PTR; + +typedef struct R2D_R +{ + INT16 refcount; + void *p_r2d_class; + INT16 ul_x,ul_y,br_x,br_y; +} T_R2D_RECT; + +//////////////////////////////////////// +// +// Text +// +typedef UINT16 T_R2D_UTF16; +typedef UINT32* T_R2D_CHAR_METRIC_PTR; + +//////////////////////////////////////// +// +// Color +// +typedef UINT32 T_R2D_ARGB_COLOR; + +//////////////////////////////////////// +// +// Textures +// +typedef void *T_R2D_FREE_TEXTURE_PTR; +typedef void *T_R2D_ANCHORED_TEXTURE_PTR; + + +/*************************************** + + Functions + +***************************************/ + +//////////////////////////////////////// +// +// Memory +// + +// Increment refcount of an object +#define r2d_retain(p) {\ + if (p) \ + { \ + if (((T_R2D_REFCOUNT*)(p))->refcount>0) \ + ((T_R2D_REFCOUNT*)(p))->refcount++; \ + \ + } \ + } + +//////////////////////////////////////// +// +// Texture +// + +// The pattern is an array of ARGB colors saved column per column +T_R2D_FREE_TEXTURE_PTR r2d_new_free_texture(T_RVF_MB_ID bank,INT16 size,T_R2D_ARGB_COLOR *pattern); +T_R2D_FREE_TEXTURE_PTR r2d_new_const_free_texture(T_RVF_MB_ID bank,INT16 size,T_R2D_ARGB_COLOR *pattern); + +T_R2D_ANCHORED_TEXTURE_PTR r2d_new_anchored_texture(T_RVF_MB_ID bank,T_R2D_GC_PTR gc,T_R2D_FREE_TEXTURE_PTR texture); + +void r2d_release_free_texture(T_R2D_FREE_TEXTURE_PTR texture); +void r2d_release_anchored_texture(T_R2D_ANCHORED_TEXTURE_PTR texture); + +//////////////////////////////////////// +// +// Framebuffer +// + + +T_R2D_FRAMEBUFFER_PTR r2d_new_framebuffer(T_RVF_MB_ID bank,T_R2D_FRAMEBUFFER_KIND the_kind,UINT16 width, UINT16 height); +void r2d_release_framebuffer(T_R2D_FRAMEBUFFER_PTR the_framebuffer); + +// return the size used in a memory bank by a framebuffer +UINT32 r2d_get_framebuffer_size(T_R2D_FRAMEBUFFER_KIND the_kind,UINT16 width, UINT16 height); + +//////////////////////////////////////// +// +// Graphic context +// + +// Return a new graphical contect connected to the LCD framebuffer +// (The LCD framebuffer is private) +T_R2D_GC_PTR r2d_new_lcd_context(T_RVF_MB_ID bank); + +// Return a new graphical context connected to a framebuffer +T_R2D_GC_PTR r2d_new_context(T_RVF_MB_ID bank,T_R2D_FRAMEBUFFER_PTR the_frame_buffer); + +// Return size used in a memory bank by a graphical context (not taking +// into account the framebuffer used by this context) +// For LCD context, the LCD framebuffer is created at build time and +// does not take any space in any memory bank. Other framebuffers are +// using memory from the memory bank +UINT32 r2d_get_gc_size(void); + +// Return a graphical context for a picture saved in R2D format +T_R2D_GC_PTR r2d_new_picture_context(T_RVF_MB_ID bank,const UINT32 *the_picture,T_R2D_FRAMEBUFFER_KIND kind); +void r2d_release_picture_context(T_R2D_GC_PTR gc); + +// Release a graphical context. +// For LCD, the framebuffer is released but never deleted +// since it is also owned by the R2D software entity +void r2d_release_context(T_R2D_GC_PTR gc); + +// Clear the content of the framebuffer referenced by +// the graphic context (in white); +void r2d_erase(T_R2D_GC_PTR gc); +void r2d_erase_with_background(T_R2D_GC_PTR gc, + INT16 a,INT16 b, + INT16 c,INT16 d); + +// Get size and width of the drawing area of the framebuffer referenced +// by the graphic context. The framebuffer (as a memory area) is generally +// a bit larger than the drawing area (defined by width*height) because +// of memory alignment constraints +UINT16 r2d_get_width(T_R2D_GC_PTR gc); +UINT16 r2d_get_height(T_R2D_GC_PTR gc); + +void r2d_get_pen_pos(T_R2D_GC_PTR gc,INT16 *x,INT16 *y); + +// +// Drawing mode settings +T_R2D_DRAWING_MODE r2d_get_drawing_mode(T_R2D_GC_PTR gc); +T_R2D_ERROR r2d_set_drawing_mode(T_R2D_GC_PTR gc,T_R2D_DRAWING_MODE the_mode); + +UINT16 r2d_get_pen_size(T_R2D_GC_PTR gc); +void r2d_set_pen_size(T_R2D_GC_PTR gc,UINT16 the_size); + +BOOLEAN r2d_dash_enabled(T_R2D_GC_PTR gc); +void r2d_set_dash_state(T_R2D_GC_PTR gc,BOOLEAN enabled); + +// Get or set the coordinates of the origin of the framebuffer in the +// graphic context (upper-left point) +// Clipping shape does not move when origin coordinates are +// changed. It is always at the same position relatively to the +// framebuffer +void r2d_set_context_origin(T_R2D_GC_PTR gc,INT16 x,INT16 y); +void r2d_get_context_origin(T_R2D_GC_PTR gc,INT16 *x,INT16 *y); + +// Convert coordinates such that the framebuffer origin is (0,0) +// after the transform +void r2d_local_to_global(T_R2D_GC_PTR gc,INT16 *x,INT16 *y); + +// +// Text settings +void r2d_set_text_face(T_R2D_GC_PTR gc,T_R2D_TEXT_FACE the_face); +T_R2D_TEXT_FACE r2d_get_text_face(T_R2D_GC_PTR gc); + +void r2d_set_text_style(T_R2D_GC_PTR gc,T_R2D_TEXT_STYLE the_style); +T_R2D_TEXT_STYLE r2d_get_text_style(T_R2D_GC_PTR gc); + +void r2d_set_text_size(T_R2D_GC_PTR gc,T_R2D_TEXT_SIZE the_size); +T_R2D_TEXT_SIZE r2d_get_text_size(T_R2D_GC_PTR gc); + +T_R2D_ERROR r2d_context_lock(T_R2D_GC_PTR gc); +T_R2D_ERROR r2d_context_unlock(T_R2D_GC_PTR gc); + +// Flush lcd framebuffer to force the display +void r2d_flush(void); + +// xreddymn Apr-06-2005 MMI-SPR-29655: Function to flush a region to display +void r2d_flush_region(INT16 ul_x,INT16 ul_y,INT16 br_x,INT16 br_y); + +void r2d_disable_refresh(void); +void r2d_enable_refresh(void); + + +// Return the a pointer to the memory area containing +// pixels for the graphic context gc +// Use with care +UINT32* r2d_get_pixmap(T_R2D_GC_PTR gc); + +//////////////////////////////////////// +// +// Colors +// + +// (Never assume a particular format for the ARGB field +// and use Riviera functions to create/set/get colors) + +// Get ARGB foreground color +T_R2D_ARGB_COLOR r2d_get_foreground_color(T_R2D_GC_PTR gc); + +// Set foreground color (seperate components or packed format as +// returned by the Riviera 2D API) +void r2d_set_foreground_color_with_argb(T_R2D_GC_PTR gc,UINT16 alpha,UINT16 red, + UINT16 green,UINT16 blue); +void r2d_set_foreground_color(T_R2D_GC_PTR gc,T_R2D_ARGB_COLOR color); + +// Get ARGB background color +T_R2D_ARGB_COLOR r2d_get_background_color(T_R2D_GC_PTR gc); + +// Set ARGB background color +// ("A" field not supported in that version) +void r2d_set_background_color_with_argb(T_R2D_GC_PTR gc,UINT16 alpha,UINT16 red, + UINT16 green,UINT16 blue); +void r2d_set_background_color(T_R2D_GC_PTR gc,T_R2D_ARGB_COLOR color); + +// Set background texture +// (it hides temporarily the background color) +void r2d_set_background_texture(T_R2D_GC_PTR gc,T_R2D_ANCHORED_TEXTURE_PTR texture); +T_R2D_ANCHORED_TEXTURE_PTR r2d_get_background_texture(T_R2D_GC_PTR gc); + + +// Get color components from an ARGB color +#define r2d_alpha(color) ((UINT16)(((color & 0x0FF000000) >> 24))) +#define r2d_red(color) ((UINT16)(((color & 0x0FF0000) >> 16))) +#define r2d_green(color) ((UINT16)(((color & 0x0FF00) >> 8))) +#define r2d_blue(color) ((UINT16)(((color & 0x00FF)))) + +T_R2D_ARGB_COLOR r2d_new_argb_color(UINT16 alpha,UINT16 red,UINT16 green,UINT16 blue); + +T_R2D_ARGB_COLOR r2d_get_argb_color_at_point(T_R2D_GC_PTR gc,INT16 x,INT16 y); +T_R2D_ARGB_COLOR r2d_get_standard_argb_color(T_R2D_COLOR_REF ref); +void r2d_hsv_to_rgb( INT16 *r, INT16 *g, INT16 *b, INT32 h, INT32 s, INT32 v ); + +//////////////////////////////////////// +// +// Shape functions +// + +void r2d_draw_shape(T_R2D_SHAPE_PTR self,T_R2D_GC_PTR gc); +void r2d_fill_shape(T_R2D_SHAPE_PTR self,T_R2D_GC_PTR gc); +void r2d_translate_shape(T_R2D_SHAPE_PTR self,INT16 dx,INT16 dy); +void r2d_release_shape(T_R2D_SHAPE_PTR self); +T_R2D_SHAPE_PTR r2d_clone_shape(T_RVF_MB_ID bank,T_R2D_SHAPE_PTR self); + + +T_R2D_SHAPE_PTR r2d_new_rectangle(T_RVF_MB_ID bank,INT16 ul_x,INT16 ul_y,INT16 br_x,INT16 br_y); +T_R2D_SHAPE_PTR r2d_new_circle(T_RVF_MB_ID bank,INT16 x,INT16 y,INT16 r); +T_R2D_SHAPE_PTR r2d_new_ellipse(T_RVF_MB_ID bank,INT16 ul_x,INT16 ul_y,INT16 br_x,INT16 br_y); +T_R2D_SHAPE_PTR r2d_new_round_rectangle(T_RVF_MB_ID bank,INT16 ul_x,INT16 ul_y, + INT16 br_x,INT16 br_y,INT16 h,INT16 v); + +T_R2D_SHAPE_PTR r2d_new_arc(T_RVF_MB_ID bank,INT16 start_angle, INT16 stop_angle,INT16 ul_x,INT16 ul_y, + INT16 br_x,INT16 br_y); + +T_R2D_SHAPE_PTR r2d_new_text(T_RVF_MB_ID bank,INT16 x, INT16 y,T_R2D_UTF16 *the_text); + +T_R2D_SHAPE_PTR r2d_new_rectangle_intersection(T_RVF_MB_ID bank,T_R2D_SHAPE_PTR a,T_R2D_SHAPE_PTR b); +T_R2D_SHAPE_PTR r2d_new_rectangle_union(T_RVF_MB_ID bank,T_R2D_SHAPE_PTR a,T_R2D_SHAPE_PTR b); + +#define r2d_get_xmin(r) ((INT16)(((T_R2D_RECT*)r)->ul_x)) +#define r2d_get_ymin(r) ((INT16)(((T_R2D_RECT*)r)->ul_y)) +#define r2d_get_xmax(r) ((INT16)(((T_R2D_RECT*)r)->br_x)) +#define r2d_get_ymax(r) ((INT16)(((T_R2D_RECT*)r)->br_y)) +#define r2d_get_shape_width(r) (((INT16)(((T_R2D_RECT*)r)->br_x)) - ((INT16)(((T_R2D_RECT*)r)->ul_x))) +#define r2d_get_shape_height(r) (((INT16)(((T_R2D_RECT*)r)->br_y)) - ((INT16)(((T_R2D_RECT*)r)->ul_y))) + +//////////////////////////////////////// +// +// Clipping functions +// + +// For clipping with rectangle, we stop +// before xmax (at xmax-1) +// contrary to rectangle drawing where xmax is drawn +void r2d_set_clipping_shape(T_R2D_SHAPE_PTR self,T_R2D_GC_PTR gc); +T_R2D_SHAPE_PTR r2d_get_clipping_shape(T_R2D_GC_PTR gc); +T_R2D_ERROR r2d_restore_standard_clipping_shape(T_R2D_GC_PTR gc); + +//////////////////////////////////////// +// +// Test functions +// +BOOLEAN r2d_point_in_shape(T_R2D_SHAPE_PTR r,INT16 x,INT16 y); + +/////////////////////////////////////// +// +// Drawing functions +// + +// Draw a point in graphical context gc at position (x, y) +void r2d_draw_point(T_R2D_GC_PTR gc,INT16 x,INT16 y); +void r2d_erase_point(T_R2D_GC_PTR gc,INT16 x,INT16 y); + +// Move pen to point (x,y) +void r2d_moveto(T_R2D_GC_PTR gc,INT16 x,INT16 y); +// draw line from pen position to point (x,y) +// (Last point at (x,y) is NOT drawn since x,y is the ending +// coordinate and not the ending point) +void r2d_lineto(T_R2D_GC_PTR gc,INT16 x,INT16 y); + +// br means bottom right as displayed on screen but +// br has a higher y coordinate than ul +// since y increasing means below + +// Rectangle +void r2d_draw_rectangle(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y); +void r2d_fill_rectangle(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 br_x, INT16 br_y); + +// Circle +void r2d_draw_circle(T_R2D_GC_PTR gc, + INT16 x,INT16 y,INT16 r); +void r2d_fill_circle(T_R2D_GC_PTR gc, + INT16 x,INT16 y,INT16 r); + +// Ellipse +void r2d_draw_ellipse(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y); +void r2d_fill_ellipse(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y); + + +// Round Rectangle +void r2d_draw_round_rectangle(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y,INT16 h,INT16 v); +void r2d_fill_round_rectangle(T_R2D_GC_PTR gc, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y,INT16 h,INT16 v); + +// Ellipse arc + +void r2d_draw_arc(T_R2D_GC_PTR gc,INT16 start_angle,INT16 stop_angle, + INT16 ul_x,INT16 ul_y,INT16 bl_x,INT16 bl_y); +void r2d_fill_arc(T_R2D_GC_PTR gc, INT16 start_angle,INT16 stop_angle, + INT16 ul_x,INT16 ul_y,INT16 bl_x, INT16 bl_y); + +/////////////////////////////////////// +// +// Copy function +// + +T_R2D_ERROR r2d_blit_rect(T_R2D_GC_PTR src_gc,T_R2D_GC_PTR dst_gc, + T_R2D_SHAPE_PTR src_rectangle, + T_R2D_SHAPE_PTR dst_rectangle, + BOOLEAN use_foreground_color); + + + +/////////////////////////////////////// +// +// Text functions +// + +#define r2d_get_char_width(p) (((INT32*)p)[1]) +#define r2d_get_char_height(p) (((INT32*)p)[2]) +#define r2d_get_char_dx(p) (((INT32*)p)[3]) +#define r2d_get_char_dy(p) (((INT32*)p)[4]) +#define r2d_get_char_org_x(p) (((INT32*)p)[5]) +#define r2d_get_char_org_y(p) (((INT32*)p)[6]) + +// Return nb of word16 (a Glyph may be made of more than one Unicode char +// so from more than one word16. Consequently, it does not represent the number +// or displayed chars) +INT16 r2d_str_nb_word16(T_R2D_UTF16 *l); +T_R2D_UTF16 *r2d_duplicate_text(T_RVF_MB_ID bank,T_R2D_UTF16 *l); + +T_R2D_UTF16 *r2d_new_unicode_from_cstring(T_RVF_MB_ID bank,unsigned char *the_string); +T_R2D_UTF16 *r2d_new_unicode_from_pstring(T_RVF_MB_ID bank,unsigned char *the_string); + +T_R2D_CHAR_METRIC_PTR r2d_get_char_metrics(T_R2D_GC_PTR gc,UINT32 the_char); + +UINT32 r2d_get_next_char(T_R2D_UTF16 *the_text,INT16 *pos, + UINT16 max_chars,BOOLEAN *swapping); + + +T_R2D_ERROR r2d_draw_char(T_R2D_GC_PTR font_cache_gc, + T_R2D_GC_PTR gc, + T_R2D_GC_PTR fontgc, + INT16 x,INT16 y,INT16 org_size,T_R2D_CHAR_METRIC_PTR p); + +T_R2D_ERROR r2d_draw_text(T_R2D_GC_PTR gc,INT16 x,INT16 y,T_R2D_UTF16 *the_text); + +// Length is given in word16 +T_R2D_ERROR r2d_draw_chars(T_R2D_GC_PTR gc,INT16 x,INT16 y,T_R2D_UTF16 *the_text, + UINT16 nb_words16); + +T_R2D_ERROR r2d_get_text_width(T_R2D_GC_PTR gc,T_R2D_UTF16 *the_text,UINT16 *size); + +// Length is given in word16 +T_R2D_ERROR r2d_get_width_of_chars(T_R2D_GC_PTR gc,T_R2D_UTF16 *the_text,UINT16 nb_words16,UINT16 *size); + + +void r2d_get_font_info(T_R2D_GC_PTR gc,INT16 *ascent,INT16 *descent,INT16 *leading); + +T_R2D_SCRIPT_MODE r2d_get_script_mode(T_R2D_GC_PTR gc); +void r2d_set_script_mode(T_R2D_GC_PTR gc,T_R2D_SCRIPT_MODE mode); + +/////////////////////////////////////// +// +// Globals +// + +#define R2D_EMPTY_RECT NULL +extern T_R2D_GC_PTR r2d_g_lcd_gc; +extern INT16 r2d_g_refresh_disabled; + +#endif