#include "objfont.h"
#include "objgfx30.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
TFont::TFont(TGfx0* buffer) {
Buf = buffer;
memset(FontDataIdx,0,sizeof(FontDataIdx));
memset(CharWidthTable,0,sizeof(CharWidthTable));
memset(CharHeightTable,0,sizeof(CharHeightTable));
FontData = 0;
FontDataSize = 0;
return;
} // TFont::TFont
void TFont::CenterTextX(Int32 y, const char * TextString ) {
Int32 x;
x = ((Buf->getMaxX()+1)-TextWidth(TextString)) / 2;
PutText(x,y,TextString);
return;
} // TFont::CenterTextX
void TFont::JustifyText(UInt8 Horiz, UInt8 Vert, const char * TextString) {
UInt32 x,y;
switch (Horiz) {
case LeftText:
x = 0;
break;
case CenterText:
x = ((Buf->getMaxX())-TextWidth(TextString)) / 2;
break;
case RightText:
x = (Buf->getMaxX())-TextWidth(TextString);
break;
default:
return;
} // switch
switch (Vert) {
case TopText:
y = 0;
break;
case CenterText:
y = ((Buf->getMaxY())-TextHeight(TextString)) / 2;
break;
case BottomText:
y = (Buf->getMaxY())-TextHeight(TextString);
default:
return;
} // switch
PutText(x,y,TextString);
return;
} // TFont::JustifyText
bool TFont::Load(const char* FontFile) {
return LoadFrom(FontFile,0);
} // TFont::Load
bool TFont::Save(const char* FontFile) {
return SaveTo(FontFile,0);
} // TFont::Save
UInt32 TFont::TextHeight(const char * TextString) {
UInt32 size, tmpsize;
size = 0;
if (TextString)
while (*TextString) {
tmpsize = CharHeightTable[*TextString++];
if (tmpsize>size) size = tmpsize;
}
return size;
} // TFont::TextHeight
UInt32 TFont::TextWidth(const char * TextString) {
UInt32 size=0;
if (TextString)
while (*TextString)
size+=CharWidthTable[*TextString++];
return size;
} // TFont::TextWidth
TFont::~TFont(void) {
if (FontDataSize) free(FontData);
return;
} // TFont::~TFont
/* TBMFont methods */
void TBMFont::SetColor(UInt32 colour) {
ColourTable[1] = colour;
return;
} // TBMFont::SetColor
void TBMFont::SetIdxColor(UInt8 idx, UInt32 colour) {
ColourTable[idx] = colour;
return;
} // TBMFont::SetIdxColor
void TBMFont::PutText(Int32 x, Int32 y, const char * TextString) {
UInt32 xx, yy;
UInt8 * offset;
UInt8 pix;
char ch;
if (!FontData) return;
if (!TextString) return;
while (*TextString) {
ch = *TextString++;
if ((CharWidthTable[ch]) && (ch!=' ')) {
offset=(UInt8 *)(FontData);
for (yy=0; yy<=(UInt32)(CharHeightTable[ch]-1); yy++)
for (xx=0; xx<=(UInt32)(CharWidthTable[ch]-1); xx++) {
pix = *offset++;
if (pix) Buf->putpixel(x+xx,y+yy,ColourTable[pix]);
} // for xx
x+=CharWidthTable[ch];
} // if charwidthtable
} // while
return;
} // TBMFont::PutText
/* TDPFont methods */
bool TDPFont::SaveTo(const char * FontFile, Int32 Offset) {
return TRUE;
}
void TDPFont::PutText(Int32 x, Int32 y, const char * TextString) {
UInt32 xx, xcount, ycount;
UInt8 * offset;
UInt8 bits;
char ch;
if (!FontData) return;
if (!TextString) return;
while (*TextString) {
ch = *TextString++;
if ((CharWidthTable[ch]) && (ch!=' ')) {
offset=(UInt8 *)(FontData);
offset+=FontDataIdx[ch];
for (ycount = 0; ycount<=(UInt32)(Height-1); ycount++) {
xcount = CharWidthTable[ch];
xx = 0;
do {
if (xx & 7==0) bits = *(offset++);
if (bits & 128)
Buf->putpixel(x+xx,y+ycount,ColourTable[1]);
xx++;
bits+=bits;
} while (xcount--);
} // for
} // if
x+=CharWidthTable[ch];
} // while
} // TDPFont::PutText
bool TDPFont::LoadFrom(const char * FontFile, UInt32 Offset) {
FILE * infile;
TDPFHeader header;
UInt32 lresult, size;
if (FontData) free(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) NumOfChars = 256;
StartingChar = header.StartingChar;
memset(FontDataIdx,0,sizeof(FontDataIdx));
memset(CharWidthTable,0,sizeof(CharWidthTable));
memset(CharHeightTable,0,sizeof(CharHeightTable));
size = ((Width+7) / 8)*Height;
FontDataSize = size*NumOfChars;
for (int tmp=StartingChar; tmp<=StartingChar+NumOfChars-1; tmp++) {
CharWidthTable[tmp]=Width;
CharHeightTable[tmp]=Height;
FontDataIdx[tmp]=(size*(tmp-StartingChar));
} // for
FontData = malloc(FontDataSize);
lresult = fread(FontData,1,FontDataSize,infile);
fclose(infile);
return TRUE;
} // TDPFont::LoadFrom