#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "freetype.h"
#include "ftxsbit.h"
#include "ft_conf.h"
#ifdef HAVE_LIBINTL_H
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
#include <libintl.h>
#include "ftxerr18.h"
#else
#define gettext( x ) ( x )
static char* TT_ErrToString18( TT_Error error )
{
static char temp[32];
sprintf( temp, "0x%04lx", error );
return temp;
}
#endif
TT_Error error;
TT_Engine engine;
TT_Face face;
TT_Instance instance;
TT_Glyph glyph;
TT_Outline outline;
TT_Glyph_Metrics metrics;
TT_Face_Properties properties;
TT_EBLC eblc;
TT_SBit_Image* bitmap;
unsigned int num_glyphs;
int ptsize;
int Fail;
int Num;
static void Usage( char* name )
{
char* gt;
gt = gettext( "ftsbit: Simple TrueType `sbit' dumper -- part of the FreeType project" );
fprintf( stderr, "%s\n", gt );
separator_line( stderr, strlen( gt ) );
fprintf( stderr, gettext(
"Usage: %s ppem fontname[.ttf|.ttc] glyph_index [glyph_index2..]\n\n" ), name );
exit( EXIT_FAILURE );
}
int main( int argc, char** argv )
{
int i;
char filename[128 + 4];
char alt_filename[128 + 4];
char* execname;
char* fname;
#ifdef HAVE_LIBINTL_H
setlocale( LC_ALL, "" );
bindtextdomain( "freetype", LOCALEDIR );
textdomain( "freetype" );
#endif
execname = argv[0];
if ( argc < 3 )
Usage( execname );
if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
Usage( execname );
if ( (error = TT_Init_FreeType( &engine )) )
{
fprintf( stderr, gettext( "Error while initializing engine.\n" ) );
goto Failure;
}
if ( (error = TT_Init_SBit_Extension( engine )) )
{
fprintf( stderr, gettext(
"Error while initializing embedded bitmap extension.\n" ) );
goto Failure;
}
fname = argv[2];
i = strlen( fname );
while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
{
if ( fname[i] == '.' )
i = 0;
i--;
}
filename[128] = '\0';
alt_filename[128] = '\0';
strncpy( filename, fname, 128 );
strncpy( alt_filename, fname, 128 );
if ( i >= 0 )
{
strncpy( filename + strlen( filename ), ".ttf", 4 );
strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
}
error = TT_Open_Face( engine, filename, &face );
if ( error == TT_Err_Could_Not_Open_File )
{
strcpy( filename, alt_filename );
error = TT_Open_Face( engine, alt_filename, &face );
}
i = strlen( filename );
fname = filename;
while ( i >= 0 )
if ( filename[i] == '/' || filename[i] == '\\' )
{
fname = filename + i + 1;
i = -1;
}
else
i--;
if ( error )
{
fprintf( stderr, gettext( "Could not find or open %s.\n" ),
filename );
goto Failure;
}
if ( error )
{
fprintf( stderr, gettext( "Error while opening %s.\n" ), filename );
goto Failure;
}
TT_Get_Face_Properties( face, &properties );
num_glyphs = properties.num_Glyphs;
error = TT_Get_Face_Bitmaps( face, &eblc );
if ( error == TT_Err_Table_Missing )
{
fprintf( stderr, gettext(
"Could not find embedded bitmaps in this font.\n" ) );
goto Failure;
}
if ( error )
{
fprintf( stderr, gettext(
"Error while loading embedded bitmaps.\n" ) );
goto Failure;
}
error = TT_New_Instance( face, &instance );
if ( error )
{
fprintf( stderr, gettext( "Could not create instance.\n" ) );
goto Failure;
}
error = TT_Set_Instance_PixelSizes( instance,
ptsize,
ptsize,
ptsize*3/4 );
if ( error )
{
fprintf( stderr,
gettext( "Could not set point size to %d.\n" ),
ptsize );
goto Failure;
}
error = TT_New_SBit_Image( &bitmap );
if ( error )
{
fprintf( stderr, gettext(
"Could not allocate glyph bitmap container.\n" ) );
goto Failure;
}
for ( i = 3; i < argc; i++ )
{
unsigned short glyph_index;
if ( sscanf( argv[i], "%hi", &glyph_index ) != 1 )
Usage( execname );
error = TT_Load_Glyph_Bitmap( face, instance, glyph_index, bitmap );
if ( error == TT_Err_Invalid_Glyph_Index )
{
fprintf( stderr, gettext(
" no bitmap for glyph %d.\n" ), glyph_index );
continue;
}
if ( error )
{
fprintf( stderr, gettext(
"Can't load bitmap for glyph %d.\n" ), glyph_index );
goto Failure;
}
{
printf( gettext( "glyph index %d = %dx%d pixels, " ),
glyph_index, bitmap->map.rows, bitmap->map.width );
printf( gettext( "advance = %ld, minBearing = [%ld,%ld]\n" ),
(long)(bitmap->metrics.horiAdvance / 64),
(long)(bitmap->metrics.horiBearingX / 64),
(long)(bitmap->metrics.horiBearingY / 64));
Show_Single_Glyph( &bitmap->map );
}
}
TT_Done_SBit_Image( bitmap );
TT_Done_FreeType( engine );
exit( EXIT_SUCCESS );
return 0;
Failure:
fprintf( stderr, " " );
fprintf( stderr, gettext( "FreeType error message: %s\n" ),
TT_ErrToString18( error ) );
exit( EXIT_FAILURE );
return 0;
}