213 lines
4.1 KiB
C++
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;
|
|
}
|
|
|