FITD/FitdLib/font.cpp

218 lines
4.4 KiB
C++

#include "common.h"
int fontHeight = 16;
char* fontVar1 = NULL;
s16 fontSm1 = 0;
s16 fontSm2 = 0x1234;
char* fontVar4 = NULL;
extern char* fontVar4;
char* fontVar5 = NULL;
extern char* fontVar5;
s16 currentFontColor = 0;
extern s16 currentFontColor;
s16 g_fontInterWordSpace = 2;
s16 g_fontInterLetterSpace = 1;
s16 fontSm3 = 18;
s16 fontVar6 = 0;
s16 fontSm7 = 0x1234;
s16 fontSm8 = 0x1234;
s16 fontSm9 = 0x80;
unsigned char flagTable[]= {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
void SetFont(char* fontData, int color)
{
s16 tempDx;
s16 tempAxFlip;
fontVar1 = fontData; // fontPtr
tempDx = READ_LE_S16(fontData); // alignement
fontData+=2;
fontSm1 = *(fontData++); // character height
fontSm2 = *(unsigned char*)(fontData++); // character size
if(!fontSm2)
{
fontSm2 = READ_LE_S16(fontData);
}
fontData+=2;
tempAxFlip = READ_LE_S16(fontData);
fontData+=2;
tempAxFlip = ((tempAxFlip & 0xFF) << 8 ) | ((tempAxFlip &0xFF00) >> 8);
fontVar4 = fontData;
fontVar5 = fontVar1 + tempAxFlip - (tempDx&0xFF)*2;
currentFontColor = color;
fontSm3 = color;
}
void SetFontSpace(int interWordSpace, int interLetterSpace)
{
g_fontInterWordSpace = interWordSpace;
g_fontInterLetterSpace = interLetterSpace;
}
int ExtGetSizeFont(u8* string)
{
int width = 0;
unsigned char character;
while((character = *(string++)))
{
char* dataPtr;
u16 data;
dataPtr = fontVar5 + character*2;
data = READ_LE_S16(dataPtr);
data>>=4;
data &= 0xF;
if(!data)
{
width += g_fontInterWordSpace;
}
width += g_fontInterLetterSpace;
width += data;
}
return(width);
}
void PrintFont(int x, int y, char* surface, u8* string)
{
unsigned char character;
fontVar6 = x;
fontSm7 = y;
while ((character = *(string++)))
{
char* dataPtr;
u16 data;
u16 dx;
dataPtr = fontVar5 + character*2;
data = READ_LE_U16(dataPtr);
data = ((data & 0xFF)<<8)| ((data&0xFF00)>>8);
dx = data;
data >>= 12;
if(data&0xF) // real character (width != 0)
{
char* characterPtr;
int bp;
int ch;
dx &= 0xFFF;
characterPtr = (dx>>3) + fontVar4;
fontSm9 = flagTable[dx & 7];
bp = fontSm7;
fontSm8 = fontVar6;
ch;
for(ch = fontSm1; ch>0; ch--)
{
if (bp >= 200)
return;
char* outPtr = (char*)uiLayer.data() + bp * 320 + fontSm8;
int dh = fontSm9;
int cl = data&0xF;
int al = *characterPtr;
int bx;
bp++;
for(bx = 0; cl>0; cl--)
{
if(dh & al)
{
*(outPtr) = (char)fontSm3;
}
outPtr++;
dh = ((dh>>1) & 0x7F) | ((dh<<7)&0x80);
if(dh&0x80)
{
bx++;
al = *(characterPtr + bx);
}
}
characterPtr += fontSm2;
}
fontVar6 += data&0xF;
}
else // space character
{
fontVar6 += g_fontInterWordSpace;
}
fontVar6 += g_fontInterLetterSpace;
}
}
void SelectedMessage(int x, int y, int index, int color1, int color2)
{
textEntryStruct* entryPtr;
u8* textPtr;
entryPtr = getTextFromIdx(index);
if(!entryPtr)
return;
x -= (entryPtr->width/2); // center
textPtr = entryPtr->textPtr;
SetFont(PtrFont,color2);
PrintFont(x,y+1,logicalScreen,textPtr);
SetFont(PtrFont,color1);
PrintFont(x,y,logicalScreen,textPtr);
}
void SimpleMessage(int x, int y, int index, int color)
{
textEntryStruct* entryPtr = getTextFromIdx(index);
if(!entryPtr)
return;
x -= (entryPtr->width/2); // center
u8* textPtr = entryPtr->textPtr;
SetFont(PtrFont,color);
PrintFont(x,y+1,logicalScreen,textPtr);
}