11#include <graphics.h>
22#include <string.h>
3+ #include <stddef.h>
34#include <sys/syscall.h>
45
56static struct GraphicsState {
67 int bkcolor ;
78 int color ;
89 int last_err ;
910 int auto_flush_disabled ;
11+ int x , y ;
1012} gstate = {0 };
1113
1214static uint8_t BUFFER [GRAPHICS_MAX_HEIGHT ][GRAPHICS_MAX_WIDTH ]= {0 };
@@ -130,7 +132,7 @@ void drawpoly(int num, int polypoints[]) {
130132}
131133
132134void filpoly (int num , int polypoints []) {
133- // TODO: ??? how
135+ // TODO
134136}
135137
136138void rectangle (int left , int top , int right , int bottom ) {
@@ -191,31 +193,193 @@ void floodfill(int x,int y, int color) {
191193 // TODO
192194}
193195
194- // For text, later
196+ // Font source: https://github.com/dhepper/font8x8/blob/master/font8x8_basic.h
197+ // - International Business Machines (public domain VGA fonts)
198+
199+ static uint8_t font [128 ][8 ] = {
200+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0000 (null)
201+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0001
202+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0002
203+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0003
204+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0004
205+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0005
206+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0006
207+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0007
208+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0008
209+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0009
210+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000A
211+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000B
212+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000C
213+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000D
214+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000E
215+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+000F
216+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0010
217+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0011
218+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0012
219+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0013
220+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0014
221+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0015
222+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0016
223+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0017
224+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0018
225+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0019
226+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001A
227+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001B
228+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001C
229+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001D
230+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001E
231+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+001F
232+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0020 (space)
233+ { 0x18 , 0x3C , 0x3C , 0x18 , 0x18 , 0x00 , 0x18 , 0x00 }, // U+0021 (!)
234+ { 0x36 , 0x36 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0022 (")
235+ { 0x36 , 0x36 , 0x7F , 0x36 , 0x7F , 0x36 , 0x36 , 0x00 }, // U+0023 (#)
236+ { 0x0C , 0x3E , 0x03 , 0x1E , 0x30 , 0x1F , 0x0C , 0x00 }, // U+0024 ($)
237+ { 0x00 , 0x63 , 0x33 , 0x18 , 0x0C , 0x66 , 0x63 , 0x00 }, // U+0025 (%)
238+ { 0x1C , 0x36 , 0x1C , 0x6E , 0x3B , 0x33 , 0x6E , 0x00 }, // U+0026 (&)
239+ { 0x06 , 0x06 , 0x03 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0027 (')
240+ { 0x18 , 0x0C , 0x06 , 0x06 , 0x06 , 0x0C , 0x18 , 0x00 }, // U+0028 (()
241+ { 0x06 , 0x0C , 0x18 , 0x18 , 0x18 , 0x0C , 0x06 , 0x00 }, // U+0029 ())
242+ { 0x00 , 0x66 , 0x3C , 0xFF , 0x3C , 0x66 , 0x00 , 0x00 }, // U+002A (*)
243+ { 0x00 , 0x0C , 0x0C , 0x3F , 0x0C , 0x0C , 0x00 , 0x00 }, // U+002B (+)
244+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x0C , 0x06 }, // U+002C (,)
245+ { 0x00 , 0x00 , 0x00 , 0x3F , 0x00 , 0x00 , 0x00 , 0x00 }, // U+002D (-)
246+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0C , 0x0C , 0x00 }, // U+002E (.)
247+ { 0x60 , 0x30 , 0x18 , 0x0C , 0x06 , 0x03 , 0x01 , 0x00 }, // U+002F (/)
248+ { 0x3E , 0x63 , 0x73 , 0x7B , 0x6F , 0x67 , 0x3E , 0x00 }, // U+0030 (0)
249+ { 0x0C , 0x0E , 0x0C , 0x0C , 0x0C , 0x0C , 0x3F , 0x00 }, // U+0031 (1)
250+ { 0x1E , 0x33 , 0x30 , 0x1C , 0x06 , 0x33 , 0x3F , 0x00 }, // U+0032 (2)
251+ { 0x1E , 0x33 , 0x30 , 0x1C , 0x30 , 0x33 , 0x1E , 0x00 }, // U+0033 (3)
252+ { 0x38 , 0x3C , 0x36 , 0x33 , 0x7F , 0x30 , 0x78 , 0x00 }, // U+0034 (4)
253+ { 0x3F , 0x03 , 0x1F , 0x30 , 0x30 , 0x33 , 0x1E , 0x00 }, // U+0035 (5)
254+ { 0x1C , 0x06 , 0x03 , 0x1F , 0x33 , 0x33 , 0x1E , 0x00 }, // U+0036 (6)
255+ { 0x3F , 0x33 , 0x30 , 0x18 , 0x0C , 0x0C , 0x0C , 0x00 }, // U+0037 (7)
256+ { 0x1E , 0x33 , 0x33 , 0x1E , 0x33 , 0x33 , 0x1E , 0x00 }, // U+0038 (8)
257+ { 0x1E , 0x33 , 0x33 , 0x3E , 0x30 , 0x18 , 0x0E , 0x00 }, // U+0039 (9)
258+ { 0x00 , 0x0C , 0x0C , 0x00 , 0x00 , 0x0C , 0x0C , 0x00 }, // U+003A (:)
259+ { 0x00 , 0x0C , 0x0C , 0x00 , 0x00 , 0x0C , 0x0C , 0x06 }, // U+003B (;)
260+ { 0x18 , 0x0C , 0x06 , 0x03 , 0x06 , 0x0C , 0x18 , 0x00 }, // U+003C (<)
261+ { 0x00 , 0x00 , 0x3F , 0x00 , 0x00 , 0x3F , 0x00 , 0x00 }, // U+003D (=)
262+ { 0x06 , 0x0C , 0x18 , 0x30 , 0x18 , 0x0C , 0x06 , 0x00 }, // U+003E (>)
263+ { 0x1E , 0x33 , 0x30 , 0x18 , 0x0C , 0x00 , 0x0C , 0x00 }, // U+003F (?)
264+ { 0x3E , 0x63 , 0x7B , 0x7B , 0x7B , 0x03 , 0x1E , 0x00 }, // U+0040 (@)
265+ { 0x0C , 0x1E , 0x33 , 0x33 , 0x3F , 0x33 , 0x33 , 0x00 }, // U+0041 (A)
266+ { 0x3F , 0x66 , 0x66 , 0x3E , 0x66 , 0x66 , 0x3F , 0x00 }, // U+0042 (B)
267+ { 0x3C , 0x66 , 0x03 , 0x03 , 0x03 , 0x66 , 0x3C , 0x00 }, // U+0043 (C)
268+ { 0x1F , 0x36 , 0x66 , 0x66 , 0x66 , 0x36 , 0x1F , 0x00 }, // U+0044 (D)
269+ { 0x7F , 0x46 , 0x16 , 0x1E , 0x16 , 0x46 , 0x7F , 0x00 }, // U+0045 (E)
270+ { 0x7F , 0x46 , 0x16 , 0x1E , 0x16 , 0x06 , 0x0F , 0x00 }, // U+0046 (F)
271+ { 0x3C , 0x66 , 0x03 , 0x03 , 0x73 , 0x66 , 0x7C , 0x00 }, // U+0047 (G)
272+ { 0x33 , 0x33 , 0x33 , 0x3F , 0x33 , 0x33 , 0x33 , 0x00 }, // U+0048 (H)
273+ { 0x1E , 0x0C , 0x0C , 0x0C , 0x0C , 0x0C , 0x1E , 0x00 }, // U+0049 (I)
274+ { 0x78 , 0x30 , 0x30 , 0x30 , 0x33 , 0x33 , 0x1E , 0x00 }, // U+004A (J)
275+ { 0x67 , 0x66 , 0x36 , 0x1E , 0x36 , 0x66 , 0x67 , 0x00 }, // U+004B (K)
276+ { 0x0F , 0x06 , 0x06 , 0x06 , 0x46 , 0x66 , 0x7F , 0x00 }, // U+004C (L)
277+ { 0x63 , 0x77 , 0x7F , 0x7F , 0x6B , 0x63 , 0x63 , 0x00 }, // U+004D (M)
278+ { 0x63 , 0x67 , 0x6F , 0x7B , 0x73 , 0x63 , 0x63 , 0x00 }, // U+004E (N)
279+ { 0x1C , 0x36 , 0x63 , 0x63 , 0x63 , 0x36 , 0x1C , 0x00 }, // U+004F (O)
280+ { 0x3F , 0x66 , 0x66 , 0x3E , 0x06 , 0x06 , 0x0F , 0x00 }, // U+0050 (P)
281+ { 0x1E , 0x33 , 0x33 , 0x33 , 0x3B , 0x1E , 0x38 , 0x00 }, // U+0051 (Q)
282+ { 0x3F , 0x66 , 0x66 , 0x3E , 0x36 , 0x66 , 0x67 , 0x00 }, // U+0052 (R)
283+ { 0x1E , 0x33 , 0x07 , 0x0E , 0x38 , 0x33 , 0x1E , 0x00 }, // U+0053 (S)
284+ { 0x3F , 0x2D , 0x0C , 0x0C , 0x0C , 0x0C , 0x1E , 0x00 }, // U+0054 (T)
285+ { 0x33 , 0x33 , 0x33 , 0x33 , 0x33 , 0x33 , 0x3F , 0x00 }, // U+0055 (U)
286+ { 0x33 , 0x33 , 0x33 , 0x33 , 0x33 , 0x1E , 0x0C , 0x00 }, // U+0056 (V)
287+ { 0x63 , 0x63 , 0x63 , 0x6B , 0x7F , 0x77 , 0x63 , 0x00 }, // U+0057 (W)
288+ { 0x63 , 0x63 , 0x36 , 0x1C , 0x1C , 0x36 , 0x63 , 0x00 }, // U+0058 (X)
289+ { 0x33 , 0x33 , 0x33 , 0x1E , 0x0C , 0x0C , 0x1E , 0x00 }, // U+0059 (Y)
290+ { 0x7F , 0x63 , 0x31 , 0x18 , 0x4C , 0x66 , 0x7F , 0x00 }, // U+005A (Z)
291+ { 0x1E , 0x06 , 0x06 , 0x06 , 0x06 , 0x06 , 0x1E , 0x00 }, // U+005B ([)
292+ { 0x03 , 0x06 , 0x0C , 0x18 , 0x30 , 0x60 , 0x40 , 0x00 }, // U+005C (\)
293+ { 0x1E , 0x18 , 0x18 , 0x18 , 0x18 , 0x18 , 0x1E , 0x00 }, // U+005D (])
294+ { 0x08 , 0x1C , 0x36 , 0x63 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+005E (^)
295+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xFF }, // U+005F (_)
296+ { 0x0C , 0x0C , 0x18 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+0060 (`)
297+ { 0x00 , 0x00 , 0x1E , 0x30 , 0x3E , 0x33 , 0x6E , 0x00 }, // U+0061 (a)
298+ { 0x07 , 0x06 , 0x06 , 0x3E , 0x66 , 0x66 , 0x3B , 0x00 }, // U+0062 (b)
299+ { 0x00 , 0x00 , 0x1E , 0x33 , 0x03 , 0x33 , 0x1E , 0x00 }, // U+0063 (c)
300+ { 0x38 , 0x30 , 0x30 , 0x3e , 0x33 , 0x33 , 0x6E , 0x00 }, // U+0064 (d)
301+ { 0x00 , 0x00 , 0x1E , 0x33 , 0x3f , 0x03 , 0x1E , 0x00 }, // U+0065 (e)
302+ { 0x1C , 0x36 , 0x06 , 0x0f , 0x06 , 0x06 , 0x0F , 0x00 }, // U+0066 (f)
303+ { 0x00 , 0x00 , 0x6E , 0x33 , 0x33 , 0x3E , 0x30 , 0x1F }, // U+0067 (g)
304+ { 0x07 , 0x06 , 0x36 , 0x6E , 0x66 , 0x66 , 0x67 , 0x00 }, // U+0068 (h)
305+ { 0x0C , 0x00 , 0x0E , 0x0C , 0x0C , 0x0C , 0x1E , 0x00 }, // U+0069 (i)
306+ { 0x30 , 0x00 , 0x30 , 0x30 , 0x30 , 0x33 , 0x33 , 0x1E }, // U+006A (j)
307+ { 0x07 , 0x06 , 0x66 , 0x36 , 0x1E , 0x36 , 0x67 , 0x00 }, // U+006B (k)
308+ { 0x0E , 0x0C , 0x0C , 0x0C , 0x0C , 0x0C , 0x1E , 0x00 }, // U+006C (l)
309+ { 0x00 , 0x00 , 0x33 , 0x7F , 0x7F , 0x6B , 0x63 , 0x00 }, // U+006D (m)
310+ { 0x00 , 0x00 , 0x1F , 0x33 , 0x33 , 0x33 , 0x33 , 0x00 }, // U+006E (n)
311+ { 0x00 , 0x00 , 0x1E , 0x33 , 0x33 , 0x33 , 0x1E , 0x00 }, // U+006F (o)
312+ { 0x00 , 0x00 , 0x3B , 0x66 , 0x66 , 0x3E , 0x06 , 0x0F }, // U+0070 (p)
313+ { 0x00 , 0x00 , 0x6E , 0x33 , 0x33 , 0x3E , 0x30 , 0x78 }, // U+0071 (q)
314+ { 0x00 , 0x00 , 0x3B , 0x6E , 0x66 , 0x06 , 0x0F , 0x00 }, // U+0072 (r)
315+ { 0x00 , 0x00 , 0x3E , 0x03 , 0x1E , 0x30 , 0x1F , 0x00 }, // U+0073 (s)
316+ { 0x08 , 0x0C , 0x3E , 0x0C , 0x0C , 0x2C , 0x18 , 0x00 }, // U+0074 (t)
317+ { 0x00 , 0x00 , 0x33 , 0x33 , 0x33 , 0x33 , 0x6E , 0x00 }, // U+0075 (u)
318+ { 0x00 , 0x00 , 0x33 , 0x33 , 0x33 , 0x1E , 0x0C , 0x00 }, // U+0076 (v)
319+ { 0x00 , 0x00 , 0x63 , 0x6B , 0x7F , 0x7F , 0x36 , 0x00 }, // U+0077 (w)
320+ { 0x00 , 0x00 , 0x63 , 0x36 , 0x1C , 0x36 , 0x63 , 0x00 }, // U+0078 (x)
321+ { 0x00 , 0x00 , 0x33 , 0x33 , 0x33 , 0x3E , 0x30 , 0x1F }, // U+0079 (y)
322+ { 0x00 , 0x00 , 0x3F , 0x19 , 0x0C , 0x26 , 0x3F , 0x00 }, // U+007A (z)
323+ { 0x38 , 0x0C , 0x0C , 0x07 , 0x0C , 0x0C , 0x38 , 0x00 }, // U+007B ({)
324+ { 0x18 , 0x18 , 0x18 , 0x00 , 0x18 , 0x18 , 0x18 , 0x00 }, // U+007C (|)
325+ { 0x07 , 0x0C , 0x0C , 0x38 , 0x0C , 0x0C , 0x07 , 0x00 }, // U+007D (})
326+ { 0x6E , 0x3B , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }, // U+007E (~)
327+ { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } // U+007F
328+ };
329+
330+ static struct {
331+ int size ; // = width = height
332+ } gfont = {8 };
333+
334+ static void draw_font (char c , int x , int y ) {
335+ int color = getcolor ();
336+
337+ for (int j = 0 ; j < 8 ; j ++ ) if (y + j >=0 && y + j < GRAPHICS_MAX_HEIGHT ) {
338+ uint8_t mask = 0b00000001 ;
339+ uint8_t frow = font [c ][j ];
340+ for (int i = 0 ; i < 8 ; i ++ ) if (x + i >=0 && x + i < GRAPHICS_MAX_WIDTH ) {
341+ if ((frow & mask )) {
342+ BUFFER [y + j ][x + i ] = color ;
343+ }
344+ mask <<=1 ;
345+ }
346+ }
347+ }
348+
195349int textheight (char * str ) {
196- // TODO
350+ return gfont . size ;
197351}
198352
199353int textwidth (char * str ) {
200- // TODO
354+ return gfont . size * strlen ( str );
201355}
202356
203357void outtext (char * str ) {
204- // TODO
358+ gstate . x += outtextxy ( gstate . x , gstate . y , str );
205359}
206360
207- void outtextxy (int x , int y , char * str ) {
208- // TODO
361+ int outtextxy (int x , int y , char * str ) {
362+ // returns textwidth
363+ int len = 0 ;
364+ while (str != NULL && (* str )!= NULL ) {
365+ draw_font (* str , x , y );
366+ x += gfont .size ;
367+ len ++ ;
368+ str ++ ;
369+ }
370+ _autoflushnow ();
371+ return len * gfont .size ;
209372}
210373
211374void moveto (int x , int y ) {
212- // TODO
375+ gstate .x = x ;
376+ gstate .y = y ;
213377}
214378
215379int getx () {
216- // TODO
380+ return gstate . x ;
217381}
218382
219383int gety () {
220- // TODO
384+ return gstate . y ;
221385}
0 commit comments