#include "objfont.h" #include "objgfx30.h" #include <string.h> #include <stdlib.h> #include <stdio.h> TFont::TFont(void) { 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(TGfx0& Buf, Int32 y, const char * TextString ) { Int32 x; x = ((Buf.getMaxX()+1)-textWidth(TextString)) / 2; putText(Buf,x,y,TextString); return; } // TFont::centerTextX void TFont::justifyText(TGfx0& Buf, 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(Buf,x,y,TextString); return; } // TFont::justifyText bool TFont::load(const char* FontFile) { return loadFrom(FontFile,0); } // TFont::Load bool TFont::loadFrom(const char* FontFile, UInt32 Offset) { return TRUE; } // TFont::loadFrom 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(UInt8 r, UInt8 g, UInt8 b) { ColourTable[1].red = r; ColourTable[1].green = g; ColourTable[1].blue = b; return; } // TBMFont::setColor void TBMFont::setIdxColor(UInt8 idx, UInt8 r, UInt8 g, UInt8 b) { if (idx>=31) return; ColourTable[idx].red = r; ColourTable[idx].green = g; ColourTable[idx].blue = b; return; } // TBMFont::setIdxColor void TBMFont::putText(TGfx0& Buf, Int32 x, Int32 y, const char * TextString) { UInt32 ct[32]; UInt32 xx, yy; UInt8 * offset; UInt8 pix; char ch; if (!FontData) return; if (!TextString) return; for (xx=0; xx<=31; xx++) ct[xx]=Buf.RGB(ColourTable[xx].red, ColourTable[xx].green, ColourTable[xx].blue); while (*TextString) { ch = *TextString++; if ((CharWidthTable[ch]) && (ch!=' ')) { offset=(UInt8 *)(FontData); offset+=FontDataIdx[ch]; for (yy=0; yy<=(UInt32)(CharHeightTable[ch]-1); yy++) for (xx=0; xx<=(UInt32)(CharWidthTable[ch]-1); xx++) { pix = *offset++; if ((pix) && (pix<=31)) Buf.putPixel(x+xx,y+yy,ct[pix]); } // for xx x+=CharWidthTable[ch]; } // if charwidthtable } // while return; } // TBMFont::putText /* TDPFont methods */ bool TDPFont::saveTo(const char * FontFile, Int32 Offset) { return TRUE; } // TDPFont::saveTo void TDPFont::putText(TGfx0& Buf, 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,Buf.RGB(ColourTable[1].red, ColourTable[1].green, ColourTable[1].blue)); 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