134 lines
2.9 KiB
C
134 lines
2.9 KiB
C
|
#include "paint.h"
|
||
|
|
||
|
typedef struct {
|
||
|
char b;
|
||
|
char g;
|
||
|
char r;
|
||
|
} rgb;
|
||
|
|
||
|
struct {
|
||
|
rect area;
|
||
|
rgb* image;
|
||
|
} canvas = {0};
|
||
|
|
||
|
__u32 canvas_index(__u16 row, __u16 column) {
|
||
|
return column + row * canvas.area.width;
|
||
|
}
|
||
|
|
||
|
point canvas_position(__u32 index) {
|
||
|
point p = {
|
||
|
.x = index % canvas.area.width,
|
||
|
.y = index / canvas.area.width
|
||
|
};
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
void canvas_init(rect *r)
|
||
|
{
|
||
|
canvas.area = *r;
|
||
|
|
||
|
canvas_delete();
|
||
|
canvas.image = malloc(r->width * r->height * sizeof(rgb));
|
||
|
}
|
||
|
|
||
|
void canvas_delete()
|
||
|
{
|
||
|
if (canvas.image)
|
||
|
free(canvas.image);
|
||
|
}
|
||
|
|
||
|
void canvas_fill(__u32 color)
|
||
|
{
|
||
|
if (canvas.image)
|
||
|
{
|
||
|
__u32 i = 0;
|
||
|
__u32 len = canvas.area.width * canvas.area.height;
|
||
|
for (i = 0; i < len; i++)
|
||
|
{
|
||
|
canvas.image[i] = *((rgb*)(&color));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void canvas_draw_rect(rect *r, __u32 color)
|
||
|
{
|
||
|
if (canvas.image)
|
||
|
{
|
||
|
__u32 row = 0;
|
||
|
__u32 column = 0;
|
||
|
rgb* c = (rgb*)(&color);
|
||
|
|
||
|
for (row = 0; row < r->height; row++)
|
||
|
{
|
||
|
for (column = 0; column < (r->width); column++)
|
||
|
{
|
||
|
canvas.image[canvas_index(row + r->y - canvas.area.y,
|
||
|
column + r->x - canvas.area.x)] = *c;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void canvas_draw_text(rect* r, char* txt, __u32 len, __u32 color)
|
||
|
{
|
||
|
__u16 x = r->x + (r->width - len * FONT_WIDTH - len) / 2 - canvas.area.x;
|
||
|
__u16 y = r->y + (r->height - FONT_HEIGHT) / 2 - canvas.area.y;
|
||
|
|
||
|
__u32 w;
|
||
|
__u32 h;
|
||
|
char* mem;
|
||
|
|
||
|
h = FONT_HEIGHT;
|
||
|
w = len * FONT_WIDTH + len;
|
||
|
mem = malloc(sizeof(__u32) * 2 + h * w * sizeof(__u32));
|
||
|
|
||
|
memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
|
||
|
((__u32*)mem)[0] = w;
|
||
|
((__u32*)mem)[1] = h;
|
||
|
|
||
|
__asm__ __volatile__("int $0x40"::
|
||
|
"a"(4),
|
||
|
"b"(0),
|
||
|
"c"(color | (8 << 24)),
|
||
|
"d"((__u32)txt),
|
||
|
"S"(len),
|
||
|
"D"((__u32)(mem)));
|
||
|
|
||
|
int row = 0;
|
||
|
int column = 0;
|
||
|
__u32* __mem = (__u32*)(mem + 8);
|
||
|
for (row = 0; row < h; row++)
|
||
|
{
|
||
|
for (column = 0; column < w; column++)
|
||
|
{
|
||
|
__u32 c = __mem[column + row * w];
|
||
|
if (c & 0xFF000000)
|
||
|
{
|
||
|
canvas.image[canvas_index(row + y,column + x)] = *((rgb*)&c);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
|
||
|
free(mem);
|
||
|
}
|
||
|
|
||
|
void canvas_draw_value(rect* r, __u32 v, __u32 color)
|
||
|
{
|
||
|
char buffer[16] = {0};
|
||
|
__u32 length = strlen(itoa(v,buffer,10));
|
||
|
canvas_draw_text(r,buffer,length,color);
|
||
|
}
|
||
|
|
||
|
void canvas_paint()
|
||
|
{
|
||
|
if (canvas.image)
|
||
|
{
|
||
|
__menuet__putimage(canvas.area.x,
|
||
|
canvas.area.y,
|
||
|
canvas.area.width,
|
||
|
canvas.area.height,
|
||
|
(char*)canvas.image);
|
||
|
}
|
||
|
}
|