#include <MiniFB.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "WindowData.h"
#include <MiniFB_internal.h>

extern uint32_t *g_buffer;
extern uint32_t g_width;
extern uint32_t g_height;

uint32_t mfb_getpix(int x,int y)
{
	unsigned int *buffer;
  buffer = g_buffer;
	if (buffer!=NULL)
	{
		if ((x>=0) && (x<g_width) && 
				(y>=0) && (y<g_height))
		{
			return (buffer[x+(y*g_width)]);
		}
	}
	return 0;
}

void mfb_setpix(int x,int y,uint32_t rgba)
{
	unsigned int *buffer;
  buffer = g_buffer;
	if (buffer!=NULL)
	{
		if ((x>=0) && (x<g_width) && 
				(y>=0) && (y<g_height))
		{
			buffer[x+(y*g_width)]=rgba;
		}
	}
}

void mfb_line(int x0, int y0, int x1, int y1, uint32_t rgba)
{
	int sx, sy, dx, dy, err, e2;
	dx = abs(x1 - x0);
	dy = abs(y1 - y0);
	if (x0 < x1) sx = 1; else sx = -1;
	if (y0 < y1) sy = 1; else sy = -1;
	err = dx - dy;

	mfb_setpix(x0, y0, rgba);
	while (x0 != x1 || y0 != y1)
	{
		mfb_setpix(x0, y0, rgba);
		e2 = 2*err;
		if (e2 > -dy) { err -= dy; x0 += sx; }
		if (e2 <  dx) { err += dx; y0 += sy; }
	}
}

void mfb_rect(int x, int y, int w, int h, uint32_t rgba)
{
	int x1, y1;
	if (w <= 0 || h <= 0)
		return;
	
	x1 = x + w-1;
	y1 = y + h-1;
	mfb_line(x, y, x1, y, rgba);
	mfb_line(x1, y, x1, y1, rgba);
	mfb_line(x1, y1, x, y1, rgba);
	mfb_line(x, y1, x, y, rgba);
}

void mfb_rect_fill(int x, int y, int w, int h, uint32_t rgba)
{
	for (int py=y;py<y+h;py++)
		mfb_line(x,py,x+w,py,rgba);	
}

void mfb_blit(uint32_t *src, int dx, int dy, int w, int h,int stride)
{
	uint32_t *td, *ts;
	int st, dt;
	//	warning no clipping yet 
	ts = src;
	td = &g_buffer[dy*g_width + dx];
	do {
		memcpy(td, ts, w*sizeof(uint32_t));
		ts += stride;
		td += g_width;
	} while(--h);
}

void mfb_box(int x0,int y0,int x1,int y1,uint32_t rgba)
{
	mfb_line(x0,y0,x1,y0,rgba);
	mfb_line(x0,y1,x1,y1,rgba);
	mfb_line(x0,y0,x0,y1,rgba);
	mfb_line(x1,y0,x1,y1,rgba);
}

void mfb_box_fill(int x0,int y0,int x1,int y1,uint32_t rgba)
{
int y2 = y0;
	if (y1>y2)
	{
		y2 = y1;
		y1 = y0;
	}
	for (int y=y1;y<y2;y++)
		mfb_line(x0,y,x1,y,rgba);	
}

void mfb_circle(int sx, int sy, int radius, uint32_t rgba)
{
	int r = radius;
	int x = -r, y = 0, err = 2-2*r;
	do {
		mfb_setpix(sx-x,sy+y,rgba);
		mfb_setpix(sx-y,sy-x,rgba);
		mfb_setpix(sx+x,sy-y,rgba);
		mfb_setpix(sx+y,sy+x,rgba);
		r = err;
		if (r <= y) err += ++y*2+1;
		if (r > x || err > y) err += ++x*2+1;
	} while (x <= 0);
}

void mfb_circle_fill(int sx, int sy, int radius, uint32_t rgba)
{
	int r = radius;
	int x = -r, y = 0, err = 2-2*r;
	do {
		mfb_line(sx-x-1,sy+y,sx+x,sy+y,rgba);
		mfb_line(sx-x-1,sy-y,sx+x,sy-y,rgba);

		r = err;
		if (r <= y) err += ++y*2+1;
		if (r > x || err > y) err += ++x*2+1;
	} while (x <= 0);
}


#if 0

