extern "C" { #include <string.h> #include <stdlib.h> #include <stdio.h> } #include "ogFont.h" #include "objgfx30.h" ogBitFont::ogBitFont(void) { memset(fontDataIdx,0,sizeof(fontDataIdx)); memset(charWidthTable,0,sizeof(charWidthTable)); memset(charHeightTable,0,sizeof(charHeightTable)); fontData = NULL; fontDataSize = 0; width = 0; height = 0; numOfChars = 0; startingChar = 0; BGColour.red = 0; BGColour.green = 0; BGColour.blue = 0; FGColour.red = 255; FGColour.green = 255; FGColour.blue = 255; return; } // ogBitFont::ogBitFont void ogBitFont::centerTextX(ogSurface& buf, int32 y, const char * TextString ) { int32 x; x = ((buf.ogGetMaxX()+1)-textWidth(TextString)) / 2; putString(buf,x,y,TextString); return; } // ogBitFont::centerTextX void ogBitFont::justifyText(ogSurface& buf, uInt8 horiz, uInt8 vert, const char * textString) { uInt32 x,y; if (textString==NULL) return; switch (horiz) { case LeftText: x = 0; break; case CenterText: x = ((buf.ogGetMaxX())-textWidth(textString)) / 2; break; case RightText: x = (buf.ogGetMaxX())-textWidth(textString); break; default: return; } // switch switch (vert) { case TopText: y = 0; break; case CenterText: y = ((buf.ogGetMaxY())-height) / 2; break; case BottomText: y = (buf.ogGetMaxY())-height; default: return; } // switch putString(buf,x,y,textString); return; } // ogBitFont::justifyText bool ogBitFont::load(const char* fontFile) { return loadFrom(fontFile,0); } // ogBitFont::Load bool ogBitFont::save(const char* fontFile) { return saveTo(fontFile,0); } // ogBitFont::save uInt32 ogBitFont::textWidth(const char * textString) { uInt32 size=0; if (textString==NULL) return 0; while (*textString) size+=charWidthTable[(uInt8)*(textString++)]; return size; } // ogBitFont::textWidth void ogBitFont::setBGColor(uInt8 r, uInt8 g, uInt8 b) { BGColour.red = r; BGColour.green = g; BGColour.blue = b; return; } // ogBitFont::setBGColor void ogBitFont::setFGColor(uInt8 r, uInt8 g, uInt8 b) { FGColour.red = r; FGColour.green = g; FGColour.blue = b; return; } // ogBitFont::setFGColor void ogBitFont::putString(ogSurface& buf, int32 x, int32 y, const char * textString) { char ch; if (fontData==NULL) return; if (textString==NULL) return; if (buf.ogAvail()==false) return; buf.ogFillRect(x,y,x+textWidth(textString)-1,y+textHeight(textString)-1, buf.ogRGB(BGColour.red, BGColour.green, BGColour.blue)); while (*textString) { ch = *textString++; putChar(buf, x, y, ch); x+=charWidthTable[(uInt8)ch]; } // while } // ogBitFont::putString void ogBitFont::putChar(ogSurface& buf, int32 x, int32 y, const char ch) { uInt32 xx, xcount, ycount; uInt8 * offset; uInt8 bits = 0; uInt32 colour; if (fontData==NULL) return; if (buf.ogAvail()==false) return; if (charWidthTable[(uInt8)ch]!=0) { colour = buf.ogRGB(FGColour.red,FGColour.green,FGColour.blue); offset=(uInt8 *)(fontData); offset+=fontDataIdx[(uInt8)ch]; for (ycount = 0; ycount<=(uInt32)(height-1); ycount++) { xcount = charWidthTable[(uInt8)ch]; xx = 0; do { if ((xx & 7)==0) bits = *(offset++); if (bits & 128) buf.ogSetPixel(x+xx,y+ycount,colour); bits+=bits; xx++; } while (--xcount); } // for } // if } // ogBitFont::putChar bool ogBitFont::loadFrom(const char * fontFile, uInt32 offset) { FILE * infile; ogDPFHeader header; uInt32 lresult, size; free(fontData); infile = fopen(fontFile,"rb"); 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 = ((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; } // ogBitFont::loadFrom bool ogBitFont::saveTo(const char *, int32) { return false; } // ogBitFont::saveTo ogBitFont::~ogBitFont(void) { if (fontDataSize) free(fontData); return; } // ogBitFont::~ogBitFont