babyos—— 简易图形库
与裸机做斗争真是其乐无穷啊~~终究是能画点、线、矩形、圆、填充矩形、字符、汉字、LOGO了。且做了目前我能做到的最好的代码组织。下一步就是用这些函数实现一个简单的界面。
整理绘图功能的函数,组织成一个简易的图形库
1.绘制点直线、圆、矩形、填充矩形的函数放到graphic.c中
[cpp]
/*************************************************************************
> File: graphics.c
> Describe: 实现基本绘图功能
> Author: 孤舟钓客
> Mail: guzhoudiaoke@126.com
> Time: 2013年01月02日 星期三 22时21分31秒
************************************************************************/
#include <graphics.h>
#include <kernel.h>
#include <math.h>
static video_info_t* p_video_info = (video_info_t*)(VIDEO_INFO_ADDR);
static u32 screen_cx = 0;
static u32 screen_cy = 0;
static color8 current_color = 0;
static u32 current_x = 0;
static u32 current_y = 0;
static u8* p_vram_base;
BOOL init_video()
{
screen_cx = p_video_info->resolution_cx;
screen_cy = p_video_info->resolution_cy;
current_x = 0;
current_y = 0;
current_color = 0;
p_vram_base = p_video_info->p_vram_base;
return TRUE;
}
static BOOL set_color8(color8 color)
{
current_color = color;
return TRUE;
}
BOOL set_pixel(s32 x, s32 y)
{
/* 超出屏幕范围 */
if (x < 0 || y < 0 || (u32)x >= screen_cx || (u32)y >= screen_cy)
return FALSE;
*(p_vram_base + y*screen_cx + x) = current_color;
return TRUE;
}
/* Bresenham line algorithm */
static BOOL bresenham_line(s32 start_x, s32 start_y, s32 end_x, s32 end_y)
{
s32 dx, dy, x, y, p, k;
dx = abs(end_x - start_x);
dy = abs(end_y - start_y);
k = (end_x-start_x) * (end_y-start_y);
if (dx >= dy)
{
p = 2*dy - dx;
if (start_x < end_x)
{
x = start_x;
y = start_y;
}
else
{
y = end_y;
x = end_x;
end_x = start_x;
}
while (x < end_x)
{
set_pixel(x, y);
++x;
if (p < 0)
p += 2*dy;
else
{
if (k > 0) ++y;
else --y;
p += 2*dy - 2*dx;
}
}
}
else
{
p = 2*dx - dy;
if (start_y < end_y)
{
x = start_x;
y = start_y;
}
else
{
y = end_y;
x = end_x;
end_y = start_y;
}
while (y < end_y)
{
set_pixel(x, y);
++y;
if (p < 0)
p += 2*dx;
else
{
if (k > 0) ++x;
else --x;
p += 2*dx - 2*dy;
}
}
}
return TRUE;
}
BOOL draw_line(s32 start_x, s32 start_y, s32 end_x, s32 end_y)
{
return bresenham_line(start_x, start_y, end_x, end_y);
}
BOOL draw_circle(s32 center_x, s32 center_y, u32 radius)
{
s32 x, y, p;
x = 0, y = radius, p = 1-radius;
while (x < y)
{
set_pixel(center_x + x, center_y + y);
补充:软件开发 , C++ ,
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