char vincent_data[128][8] = { 
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0000 (nul)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0001
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0002
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0003
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0004
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0005
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0006
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0007
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0008
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0009
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000A
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000B
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000C
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000D
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000E
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+000F
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0010
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0011
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0012
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0013
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0014
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0015
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0016
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0017
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0018
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0019
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001A
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001B
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001C
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001D
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001E
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+001F
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0020 (space)
    { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00},   // U+0021 (!)
    { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0022 (")
    { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00},   // U+0023 (#)
    { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00},   // U+0024 ($)
    { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00},   // U+0025 (%)
    { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00},   // U+0026 (&)
    { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0027 (')
    { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00},   // U+0028 (()
    { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00},   // U+0029 ())
    { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00},   // U+002A (*)
    { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00},   // U+002B (+)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+002C (,)
    { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00},   // U+002D (-)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+002E (.)
    { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00},   // U+002F (/)
    { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00},   // U+0030 (0)
    { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00},   // U+0031 (1)
    { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00},   // U+0032 (2)
    { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00},   // U+0033 (3)
    { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00},   // U+0034 (4)
    { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00},   // U+0035 (5)
    { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00},   // U+0036 (6)
    { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00},   // U+0037 (7)
    { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00},   // U+0038 (8)
    { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00},   // U+0039 (9)
    { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00},   // U+003A (:)
    { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06},   // U+003B (;)
    { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00},   // U+003C (<)
    { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00},   // U+003D (=)
    { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00},   // U+003E (>)
    { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00},   // U+003F (?)
    { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00},   // U+0040 (@)
    { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00},   // U+0041 (A)
    { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00},   // U+0042 (B)
    { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00},   // U+0043 (C)
    { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00},   // U+0044 (D)
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00},   // U+0045 (E)
    { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00},   // U+0046 (F)
    { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00},   // U+0047 (G)
    { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00},   // U+0048 (H)
    { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0049 (I)
    { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00},   // U+004A (J)
    { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00},   // U+004B (K)
    { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00},   // U+004C (L)
    { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00},   // U+004D (M)
    { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00},   // U+004E (N)
    { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00},   // U+004F (O)
    { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00},   // U+0050 (P)
    { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00},   // U+0051 (Q)
    { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00},   // U+0052 (R)
    { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00},   // U+0053 (S)
    { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0054 (T)
    { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00},   // U+0055 (U)
    { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0056 (V)
    { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00},   // U+0057 (W)
    { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00},   // U+0058 (X)
    { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00},   // U+0059 (Y)
    { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00},   // U+005A (Z)
    { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00},   // U+005B ([)
    { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00},   // U+005C (\)
    { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00},   // U+005D (])
    { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00},   // U+005E (^)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   // U+005F (_)
    { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+0060 (`)
    { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00},   // U+0061 (a)
    { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00},   // U+0062 (b)
    { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00},   // U+0063 (c)
    { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00},   // U+0064 (d)
    { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00},   // U+0065 (e)
    { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00},   // U+0066 (f)
    { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0067 (g)
    { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00},   // U+0068 (h)
    { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+0069 (i)
    { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E},   // U+006A (j)
    { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00},   // U+006B (k)
    { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00},   // U+006C (l)
    { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00},   // U+006D (m)
    { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00},   // U+006E (n)
    { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},   // U+006F (o)
    { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},   // U+0070 (p)
    { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},   // U+0071 (q)
    { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},   // U+0072 (r)
    { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00},   // U+0073 (s)
    { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00},   // U+0074 (t)
    { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00},   // U+0075 (u)
    { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00},   // U+0076 (v)
    { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00},   // U+0077 (w)
    { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00},   // U+0078 (x)
    { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F},   // U+0079 (y)
    { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00},   // U+007A (z)
    { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00},   // U+007B ({)
    { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},   // U+007C (|)
    { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00},   // U+007D (})
    { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   // U+007E (~)
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}    // U+007F
};


void mfb_putchv(struct mfb_window *window,unsigned short c,int x, int y,uint32_t rgba)
{
	int i, j;
	if(c < 32 || c > 127) c = 127;
	for(j = 0; j < 8 ; j++)
	{
		unsigned char bits = vincent_data[c][j];
		for(i = 0; i < 8 ; i++)
		{
			if( bits & (1 << i)!=0)
				mfb_setpix(window,x+i,y+j,rgba);
		}
	}
}


void mfb_print(struct mfb_window *window,int x, int y, uint32_t rgba, const char *text, ...)
{
static int stb_fontinit=0;
	char tmp[1024];
	va_list args;
	const char *p;
	int start = x, c;
	// Expand the formatting string.
	va_start(args, text);
	vsnprintf(tmp, sizeof(tmp), text, args);
	tmp[sizeof(tmp)-1] = 0;
	va_end(args);

	// Print each glyph.
	p = tmp;
	while (*p)
	{
		mfb_putchv(window,*p,x,y,rgba);
		x+=8;
		p++;
	}
}

#else

unsigned char mfb_tom_thumb_bits[] =
{
	 0xbf, 0x89, 0xad, 0xac, 0xee, 0xff, 0xdf, 0xaa, 0xaa, 0xaa, 0xcd, 0xac,
   0xdf, 0x8a, 0x88, 0xdc, 0xaf, 0xda, 0xdf, 0xaa, 0xae, 0xae, 0xaf, 0xd8,
   0xbf, 0x8c, 0xa9, 0xae, 0xaf, 0xae, 0xdd, 0x8d, 0x8d, 0xad, 0xdf, 0xff,
   0xbd, 0xac, 0xda, 0xaa, 0xfc, 0xa9, 0xbd, 0x8d, 0xd8, 0xda, 0xd9, 0x8a,
   0xbf, 0xbd, 0xda, 0xd8, 0xda, 0xb8, 0xdd, 0xcd, 0x8a, 0xd9, 0xd8, 0xcb,
   0xaa, 0xdc, 0xbc, 0x8c, 0xbe, 0xff, 0xda, 0xfb, 0xba, 0xba, 0xfc, 0x89,
   0xaf, 0xfd, 0xbc, 0xdc, 0xba, 0x9e, 0xff, 0xde, 0xaa, 0xea, 0xaa, 0xce,
   0xff, 0xf8, 0xdc, 0x8a, 0xdc, 0x8e, 0xfa, 0xd8, 0xa9, 0x99, 0xef, 0x9f,
   0xd8, 0xfb, 0xae, 0xde, 0xa9, 0xd9, 0x8a, 0xfd, 0xce, 0xdd, 0xce, 0xec,
   0xd8, 0xdb, 0xae, 0xdb, 0xce, 0xd9, 0xfa, 0xec, 0xa9, 0x9c, 0xa9, 0x9c,
   0xf9, 0xba, 0xec, 0xf8, 0xcb, 0xdd, 0xfc, 0xda, 0xea, 0xed, 0xd9, 0xd8,
   0xf9, 0xe8, 0xea, 0xdd, 0xda, 0xfd, 0xdc, 0xdb, 0xea, 0xbd, 0xda, 0xdd,
   0xed, 0xbb, 0x8c, 0xfd, 0x89, 0xd9, 0xfe, 0xf8, 0xa8, 0x9a, 0xff, 0xcf,
   0xfb, 0x8e, 0x8e, 0xba, 0x89, 0xda, 0x8d, 0xfc, 0x8c, 0xba, 0x8a, 0xba,
   0xfe, 0x8b, 0xae, 0xba, 0xac, 0xda, 0xfb, 0xfc, 0xa8, 0x99, 0xa9, 0xc9,
   0xfd, 0xe9, 0xa8, 0xda, 0xfb, 0x9f, 0xfa, 0xde, 0x8e, 0xaa, 0xcd, 0xca,
   0xfd, 0xb8, 0x8c, 0xfa, 0xa8, 0xfa, 0xda, 0xda, 0x8e, 0xfa, 0xad, 0xfa,
   0xf9, 0xe8, 0xae, 0xfd, 0xad, 0xfd, 0xfd, 0x88, 0xd9, 0xfa, 0xff, 0x8f,
   0xbd, 0xbb, 0xae, 0xfa, 0xd9, 0x8a, 0xdf, 0xdd, 0xaa, 0xf8, 0xa8, 0x8a,
   0xef, 0xfe, 0xaa, 0xf8, 0xab, 0x88, 0xff, 0xde, 0xd9, 0x8a, 0xdc, 0x88 };

void mfb_putch(unsigned short c,int x, int y,uint32_t rgba)
{
		int frow, fcol, byte;
    int i, j;
    if(c < 32 || c > 127) c = 127;
    c -= 0x20;
    fcol = c >> 3;
    int shf = (fcol & 0x1);
    fcol >>= 1;    
    frow = c & 0x7;    
    byte = frow * 5 * 6 + fcol;
    for(j = 0; j < 5 ; j++)
		{
				unsigned char bits = mfb_tom_thumb_bits[byte];
				if(shf) bits >>= 4;
				for(i = 0; i < 4 ; i++)
				{
					if(!(bits & (1 << i)))
					{
						mfb_setpix(x+i,y+j+1,0xff000000);
						mfb_setpix(x+i,y+j,rgba);
					}
				}
        byte += 6;
    }
}

void mfb_print(int x, int y, uint32_t rgba, const char *text, ...)
{
static int stb_fontinit=0;
	char tmp[1024];
	va_list args;
	const char *p;
	int start = x, c;
	// Expand the formatting string.
	va_start(args, text);
	vsnprintf(tmp, sizeof(tmp), text, args);
	tmp[sizeof(tmp)-1] = 0;
	va_end(args);

	// Print each glyph.
	p = tmp;
	while (*p)
	{
		mfb_putch(*p,x,y,rgba);
		x+=4;
		p++;
	}
}


#endif
