您的位置:首页 > 其它

十六、画图

2015-12-12 00:00 323 查看
转到内核用 C语言写东西,速度就快了,先实现画图:

/*  graphics.c
图形函数
四彩
2015-12-12
*/

#include "../kernel/include/graphics.h"

// 图形函数相关全局参数
static unsigned short *pVideo, Color = 0;
static unsigned short Screen_X, Screen_Y;
static unsigned char BytePerPix;

/*  画一条线
*/
void line(unsigned x0, unsigned y0, unsigned x1, unsigned y1)
{
int x, y;

if(x0 == x1)
for(y = y0; y <= y1; y++)
pVideo[Screen_X * y + x] = Color;
else if(x0 < x1)
for(x = x0; x <= x1; x++)
{
y = ((x - x0) * y1 + (x1 - x) * y0) / (x1 - x0);
pVideo[Screen_X * y + x] = Color;
}
else // if(x0 > x1)
for(x = x1; x <= x0; x++)
{
y = ((x0 - x) * y1 + (x - x1) * y0) / (x0 - x1);
pVideo[Screen_X * y + x] = Color;
}
}

/*  画一个方框并填色
*/
void rectangle(unsigned x0, unsigned y0, unsigned x1, unsigned y1)
{
unsigned x, y;
for(y = y0; y <= y1; y++)
for(x = x0; x <= x1; x++)
pVideo[Screen_X * y + x] = Color;
}

// 初始化图形参数
void InitGraphics(GRAPHICS_PARAM *ptGraphics)
{
pVideo     = (unsigned short *)ptGraphics->dwPhyAddrOfVideo;
Screen_X   = ptGraphics->wScreenX;
Screen_Y   = ptGraphics->wScreenY;
BytePerPix = ptGraphics->bBitsPerPixel;
}

// 设置颜色
void SetColor(unsigned color)
{
Color = color;
}

unsigned GetColor()
{
return Color;
}

unsigned GetScreenX()
{
return Screen_X;
}

unsigned GetScreenY()
{
return Screen_Y;
}


kernel 做了调整,图形相关定义、函数调整到图形模块里去了。这个头文件还把图形函数引出来(这里定义的颜色可是费老劲收集到的):

/*  graphics.h
图形出函数
四彩
2015-12-12
*/

#ifndef _GRAPHICS_H
#define _GRAPHICS_H

typedef struct tag_Graphics_Param
{
unsigned        dwPhyAddrOfVideo;   // 显存基址
unsigned short  wScreenX;           // 分辨率 X
unsigned short  wScreenY;           // 分辨率 Y
unsigned char   bBitsPerPixel;      // 颜色数
} GRAPHICS_PARAM;

// RGB565 合成 16 位色宏
//      r = 红(高 5 位,0 ~ 31),g = 绿(中 6 位,0 ~ 63),b = 蓝(低 5 位, 0 ~ 31)
#define RGB565(r, g, b)     (unsigned short)(((r) << 11) | ((g) << 5) | (b))

// 基本色
#define COLOR16_BLACK           0b0000000000000000
#define COLOR16_WHITE           0b1111111111111111
#define COLOR16_RED             0b1111100000000000                  // 红
#define COLOR16_GREEN           0b0000011111100000                  // 绿
#define COLOR16_BLUE            0b0000000000011111                  // 蓝

#define COLOR16_YELLOW          (COLOR16_RED | COLOR16_GREEN)       // 黄
#define COLOR16_MAGENTA         (COLOR16_RED | COLOR16_BLUE)        // 洋红
#define COLOR16_CYAN            (COLOR16_GREEN | COLOR16_BLUE)      // 青

