deargui-vpl/ref/virtools/Samples/Behaviors/Interface/Sources/CKBitmapFont.cpp

213 lines
4.1 KiB
C++

#include "CKAll.h"
#include "CKBitmapFont.h"
//#include <fstream.h>
CKBitmapFont::CKBitmapFont():m_FontBitmap(0),m_Height(0)
{
int i;
for(i=0;i<256;i++) {
m_CorrespondanceTable[i].pos=-1;
m_CorrespondanceTable[i].width=0;
}
}
DWORD
readPixel(BYTE* data,int bpp)
{
DWORD col;
switch(bpp) {
case 1:
col = *data;
break;
case 2:
col = *(WORD*)data;
break;
case 3:
col = *(DWORD*)data;
col&=0x00FFFFFF;
break;
case 4:
col = *(DWORD*)data;
break;
}
return col;
}
void
verticalLine(BYTE* data,DWORD col,int bpp,int pitch,int height)
{
int i;
for(i=0;i<height;i++) {
switch(bpp) {
case 1:
*data = (BYTE)col;
break;
case 2:
*(WORD*)data = (WORD)col;
break;
case 3:
memcpy(data,&col,bpp);
break;
case 4:
*(DWORD*)data = col;
break;
}
data+=pitch;
}
}
void
VerticalLine(CKSprite* sprite,int x,int height,DWORD col)
{
int i;
for(i=0;i<height;i++) {
sprite->SetPixel(x,i,col);
}
}
int
CKBitmapFont::CreateFont(CK_ID sprite, CKContext *ctx)
{
m_FontBitmap = sprite;
CKSprite* fontBitmap = (CKSprite*)ctx->GetObject(sprite);
if(!fontBitmap) return 0;
fontBitmap->GetCKContext()->OutputToConsole("Creating Font");
// We get the height
m_Height=fontBitmap->GetHeight();
//We get the width
int width = fontBitmap->GetWidth();
int x = 0;
// First we must find the separating color
DWORD col;
m_SeparationColor = fontBitmap->GetPixel(x++,0);
// it should be the space character there, so we take this color as color key...
m_FillColor = fontBitmap->GetPixel(x,0);
// If the 2 colors are the same, the font is invalid
if(m_SeparationColor == m_FillColor) {
m_FontBitmap = 0;
ctx->OutputToConsole("Wrong Bitmap Font");
return 0;
}
// read all letters
int pos=1;
int cw;
int i;
for(i=32;i<'~'+1;i++) {
// we advance till we found the other separator
cw = -1;
do {
col = fontBitmap->GetPixel(x++,0);
cw++;
} while( col != m_SeparationColor);
m_CorrespondanceTable[i].width=cw;
m_CorrespondanceTable[i].pos=pos;
pos+=(cw+1);
if(pos>=width) break;
}
return 1;
}
CKBitmapFont::~CKBitmapFont()
{
}
void
CKBitmapFont::MaskSeparationLines(CKBOOL mask, CKContext *ctx)
{
// We test if there is a font attached
CKSprite* fontBitmap = (CKSprite*)ctx->GetObject(m_FontBitmap);
if(!fontBitmap) return;
DWORD col = 0;
if(mask) { //we write these lines in black
col = m_FillColor;
} else { //we write these lines in separation color
col = m_SeparationColor;
}
int i;
for(i=32;i<'~'+1;i++) {
VerticalLine(fontBitmap,m_CorrespondanceTable[i].pos-1,m_Height,col);
}
}
int
CKBitmapFont::DrawCharacter(CKRenderContext* context,int i,int x,int y,Vx2DVector& scale)
{
if(m_CorrespondanceTable[i].pos!=-1) {
CKSprite* fontBitmap = (CKSprite*)context->GetCKContext()->GetObject(m_FontBitmap);
if(!fontBitmap) return 0;
VxRect srcrect;
srcrect.left = (float)m_CorrespondanceTable[i].pos;
srcrect.top = 0;
srcrect.right = srcrect.left+m_CorrespondanceTable[i].width;
srcrect.bottom = (float)m_Height;
VxRect rect;
rect.left = (float)x;
rect.top = (float)y;
rect.right = (float)(x+(int)(m_CorrespondanceTable[i].width*scale.x));
rect.bottom = (float)(y+(int)((m_Height)*scale.y));
fontBitmap->SetSourceRect(srcrect);
fontBitmap->SetRect(rect);
fontBitmap->Render(context);
return m_CorrespondanceTable[i].width;
}
return 0;
}
void
CKBitmapFont::DrawString(CKRenderContext* context,char* str,int x,int y,int s,Vx2DVector& scale)
{
CKSprite* fontBitmap = (CKSprite*)context->GetCKContext()->GetObject(m_FontBitmap);
if(!fontBitmap) return;
fontBitmap->UseSourceRect(TRUE);
fontBitmap->Show(CKSHOW);
while(*str!='\0') {
x+=(int)(scale.x*DrawCharacter(context,*str,x,y,scale));
x+=(int)(scale.x*s);
++str;
}
fontBitmap->UseSourceRect(FALSE);
fontBitmap->Show(CKHIDE);
VxRect rect;
rect.left = 0;
rect.top = 0;
rect.right = (float)fontBitmap->GetWidth();
rect.bottom = (float)fontBitmap->GetHeight();
fontBitmap->SetRect(rect);
}
int
CKBitmapFont::StringWidth(char* str,int s,Vx2DVector& scale)
{
int x=0;
while(*str!='\0') {
x+=(int)(scale.x*m_CorrespondanceTable[*str].width);
x+=(int)(scale.x*s);
str++;
}
return x;
}