Subversion Repositories Kolibri OS

Rev

Rev 5231 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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