📄 ftdump.c
字号:
/****************************************************************************/
/* */
/* The FreeType project -- a free and portable quality TrueType renderer. */
/* */
/* Copyright 1996-2000, 2003, 2004, 2005, 2006 by */
/* D. Turner, R.Wilhelm, and W. Lemberg */
/* */
/****************************************************************************/
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_SFNT_NAMES_H
#include FT_TRUETYPE_IDS_H
/* the following header shouldn't be used in normal programs */
#include FT_INTERNAL_DEBUG_H
/* showing driver name */
#include FT_MODULE_H
#include FT_INTERNAL_OBJECTS_H
#include FT_INTERNAL_DRIVER_H
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FT_Error error;
int comma_flag = 0;
int verbose = 0;
int debug = 0;
int trace_level = 0;
int name_tables = 0;
/* PanicZ */
static
void PanicZ( const char* message )
{
fprintf( stderr, "%s\n error = 0x%04x\n", message, error );
exit( 1 );
}
void
Print_Comma( const char* message )
{
if ( comma_flag )
printf( ", " );
printf( "%s", message );
comma_flag = 1;
}
static void
usage( char* execname )
{
fprintf( stderr, "\n" );
fprintf( stderr, "ftdump: simple font dumper -- part of the FreeType project\n" );
fprintf( stderr, "-----------------------------------------------------------\n" );
fprintf( stderr, "\n" );
fprintf( stderr, "Usage: %s [options] fontname\n", execname );
fprintf( stderr, "\n" );
#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 && FREETYPE_PATCH <= 8
fprintf( stderr, " -d enable debug information\n" );
# ifdef FT_DEBUG_LEVEL_TRACE
fprintf( stderr, " -l level trace level for debug information\n" );
# endif
#endif
fprintf( stderr, " -n print SFNT name tables\n" );
fprintf( stderr, " -v be verbose\n" );
fprintf( stderr, "\n" );
exit( 1 );
}
void
Print_Name( FT_Face face )
{
const char* ps_name;
printf( "font name entries\n" );
/* XXX: Foundry? Copyright? Version? ... */
printf( " family: %s\n", face->family_name );
printf( " style: %s\n", face->style_name );
ps_name = FT_Get_Postscript_Name( face );
if ( ps_name == NULL )
ps_name = "UNAVAILABLE";
printf( " postscript: %s\n", ps_name );
}
void
Print_Type( FT_Face face )
{
FT_ModuleRec* module;
printf( "font type entries\n" );
module = &face->driver->root;
printf( " FreeType driver: %s\n", module->clazz->module_name );
/* Is it better to dump all sfnt tag names? */
printf( " sfnt wrapped: %s\n",
FT_IS_SFNT( face ) ? (char *)"yes" : (char *)"no" );
/* isScalable? */
comma_flag = 0;
printf( " type: " );
if ( FT_IS_SCALABLE( face ) )
{
Print_Comma( "scalable" );
if ( FT_HAS_MULTIPLE_MASTERS( face ) )
Print_Comma( "multiple masters" );
}
if ( FT_HAS_FIXED_SIZES( face ) )
Print_Comma( "fixed size" );
printf( "\n" );
/* Direction */
comma_flag = 0;
printf( " direction: " );
if ( FT_HAS_HORIZONTAL( face ) )
Print_Comma( "horizontal" );
if ( FT_HAS_VERTICAL( face ) )
Print_Comma( "vertical" );
printf( "\n" );
printf( " fixed width: %s\n",
FT_IS_FIXED_WIDTH( face ) ? (char *)"yes" : (char *)"no" );
printf( " glyph names: %s\n",
FT_HAS_GLYPH_NAMES( face ) ? (char *)"yes" : (char *)"no" );
if ( FT_IS_SCALABLE( face ) )
{
printf( " EM size: %d\n", face->units_per_EM );
printf( " global BBox: (%ld,%ld):(%ld,%ld)\n",
face->bbox.xMin, face->bbox.yMin,
face->bbox.xMax, face->bbox.yMax );
printf( " ascent: %d\n", face->ascender );
printf( " descent: %d\n", face->descender );
printf( " text height: %d\n", face->height );
}
}
static const char*
platform_id( int id )
{
switch ( id )
{
case TT_PLATFORM_APPLE_UNICODE:
return "Apple (Unicode)";
case TT_PLATFORM_MACINTOSH:
return "Macintosh";
case TT_PLATFORM_ISO:
return "ISO (deprecated)";
case TT_PLATFORM_MICROSOFT:
return "Microsoft";
case TT_PLATFORM_CUSTOM:
return "custom";
case TT_PLATFORM_ADOBE:
return "Adobe";
default:
return "UNKNOWN";
}
}
static const char*
name_id( int id )
{
switch ( id )
{
case TT_NAME_ID_COPYRIGHT:
return "copyright";
case TT_NAME_ID_FONT_FAMILY:
return "font family";
case TT_NAME_ID_FONT_SUBFAMILY:
return "font subfamily";
case TT_NAME_ID_UNIQUE_ID:
return "unique ID";
case TT_NAME_ID_FULL_NAME:
return "full name";
case TT_NAME_ID_VERSION_STRING:
return "version string";
case TT_NAME_ID_PS_NAME:
return "PostScript name";
case TT_NAME_ID_TRADEMARK:
return "trademark";
/* the following values are from the OpenType spec */
case TT_NAME_ID_MANUFACTURER:
return "manufacturer";
case TT_NAME_ID_DESIGNER:
return "designer";
case TT_NAME_ID_DESCRIPTION:
return "description";
case TT_NAME_ID_VENDOR_URL:
return "vendor URL";
case TT_NAME_ID_DESIGNER_URL:
return "designer URL";
case TT_NAME_ID_LICENSE:
return "license";
case TT_NAME_ID_LICENSE_URL:
return "license URL";
/* number 15 is reserved */
case TT_NAME_ID_PREFERRED_FAMILY:
return "preferred family";
case TT_NAME_ID_PREFERRED_SUBFAMILY:
return "preferred subfamily";
case TT_NAME_ID_MAC_FULL_NAME:
return "Mac full name";
/* The following code is new as of 2000-01-21 */
case TT_NAME_ID_SAMPLE_TEXT:
return "sample text";
/* This is new in OpenType 1.3 */
case TT_NAME_ID_CID_FINDFONT_NAME:
return "CID `findfont' name";
default:
return "UNKNOWN";
}
}
static void
put_ascii( FT_Byte* string,
FT_UInt string_len,
FT_UInt indent )
{
FT_UInt i, j;
for ( j = 0; j < indent; j++ )
putchar( ' ' );
putchar( '"' );
for ( i = 0; i < string_len; i++ )
{
switch ( string[i] )
{
case '\n':
fputs( "\\n\"", stdout );
if ( i + 1 < string_len )
{
putchar( '\n' );
for ( j = 0; j < indent; j++ )
putchar( ' ' );
putchar( '"' );
}
break;
case '\r':
fputs( "\\r", stdout );
break;
case '\t':
fputs( "\\t", stdout );
break;
case '\\':
fputs( "\\\\", stdout );
break;
case '"':
fputs( "\\\"", stdout );
break;
default:
putchar( string[i] );
break;
}
}
if ( string[i - 1] != '\n' )
putchar( '"' );
}
static void
put_unicode_be16( FT_Byte* string,
FT_UInt string_len,
FT_UInt indent )
{
FT_Int ch = 0;
FT_UInt i, j;
for ( j = 0; j < indent; j++ )
putchar( ' ' );
putchar( '"' );
for ( i = 0; i < string_len; i += 2 )
{
ch = ( string[i] << 8 ) | string[i + 1];
switch ( ch )
{
case '\n':
fputs( "\\n\"", stdout );
if ( i + 2 < string_len )
{
putchar( '\n' );
for ( j = 0; j < indent; j++ )
putchar( ' ' );
putchar( '"' );
}
break;
case '\r':
fputs( "\\r", stdout );
break;
case '\t':
fputs( "\\t", stdout );
break;
case '\\':
fputs( "\\\\", stdout );
break;
case '"':
fputs( "\\\"", stdout );
break;
case 0x00A9:
fputs( "(c)", stdout );
break;
case 0x00AE:
fputs( "(r)", stdout );
break;
case 0x2013:
fputs( "--", stdout );
break;
case 0x2019:
fputs( "\'", stdout );
break;
case 0x2122:
fputs( "(tm)", stdout );
break;
default:
if ( ch < 256 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -