Subversion Repositories Kolibri OS

Rev

Rev 5231 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5231 raandoom 1
#include "paint.h"
2
 
3
typedef struct {
4
    char b;
5
    char g;
6
    char r;
7
} rgb;
8
 
9
struct {
10
    rect    area;
11
    rgb*    image;
12
} canvas = {0};
13
 
14
__u32 canvas_index(__u16 row, __u16 column) {
15
    return column + row * canvas.area.width;
16
}
17
 
18
point canvas_position(__u32 index) {
19
    point p = {
20
        .x = index % canvas.area.width,
21
        .y = index / canvas.area.width
22
    };
23
    return p;
24
}
25
 
26
void canvas_init(rect *r)
27
{
28
    canvas.area = *r;
29
 
30
    canvas_delete();
31
    canvas.image = malloc(r->width * r->height * sizeof(rgb));
32
}
33
 
34
void canvas_delete()
35
{
36
    if (canvas.image)
37
        free(canvas.image);
38
}
39
 
40
void canvas_fill(__u32 color)
41
{
42
    if (canvas.image)
43
    {
44
        __u32 i = 0;
45
        __u32 len = canvas.area.width * canvas.area.height;
46
        for (i = 0; i < len; i++)
47
        {
48
            canvas.image[i] = *((rgb*)(&color));
49
        }
50
    }
51
}
52
 
53
void canvas_draw_rect(rect *r, __u32 color)
54
{
55
    if (canvas.image)
56
    {
57
        __u32 row = 0;
58
        __u32 column = 0;
59
        rgb* c = (rgb*)(&color);
60
 
61
        for (row = 0; row < r->height; row++)
62
        {
63
            for (column = 0; column < (r->width); column++)
64
            {
65
                canvas.image[canvas_index(row + r->y - canvas.area.y,
66
                                          column + r->x - canvas.area.x)] = *c;
67
            }
68
        }
69
    }
70
}
71
 
72
void canvas_draw_text(rect* r, char* txt, __u32 len, __u32 color)
73
{
74
    __u32 w;
75
    __u32 h;
76
    char* mem;
77
 
78
    h = FONT_HEIGHT;
79
    w = len * FONT_WIDTH + len;
80
    mem = malloc(sizeof(__u32) * 2 + h * w * sizeof(__u32));
81
 
82
    memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
83
    ((__u32*)mem)[0] = w;
84
    ((__u32*)mem)[1] = h;
85
 
86
     __asm__ __volatile__("int $0x40"::
87
                          "a"(4),
88
                          "b"(0),
89
                          "c"(color | (8 << 24)),
90
                          "d"((__u32)txt),
91
                          "S"(len),
92
                          "D"((__u32)(mem)));
93
 
5252 raandoom 94
    __u16 x = r->x + (r->width - (len * FONT_WIDTH + len) * 2) / 2 - canvas.area.x;
95
    __u16 y = r->y + (r->height - FONT_HEIGHT * 2) / 2 - canvas.area.y;
96
 
5231 raandoom 97
    int row = 0;
98
    int column = 0;
99
    __u32* __mem = (__u32*)(mem + 8);
100
    for (row = 0; row < h; row++)
101
    {
102
        for (column = 0; column < w; column++)
103
        {
104
            __u32 c = __mem[column + row * w];
105
            if (c & 0xFF000000)
106
            {
5252 raandoom 107
                canvas.image[canvas_index(row * 2 + y,column * 2 + x)] = *((rgb*)&c);
108
                canvas.image[canvas_index(row * 2 + y,column * 2 + 1 + x)] = *((rgb*)&c);
109
 
110
                canvas.image[canvas_index(row * 2 + 1 + y,column * 2 + x)] = *((rgb*)&c);
111
                canvas.image[canvas_index(row * 2 + 1 + y,column * 2 + 1 + x)] = *((rgb*)&c);
5231 raandoom 112
            }
113
        }
114
    }
115
 
116
    memset(mem,0,sizeof(__u32) * 2 + h * w * sizeof(__u32));
117
    free(mem);
118
}
119
 
120
void canvas_draw_value(rect* r, __u32 v, __u32 color)
121
{
122
    char buffer[16] = {0};
123
    __u32 length = strlen(itoa(v,buffer,10));
124
    canvas_draw_text(r,buffer,length,color);
125
}
126
 
127
void canvas_paint()
128
{
129
    if (canvas.image)
130
    {
131
        __menuet__putimage(canvas.area.x,
132
                           canvas.area.y,
133
                           canvas.area.width,
134
                           canvas.area.height,
135
                           (char*)canvas.image);
136
    }
137
}