USHORT ssfDrawChar( AL_BITMAP * dst, ssfFont * sfont, char c, int x, int y, int color ) { BYTE p; int i, j, thick; ssfGlyph charGlyph; ssfFrame charFrame; int points[ 8 ]; float fScale; p = ( BYTE ) c; charGlyph = *sfont->chars[ p ]; fScale = ( float ) ( ( float ) sfont->fsize / ( float ) 65535 ); for( i = 0; i < charGlyph.num; i++ ) { charFrame = charGlyph.frames[ i ]; if( charFrame.ftype == SSF_SPLINE2 ) { fLeft2 = x + ( int ) ( fScale * charFrame.left ); fTop2 = y + ( int ) ( fScale * charFrame.top ); fRight2 = x + ( int ) ( fScale * charFrame.right ); fBottom2 = y + ( int ) ( fScale * charFrame.bottom ); } else { fLeft = x + ( int ) ( fScale * charFrame.left ); fTop = y + ( int ) ( fScale * charFrame.top ); fRight = x + ( int ) ( fScale * charFrame.right ); fBottom = y + ( int ) ( fScale * charFrame.bottom ); } switch( charFrame.ftype ) { case SSF_SPLINE2: thick = ( int ) ( fScale * charFrame.thick ); if( thick == 0 ) thick++; for( j = 0; j < thick; j++ ) { al_draw_spline( dst, points, color ); switch( charFrame.thickdir ) { case THICK_LEFT: fLeft--; fRight--; fLeft2--; fRight2--; break; case THICK_UP: fTop--; fBottom--; fTop2--; fBottom2--; break; case THICK_RIGHT: fLeft++; fRight++; fLeft2++; fRight2++; break; case THICK_DOWN: fTop++; fBottom++; fTop2++; fBottom2++; break; } } break; case SSF_LINE: thick = ( int ) ( fScale * charFrame.thick ); if( thick == 0 ) thick++; for( j = 0; j < thick; j++ ) { al_draw_line( dst, fLeft, fTop, fRight, fBottom, color ); switch( charFrame.thickdir ) { case THICK_LEFT: fLeft--; fRight--; break; case THICK_UP: fTop--; fBottom--; break; case THICK_RIGHT: fLeft++; fRight++; break; case THICK_DOWN: fTop++; fBottom++; break; } } break; case SSF_BOX: al_draw_rect_fill( dst, fLeft, fTop, fRight, fBottom, color ); break; case SSF_TRIANGLE: thick = x + ( int ) ( fScale * charFrame.thick ); al_draw_triangle( dst, fLeft, fTop, fRight, fBottom, thick, y + ( int ) ( fScale * charFrame.thickdir ), color ); break; } } return sfont->fsize / 2; }
unsigned short ssfDrawChar( AL_BITMAP * dst, ssfFont * sfont, char c, int x, int y, int color ) { HB_BYTE p; int i, j, thick; ssfGlyph charGlyph; ssfFrame charFrame; int points[ 8 ]; float fScale; p = ( HB_BYTE ) c; charGlyph = *sfont->chars[ p ]; fScale = ( float ) ( ( float ) sfont->fsize / ( float ) 65535 ); for( i = 0; i < charGlyph.num; i++ ) { charFrame = charGlyph.frames[ i ]; if( charFrame.ftype == SSF_SPLINE2 ) { points[ _F_LEFT2 ] = x + ( int ) ( fScale * charFrame.left ); points[ _F_TOP2 ] = y + ( int ) ( fScale * charFrame.top ); points[ _F_RIGHT2 ] = x + ( int ) ( fScale * charFrame.right ); points[ _F_BOTTOM2 ] = y + ( int ) ( fScale * charFrame.bottom ); } else { points[ _F_LEFT ] = x + ( int ) ( fScale * charFrame.left ); points[ _F_TOP ] = y + ( int ) ( fScale * charFrame.top ); points[ _F_RIGHT ] = x + ( int ) ( fScale * charFrame.right ); points[ _F_BOTTOM ] = y + ( int ) ( fScale * charFrame.bottom ); } switch( charFrame.ftype ) { case SSF_SPLINE2: thick = ( int ) ( fScale * charFrame.thick ); if( thick == 0 ) thick++; for( j = 0; j < thick; j++ ) { al_draw_spline( dst, points, color ); switch( charFrame.thickdir ) { case THICK_LEFT: points[ _F_LEFT ]--; points[ _F_RIGHT ]--; points[ _F_LEFT2 ]--; points[ _F_RIGHT2 ]--; break; case THICK_UP: points[ _F_TOP ]--; points[ _F_BOTTOM ]--; points[ _F_TOP2 ]--; points[ _F_BOTTOM2 ]--; break; case THICK_RIGHT: points[ _F_LEFT ]++; points[ _F_RIGHT ]++; points[ _F_LEFT2 ]++; points[ _F_RIGHT2 ]++; break; case THICK_DOWN: points[ _F_TOP ]++; points[ _F_BOTTOM ]++; points[ _F_TOP2 ]++; points[ _F_BOTTOM2 ]++; break; } } break; case SSF_LINE: thick = ( int ) ( fScale * charFrame.thick ); if( thick == 0 ) thick++; for( j = 0; j < thick; j++ ) { al_draw_line( dst, points[ _F_LEFT ], points[ _F_TOP ], points[ _F_RIGHT ], points[ _F_BOTTOM ], color ); switch( charFrame.thickdir ) { case THICK_LEFT: points[ _F_LEFT ]--; points[ _F_RIGHT ]--; break; case THICK_UP: points[ _F_TOP ]--; points[ _F_BOTTOM ]--; break; case THICK_RIGHT: points[ _F_LEFT ]++; points[ _F_RIGHT ]++; break; case THICK_DOWN: points[ _F_TOP ]++; points[ _F_BOTTOM ]++; break; } } break; case SSF_BOX: al_draw_rect_fill( dst, points[ _F_LEFT ], points[ _F_TOP ], points[ _F_RIGHT ], points[ _F_BOTTOM ], color ); break; case SSF_TRIANGLE: thick = x + ( int ) ( fScale * charFrame.thick ); al_draw_triangle( dst, points[ _F_LEFT ], points[ _F_TOP ], points[ _F_RIGHT ], points[ _F_BOTTOM ], thick, y + ( int ) ( fScale * charFrame.thickdir ), color ); break; } } return sfont->fsize / 2; }