314 lines
7.3 KiB
C
314 lines
7.3 KiB
C
/****************************************************************************/
|
|
/* */
|
|
/* The FreeType project -- a free and portable quality TrueType renderer. */
|
|
/* */
|
|
/* Copyright 1996-1998 by */
|
|
/* D. Turner, R.Wilhelm, and W. Lemberg */
|
|
/* */
|
|
/* ftsbit: a _very_ simple embedded bitmap dumper for FreeType 1.x. */
|
|
/* */
|
|
/* NOTE: This is just a test program that is used to show off and */
|
|
/* debug the current engine. */
|
|
/* */
|
|
/****************************************************************************/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "freetype.h"
|
|
|
|
|
|
#ifdef HAVE_LIBINTL_H
|
|
|
|
#ifdef HAVE_LOCALE_H
|
|
#include <locale.h>
|
|
#endif
|
|
|
|
#include <libintl.h>
|
|
#include "ftxerr18.h"
|
|
|
|
#else /* !HAVE_LIBINTL */
|
|
|
|
#define gettext( x ) ( x )
|
|
|
|
/* We ignore error message strings with this function */
|
|
|
|
static char* TT_ErrToString18( FT_Error error )
|
|
{
|
|
static char temp[32];
|
|
|
|
sprintf( temp, "0x%04lx", error );
|
|
return temp;
|
|
}
|
|
|
|
#endif /* !HAVE_LIBINTL */
|
|
|
|
|
|
FT_Error error;
|
|
FT_Library engine;
|
|
FT_Resource resource;
|
|
|
|
FT_Face face;
|
|
FT_Size instance;
|
|
FT_GlyphSlot glyph;
|
|
|
|
unsigned int num_glyphs;
|
|
int ptsize;
|
|
|
|
int Fail;
|
|
int Num;
|
|
|
|
|
|
|
|
static void Usage( char* name )
|
|
{
|
|
printf( gettext( "ftsbit: simple TrueType 'sbit' dumper -- part of the FreeType project\n" ) );
|
|
printf( "---------------------------------------------------------------------\n" );
|
|
printf( "\n" );
|
|
printf( gettext( "Usage: %s ppem fontname (index)* (index1-index2)*\n\n" ), name );
|
|
printf( gettext( " or %s -a ppem fontname (dumps all glyphs)\n" ), name );
|
|
printf( "\n" );
|
|
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
|
|
|
|
|
|
static
|
|
void dump_bitmap( FT_GlyphSlot glyph, int glyph_index )
|
|
{
|
|
/* Dump the resulting bitmap */
|
|
{
|
|
int y;
|
|
unsigned char* line = (unsigned char*)glyph->bitmap.buffer;
|
|
|
|
printf( "glyph index %d = %dx%d pixels, ",
|
|
glyph_index, glyph->bitmap.rows, glyph->bitmap.width );
|
|
|
|
printf( "advance = %d, minBearing = [%d,%d]\n",
|
|
glyph->metrics.horiAdvance >> 6,
|
|
glyph->metrics.horiBearingX >> 6,
|
|
glyph->metrics.horiBearingY >> 6 );
|
|
|
|
for ( y = 0; y < glyph->bitmap.rows; y++, line += glyph->bitmap.cols )
|
|
{
|
|
unsigned char* ptr = line;
|
|
int x;
|
|
unsigned char mask = 0x80;
|
|
|
|
for ( x = 0; x < glyph->bitmap.width; x++ )
|
|
{
|
|
printf( "%c", (ptr[0] & mask) ? '*' : '.' );
|
|
mask >>= 1;
|
|
if (mask == 0)
|
|
{
|
|
mask = 0x80;
|
|
ptr++;
|
|
}
|
|
}
|
|
|
|
printf( "\n" );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static
|
|
void dump_range( FT_GlyphSlot glyph,
|
|
int first_glyph,
|
|
int last_glyph )
|
|
{
|
|
int i;
|
|
|
|
for ( i = first_glyph; i <= last_glyph; i++ )
|
|
{
|
|
error = FT_Load_Glyph( glyph,
|
|
instance,
|
|
(unsigned short)i,
|
|
FT_LOAD_NO_OUTLINE,
|
|
0 );
|
|
if (error)
|
|
{
|
|
printf( " no bitmap for glyph %d\n", i );
|
|
printf( gettext( "FreeType error message: %s\n" ),
|
|
TT_ErrToString18( error ) );
|
|
continue;
|
|
}
|
|
|
|
dump_bitmap(glyph,i);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
int main( int argc, char** argv )
|
|
{
|
|
int i;
|
|
char filename[128 + 4];
|
|
char alt_filename[128 + 4];
|
|
char* execname;
|
|
char* fname;
|
|
int dump_all = 0;
|
|
|
|
|
|
#ifdef HAVE_LIBINTL_H
|
|
setlocale( LC_ALL, "" );
|
|
bindtextdomain( "freetype", LOCALEDIR );
|
|
textdomain( "freetype" );
|
|
#endif
|
|
|
|
execname = argv[0];
|
|
|
|
if ( argc < 3 )
|
|
Usage( execname );
|
|
|
|
if ( argv[1][0] == '-' &&
|
|
argv[1][1] == 'a' )
|
|
{
|
|
argv++;
|
|
argc--;
|
|
dump_all = 1;
|
|
}
|
|
|
|
if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
|
|
Usage( execname );
|
|
|
|
/* Initialize engine */
|
|
if ( (error = FT_Init_FreeType( &engine )) )
|
|
{
|
|
fprintf( stderr, gettext( "Error while initializing engine\n" ) );
|
|
goto Failure;
|
|
}
|
|
|
|
/* Now check all files */
|
|
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 );
|
|
}
|
|
|
|
/* Load face */
|
|
error = FT_New_Resource( engine, filename, &resource );
|
|
if (error)
|
|
{
|
|
strcpy( filename, alt_filename );
|
|
error = FT_New_Resource( engine, alt_filename, &resource );
|
|
}
|
|
|
|
i = strlen( filename );
|
|
fname = filename;
|
|
|
|
while ( i >= 0 )
|
|
if ( filename[i] == '/' || filename[i] == '\\' )
|
|
{
|
|
fname = filename + i + 1;
|
|
i = -1;
|
|
}
|
|
else
|
|
i--;
|
|
|
|
if ( error )
|
|
{
|
|
printf( gettext( "Could not find or open file.\n" ) );
|
|
goto Failure;
|
|
}
|
|
|
|
error = FT_New_Face( resource, 0, &face );
|
|
if (error)
|
|
{
|
|
printf( gettext( "Could not create face object.\n " ) );
|
|
goto Failure;
|
|
}
|
|
|
|
/* get face properties */
|
|
num_glyphs = face->num_glyphs;
|
|
|
|
/* create instance */
|
|
error = FT_New_Size( face, &instance );
|
|
if ( error )
|
|
{
|
|
printf( gettext( "Could not create instance.\n" ) );
|
|
goto Failure;
|
|
}
|
|
|
|
error = FT_Set_Pixel_Sizes( instance, ptsize, ptsize );
|
|
if (error)
|
|
{
|
|
printf( gettext( "Could not set character size.\n" ) );
|
|
goto Failure;
|
|
}
|
|
|
|
glyph = face->slot;
|
|
|
|
if (dump_all)
|
|
dump_range( glyph, 0, num_glyphs-1 );
|
|
else
|
|
{
|
|
for ( i = 3; i < argc; i++ )
|
|
{
|
|
/* check for range in argument string */
|
|
int range_check = 0;
|
|
char* base = argv[i];
|
|
char* cur = base;
|
|
int first, last;
|
|
|
|
while (*cur)
|
|
{
|
|
if (*cur == '-')
|
|
{
|
|
range_check = 1;
|
|
break;
|
|
}
|
|
cur++;
|
|
}
|
|
|
|
if (range_check)
|
|
{
|
|
if ( sscanf( argv[i], "%d-%d", &first, &last ) != 2 )
|
|
Usage( execname );
|
|
|
|
dump_range( glyph, first, last );
|
|
}
|
|
else
|
|
{
|
|
if ( sscanf( argv[i], "%d", &first ) != 1 )
|
|
Usage( execname );
|
|
|
|
dump_range( glyph, first, first );
|
|
}
|
|
}
|
|
}
|
|
|
|
FT_Done_FreeType( engine );
|
|
exit( EXIT_SUCCESS ); /* for safety reasons */
|
|
|
|
return 0; /* never reached */
|
|
|
|
Failure:
|
|
printf( gettext( "FreeType error message: %s\n" ),
|
|
TT_ErrToString18( error ) );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
|
|
|
|
/* End */
|