|
半年时间,写了一个函数:put_pixel,刚写完,还没有调试,调试要到下个月才行。
下月把djyos移植到2416上,在该平台上调试。
透透气,接下来写画细直线(单像素宽)的函数。
函数代码如下,这是预览版,没贴出其他支持代码,待djygui完成后,将完整开源。
//----画点---------------------------------------------------------------------
//功能: 在窗口内画一个像素点。
//参数: gkwin,目标窗口指针
// x,y,画图坐标
// color,颜色,
// r2_mode,二元光栅操作码
//返回: 无
//-----------------------------------------------------------------------------
void gk_put_pixel(struct gkwin_rsc *gkwin,s32 x,s32 y,u32 color,u32 r2_code)
{
struct st_rect limit;
struct clip_rect *clip;
struct gkwin_rsc *fbwin;
struct st_rect_bitmap *bitmap;
u32 pf_color;
s32 offsetx,offsety;
if((r2_code == cn_r2_nop) || (r2_code > cn_r2_last)) //不执行任何操作
return;
if(gkwin->area.bm_bits != NULL) //说明有win buffer
{ //处理方法:在win buffer中绘图,标志change_msk,
bitmap = gkwin->area;
if(bitmap->pf_type == cn_private_pf)
{
gkwin->draw->pixel(bitmap,x,y,color,r2_code);
}else
{
pf_color = __gk_convert_color_to_pf(bitmap->pf_type,color);
__gk_put_pixel_bm(bitmap,x,y,pf_color,r2_code);
}
}else
{
clip = gkwin->visible_clip;
if(clip == NULL)
return ;
fbwin = gkwin->disp->root_gkwin;
if(fbwin->area.bm_bits != NULL) //有frame buffer
{ //处理方法:在root_gkwin中绘图,但只绘gkwin中的可视区域
offsetx = gkwin->absx0 +x;
offsety = gkwin->absy0 +y;
bitmap = gkwin->area;
do{
if(!((offsetx<clip->rect.left) || (offsetx>=clip->rect.right)
|| (offsety<clip->rect.top) ||(offsety>=clip->rect.bottom)))
{
if(bitmap->pf_type == cn_private_pf)
{
fbwin->draw->pixel(bitmap,offsetx,offsety,color,r2_code);
}else
{
pf_color = __gk_convert_color_to_pf(bitmap->pf_type,color);
__gk_put_pixel_bm(bitmap,offsetx,offsety,pf_color,r2_code);
}
__gk_Shading_pixel(fbwin,offsetx,offsety);
break; //像素已经绘制,退出循环
}else
clip = clip->next;
}while(clip != gkwin->visible_clip);
}else //无win buffer,也无frame buffer,直接画在screen上
{
offsetx = gkwin->absx0 - fbwin->absx0 +x;
offsety = gkwin->absy0 - fbwin->absy0 +y;
do{
if(!((offsetx<clip->rect.left) || (offsetx>=clip->rect.right)
|| (offsety<clip->rect.top) ||(offsety>=clip->rect.bottom)))
{
gkwin->disp->direct_draw->pixel(offsetx,offsety,color,r2_code);
break; //像素已经绘制,退出循环
}else
clip = clip->next;
}while(clip != gkwin->visible_clip);
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|