gxfont.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "std.h"
  2. #include "gxfont.h"
  3. #include "gxcanvas.h"
  4. #include "gxgraphics.h"
  5. gxFont::gxFont( gxGraphics *g,gxCanvas *c,int w,int h,int b,int e,int d,int *os,int *ws ):
  6. graphics(g),canvas(c),
  7. width(w),height(h),begin_char(b),end_char(e),def_char(d),
  8. offs(os),widths(ws){
  9. canvas->setMask( 0xffffff );
  10. t_canvas=graphics->createCanvas( graphics->getWidth(),height,0 );
  11. }
  12. gxFont::~gxFont(){
  13. delete[] offs;
  14. delete[] widths;
  15. graphics->freeCanvas( t_canvas );
  16. graphics->freeCanvas( canvas );
  17. }
  18. int gxFont::charWidth( int c )const{
  19. if( c<begin_char || c>=end_char ) c=def_char;
  20. return widths[c-begin_char];
  21. }
  22. void gxFont::render( gxCanvas *dest,unsigned color_argb,int x,int y,const string &t ){
  23. int width=getWidth( t );
  24. if( width>t_canvas->getWidth() ){
  25. graphics->freeCanvas( t_canvas );
  26. t_canvas=graphics->createCanvas( width,height,0 );
  27. }
  28. t_canvas->setColor( color_argb );
  29. if( !(t_canvas->getColor()&0xffffff) ) t_canvas->setColor( 0x10 );
  30. t_canvas->rect( 0,0,width,height,true );
  31. int t_x=0;
  32. for( int k=0;k<t.size();++k ){
  33. int c=t[k]&0xff;
  34. if( c<begin_char || c>=end_char ) c=def_char;
  35. c-=begin_char;
  36. int sx=(offs[c]>>16)&0xffff,sy=offs[c]&0xffff;
  37. t_canvas->blit( t_x,0,canvas,sx,sy,widths[c],height,false );
  38. t_x+=widths[c];
  39. }
  40. dest->blit( x,y,t_canvas,0,0,width,height,false );
  41. }
  42. int gxFont::getWidth()const{
  43. return width;
  44. }
  45. int gxFont::getHeight()const{
  46. return height;
  47. }
  48. int gxFont::getWidth( const string &t )const{
  49. int w=0;
  50. for( int k=0;k<t.size();++k ){
  51. int c=t[k]&0xff;
  52. if( c<begin_char || c>=end_char ) c=def_char;
  53. w+=widths[c-begin_char];
  54. }
  55. return w;
  56. }
  57. bool gxFont::isPrintable( int chr )const{
  58. return chr>=begin_char && chr<end_char;
  59. }