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