📄 r2d_vertical_lcd_i.c
字号:
#if (R2D_PIXEL_DEPTH == 32)
#define R2D_PIXEL_DOWN_OUT(a) (0)
#define R2D_PIXEL_UP_OUT(a) (0)
#else
#define R2D_PIXEL_DOWN_OUT(a) (a>>R2D_PIXEL_DEPTH)
#define R2D_PIXEL_UP_OUT(a) (a<<R2D_PIXEL_DEPTH)
#endif
#if (R2D_ASM == R2D_ON)
// All below global are modified in the context of a blit_rect and
// the use of the self modifying blit_rect is protected by
// a semaphore
extern T_R2D_DRAWING_MODE r2d_g_old_mode;
extern R2D_BOOLEAN r2d_g_old_use_foreground;
extern INT32 r2d_g_old_srcdst;
extern UINT32 r2d_g_old_foreground_pixelvalue;
extern UINT32 r2d_g_old_background_pixelvalue;
extern void r2d_blit_la(UINT32 *a);
extern void r2d_blit_lb(UINT32 *a);
#endif
#define r2d_get_texture_color() ((T_R2D_ANCHORED_TEXTURE*)(gc->background_texture))->pattern[((x-gc->s_org_x)&texture_mask)*texture_size+((ty-gc->s_org_y)&texture_mask)]
extern void MI_dbgPrintf(const char* const format, ...);
void r2d_write_lcd_line(T_R2D_GC* gc,INT16 x,INT16 y,INT16 nb,R2D_BOOLEAN background)
{
UINT32 *p;
UINT16 tmp,ty;
UINT32 temp;
UINT32 pixel_cache,current_y,count,pixel_value;
UINT32 new_value,current_value;
T_R2D_DRAWING_OP dop;
INT16 texture_mask,texture_size;
ty=y; // True y
if (gc->background_texture!=NULL)
{
texture_mask=~((-1)<<gc->background_texture->size);
texture_size=1<<gc->background_texture->size;
}
dop=gc->drawing_op;
if (nb==0)
goto r2d_fail_line;
p=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words;
switch(((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->kind)
{
case 0:// LCD format with hard coded dimensions
{
// Get position of the memory word containing the pixel
#if (R2D_REFRESH == R2D_VERTICAL)
p+=((x*(R2D_MWHEIGHT)+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#else
p+=((x*R2D_MWWIDTH+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#endif
if ((y<0) || (x<0) || ((p<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| (p>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
#if (R2D_DEBUG == R2D_ON)
//printf("Error : frame_buffer overflow\n");
IND_rvf_send_trace("R2D : Framebuffer overflow 1",28, NULL_PARAM,
RV_TRACE_LEVEL_ERROR, R2D_USE_ID );
#endif
goto r2d_fail_line;
}
// Get the pixel position into the memory word
new_value=0;
y=y & R2D_WORD_POSITION_MASK;
y=y << R2D_PIXEL_POS_TO_BIT_POS;
pixel_cache=*p;
current_y=0;
current_value=pixel_cache;
if (y!=0)
{
do
{
new_value =R2D_PIXEL_DOWN_OUT(new_value);
new_value|=((current_value & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
} while (current_y != y);
}
count=0;
#if (R2D_DITHERING == R2D_OFF)
if (background)
pixel_value=((T_R2D_GC*)gc)->background_pixel_value;
else
pixel_value=((T_R2D_GC*)gc)->foreground_pixel_value;
#endif
//new_value = 0xffffffff;
do
{
#if (R2D_DITHERING == R2D_ON)
if (background)
{
if (gc->background_texture!=NULL)
pixel_value=r2d_get_texture_color();
else
pixel_value=r2d_get_dithering_matrix_entry(((T_R2D_GC*)gc)->p_background_dithered_cache,x,ty);
}
else
pixel_value=r2d_get_dithering_matrix_entry(((T_R2D_GC*)gc)->p_foreground_dithered_cache,x,ty);
#endif
#if (R2D_DITHERING == R2D_OFF)
if ((background) && (gc->background_texture!=NULL))
pixel_value=r2d_get_texture_color();
#endif
ty++;
new_value =R2D_PIXEL_DOWN_OUT(new_value);
new_value|=((dop(current_value & R2D_PIXEL_MASK,pixel_value) & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
if (current_y==(1<<R2D_MEMORY_WORD))
{
current_y=0;
*p++=new_value;
current_value=*p;
}
count++;
} while (count<nb);
while(current_y != (1<<R2D_MEMORY_WORD))
{
new_value =R2D_PIXEL_DOWN_OUT(new_value) ;
new_value|=((current_value & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
}
*p++=new_value;
}
break;
case R2D_LCD_KIND: // LCD format with any size
{
INT16 height,width;
height=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->height;
width=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->width;
// Get position of the memory word containing the pixel
#if (R2D_REFRESH == R2D_VERTICAL)
p+=((x*R2D_ALIGNED_MWLENGTH(height)+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#else
p+=((x*R2D_ALIGNED_MWLENGTH(width)+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#endif
if ((y<0) || (x<0) || ((p<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| (p>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
#if (R2D_DEBUG == R2D_ON)
IND_rvf_send_trace("R2D : Framebuffer overflow 2",28, NULL_PARAM,
RV_TRACE_LEVEL_ERROR, R2D_USE_ID );
#endif
goto r2d_fail_line;
}
// Get the pixel position into the memory word
new_value=0;
y=y & R2D_WORD_POSITION_MASK;
y=y << R2D_PIXEL_POS_TO_BIT_POS;
pixel_cache=*p;
current_y=0;
current_value=pixel_cache;
if (y!=0)
{
do
{
new_value =R2D_PIXEL_DOWN_OUT(new_value) ;
new_value|=((current_value & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
} while (current_y != y);
}
count=0;
#if (R2D_DITHERING == R2D_OFF)
if (background)
pixel_value=((T_R2D_GC*)gc)->background_pixel_value;
else
pixel_value=((T_R2D_GC*)gc)->foreground_pixel_value;
#endif
do
{
#if (R2D_DITHERING == R2D_ON)
if (background)
if (gc->background_texture!=NULL)
pixel_value=r2d_get_texture_color();
else
pixel_value=r2d_get_dithering_matrix_entry(((T_R2D_GC*)gc)->p_background_dithered_cache,x,ty);
else
pixel_value=r2d_get_dithering_matrix_entry(((T_R2D_GC*)gc)->p_foreground_dithered_cache,x,ty);
#endif
#if (R2D_DITHERING == R2D_OFF)
if ((background) && (gc->background_texture!=NULL))
pixel_value=r2d_get_texture_color();
#endif
ty++;
new_value =R2D_PIXEL_DOWN_OUT(new_value);
new_value|=((dop(current_value & R2D_PIXEL_MASK,pixel_value) & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
if (current_y==(1<<R2D_MEMORY_WORD))
{
current_y=0;
*p++=new_value;
current_value=*p;
}
count++;
} while (count<nb);
while(current_y != (1<<R2D_MEMORY_WORD))
{
new_value =R2D_PIXEL_DOWN_OUT(new_value);
new_value|=((current_value & R2D_PIXEL_MASK)
<< ((1<<R2D_MEMORY_WORD) - R2D_PIXEL_DEPTH)) ;
current_value=R2D_PIXEL_DOWN_OUT(current_value);
current_y+=(1<<R2D_PIXEL_POS_TO_BIT_POS);
}
*p++=new_value;
}
break;
case R2D_FULL_KIND: // LCD format with any size
{
INT16 height,width;
height=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->height;
width=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->width;
// Get position of the memory word containing the pixel
#if (R2D_REFRESH == R2D_VERTICAL)
p+=((x*height+y));
#else
p+=((x*width+y));
#endif
if ((y<0) || (x<0) || ((p<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| (p>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
#if (R2D_DEBUG == R2D_ON)
IND_rvf_send_trace("R2D : Framebuffer overflow 3",28, NULL_PARAM,
RV_TRACE_LEVEL_ERROR, R2D_USE_ID );
#endif
goto r2d_fail_line;
}
// Get the pixel position into the memory word
y=0;
new_value=0;
pixel_cache=*p;
current_y=0;
current_value=pixel_cache;
count=0;
if (background)
{
pixel_value=((T_R2D_GC*)gc)->background_pixel_value;
}
else
{
pixel_value=((T_R2D_GC*)gc)->foreground_pixel_value;
}
do
{
if ((background) && (gc->background_texture!=NULL))
pixel_value=r2d_get_texture_color();
ty++;
new_value=dop(current_value,pixel_value);
current_y=0;
*p++=new_value;
current_value=*p;
count++;
} while (count<nb);
}
break;
}
r2d_fail_line:tmp=0; // Just because one needs code after a label
}
/*********************************tangyan add it 9.6***********************************
*function : r2d_getpixelvalue
*author : tangyan
*description: 将指定的(x,y)点color内容从gc 中读出并且返回
*************************************************************************************/
UINT32 r2d_getpixelvalue(T_R2D_GC* gc,INT16 x,INT16 y)
{
UINT32 *p;
UINT16 tmp;
UINT32 pixel_cache,new_value;
UINT32 result;
p=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words;
if(((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->kind==0)
{
#if (R2D_REFRESH == R2D_VERTICAL)
p+=((x*R2D_MWHEIGHT+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#else
p+=((x*R2D_MWWIDTH+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#endif
if ((y<0) || (x<0) || ((p<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| (p>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
return -1;
}
// Get the pixel position into the memory word
y=y & R2D_WORD_POSITION_MASK;
y=y << R2D_PIXEL_POS_TO_BIT_POS;
pixel_cache=*p;
result=(pixel_cache >> y) & R2D_PIXEL_MASK;
return(result);
}
}
UINT32 r2d_cpy_lcdbuffer(T_R2D_GC* gc,UINT32 lcdy,UINT32 yincreament)
{
UINT32 *pdest,*psrc,memoffset,memsize;
UINT32 twopixvalue,i;
//memoffset=lcdy*60;
memoffset=lcdy*61;
memsize=yincreament*61;
pdest=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words+memoffset;
psrc= ((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words+memoffset+memsize;
if (((pdest<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| ((psrc+memsize)>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
return -1;
}
// Get the pixel position into the memory word
memcpy(pdest,psrc,memsize*4);
return 1;
}
// Returns the equivalent color pixel value
// for the color kind of framebuffer
// It must be converted to RGB components
// Don't confuse with r2d_get_pixel_value which is
// just reading the cached pixel vlue from
// the graphic context.
// That routine is extracting the pixel value at position (x,y)
// from framebuffer
UINT32 r2d_get_color_pixel_value(T_R2D_GC* gc,INT16 x,INT16 y)
{
UINT32 *p;
UINT16 tmp;
UINT32 pixel_cache,new_value;
UINT32 result;
p=((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words;
switch(((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->kind)
{
case 0: // LCD format with hard coded dimensions
{
// Get position of the memory word containing the pixel
#if (R2D_REFRESH == R2D_VERTICAL)
p+=((x*R2D_MWHEIGHT+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#else
p+=((x*R2D_MWWIDTH+(y>>R2D_PIXELS_PER_MEMORY_WORD)));
#endif
if ((y<0) || (x<0) || ((p<((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_memory_words)
|| (p>((T_R2D_FRAMEBUFFER*)(gc->p_frame_buffer))->p_frame_buffer_end)))
{
#if (R2D_DEBUG == R2D_ON)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -