babyos (九) —— 显示bitmap
来源:互联网 发布:b站电影下架 知乎 编辑:程序博客网 时间:2024/06/05 14:37
注:以下代码为原创,若发现bug,万望指出,若有问题,欢迎交流,转载请指明出处。若能有助于一二访客,幸甚。
上次完成了基本图形界面的绘制,但没有关闭、最小化、最大化按钮,终究是不爽,而试着用直线、矩形绘制了一个,感觉不好看,于是就到了让baby能够绘制bitmap图像的时候了~
结果如下,就是把我现在用的Ubuntu Gnome的一种主题模式的三个按钮截了个图,加载到内存,然后绘制在窗口上了。
实现方法也不太难,就是写的时候只考虑了前两个结构体的内存对齐,没有考虑bitmap_t的内存对齐,于是不能绘制,bochs调试一番未果,于是实现了一个在屏幕上绘制16进制数的简单代码,用于调试,打印变量信息若干,才发现问题。
注:只考虑了24位位图、倒立的。
/*************************************************************************> File:bitmap.c> Describe:识别和显示bmp图像> Author:孤舟钓客> Mail:guzhoudiaoke@126.com > Time:2013年01月05日 星期六 22时57分16秒 ************************************************************************/#include <bitmap.h>#include <graphics.h>#include <font.h>#include <math.h>BOOL draw_bitmap24(bitmap_t* p_bmp, s32 dst_x, s32 dst_y, u32 width, u32 height, s32 src_x, s32 src_y){s32 x, y, bmp_cx, bmp_cy, bmp_x, bmp_y, line_byte_count;color24 old_color;u8* p_bmp_data_base = (u8*)p_bmp + sizeof(p_bmp->file_head) + sizeof(p_bmp->info_head);u8* p_data;/* 不是24位位图 */if (p_bmp->info_head.bi_bit_count != 24)return FALSE;/* 图像的宽、髙 */bmp_cx = abs(p_bmp->info_head.bi_width);bmp_cy = abs(p_bmp->info_head.bi_height);if (src_x > bmp_cx || src_y > bmp_cy || (s32)(src_x+width) < 0 || (s32)(src_y+height) < 0)return FALSE;line_byte_count = (((bmp_cx*p_bmp->info_head.bi_bit_count + 31) >> 5) << 2);old_color = get_current_color();for (y = dst_y; y < (s32)(dst_y + height); y++){bmp_y = src_y + height - 1 + dst_y - y;if (bmp_y < 0) continue;if (bmp_y == bmp_cy) break;for (x = dst_x; x < (s32)(dst_x + width); x++){bmp_x = src_x + x - dst_x;if (bmp_x < 0) continue;if (bmp_x == bmp_cx) break;p_data = p_bmp_data_base + line_byte_count*bmp_y + 3*bmp_x;set_color(RGB(p_data[2], p_data[1], p_data[0]));set_pixel(x, y);}}set_color(old_color);return TRUE;}BOOL draw_bitmap(bitmap_t* p_bmp, s32 dst_x, s32 dst_y, u32 width, u32 height, s32 src_x, s32 src_y){return draw_bitmap24(p_bmp, dst_x, dst_y, width, height, src_x, src_y);}
- babyos (九) —— 显示bitmap
- babyos (六)—— 显示ASCII字符和汉字
- babyos (八)—— 简单图形界面
- babyos (十二) —— 键盘中断
- babyos (一)——利用BIOS 中断INT 0x10显示字符和字符串
- babyos (五)—— 跳转到保护模式并显示一个LOGO
- babyos (一)——利用BIOS 中断INT 0x10显示字符和字符串
- babyos (七)—— 简易图形库
- babyos (十一) —— baby, 1/0 = ? (异常和中断)
- babyos (二)——使用BIOS以及直接写显存绘制图形
- babyos (三)——利用BIOS INT 0x13读取软盘
- babyos (四)—— SVGA、VBE基础与切换到髙分辨率模式
- babyos (十) —— 通过IO端口读取硬盘扇区
- babyos (十三) —— 运行在优先级0 的拼图游戏
- babyos (三)——利用BIOS INT 0x13读取软盘
- 【Android开发经验】Bitmap高效显示系列——如何有效的加载大尺寸Bitmap
- 【Android开发经验】Bitmap高效显示系列——如何有效的加载大尺寸Bitmap
- 【Android开发经验】Bitmap高效显示系列——如何有效的加载大尺寸Bitmap
- win7,64位 word2010打开已保存过的文档时报错,必须在安全模式下打开才能打开
- JSP数据库连接大全
- 关于解锁和锁屏
- Spring Security-授权(AccessDecisionManager,AccessDecisionVoter)
- sqlserver里循环调用
- babyos (九) —— 显示bitmap
- xBox kinect视频汇总
- android的m、mm、mmm编译命令的使用
- QWidget and QFrame ->border-image and border-width
- Android web开发(收藏用)
- 浮动div以及div透明
- J2EE应用中与Oracle数据库的连接
- 滑动锁屏的布局文件解析
- Windows XP下安装USB2.0 Storage Device常见错误