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);}



原创粉丝点击