#include <objgfx40/ogFont.h>
#include <objgfx40/objgfx40.h>
extern "C" {
#ifdef __UBIXOS_KERNEL__
#include <vfs/file.h>
#include <sys/types.h>
#include <lib/kprintf.h>
#else
#include <stdlib.h>
#include <stdio.h>
#endif
#include <string.h>
}
//using namespace std;
typedef struct {
char ID[3];
uint8_t version;
uint8_t width, height;
uint8_t numOfChars;
uint8_t startingChar;
uint8_t colourType;
uint8_t paddington[7];
} ogDPFHeader;
ogBitFont::ogBitFont(void) {
memset(fontDataIdx, 0, sizeof(fontDataIdx));
memset(charWidthTable, 0, sizeof(charWidthTable));
memset(charHeightTable, 0, sizeof(charHeightTable));
fontData = NULL;
fontDataSize = 0;
numOfChars = 0;
width = height = startingChar = 0;
BGColour.red = 0;
BGColour.green = 0;
BGColour.blue = 0;
BGColour.alpha = 0;
FGColour.red = 255;
FGColour.green = 255;
FGColour.blue = 255;
FGColour.alpha = 255;
return;
} // ogBitFont::ogBitFont
void ogBitFont::SetBGColor(uint32_t red, uint32_t green, uint32_t blue, uint32_t alpha) {
BGColour.red = red;
BGColour.green = green;
BGColour.blue = blue;
BGColour.alpha = alpha;
return;
} // ogBitFont::SetBGColor
void ogBitFont::SetFGColor(uint32_t red, uint32_t green, uint32_t blue, uint32_t alpha) {
FGColour.red = red;
FGColour.green = green;
FGColour.blue = blue;
FGColour.alpha = alpha;
return;
} // ogBitFont::SetFGColor
ogBitFont::~ogBitFont(void) {
memset(fontDataIdx, 0, sizeof(fontDataIdx));
memset(charWidthTable, 0, sizeof(charWidthTable));
memset(charHeightTable, 0, sizeof(charHeightTable));
delete[] fontData;
fontData = NULL;
fontDataSize = 0;
width = height = startingChar = 0;
return;
} // ogBitFont::~ogBitFont;
void ogBitFont::CenterTextX(ogSurface& dest, int32 y, const char * textString) {
int32 x;
x = ((dest.ogGetMaxX() + 1) - TextWidth(textString)) / 2;
PutString(dest, x, y, textString);
return;
} // ogBitFont::CenterTextX
void ogBitFont::JustifyText(ogSurface& dest, ogTextAlign horiz, ogTextAlign vert, const char * textString) {
uint32_t x, y;
switch (horiz) {
case leftText:
x = 0;
break;
case centerText:
x = ((dest.ogGetMaxX()) - TextWidth(textString)) / 2;
break;
case rightText:
x = (dest.ogGetMaxX()) - TextWidth(textString);
break;
default:
return;
} // switch
switch (vert) {
case topText:
y = 0;
break;
case centerText:
y = ((dest.ogGetMaxY()) - TextHeight(textString)) / 2;
break;
case bottomText:
y = (dest.ogGetMaxY()) - TextHeight(textString);
default:
return;
} // switch
PutString(dest, x, y, textString);
return;
} // ogBitFont::JustifyText
bool ogBitFont::Load(const char* fontFile, uint32_t offset = 0) {
#ifdef __UBIXOS_KERNEL__
fileDescriptor_t *infile;
#else
FILE * infile;
#endif
ogDPFHeader header;
uint32_t lresult, size;
delete[] fontData;
infile = fopen(fontFile, "r");
//fseek(infile, offset, SEEK_SET);
lresult = fread(&header, sizeof(header), 1, infile);
width = header.width;
height = header.height;
numOfChars = header.numOfChars;
if (numOfChars == 0)
numOfChars = 256;
startingChar = header.startingChar;
memset(fontDataIdx, 0, sizeof(fontDataIdx));
memset(charWidthTable, 0, sizeof(charWidthTable));
memset(charHeightTable, 0, sizeof(charHeightTable));
size = (((uint32_t) width + 7) / 8) * (uint32_t) height;
fontDataSize = size * (uint32_t) numOfChars;
for (int32 tmp = startingChar; tmp <= startingChar + (numOfChars - 1); tmp++) {
charWidthTable[tmp] = width;
charHeightTable[tmp] = height;
fontDataIdx[tmp] = (size * (tmp - startingChar));
} // for tmp
fontData = new uint8_t[fontDataSize];
#ifdef __UBIXOS_KERNEL__
kern_fseek(infile, 16, 0);
#else
fseek(infile, 16, 0);
#endif
lresult = fread(fontData, fontDataSize, 1, infile);
fclose(infile);
return true;
} // ogBitFont::Load
/*
bool
ogFont::LoadFrom(const char* FontFile, uint32_t Offset) {
return true;
} // ogFont::LoadFrom
bool
ogFont::Save(const char* FontFile) {
return saveTo(FontFile,0);
} // ogFont::Save
*/
uint32_t ogBitFont::TextHeight(const char * textString) {
uint32_t size, tmpsize;
size = 0;
const unsigned char * text = (const unsigned char *) textString;
if (text != NULL)
while (*text) {
tmpsize = charHeightTable[*text++];
if (tmpsize > size)
size = tmpsize;
} // while
return size;
} // ogBitFont::TextHeight
uint32_t ogBitFont::TextWidth(const char * textString) {
uint32_t size = 0;
const unsigned char * text = (const unsigned char *) textString;
if (text != NULL)
while (*text)
size += charWidthTable[*text++];
return size;
} // ogBitFont::TextWidth
/*
bool
ogBitFont::SaveTo(const char * fontFile, int32 offset) {
return true;
} // TDPFont::SaveTo
*/
void ogBitFont::PutChar(ogSurface& dest, int32 x, int32 y, const char ch) {
uint32_t xx, xCount, yCount;
uint32_t BGC, FGC, tColour;
uint8_t * offset;
uint8_t bits = 0;
const unsigned char c = (const unsigned char) ch;
if (fontData == NULL)
return;
if (!dest.ogAvail())
return;
if (charWidthTable[c] != 0) {
BGC = dest.ogPack(BGColour.red, BGColour.green, BGColour.blue, BGColour.alpha);
BGC &= dest.ogGetAlphaMasker();
tColour = dest.ogGetTransparentColor();
FGC = dest.ogPack(FGColour.red, FGColour.green, FGColour.blue, FGColour.alpha);
offset = fontData;
offset += fontDataIdx[c];
for (yCount = 0; yCount < height; yCount++) {
xCount = charWidthTable[c];
xx = 0;
do {
if ((xx & 7) == 0)
bits = *(offset++);
if ((bits & 128) != 0)
dest.ogSetPixel(x + xx, y + yCount, FGColour.red, FGColour.green, FGColour.blue, FGColour.alpha);
else if (BGC != tColour)
dest.ogSetPixel(x + xx, y + yCount, BGC);
bits += bits;
++xx;
} while (--xCount);
} // for yCount
} // if
return;
} // ogBitFont::PutChar
void ogBitFont::PutString(ogSurface& dest, int32 x, int32 y, const char *textString) {
const unsigned char *text;
unsigned char ch;
if (textString == NULL)
return;
if (0 == strlen(textString))
return;
if (!dest.ogAvail())
return;
text = (const unsigned char *) textString;
while ((ch = *text++) != 0) {
PutChar(dest, x, y, ch);
x += charWidthTable[ch];
} // while
return;
} // ogBitFont::PutString