| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1113 人关注过本帖
标题:请问:一笔苍穹 NEO SDK 有关画水平直线优化算法:char hline(int x1, int ...
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:3 
请问:一笔苍穹 NEO SDK 有关画水平直线优化算法:char hline(int x1, int y, int

有关画水平直线优化算法:
1、普通的算法采用char far *video_buffer = (char far *)0xa000;
  普通方式往显存打点时采用BYTE(字节)方式打点
2、优化方式采用 int far *video_buffer = (int far *)0xa000;
优化方式往显存打点时采用WORD(字)方式打点

对于320*200*16色方式下程序代码如下:
无需考虑跨页

void Hline_1(int x1,int y,int x2,int color)
{
unsigned int first_word,middle_word,last_word,line_offset,index;
unsigned int far *video_buffer_w = (unsigned int far *)video_buffer;//字变量

if ((x1&0x0001))
first_word = (color<<8);//第一点为奇数,不整除,只填写后一点
else
first_word = ((color<<8)|color);//第一点为偶数,整除,两点都填写
if ((x2&0x0001))
last_word = (color<<8)|color);//最后一点为奇数,不整除,两点都填写
else
last_word = color;//最后一点为偶数,整除,只填写前一点
//处理直线最前面和最后面那两个无法整除的字节
line_offset = ((y<<7)+(y<<5));
middle_word = ((color<<8)|color);
//以下以字为单位copy数据到显存
video_buffer_w[line_offset-(x1>>1)] = first_word;//画线首
for (i = (x1>>1)+1;i<(x2>>1);i++)//以字为单位循环画线中部
video_buffer_w[line_offset+i] = middle_word;
video_buffer_w[line_offset-(x2>>1)] = last_word;//画线尾
}

但是对于800*600*256色深下,由于以(字)方式往显存写像素点时,
需要考虑跨页,跨页时该如何处理?以下是你的NEO SDK3.1的程序片段,
希望你能帮我看看我加的注释是否正确:

page = (char)((addr = ((long)y + g_sl_offset) * g_screen_h + x1) >> 15);
//计算直线的起始页号
if (page == ((addr + length) >> 15)) //如果当前直线在同一页内
{
int far *d_tmp = (int far *)(g_videoptr + (unsigned)((addr << 1) & 0xffff));
//以字为单位的直线在显示的起始地址
set_vbe_page(page);
for (k = g_rect_left; k < len; ++k)
{
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[k] = color; break;//以字方式打点
case XOR_PUT : d_tmp[k] = d_tmp[k] ^ color; break;
case NOT_PUT : d_tmp[k] = ~d_tmp[k]; break;
case OR_PUT : d_tmp[k] = d_tmp[k] | color; break;
case AND_PUT : d_tmp[k] = d_tmp[k] & color; break;
}
}
}
else//如果当前直线跨页
{
for (k = g_rect_left; k < length; ++k)
dot(k + xx, y, color);
if (odd) dot(xx + length, y, color8); /*补齐*/
}
 
当跨页时,怎么只是简单的用字节(BYTE)方式打点,并没有见到跨页点的处理呢?

搜索更多相关主题的帖子: int 水平直线 SDK char 算法 
2007-10-30 14:50
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
呵呵,当时偷了个懒,发生跨页后就从跨页处开始直接调用dot()直到结束
其实可以单独处理了跨页后再使用int *进行优化画线。
其实还可以用datamove画线,更加优化。也要处理跨页
2007-10-30 15:18
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
是否需要考虑如下几种情况:
 1、当不跨页时
a.水平线第一点为奇数(或者偶数)
b.水平线最后一点为奇数(或者偶数)
2、当跨页时
a.第一页水平线第一点奇数(或者偶数)
b.第一页水平线最后一点为奇数(或者偶数)
c.第二页水平线第一点为奇数(或者偶数)
d.第二页水平线最后一点为奇数(或者偶数)

当第一点为奇数,只填写后一点
当第一点为偶数,两点都填写
当最后一点为奇数,两点都填写
当最后一点为奇数,只填写前一点

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-10-30 16:00
eakcon
Rank: 1
等 级:新手上路
帖 子:754
专家分:0
注 册:2007-11-7
收藏
得分:0 
太有味了
2007-11-14 10:06
快速回复:请问:一笔苍穹 NEO SDK 有关画水平直线优化算法:char hline(int x1, ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019420 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved