当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,