babyos―― 简易图形库(一)

2014-11-24 08:38:15 · 作者: · 浏览: 0
与裸机做斗争真是其乐无穷啊~~
终究是能画点、线、矩形、圆、填充矩形、字符、汉字、LOGO了。且做了目前我能做到的最好的代码组织。下一步就是用这些函数实现一个简单的界面。
整理绘图功能的函数,组织成一个简易的图形库
1.绘制点直线、圆、矩形、填充矩形的函数放到graphic.c中
[cpp]
/*************************************************************************
> File: graphics.c
> Describe: 实现基本绘图功能
> Author: 孤舟钓客
> Mail: guzhoudiaoke@126.com
> Time: 2013年01月02日 星期三 22时21分31秒
************************************************************************/
#include
#include
#include
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);
set_pixel(center_x - x, center_y + y);
set_pixel(center_x - x, center_y - y);
set_pixel(center_x + x, center_y - y);
set_pixel(center_x + y, center_y + x);
set_pixel(center_x - y, center_y + x);
set_pixel(center_x - y, center_y - x