Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/bootloader/gfx/gfx.c
1471 views
1
/*
2
* Copyright (c) 2018 naehrwert
3
* Copyright (c) 2018-2022 CTCaer
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms and conditions of the GNU General Public License,
7
* version 2, as published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
*/
17
18
#include <stdarg.h>
19
#include <string.h>
20
#include "gfx.h"
21
22
// Global gfx console and context.
23
gfx_ctxt_t gfx_ctxt;
24
gfx_con_t gfx_con;
25
26
static bool gfx_con_init_done = false;
27
28
static const u8 _gfx_font[] = {
29
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char 032 ( )
30
0x00, 0x30, 0x30, 0x18, 0x18, 0x00, 0x0C, 0x00, // Char 033 (!)
31
0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, // Char 034 (")
32
0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, // Char 035 (#)
33
0x00, 0x18, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x18, // Char 036 ($)
34
0x00, 0x46, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x62, // Char 037 (%)
35
0x00, 0x3C, 0x66, 0x3C, 0x1C, 0xE6, 0x66, 0xFC, // Char 038 (&)
36
0x00, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, // Char 039 (')
37
0x00, 0x30, 0x18, 0x0C, 0x0C, 0x18, 0x30, 0x00, // Char 040 (()
38
0x00, 0x0C, 0x18, 0x30, 0x30, 0x18, 0x0C, 0x00, // Char 041 ())
39
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, // Char 042 (*)
40
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // Char 043 (+)
41
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 044 (,)
42
0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, // Char 045 (-)
43
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // Char 046 (.)
44
0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, // Char 047 (/)
45
0x00, 0x3C, 0x66, 0x76, 0x6E, 0x66, 0x3C, 0x00, // Char 048 (0)
46
0x00, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x7E, 0x00, // Char 049 (1)
47
0x00, 0x3C, 0x62, 0x30, 0x0C, 0x06, 0x7E, 0x00, // Char 050 (2)
48
0x00, 0x3C, 0x62, 0x38, 0x60, 0x66, 0x3C, 0x00, // Char 051 (3)
49
0x00, 0x6C, 0x6C, 0x66, 0xFE, 0x60, 0x60, 0x00, // Char 052 (4)
50
0x00, 0x7E, 0x06, 0x7E, 0x60, 0x66, 0x3C, 0x00, // Char 053 (5)
51
0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3C, 0x00, // Char 054 (6)
52
0x00, 0x7E, 0x30, 0x30, 0x18, 0x18, 0x18, 0x00, // Char 055 (7)
53
0x00, 0x3C, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // Char 056 (8)
54
0x00, 0x3C, 0x66, 0x7C, 0x60, 0x66, 0x3C, 0x00, // Char 057 (9)
55
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, // Char 058 (:)
56
0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 059 (;)
57
0x00, 0x70, 0x1C, 0x06, 0x06, 0x1C, 0x70, 0x00, // Char 060 (<)
58
0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, // Char 061 (=)
59
0x00, 0x0E, 0x38, 0x60, 0x60, 0x38, 0x0E, 0x00, // Char 062 (>)
60
0x00, 0x3C, 0x66, 0x30, 0x18, 0x00, 0x18, 0x00, // Char 063 (?)
61
0x00, 0x3C, 0x66, 0x76, 0x76, 0x06, 0x46, 0x3C, // Char 064 (@)
62
0x00, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 065 (A)
63
0x00, 0x3E, 0x66, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 066 (B)
64
0x00, 0x3C, 0x66, 0x06, 0x06, 0x66, 0x3C, 0x00, // Char 067 (C)
65
0x00, 0x1E, 0x36, 0x66, 0x66, 0x36, 0x1E, 0x00, // Char 068 (D)
66
0x00, 0x7E, 0x06, 0x1E, 0x06, 0x06, 0x7E, 0x00, // Char 069 (E)
67
0x00, 0x3E, 0x06, 0x1E, 0x06, 0x06, 0x06, 0x00, // Char 070 (F)
68
0x00, 0x3C, 0x66, 0x06, 0x76, 0x66, 0x3C, 0x00, // Char 071 (G)
69
0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 072 (H)
70
0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 073 (I)
71
0x00, 0x78, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, // Char 074 (J)
72
0x00, 0x66, 0x36, 0x1E, 0x1E, 0x36, 0x66, 0x00, // Char 075 (K)
73
0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7E, 0x00, // Char 076 (L)
74
0x00, 0x46, 0x6E, 0x7E, 0x56, 0x46, 0x46, 0x00, // Char 077 (M)
75
0x00, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00, // Char 078 (N)
76
0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 079 (O)
77
0x00, 0x3E, 0x66, 0x3E, 0x06, 0x06, 0x06, 0x00, // Char 080 (P)
78
0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x70, 0x00, // Char 081 (Q)
79
0x00, 0x3E, 0x66, 0x3E, 0x1E, 0x36, 0x66, 0x00, // Char 082 (R)
80
0x00, 0x3C, 0x66, 0x0C, 0x30, 0x66, 0x3C, 0x00, // Char 083 (S)
81
0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // Char 084 (T)
82
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 085 (U)
83
0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 086 (V)
84
0x00, 0x46, 0x46, 0x56, 0x7E, 0x6E, 0x46, 0x00, // Char 087 (W)
85
0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // Char 088 (X)
86
0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // Char 089 (Y)
87
0x00, 0x7E, 0x30, 0x18, 0x0C, 0x06, 0x7E, 0x00, // Char 090 (Z)
88
0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, // Char 091 ([)
89
0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, // Char 092 (\)
90
0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, // Char 093 (])
91
0x00, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, // Char 094 (^)
92
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // Char 095 (_)
93
0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // Char 096 (`)
94
0x00, 0x00, 0x3C, 0x60, 0x7C, 0x66, 0x7C, 0x00, // Char 097 (a)
95
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 098 (b)
96
0x00, 0x00, 0x3C, 0x06, 0x06, 0x06, 0x3C, 0x00, // Char 099 (c)
97
0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00, // Char 100 (d)
98
0x00, 0x00, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00, // Char 101 (e)
99
0x00, 0x38, 0x0C, 0x3E, 0x0C, 0x0C, 0x0C, 0x00, // Char 102 (f)
100
0x00, 0x00, 0x7C, 0x66, 0x7C, 0x40, 0x3C, 0x00, // Char 103 (g)
101
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x00, // Char 104 (h)
102
0x00, 0x18, 0x00, 0x1C, 0x18, 0x18, 0x3C, 0x00, // Char 105 (i)
103
0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x1E, 0x00, // Char 106 (j)
104
0x00, 0x06, 0x06, 0x36, 0x1E, 0x36, 0x66, 0x00, // Char 107 (k)
105
0x00, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 108 (l)
106
0x00, 0x00, 0x66, 0xFE, 0xFE, 0xD6, 0xC6, 0x00, // Char 109 (m)
107
0x00, 0x00, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x00, // Char 110 (n)
108
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 111 (o)
109
0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x00, // Char 112 (p)
110
0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x00, // Char 113 (q)
111
0x00, 0x00, 0x3E, 0x66, 0x06, 0x06, 0x06, 0x00, // Char 114 (r)
112
0x00, 0x00, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x00, // Char 115 (s)
113
0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x70, 0x00, // Char 116 (t)
114
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, // Char 117 (u)
115
0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 118 (v)
116
0x00, 0x00, 0xC6, 0xD6, 0xFE, 0x7C, 0x6C, 0x00, // Char 119 (w)
117
0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // Char 120 (x)
118
0x00, 0x00, 0x66, 0x66, 0x7C, 0x60, 0x3C, 0x00, // Char 121 (y)
119
0x00, 0x00, 0x7E, 0x30, 0x18, 0x0C, 0x7E, 0x00, // Char 122 (z)
120
0x00, 0x18, 0x08, 0x08, 0x04, 0x08, 0x08, 0x18, // Char 123 ({)
121
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, // Char 124 (|)
122
0x00, 0x0C, 0x08, 0x08, 0x10, 0x08, 0x08, 0x0C, // Char 125 (})
123
0x00, 0x00, 0x00, 0x4C, 0x32, 0x00, 0x00, 0x00 // Char 126 (~)
124
};
125
126
void gfx_clear_grey(u8 color)
127
{
128
memset(gfx_ctxt.fb, color, gfx_ctxt.width * gfx_ctxt.height * 4);
129
}
130
131
void gfx_clear_partial_grey(u8 color, u32 pos_x, u32 height)
132
{
133
memset(gfx_ctxt.fb + pos_x * gfx_ctxt.stride, color, height * 4 * gfx_ctxt.stride);
134
}
135
136
void gfx_clear_color(u32 color)
137
{
138
for (u32 i = 0; i < gfx_ctxt.width * gfx_ctxt.height; i++)
139
gfx_ctxt.fb[i] = color;
140
}
141
142
void gfx_init_ctxt(u32 *fb, u32 width, u32 height, u32 stride)
143
{
144
gfx_ctxt.fb = fb;
145
gfx_ctxt.width = width;
146
gfx_ctxt.height = height;
147
gfx_ctxt.stride = stride;
148
}
149
150
void gfx_con_init()
151
{
152
gfx_con.gfx_ctxt = &gfx_ctxt;
153
gfx_con.fntsz = 16;
154
gfx_con.x = 0;
155
gfx_con.y = 0;
156
gfx_con.savedx = 0;
157
gfx_con.savedy = 0;
158
gfx_con.fgcol = TXT_CLR_DEFAULT;
159
gfx_con.fillbg = 1;
160
gfx_con.bgcol = TXT_CLR_BG;
161
gfx_con.mute = 0;
162
163
gfx_con_init_done = true;
164
}
165
166
void gfx_con_setcol(u32 fgcol, int fillbg, u32 bgcol)
167
{
168
gfx_con.fgcol = fgcol;
169
gfx_con.fillbg = fillbg;
170
gfx_con.bgcol = bgcol;
171
}
172
173
void gfx_con_getpos(u32 *x, u32 *y)
174
{
175
*x = gfx_con.x;
176
*y = gfx_con.y;
177
}
178
179
void gfx_con_setpos(u32 x, u32 y)
180
{
181
gfx_con.x = x;
182
gfx_con.y = y;
183
}
184
185
void gfx_putc(char c)
186
{
187
// Duplicate code for performance reasons.
188
switch (gfx_con.fntsz)
189
{
190
case 16:
191
if (c >= 32 && c <= 126)
192
{
193
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
194
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
195
196
for (u32 i = 0; i < 16; i += 2)
197
{
198
u8 v = *cbuf;
199
for (u32 k = 0; k < 2; k++)
200
{
201
for (u32 j = 0; j < 8; j++)
202
{
203
if (v & 1)
204
{
205
*fb = gfx_con.fgcol;
206
fb++;
207
*fb = gfx_con.fgcol;
208
}
209
else if (gfx_con.fillbg)
210
{
211
*fb = gfx_con.bgcol;
212
fb++;
213
*fb = gfx_con.bgcol;
214
}
215
else
216
fb++;
217
v >>= 1;
218
fb++;
219
}
220
fb += gfx_ctxt.stride - 16;
221
v = *cbuf;
222
}
223
cbuf++;
224
}
225
gfx_con.x += 16;
226
}
227
else if (c == '\n')
228
{
229
gfx_con.x = 0;
230
gfx_con.y += 16;
231
if (gfx_con.y > gfx_ctxt.height - 16)
232
gfx_con.y = 0;
233
}
234
break;
235
case 8:
236
default:
237
if (c >= 32 && c <= 126)
238
{
239
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
240
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
241
for (u32 i = 0; i < 8; i++)
242
{
243
u8 v = *cbuf++;
244
for (u32 j = 0; j < 8; j++)
245
{
246
if (v & 1)
247
*fb = gfx_con.fgcol;
248
else if (gfx_con.fillbg)
249
*fb = gfx_con.bgcol;
250
v >>= 1;
251
fb++;
252
}
253
fb += gfx_ctxt.stride - 8;
254
}
255
gfx_con.x += 8;
256
}
257
else if (c == '\n')
258
{
259
gfx_con.x = 0;
260
gfx_con.y += 8;
261
if (gfx_con.y > gfx_ctxt.height - 8)
262
gfx_con.y = 0;
263
}
264
break;
265
}
266
}
267
268
void gfx_puts(const char *s)
269
{
270
if (!s || !gfx_con_init_done || gfx_con.mute)
271
return;
272
273
for (; *s; s++)
274
gfx_putc(*s);
275
}
276
277
static void _gfx_putn(u32 v, int base, char fill, int fcnt)
278
{
279
static const char digits[] = "0123456789ABCDEF";
280
281
char *p;
282
char buf[65];
283
int c = fcnt;
284
bool negative = false;
285
286
if (base != 10 && base != 16)
287
return;
288
289
// Account for negative numbers.
290
if (base == 10 && v & 0x80000000)
291
{
292
negative = true;
293
v = (int)v * -1;
294
c--;
295
}
296
297
p = buf + 64;
298
*p = 0;
299
do
300
{
301
c--;
302
*--p = digits[v % base];
303
v /= base;
304
} while (v);
305
306
if (negative)
307
*--p = '-';
308
309
if (fill != 0)
310
{
311
while (c > 0 && p > buf)
312
{
313
*--p = fill;
314
c--;
315
}
316
}
317
318
gfx_puts(p);
319
}
320
321
void gfx_put_small_sep()
322
{
323
u8 prevFontSize = gfx_con.fntsz;
324
gfx_con.fntsz = 8;
325
gfx_putc('\n');
326
gfx_con.fntsz = prevFontSize;
327
}
328
329
void gfx_put_big_sep()
330
{
331
u8 prevFontSize = gfx_con.fntsz;
332
gfx_con.fntsz = 16;
333
gfx_putc('\n');
334
gfx_con.fntsz = prevFontSize;
335
}
336
337
void gfx_printf(const char *fmt, ...)
338
{
339
if (!gfx_con_init_done || gfx_con.mute)
340
return;
341
342
va_list ap;
343
int fill, fcnt;
344
345
va_start(ap, fmt);
346
while (*fmt)
347
{
348
if (*fmt == '%')
349
{
350
fmt++;
351
fill = 0;
352
fcnt = 0;
353
if ((*fmt >= '0' && *fmt <= '9') || *fmt == ' ')
354
{
355
fcnt = *fmt;
356
fmt++;
357
if (*fmt >= '0' && *fmt <= '9')
358
{
359
fill = fcnt;
360
fcnt = *fmt - '0';
361
fmt++;
362
}
363
else
364
{
365
fill = ' ';
366
fcnt -= '0';
367
}
368
}
369
switch(*fmt)
370
{
371
case 'c':
372
gfx_putc(va_arg(ap, u32));
373
break;
374
case 's':
375
gfx_puts(va_arg(ap, char *));
376
break;
377
case 'd':
378
_gfx_putn(va_arg(ap, u32), 10, fill, fcnt);
379
break;
380
case 'p':
381
case 'P':
382
case 'x':
383
case 'X':
384
_gfx_putn(va_arg(ap, u32), 16, fill, fcnt);
385
break;
386
case 'k':
387
gfx_con.fgcol = va_arg(ap, u32);
388
break;
389
case 'K':
390
gfx_con.bgcol = va_arg(ap, u32);
391
gfx_con.fillbg = 1;
392
break;
393
case '%':
394
gfx_putc('%');
395
break;
396
case '\0':
397
goto out;
398
default:
399
gfx_putc('%');
400
gfx_putc(*fmt);
401
break;
402
}
403
}
404
else
405
gfx_putc(*fmt);
406
fmt++;
407
}
408
409
out:
410
va_end(ap);
411
}
412
413
static void _gfx_cputs(u32 color, const char *s)
414
{
415
gfx_con.fgcol = color;
416
gfx_puts(s);
417
gfx_putc('\n');
418
gfx_con.fgcol = TXT_CLR_DEFAULT;
419
}
420
421
void gfx_wputs(const char *s) { _gfx_cputs(TXT_CLR_WARNING, s); }
422
void gfx_eputs(const char *s) { _gfx_cputs(TXT_CLR_ERROR, s); }
423
424
void gfx_hexdump(u32 base, const void *buf, u32 len)
425
{
426
if (!gfx_con_init_done || gfx_con.mute)
427
return;
428
429
u8 *buff = (u8 *)buf;
430
431
u8 prevFontSize = gfx_con.fntsz;
432
gfx_con.fntsz = 8;
433
for (u32 i = 0; i < len; i++)
434
{
435
if (i % 0x10 == 0)
436
{
437
if (i != 0)
438
{
439
gfx_puts("| ");
440
for (u32 j = 0; j < 0x10; j++)
441
{
442
u8 c = buff[i - 0x10 + j];
443
if (c >= 32 && c <= 126)
444
gfx_putc(c);
445
else
446
gfx_putc('.');
447
}
448
gfx_putc('\n');
449
}
450
gfx_printf("%08x: ", base + i);
451
}
452
gfx_printf("%02x ", buff[i]);
453
if (i == len - 1)
454
{
455
int ln = len % 0x10 != 0;
456
u32 k = 0x10 - 1;
457
if (ln)
458
{
459
k = (len & 0xF) - 1;
460
for (u32 j = 0; j < 0x10 - k; j++)
461
gfx_puts(" ");
462
}
463
gfx_puts("| ");
464
for (u32 j = 0; j < (ln ? k : k + 1); j++)
465
{
466
u8 c = buff[i - k + j];
467
if (c >= 32 && c <= 126)
468
gfx_putc(c);
469
else
470
gfx_putc('.');
471
}
472
gfx_putc('\n');
473
}
474
}
475
gfx_putc('\n');
476
gfx_con.fntsz = prevFontSize;
477
}
478
479
static int abs(int x)
480
{
481
if (x < 0)
482
return -x;
483
return x;
484
}
485
486
void gfx_set_pixel(u32 x, u32 y, u32 color)
487
{
488
gfx_ctxt.fb[x + y * gfx_ctxt.stride] = color;
489
}
490
491
void gfx_line(int x0, int y0, int x1, int y1, u32 color)
492
{
493
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
494
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
495
int err = (dx > dy ? dx : -dy) / 2, e2;
496
497
while (1)
498
{
499
gfx_set_pixel(x0, y0, color);
500
if (x0 == x1 && y0 == y1)
501
break;
502
e2 = err;
503
if (e2 >-dx)
504
{
505
err -= dy;
506
x0 += sx;
507
}
508
if (e2 < dy)
509
{
510
err += dx;
511
y0 += sy;
512
}
513
}
514
}
515
516
void gfx_set_rect_grey(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
517
{
518
u32 pos = 0;
519
for (u32 y = pos_y; y < (pos_y + size_y); y++)
520
{
521
for (u32 x = pos_x; x < (pos_x + size_x); x++)
522
{
523
memset(&gfx_ctxt.fb[x + y*gfx_ctxt.stride], buf[pos], 4);
524
pos++;
525
}
526
}
527
}
528
529
530
void gfx_set_rect_rgb(const u8 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
531
{
532
u32 pos = 0;
533
for (u32 y = pos_y; y < (pos_y + size_y); y++)
534
{
535
for (u32 x = pos_x; x < (pos_x + size_x); x++)
536
{
537
gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[pos + 2] | (buf[pos + 1] << 8) | (buf[pos] << 16);
538
pos+=3;
539
}
540
}
541
}
542
543
void gfx_set_rect_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
544
{
545
u32 *ptr = (u32 *)buf;
546
for (u32 y = pos_y; y < (pos_y + size_y); y++)
547
for (u32 x = pos_x; x < (pos_x + size_x); x++)
548
gfx_ctxt.fb[x + y * gfx_ctxt.stride] = *ptr++;
549
}
550
551
void gfx_render_bmp_argb(const u32 *buf, u32 size_x, u32 size_y, u32 pos_x, u32 pos_y)
552
{
553
for (u32 y = pos_y; y < (pos_y + size_y); y++)
554
{
555
for (u32 x = pos_x; x < (pos_x + size_x); x++)
556
gfx_ctxt.fb[x + y * gfx_ctxt.stride] = buf[(size_y + pos_y - 1 - y ) * size_x + x - pos_x];
557
}
558
}
559
560