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 | }>>><>>>> |