📄 ftdump.c
字号:
/****************************************************************************//* *//* The FreeType project -- a free and portable quality TrueType renderer. *//* *//* Copyright 1996-2000, 2003, 2004 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 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, "\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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -