Newer
Older
ubix / src / sys / graphics / objfont.cpp
#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