72 lines
1.7 KiB
C++
72 lines
1.7 KiB
C++
|
|
#include "std.hpp"
|
|
#include "gxfont.hpp"
|
|
#include "gxcanvas.hpp"
|
|
#include "gxgraphics.hpp"
|
|
|
|
gxFont::gxFont( gxGraphics *g,gxCanvas *c,int w,int h,int b,int e,int d,int *os,int *ws ):
|
|
graphics(g),canvas(c),
|
|
width(w),height(h),begin_char(b),end_char(e),def_char(d),
|
|
offs(os),widths(ws){
|
|
canvas->setMask( 0xffffff );
|
|
t_canvas=graphics->createCanvas( graphics->getWidth(),height,0 );
|
|
}
|
|
|
|
gxFont::~gxFont(){
|
|
delete[] offs;
|
|
delete[] widths;
|
|
graphics->freeCanvas( t_canvas );
|
|
graphics->freeCanvas( canvas );
|
|
}
|
|
|
|
int gxFont::charWidth( int c )const{
|
|
if( c<begin_char || c>=end_char ) c=def_char;
|
|
return widths[c-begin_char];
|
|
}
|
|
|
|
void gxFont::render( gxCanvas *dest,unsigned color_argb,int x,int y,const string &t ){
|
|
int width=getWidth( t );
|
|
if( width>t_canvas->getWidth() ){
|
|
graphics->freeCanvas( t_canvas );
|
|
t_canvas=graphics->createCanvas( width,height,0 );
|
|
}
|
|
|
|
t_canvas->setColor( color_argb );
|
|
if( !(t_canvas->getColor()&0xffffff) ) t_canvas->setColor( 0x10 );
|
|
t_canvas->rect( 0,0,width,height,true );
|
|
|
|
int t_x=0;
|
|
for( int k=0;k<t.size();++k ){
|
|
int c=t[k]&0xff;
|
|
if( c<begin_char || c>=end_char ) c=def_char;
|
|
c-=begin_char;
|
|
int sx=(offs[c]>>16)&0xffff,sy=offs[c]&0xffff;
|
|
t_canvas->blit( t_x,0,canvas,sx,sy,widths[c],height,false );
|
|
t_x+=widths[c];
|
|
}
|
|
|
|
dest->blit( x,y,t_canvas,0,0,width,height,false );
|
|
}
|
|
|
|
int gxFont::getWidth()const{
|
|
return width;
|
|
}
|
|
|
|
int gxFont::getHeight()const{
|
|
return height;
|
|
}
|
|
|
|
int gxFont::getWidth( const string &t )const{
|
|
int w=0;
|
|
for( int k=0;k<t.size();++k ){
|
|
int c=t[k]&0xff;
|
|
if( c<begin_char || c>=end_char ) c=def_char;
|
|
w+=widths[c-begin_char];
|
|
}
|
|
return w;
|
|
}
|
|
|
|
bool gxFont::isPrintable( int chr )const{
|
|
return chr>=begin_char && chr<end_char;
|
|
}
|