FreeCalypso > hg > fc-tourmaline
diff src/cs/drivers/drv_app/r2d/r2d_i.c @ 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_i.c Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,448 @@ +/** + + @file: r2d_i.c + + @author Christophe Favergeon + + @version 0.5 + + Purpose: Low level utilities functions for R2D + +*/ + +/* + + Date Modification + ------------------------------------ + 06/02/2001 Create + 10/18/2001 Version 0.5 for first integration with Riviera database + + + (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved +*/ + + + +#include "rv/general.h" +#include "rvf/rvf_api.h" +#include "r2d/r2d_config.h" +#include "r2d/r2d.h" +#include "r2d/r2d_i.h" +#include "r2d/r2d_independance_layer.h" +#if (R2D_DEBUG == R2D_ON) +#include <stdio.h> +#endif + +#if (R2D_EMBEDDED_LCD == R2D_PC_COLOR_LCD) +#include "Windows.h" +#endif + + +//////////////////////////////////////// +// +// GLOBALS +// + +UINT32 *r2d_g_dithering_matrix; + +#if (R2D_ASM == R2D_ON) +T_RVF_MUTEX * r2d_g_blit_mutex; +T_R2D_DRAWING_MODE r2d_g_old_mode; +R2D_BOOLEAN r2d_g_old_use_foreground; +INT32 r2d_g_old_srcdst; +UINT32 r2d_g_old_foreground_pixelvalue; +UINT32 r2d_g_old_background_pixelvalue; +#endif + +T_RVF_MUTEX * r2d_g_global_mutex; + + +//////////////////////////////////////// +// +// Class definitions +// + +const T_R2D_CLASS_SHAPE r2d_class_rectangle= +{ + NULL, + r2d_release_rectangle, + r2d_draw_rectangle_shape, + r2d_fill_rectangle_shape, + r2d_clone_rectangle_shape, + r2d_translate_rectangle_shape, + r2d_point_in_rectangle_shape +}; + +const T_R2D_CLASS_SHAPE r2d_class_circle= +{ + NULL, + r2d_release_circle, + r2d_draw_circle_shape, + r2d_fill_circle_shape, + r2d_clone_circle_shape, + r2d_translate_point_shape, + r2d_point_in_circle_shape +}; + +const T_R2D_CLASS_SHAPE r2d_class_ellipse= +{ + NULL, + r2d_release_ellipse, + r2d_draw_ellipse_shape, + r2d_fill_ellipse_shape, + r2d_clone_rectangle_shape, + r2d_translate_rectangle_shape, + r2d_point_in_ellipse_shape +}; + +const T_R2D_CLASS_SHAPE r2d_class_round_rectangle= +{ + NULL, + r2d_release_round_rectangle, + r2d_draw_round_rectangle_shape, + r2d_fill_round_rectangle_shape, + r2d_clone_round_rectangle_shape, + r2d_translate_rectangle_shape, + r2d_point_in_round_rectangle_shape +}; + +const T_R2D_CLASS_SHAPE r2d_class_arc= +{ + NULL, + r2d_release_arc, + r2d_draw_arc_shape, + r2d_fill_arc_shape, + r2d_clone_arc_shape, + r2d_translate_rectangle_shape, + r2d_point_in_not_supported_shape +}; + +const T_R2D_CLASS_SHAPE r2d_class_text= +{ + NULL, + r2d_release_text, + r2d_draw_text_shape, + r2d_fill_text_shape, + r2d_clone_text_shape, + r2d_translate_point_shape, + r2d_point_in_not_supported_shape +}; + +////////////////////////////////// +// +// All globals must be protected +// with semaphores + + +T_R2D_FRAMEBUFFER* r2d_g_framebuffer; + +// Pointer for default initializations of graphical context +T_R2D_FRAMEBUFFER *r2d_g_default_font_framebuffer; +INT32 *r2d_g_default_font_metrics; +INT32 *r2d_g_default_font_table; + + +BOOLEAN r2d_g_event_was_sent; +INT16 r2d_g_refresh_disabled; + +T_R2D_FONT_DESCRIPTION *r2d_g_font_configuration; + +////////////////////////////////// +// +// Common C code +// + +T_R2D_DRAWING_OP r2d_get_drawing_op(T_R2D_GC *gc,T_R2D_DRAWING_MODE mode) +{ + if (((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->kind!=R2D_FULL_KIND) + { + return(r2d_g_lcd_operators[mode]); + } + else + return(r2d_g_color_operators[mode]); +} + +#if (R2D_ASM == R2D_ON) +UINT32 * r2d_get_asm_drawing_op(T_R2D_GC *gc,T_R2D_DRAWING_MODE mode) +{ + if (((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->kind!=R2D_FULL_KIND) + { + return(r2d_g_asm_lcd_operators[mode]); + } + else + return(r2d_g_asm_color_operators[mode]); +} +#endif + + +// Get max component +UINT16 r2d_max_color(UINT16 red,UINT16 green, UINT16 blue) +{ + UINT16 result=red; + if (green > result) + result=green; + if (blue > result) + result=blue; + return(result); +} + +// Get min component +UINT16 r2d_min_color(UINT16 red,UINT16 green, UINT16 blue) +{ + UINT16 result=red; + if (green < result) + result=green; + if (blue < result) + result=blue; + return(result); +} + +#if (R2D_DITHERING == R2D_ON) + +// Set element (x,y) of dithering or dithered matrix +void r2d_set_dithering_matrix_entry(UINT32 *matrix,UINT32 elem,INT16 x,INT16 y) +{ + UINT32 *p=matrix; + p+=(x&1)+(y&1)*2; + *p=elem; +} + + +#else +#define r2d_set_dithering_matrix_entry(matrix,elem,x,y) +#endif + + +static UINT32 r2d_color_copy_operator(UINT32 old,UINT32 value) +{ + return(value); +} +static UINT32 r2d_color_or_operator(UINT32 old,UINT32 value) +{ + if ((value&0x00FFFFFF)==0) + return(value); + else + return(old); + +} +static UINT32 r2d_color_and_operator(UINT32 old,UINT32 value) +{ + return(old & value); +} +static UINT32 r2d_color_xor_operator(UINT32 old,UINT32 value) +{ + return(old ^ value) ; +} +static UINT32 r2d_color_not_copy_operator(UINT32 old,UINT32 value) +{ + return(~value); +} +static UINT32 r2d_color_not_or_operator(UINT32 old,UINT32 value) +{ + return(~(old | value)); +} +static UINT32 r2d_color_not_and_operator(UINT32 old,UINT32 value) +{ + return(~(old & value)); +} +static UINT32 r2d_color_not_xor_operator(UINT32 old,UINT32 value) +{ + return(~(old ^ value)) ; +} + +static UINT32 r2d_color_erase_operator(UINT32 old,UINT32 value) +{ + if ((value & 0xFFFFFF)==0xFFFFFF) + return(0); + else + return(old); +} + +UINT32 r2d_color_alpha_operator(UINT32 old,UINT32 value) +{ + INT16 a,rs,gs,bs,rd,gd,bd; + + a=(value >> 24) & 0x0FF; + + value=~value; + old=~old; + + bs=(value & 0xFF); + value=value>>8; + gs=(value & 0xFF); + value=value>>8; + rs=(value & 0xFF); + value=value>>8; + + + + + bd=(old & 0xFF); + old=old>>8; + gd=(old & 0xFF); + old=old>>8; + rd=(old & 0xFF); + + // Pixel value has been complemented before being + // saved so that the white correspond to 0 and be + // compatible with formulas for other modes. + // But alpha value is not complemented + // So a=0xFF correspond tranparency + bd=((a)*bd+(0x100 - a)*bs) >> 8; + gd=((a)*gd+(0x100 - a)*gs) >> 8; + rd=((a)*rd+(0x100 - a)*rs) >> 8; + + old=0; + old=old|(rd&0xFF); + old=old<<8; + old=old|(gd&0xFF); + old=old<<8; + old=old|(bd&0xFF); + old=(~old) & 0x00FFFFFF; + return(old); +} + + +const T_R2D_DRAWING_OPERATORS r2d_g_color_operators= +{ + &r2d_color_copy_operator, + &r2d_color_or_operator, + &r2d_color_and_operator, + &r2d_color_xor_operator, + &r2d_color_not_copy_operator, + &r2d_color_not_or_operator, + &r2d_color_not_and_operator, + &r2d_color_not_xor_operator, + &r2d_color_alpha_operator, + &r2d_color_erase_operator +}; + +void r2d_convert_foreground_color_color(T_R2D_GC *gc,UINT32 color) +{ + UINT32 lcolor; + gc->foreground_pixel_value=r2d_alpha(color); + gc->foreground_pixel_value<<=24; + + lcolor=0; + lcolor|=r2d_red(color); + lcolor=lcolor<<8; + lcolor|=r2d_green(color); + lcolor=lcolor<<8; + lcolor|=r2d_blue(color); + + gc->foreground_pixel_value|=(~lcolor) & 0x00FFFFFF; + + +} + +// Return the pixel value to write on the LCD or the offscreen +// pixmap +// LCD DEPENDENT +void r2d_convert_background_color_color(T_R2D_GC *gc,UINT32 color) +{ + UINT32 lcolor; + gc->background_pixel_value=r2d_alpha(color); + gc->background_pixel_value<<=24; + + lcolor=0; + lcolor|=r2d_red(color); + lcolor=lcolor<<8; + lcolor|=r2d_green(color); + lcolor=lcolor<<8; + lcolor|=r2d_blue(color); + + + gc->background_pixel_value|=(~color) & 0x00FFFFFF; + +} + + +// Select pixel of a color framebuffer as being +// a foreground or background one +BOOLEAN r2d_color_framebuffer_foreground_pixel(UINT32 lcd_value,T_R2D_GC_PTR src_gc) +{ + if ((lcd_value & 0x00FFFFFF)) + return(TRUE); + else + return(FALSE); +} + + +INT32 r2d_ptree_find(INT32 *tree,INT32 unicode) +{ + INT32 state=0; + INT32 current_block; + + current_block=unicode>>R2D_PTREE_SHIFT; + while (tree[state+R2D_PTREE_TYPE]!=R2D_PTREE_T_LEAF) + { + if (current_block & tree[state+R2D_PTREE_PREFIX]) + state=tree[state+R2D_PTREE_RIGHT]; + else + state=tree[state+R2D_PTREE_LEFT]; + } + + if (tree[state+R2D_PTREE_UNICODE_BLOCK]==current_block) + { + return(unicode + (tree[state+R2D_PTREE_CONVERSION])); + } + else + return(0); +} + + + +INT32 r2d_get_point_side(INT16 x,INT16 y,INT32 sa,INT32 sb) +{ + INT32 ret; + ret=((sb>>1)*x+((-sa)>>1)*y); + return(ret); +} + +BOOLEAN r2d_check_is_in_arc_region(INT16 x,INT16 y,T_R2D_ARC_REGION *rgn) +{ + INT32 a,b; + + a=r2d_get_point_side(x,y,rgn->sa,rgn->sb); + b=r2d_get_point_side(x,y,rgn->ea,rgn->eb); + + /*if (a&&b) + r2d_set_foreground_color_with_argb(r2d_g_lcd_gc,0,255,0,0); + else if (!a && !b) + r2d_set_foreground_color_with_argb(r2d_g_lcd_gc,0,0,255,0); + else if (!a && b) + r2d_set_foreground_color_with_argb(r2d_g_lcd_gc,0,0,0,255); + else if (a && !b) + r2d_set_foreground_color_with_argb(r2d_g_lcd_gc,0,255,255,0);*/ + + if (rgn->one_sector==0) + return(((a>=0) && (b>=0))); + else + return(!(!(a>=0) && !(b>=0))); + +} + +void r2d_arc_region_y_reflect(T_R2D_ARC_REGION *rgn) +{ + rgn->sa=-rgn->sa; + rgn->ea=-rgn->ea; +} + +void r2d_arc_region_x_reflect(T_R2D_ARC_REGION *rgn) +{ + rgn->sb=-rgn->sb; + rgn->eb=-rgn->eb; +} + +void r2d_arc_region_diagonal_reflect(T_R2D_ARC_REGION *rgn) +{ + INT32 tmp; + + tmp=rgn->sa; + rgn->sa=rgn->sb; + rgn->sb=tmp; + + tmp=rgn->ea; + rgn->ea=rgn->eb; + rgn->eb=tmp; +} \ No newline at end of file