📄 ftchkwd.c
字号:
/****************************************************************************/
/* */
/* The FreeType project -- a free and portable quality font engine */
/* */
/* Copyright 2003 by */
/* D. Turner, R.Wilhelm, and W. Lemberg */
/* */
/* ftchkwd */
/* */
/* NOTE: This is just a test program that is used to show off and */
/* debug the current engine. */
/* */
/****************************************************************************/
#include <ft2build.h>
#include FT_FREETYPE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FT_Error error;
static void
Usage( char* name )
{
printf( "ftchkwd: test fixed font width -- part of the FreeType project\n" );
printf( "---------------------------------------------------------------------\n" );
printf( "\n" );
printf( "Usage: %s fontname[.ttf|.ttc] [fontname2..]\n", name );
printf( "\n" );
exit( 1 );
}
static void
Panic( const char* message )
{
fprintf( stderr, "%s\n error code = 0x%04x\n", message, error );
exit(1);
}
static const char*
file_basename( const char* pathname )
{
const char* base = pathname;
const char* p = pathname;
while ( *p )
{
if ( *p == '/' || *p == '\\' )
base = p + 1;
p++;
}
return base;
}
static void
check_face( FT_Face face,
const char* filepathname,
int idx )
{
int face_has_fixed_flag = FT_IS_FIXED_WIDTH(face);
int face_max_advance = face->max_advance_width;
int num_proportional = 0;
int n;
FT_UNUSED( idx );
printf( "%15s : %20s : ",
file_basename( filepathname ),
face->family_name ? face->family_name : "UNKNOWN FAMILY" );
for ( n = 0; n < face->num_glyphs; n++ )
{
/* load the glyph outline */
error = FT_Load_Glyph( face, n, FT_LOAD_NO_SCALE |
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH );
if ( error )
continue;
if ( face->glyph->metrics.horiAdvance != face_max_advance )
num_proportional++;
}
if ( num_proportional > 0 )
{
if ( face_has_fixed_flag )
printf( "KO! Tagged as fixed, but has %d `proportional' glyphs",
num_proportional );
else
printf( "OK (proportional)" );
}
else
{
if ( face_has_fixed_flag )
printf( "OK (fixed-width)" );
else
printf( "KO! Tagged as proportional but has fixed width" );
}
printf( "\n" );
}
int
main( int argc,
char** argv )
{
FT_Face face;
FT_Library library;
int i, file_index;
char filename[128 + 4];
char alt_filename[128 + 4];
char* execname;
char* fname;
execname = argv[0];
if ( argc < 2 )
Usage( execname );
error = FT_Init_FreeType( &library );
if ( error )
Panic( "Could not create library object" );
/* Now check all files */
for ( file_index = 1; file_index < argc; file_index++ )
{
fname = argv[file_index];
/* try to open the file with no extra extension first */
error = FT_New_Face( library, fname, 0, &face );
if ( !error )
goto Success;
if ( error == FT_Err_Unknown_File_Format )
{
fprintf( stderr, "%s: unknown format\n", fname );
continue;
}
/* Ok, we could not load the file. Try to add an extension to */
/* its name if possible. */
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 );
#ifndef macintosh
if ( i >= 0 )
{
strncpy( filename + strlen( filename ), ".ttf", 4 );
strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
}
#endif
/* Load face */
error = FT_New_Face( library, filename, 0, &face );
if ( error )
{
if ( error == FT_Err_Unknown_File_Format )
printf( "unknown format\n" );
else
printf( "could not find/open file (error: %d)\n", error );
continue;
}
Success:
check_face( face, fname, face->face_index );
FT_Done_Face( face );
}
FT_Done_FreeType( library );
exit( 0 ); /* for safety reasons */
return 0; /* never reached */
}
/* End */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -