Example #1
0
File: ssf.c Project: xharbour/core
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;
}
Example #2
0
File: ssf.c Project: NaldoDj/core
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;
}