// 常见 RGB565 合成色
// 红色系
#define COLOR16_DARKRED         RGB565(17,  0,  0)                  // 暗红
// 绿色系
#define COLOR16_PALEGREEN       RGB565(19, 62, 19)                  // 淡绿
#define COLOR16_GREENYELLOW     RGB565(21, 63,  5)                  // 黄绿
// 蓝色系
#define COLOR16_LIGHTBLUE       RGB565(21, 54, 28)                  // 亮蓝
#define COLOR16_MEDIUMBLUE      RGB565( 0,  0, 25)                  // 中蓝
#define COLOR16_DARKBLUE        RGB565( 0,  0, 17)                  // 暗蓝
#define COLOR16_BABYBLUE        RGB565(28, 63, 31)                  // 浅蓝
#define COLOR16_SKYBLUE         RGB565(16, 51, 29)                  // 天蓝
#define COLOR16_LIGHTSKYBLUE    RGB565(16, 51, 31)                  // 亮天蓝
#define COLOR16_DEEPSKYBLUE     RGB565( 0, 41, 31)                  // 暗天蓝
// 黄色系
// 橙色系
#define COLOR16_ORANGE          RGB565(31, 41,  0)                  // 橙
// 灰色系
#define COLOR16_GRAY            RGB565(16, 32, 16)                  // 灰
#define COLOR16_LIGHTGRAY       RGB565(26, 52, 26)                  // 亮灰
#define COLOR16_DARKGRAY        RGB565(21, 42, 21)                  // 暗灰
// 紫色系
#define COLOR16_PURPLE          RGB565(16,  0, 16)					// 紫
#define COLOR16_LIGHTVIOLET     RGB565(29, 32, 29)					// 亮紫
#define COLOR16_MEDIUMPURPLE    RGB565(18, 28, 27)					// 中紫
#define COLOR16_DARKVIOLET      RGB565(18,  0, 26)					// 暗紫
// 褐色系
#define COLOR16_BROWN           RGB565(20, 10,  5)                  // 棕褐

// 设置部分
void InitGraphics(GRAPHICS_PARAM *ptGraphics);
void SetColor(unsigned color);

// 取参数部分
unsigned GetColor();
unsigned GetScreenX();
unsigned GetScreenY();

// 绘图部分
void line(unsigned x0, unsigned y0, unsigned x1, unsigned y1);
void rectangle(unsigned x0, unsigned y0, unsigned x1, unsigned y1);

#endif


kernel 增加了一个简单的界面

/*  kernel.c
内核
whoozit
2012-12-12
*/

#include "../lib/include/stddef.h"
#include "../lib/include/string.h"
#include "../kernel/include/PMode.h"
#include "../kernel/include/graphics.h"

// 存放全局变量的物理地址(const.inc 中的 SEGMENTOFGPARAM * 0x10)
#define PHYADDROFGPARAM     0x500
// 全局变量结构
typedef struct tag_Global_param
{
unsigned int    dwMemorySize;
GRAPHICS_PARAM  tGraphics;
} GLOBAL_PARAM;

// 引用汇编指令函数
extern void asm_hlt();

void c_main()
{
unsigned i, j;
unsigned short Screen_X, Screen_Y;
char string[80], number[33];
GLOBAL_PARAM g_Param;

// 初始化 GDT 表
InitGdt();

// 取全局变量
memcpy((void *)&g_Param, (void *)(PHYADDROFGPARAM), sizeof(GLOBAL_PARAM));

// 初始化图形参数
InitGraphics(&(g_Param.tGraphics));
Screen_X = GetScreenX();
Screen_Y = GetScreenY();

// 画界面
SetColor(COLOR16_DEEPSKYBLUE);
rectangle(0,             0,             Screen_X - 1,  Screen_Y - 1);

SetColor(COLOR16_LIGHTGRAY);
rectangle(0,             Screen_Y - 28, Screen_X - 1,  Screen_Y - 28);
rectangle(0,             Screen_Y - 26, Screen_X - 1,  Screen_Y - 1);

SetColor(COLOR16_WHITE);
rectangle(0,             Screen_Y - 27, Screen_X - 1,  Screen_Y - 27);
rectangle(3,             Screen_Y - 24, 59,            Screen_Y - 24);
rectangle(2,             Screen_Y - 24, 2,             Screen_Y - 4);
rectangle(2,             Screen_Y - 3,  59,            Screen_Y - 3);
rectangle(60,            Screen_Y - 24, 60,            Screen_Y - 3);
rectangle(Screen_X - 47, Screen_Y - 3,  Screen_X - 4,  Screen_Y - 3);
rectangle(Screen_X - 3,  Screen_Y - 24, Screen_X - 3,  Screen_Y - 3);

SetColor(COLOR16_DARKGRAY);
rectangle(3,             Screen_Y - 4,  59,            Screen_Y - 4);
rectangle(59,            Screen_Y - 23, 59,            Screen_Y - 5);
rectangle(Screen_X - 47, Screen_Y - 24, Screen_X - 4,  Screen_Y - 24);
rectangle(Screen_X - 47, Screen_Y - 23, Screen_X - 47, Screen_Y - 4);

while(1)
asm_hlt();
}


Makefile 里增加了图形文件(一个.c、一个.h)的编译,其他文件没有变化。运行效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: