summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype/freetype-1.5/test/ftdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/freetype/freetype-1.5/test/ftdump.c')
-rw-r--r--Build/source/libs/freetype/freetype-1.5/test/ftdump.c1146
1 files changed, 1146 insertions, 0 deletions
diff --git a/Build/source/libs/freetype/freetype-1.5/test/ftdump.c b/Build/source/libs/freetype/freetype-1.5/test/ftdump.c
new file mode 100644
index 00000000000..2ff73dc4d4c
--- /dev/null
+++ b/Build/source/libs/freetype/freetype-1.5/test/ftdump.c
@@ -0,0 +1,1146 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-2001 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftdump: Simple TrueType font file resource profiler. */
+/* */
+/* This program dumps various properties of a given font file. */
+/* */
+/* */
+/* */
+/* 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 "common.h"
+#include "freetype.h"
+#include "ftxcmap.h"
+#include "ftxopen.h" /* TrueType Open support */
+#include "ftxsbit.h" /* embedded bitmap support */
+
+/*
+ * The following comment should be ignored. The "ttobjs.h" file does
+ * already include ft_conf.h.
+ *
+ * ------------------------------------------------------------------
+ *
+ * IGNORE> Basically, an external program using FreeType shouldn't depend on an
+ * IGNORE> internal file of the FreeType library, especially not on ft_conf.h -- but
+ * IGNORE> to avoid another configure script which tests for the existence of the
+ * IGNORE> i18n stuff we include ft_conf.h here since we can be sure that our test
+ * IGNORE> programs use the same configuration options as the library itself.
+ */
+
+#include "ttobjs.h" /* We're going to access internal tables directly */
+#include "ttmemory.h" /* We use FREE() to satisfy -DDEBUG_MEMORY */
+
+#ifdef HAVE_LIBINTL_H
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#include "ftxerr18.h"
+#include <libintl.h>
+#else
+#define gettext( x ) ( x )
+#endif
+
+
+ TT_Error error;
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+
+ TT_Instance_Metrics imetrics;
+ TT_Outline outline;
+ TT_Glyph_Metrics metrics;
+
+ TT_Face_Properties properties;
+
+ int num_glyphs;
+ int ptsize;
+
+ int Fail;
+ int Num;
+
+ int flag_memory = 1;
+ int flag_names = 1;
+ int flag_encodings = 1;
+ int flag_cmap = 1;
+ int flag_sbits = 1;
+ int flag_ttopen = 1;
+
+#if defined( FREETYPE_DLL ) || defined( TT_CONFIG_OPTION_THREAD_SAFE )
+
+ /* If the library is linked as a DLL, TTMemory_Allocated() */
+ /* (which is not exported) cannot be accessed. */
+ /* In this case, some compilers report an error because */
+ /* they try to link against a non-existing symbol. */
+ /* */
+ /* We thus avoid the external reference on these compilers. */
+
+ #define TTMemory_Allocated 0L
+
+#else
+ extern long TTMemory_Allocated;
+#endif
+
+ long org_memory, old_memory, cur_memory;
+
+ const char* Apple_Encodings[33] =
+ {
+ "Roman", "Japanese", "Chinese", "Korean", "Arabic", "Hebrew",
+ "Greek", "Russian", "RSymbol", "Devanagari", "Gurmukhi",
+ "Gujarati", "Oriya", "Bengali", "Tamil", "Telugu", "Kannada",
+ "Malayalam", "Sinhalese", "Burmese", "Khmer", "Tai", "Laotian",
+ "Georgian", "Armenian", "Maldivian/Simplif. Chinese", "Tibetan",
+ "Mongolian", "Geez", "Slavic", "Vietnamese", "Sindhi", "Uninterpreted"
+ };
+
+ struct
+ {
+ long initial_overhead;
+ long face_object;
+ long glyph_object;
+ long first_instance;
+ long second_instance;
+
+ } memory_footprint;
+
+
+ /* We ignore error message strings with this function */
+
+#ifndef HAVE_LIBINTL_H
+ static char*
+ TT_ErrToString18( TT_Error error )
+ {
+ static char temp[32];
+
+
+ sprintf( temp, "0x%04lx", error );
+ return temp;
+ }
+#endif
+
+
+ void
+ Save_Memory( long* var )
+ {
+ *var = TTMemory_Allocated - old_memory;
+ old_memory += *var;
+ }
+
+#define FOOTPRINT( field ) Save_Memory( &memory_footprint.field )
+
+
+ static void
+ Print_Mem( long val, char* string )
+ {
+ printf( "%6ld Bytes (%4ld kByte): %s\n",
+ val,
+ ( val + 1023L ) / 1024,
+ string );
+ }
+
+#define PRINT_MEM( field, string ) \
+ Print_Mem( memory_footprint.field, string )
+
+
+ /* Print the memory footprint */
+
+ void
+ Print_Memory( void )
+ {
+ /* create glyph */
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Could not create glyph container.\n" ) );
+ goto Failure;
+ }
+
+ FOOTPRINT( glyph_object );
+
+ /* create instance */
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Could not create instance.\n" ) );
+ goto Failure;
+ }
+
+ FOOTPRINT( first_instance );
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Could not create second instance.\n" ) );
+ goto Failure;
+ }
+
+ FOOTPRINT( second_instance );
+
+ printf( gettext( "Memory footprint statistics:\n" ) );
+ separator_line( stdout, 78 );
+
+ /* NOTE: In our current implementation, the face's execution */
+ /* context object is created lazily with the first */
+ /* instance. However, all later instances share the */
+ /* the same context. */
+
+ PRINT_MEM( face_object, gettext( "face object" ) );
+ PRINT_MEM( glyph_object, gettext( "glyph object" ) );
+ PRINT_MEM( second_instance, gettext( "instance object" ) );
+
+ Print_Mem( memory_footprint.first_instance -
+ memory_footprint.second_instance,
+ gettext( "exec. context object" ) );
+
+ separator_line( stdout, 78 );
+
+ Print_Mem( memory_footprint.face_object +
+ memory_footprint.glyph_object +
+ memory_footprint.first_instance,
+ gettext( "total memory usage" ) );
+
+ printf( "\n" );
+
+ return;
+
+ Failure:
+ fprintf( stderr, " " );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+
+ static char name_buffer[257];
+ static int name_len = 0;
+
+
+ static char*
+ LookUp_Name( int index )
+ {
+ unsigned short i, n;
+
+ unsigned short platform, encoding, language, id;
+ char* string;
+ unsigned short string_len;
+
+ int j, found;
+
+
+ n = properties.num_Names;
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_Name_ID( face, i, &platform, &encoding, &language, &id );
+ TT_Get_Name_String( face, i, &string, &string_len );
+
+ if ( id == index )
+ {
+
+ /* The following code was inspired from Mark Leisher's */
+ /* ttf2bdf package */
+
+ found = 0;
+
+ /* Try to find a Microsoft English name */
+
+ if ( platform == 3 )
+ for ( j = 1; j >= 0; j-- )
+ if ( encoding == j ) /* Microsoft ? */
+ if ( (language & 0x3FF) == 0x009 ) /* English language */
+ {
+ found = 1;
+ break;
+ }
+
+ if ( !found && platform == 0 && language == 0 )
+ found = 1;
+
+ /* Found a Unicode Name. */
+
+ if ( found )
+ {
+ if ( string_len > 512 )
+ string_len = 512;
+
+ name_len = 0;
+
+ for ( i = 1; i < string_len; i += 2 )
+ name_buffer[name_len++] = string[i];
+
+ name_buffer[name_len] = '\0';
+
+ return name_buffer;
+ }
+ }
+ }
+
+ /* Not found */
+ return NULL;
+ }
+
+
+ static void
+ Print_Names( void )
+ {
+ printf( gettext( "font name table entries\n" ) );
+ separator_line( stdout, 78 );
+
+ if ( LookUp_Name( 4 ) )
+ printf( "%s - ", name_buffer );
+
+ if ( LookUp_Name( 5 ) )
+ printf( "%s\n\n", name_buffer );
+
+ if ( LookUp_Name( 6 ) )
+ printf( gettext( "PostScript name: %s\n\n" ), name_buffer );
+
+ if ( LookUp_Name( 0 ) )
+ printf( "%s\n\n", name_buffer );
+
+ if ( LookUp_Name( 7 ) )
+ printf( name_buffer );
+
+ printf( "\n" );
+ separator_line( stdout, 78 );
+ }
+
+
+ static void
+ Print_Encodings( void )
+ {
+ unsigned short n, i;
+ unsigned short platform, encoding;
+ char* platStr, *encoStr;
+
+ char tempStr[128];
+
+
+ printf( gettext( "character map encodings\n" ) );
+ separator_line( stdout, 78 );
+
+ n = properties.num_CharMaps;
+ if ( n == 0 )
+ {
+ printf( gettext(
+ "The file doesn't seem to have any encoding table.\n" ) );
+ return;
+ }
+
+ printf( gettext( "There are %hu encodings:\n\n" ), n );
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ printf( gettext( "encoding %2u: " ), i );
+
+ platStr = encoStr = NULL;
+
+ switch ( platform )
+ {
+ case TT_PLATFORM_APPLE_UNICODE:
+ platStr = "Apple Unicode";
+ switch ( encoding )
+ {
+ case TT_APPLE_ID_DEFAULT:
+ encoStr = "";
+ break;
+
+ case TT_APPLE_ID_UNICODE_1_1:
+ encoStr = "(v.1.1)";
+ break;
+
+ case TT_APPLE_ID_ISO_10646:
+ encoStr = "(ISO 10646-1:1993)";
+ break;
+
+ case TT_APPLE_ID_UNICODE_2_0:
+ encoStr = "(v.2.0)";
+ break;
+
+ default:
+ sprintf( tempStr, gettext( "Unknown value %hu" ), encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ case TT_PLATFORM_MACINTOSH:
+ platStr = "Apple";
+ if ( encoding > 32 )
+ {
+ sprintf( tempStr, gettext( "Unknown value %hu" ), encoding );
+ encoStr = tempStr;
+ }
+ else
+ encoStr = (char*)Apple_Encodings[encoding];
+ break;
+
+ case TT_PLATFORM_ISO:
+ platStr = "Iso";
+ switch ( encoding )
+ {
+ case TT_ISO_ID_7BIT_ASCII:
+ platStr = "Ascii";
+ encoStr = "7-bit";
+ break;
+
+ case TT_ISO_ID_10646:
+ encoStr = "10646";
+ break;
+
+ case TT_ISO_ID_8859_1:
+ encoStr = "8859-1";
+ break;
+
+ default:
+ sprintf( tempStr, "%hu", encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ case TT_PLATFORM_MICROSOFT:
+ platStr = "Windows";
+ switch ( encoding )
+ {
+ case TT_MS_ID_SYMBOL_CS:
+ encoStr = "Symbol";
+ break;
+
+ case TT_MS_ID_UNICODE_CS:
+ encoStr = "Unicode";
+ break;
+
+ case TT_MS_ID_SJIS:
+ encoStr = "Shift-JIS";
+ break;
+
+ case TT_MS_ID_GB2312:
+ encoStr = "GB2312";
+ break;
+
+ case TT_MS_ID_BIG_5:
+ encoStr = "Big 5";
+ break;
+
+ case TT_MS_ID_WANSUNG:
+ encoStr = "WanSung";
+ break;
+
+ case TT_MS_ID_JOHAB:
+ encoStr = "Johab";
+ break;
+
+ case TT_MS_ID_UCS_4:
+ encoStr = "UCS-4";
+ break;
+
+ default:
+ sprintf( tempStr, gettext( "Unknown value %hu" ), encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ default:
+ sprintf( tempStr, "%hu - %hu", platform, encoding );
+ platStr = gettext( "Unknown" );
+ encoStr = tempStr;
+ }
+
+ printf( "%s %s\n", platStr, encoStr );
+ }
+
+ printf( "\n" );
+ separator_line( stdout, 78 );
+ }
+
+
+ static void
+ Print_Cmap( void )
+ {
+ TT_CharMap charmap;
+ TT_UShort glyph_index;
+ TT_Long char_index;
+ unsigned short n, i;
+ unsigned short platform, encoding;
+
+
+ printf( gettext( "ftxcmap test\n" ) );
+ separator_line( stdout, 78 );
+
+ n = properties.num_CharMaps;
+ if ( n == 0 )
+ {
+ printf( gettext(
+ "The file doesn't seem to have any encoding table.\n" ) );
+ return;
+ }
+
+ printf( gettext( "There are %hu encodings:\n\n" ), n );
+
+ for ( i = 0; i < n; i++ )
+ {
+
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ printf( gettext( "encoding %2u:\n" ), i );
+
+ TT_Get_CharMap( face, i, &charmap);
+
+ char_index = TT_CharMap_First( charmap, &glyph_index );
+ printf( gettext( "first: glyph index %hu, character code 0x%lx\n" ),
+ glyph_index, char_index );
+
+ char_index = TT_CharMap_Next( charmap, char_index, &glyph_index );
+ printf( gettext( "next: glyph index %hu, character code 0x%lx\n" ),
+ glyph_index, char_index );
+
+ char_index = TT_CharMap_Last( charmap, &glyph_index );
+ printf( gettext( "last: glyph index %hu, character code 0x%lx\n" ),
+ glyph_index, char_index );
+ }
+
+ printf( "\n" );
+ separator_line( stdout, 78 );
+ }
+
+
+ static void
+ Print_SBits( void )
+ {
+ TT_EBLC eblc;
+ TT_Error error;
+
+
+ error = TT_Get_Face_Bitmaps( face, &eblc );
+ if ( error == TT_Err_Table_Missing )
+ return;
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while retrieving embedded bitmaps table.\n" ) );
+ goto Failure;
+ }
+
+ printf( gettext( "embedded bitmap table\n" ) );
+ separator_line( stdout, 78 );
+
+ printf( gettext( " version of embedded bitmap table: 0x%lx\n" ),
+ eblc.version );
+ printf( gettext( " number of embedded bitmap strikes: %lu\n" ),
+ eblc.num_strikes );
+
+ {
+ TT_SBit_Strike* strike = eblc.strikes;
+ int count = 0;
+
+
+ for ( ; count < eblc.num_strikes; count++, strike++ )
+ {
+ printf( gettext( " bitmap strike %hu/%lu: " ),
+ count + 1, eblc.num_strikes );
+
+ printf( gettext( "%hux%hu pixels, %hu-bit depth, glyphs [%hu..%hu]\n" ),
+ strike->x_ppem, strike->y_ppem, strike->bit_depth,
+ strike->start_glyph, strike->end_glyph );
+ {
+ TT_SBit_Range* range = strike->sbit_ranges;
+ TT_SBit_Range* limit = range + strike->num_ranges;
+
+
+ for ( ; range < limit; range++ )
+ printf( gettext( " range format (%hu:%hu) glyphs %hu..%hu\n" ),
+ range->index_format,
+ range->image_format,
+ range->first_glyph,
+ range->last_glyph );
+ }
+ }
+ }
+ printf( "\n" );
+ separator_line( stdout, 78 );
+
+ return;
+
+ Failure:
+ fprintf( stderr, " " );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+
+#define TAG2STRING( t, s ) s[0] = (char)(t >> 24), \
+ s[1] = (char)(t >> 16), \
+ s[2] = (char)(t >> 8), \
+ s[3] = (char)(t )
+
+
+ static void
+ Print_GSUB( void )
+ {
+ TTO_GSUBHeader gsub;
+ TT_Error error;
+
+ TT_UShort i;
+ TTO_Feature f;
+ TTO_Lookup* lo;
+
+ TT_ULong *script_tag_list, *stl;
+ TT_ULong *language_tag_list, *ltl;
+ TT_ULong *feature_tag_list, *ftl;
+
+ TT_UShort script_index, language_index,
+ feature_index, req_feature_index;
+
+ char script_tag[4], language_tag[4], feature_tag[4];
+
+
+ error = TT_Load_GSUB_Table( face, &gsub, NULL );
+ if ( error == TT_Err_Table_Missing )
+ return;
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Error while loading GSUB table.\n" ) );
+ goto Failure;
+ }
+
+ printf( gettext( "GSUB table\n" ) );
+ separator_line( stdout, 78 );
+
+ error = TT_GSUB_Query_Scripts( &gsub, &script_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GSUB script list.\n" ) );
+ goto Failure;
+ }
+
+ stl = script_tag_list;
+ for ( ; *stl; stl++ )
+ {
+ TAG2STRING( *stl, script_tag );
+
+ error = TT_GSUB_Select_Script( &gsub, *stl, &script_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GSUB script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " script `%4.4s' (index %hu):\n" ),
+ script_tag, script_index );
+
+ error = TT_GSUB_Query_Features( &gsub, script_index, 0xFFFF,
+ &feature_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GSUB default language system for script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " default language system:\n" ) );
+
+ ftl = feature_tag_list;
+ for ( ; *ftl; ftl++ )
+ {
+ TAG2STRING( *ftl, feature_tag );
+
+ error = TT_GSUB_Select_Feature( &gsub, *ftl,
+ script_index, 0xFFFF,
+ &feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GSUB feature `%4.4s'\n"
+ "for default language system of script `%4.4s'.\n" ),
+ feature_tag, script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " feature `%4.4s' (index %hu; lookup " ),
+ feature_tag, feature_index );
+
+ f = gsub.FeatureList.FeatureRecord[feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+ FREE( feature_tag_list );
+
+ error = TT_GSUB_Query_Languages( &gsub, script_index,
+ &language_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GSUB language list for script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ ltl = language_tag_list;
+ for ( ; *ltl; ltl++ )
+ {
+ TAG2STRING( *ltl, language_tag );
+
+ error = TT_GSUB_Select_Language( &gsub, *ltl,
+ script_index,
+ &language_index,
+ &req_feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GSUB language `%4.4s' for script `%4.4s'.\n" ),
+ language_tag, script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " language `%4.4s' (index %hu):\n" ),
+ language_tag, language_index );
+
+ if ( req_feature_index != 0xFFFF )
+ {
+ printf( gettext( " required feature index %hu (lookup " ),
+ req_feature_index );
+
+ f = gsub.FeatureList.FeatureRecord[req_feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+
+ error = TT_GSUB_Query_Features( &gsub, script_index, language_index,
+ &feature_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GSUB feature list\n"
+ "for script `%4.4s', language `%4.4s'.\n" ),
+ script_tag, language_tag );
+ goto Failure;
+ }
+
+ ftl = feature_tag_list;
+ for ( ; *ftl; ftl++ )
+ {
+ TAG2STRING( *ftl, feature_tag );
+
+ error = TT_GSUB_Select_Feature( &gsub, *ftl,
+ script_index, language_index,
+ &feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GSUB feature `%4.4s'\n"
+ "for script `%4.4s', language `%4.4s'.\n" ),
+ feature_tag, script_tag, language_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " feature `%4.4s' (index %hu; lookup " ),
+ feature_tag, feature_index );
+
+ f = gsub.FeatureList.FeatureRecord[feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+ FREE( feature_tag_list );
+ }
+ FREE( language_tag_list );
+ }
+ FREE( script_tag_list );
+
+ printf( "\n" );
+
+ lo = gsub.LookupList.Lookup;
+
+ printf( gettext( "Lookups:\n\n" ) );
+
+ for ( i = 0; i < gsub.LookupList.LookupCount; i++ )
+ printf( gettext( " %hu: type %hu, flag 0x%x\n" ),
+ i, lo[i].LookupType, lo[i].LookupFlag );
+
+ printf( "\n" );
+ separator_line( stdout, 78 );
+
+ return;
+
+ Failure:
+ fprintf( stderr, " " );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+
+ static void
+ Print_GPOS( void )
+ {
+ TTO_GPOSHeader gpos;
+ TT_Error error;
+
+ TT_UShort i;
+ TTO_Feature f;
+ TTO_Lookup* lo;
+
+ TT_ULong *script_tag_list, *stl;
+ TT_ULong *language_tag_list, *ltl;
+ TT_ULong *feature_tag_list, *ftl;
+
+ TT_UShort script_index, language_index,
+ feature_index, req_feature_index;
+
+ char script_tag[4], language_tag[4], feature_tag[4];
+
+
+ error = TT_Load_GPOS_Table( face, &gpos, NULL );
+ if ( error == TT_Err_Table_Missing )
+ return;
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Error while loading GPOS table.\n" ) );
+ goto Failure;
+ }
+
+ printf( gettext( "GPOS table\n" ) );
+ separator_line( stdout, 78 );
+
+ error = TT_GPOS_Query_Scripts( &gpos, &script_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GPOS script list.\n" ) );
+ goto Failure;
+ }
+
+ stl = script_tag_list;
+ for ( ; *stl; stl++ )
+ {
+ TAG2STRING( *stl, script_tag );
+
+ error = TT_GPOS_Select_Script( &gpos, *stl, &script_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GPOS script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " script `%4.4s' (index %hu):\n" ),
+ script_tag, script_index );
+
+ error = TT_GPOS_Query_Features( &gpos, script_index, 0xFFFF,
+ &feature_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GPOS default language system for script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " default language system:\n" ) );
+
+ ftl = feature_tag_list;
+ for ( ; *ftl; ftl++ )
+ {
+ TAG2STRING( *ftl, feature_tag );
+
+ error = TT_GPOS_Select_Feature( &gpos, *ftl,
+ script_index, 0xFFFF,
+ &feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GPOS feature `%4.4s'\n"
+ "for default language system of script `%4.4s'.\n" ),
+ feature_tag, script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " feature `%4.4s' (index %hu; lookup " ),
+ feature_tag, feature_index );
+
+ f = gpos.FeatureList.FeatureRecord[feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+ FREE( feature_tag_list );
+
+ error = TT_GPOS_Query_Languages( &gpos, script_index,
+ &language_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GPOS language list for script `%4.4s'.\n" ),
+ script_tag );
+ goto Failure;
+ }
+
+ ltl = language_tag_list;
+ for ( ; *ltl; ltl++ )
+ {
+ TAG2STRING( *ltl, language_tag );
+
+ error = TT_GPOS_Select_Language( &gpos, *ltl,
+ script_index,
+ &language_index,
+ &req_feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GPOS language `%4.4s' for script `%4.4s'.\n" ),
+ language_tag, script_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " language `%4.4s' (index %hu):\n" ),
+ language_tag, language_index );
+
+ if ( req_feature_index != 0xFFFF )
+ {
+ printf( gettext( " required feature index %hu (lookup " ),
+ req_feature_index );
+
+ f = gpos.FeatureList.FeatureRecord[req_feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+
+ error = TT_GPOS_Query_Features( &gpos, script_index, language_index,
+ &feature_tag_list );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while querying GPOS feature list\n"
+ "for script `%4.4s', language `%4.4s'.\n" ),
+ script_tag, language_tag );
+ goto Failure;
+ }
+
+ ftl = feature_tag_list;
+ for ( ; *ftl; ftl++ )
+ {
+ TAG2STRING( *ftl, feature_tag );
+
+ error = TT_GPOS_Select_Feature( &gpos, *ftl,
+ script_index, language_index,
+ &feature_index );
+ if ( error )
+ {
+ fprintf( stderr, gettext(
+ "Error while selecting GPOS feature `%4.4s'\n"
+ "for script `%4.4s', language `%4.4s'.\n" ),
+ feature_tag, script_tag, language_tag );
+ goto Failure;
+ }
+
+ printf( gettext( " feature `%4.4s' (index %hu; lookup " ),
+ feature_tag, feature_index );
+
+ f = gpos.FeatureList.FeatureRecord[feature_index].Feature;
+
+ for ( i = 0; i < f.LookupListCount - 1; i++ )
+ printf( "%hu, ", f.LookupListIndex[i] );
+ printf( "%hu)\n", f.LookupListIndex[i] );
+ }
+ FREE( feature_tag_list );
+ }
+ FREE( language_tag_list );
+ }
+ FREE( script_tag_list );
+
+ printf( "\n" );
+
+ lo = gpos.LookupList.Lookup;
+
+ printf( gettext( "Lookups:\n\n" ) );
+
+ for ( i = 0; i < gpos.LookupList.LookupCount; i++ )
+ printf( gettext( " %hu: type %hu, flag 0x%x\n" ),
+ i, lo[i].LookupType, lo[i].LookupFlag );
+
+ printf( "\n" );
+ separator_line( stdout, 78 );
+
+ return;
+
+ Failure:
+ fprintf( stderr, " " );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+
+ int
+ main( int argc, char** argv )
+ {
+ int i;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+ char* gt;
+
+
+#ifdef HAVE_LIBINTL_H
+ setlocale( LC_ALL, "" );
+ bindtextdomain( "freetype", LOCALEDIR );
+ textdomain( "freetype" );
+#endif
+
+ execname = argv[0];
+
+ if ( argc != 2 )
+ {
+ gt = gettext( "ftdump: Simple TrueType Dumper -- part of the FreeType project" );
+ fprintf( stderr, "%s\n", gt );
+ separator_line( stderr, strlen( gt ) );
+
+ fprintf( stderr, gettext( "Usage: %s fontname[.ttf|.ttc]\n\n" ),
+ execname );
+
+ exit( EXIT_FAILURE );
+ }
+
+ i = strlen( argv[1] );
+ while ( i > 0 && argv[1][i] != '\\' )
+ {
+ if ( argv[1][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[1], 128 );
+ strncpy( alt_filename, argv[1], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Initialize engine */
+
+ old_memory = 0;
+
+ 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;
+ }
+
+ if ( (error = TT_Init_GSUB_Extension( engine )) )
+ {
+ fprintf( stderr, gettext(
+ "Error while initializing GSUB extension.\n" ) );
+ goto Failure;
+ }
+
+ if ( (error = TT_Init_GPOS_Extension( engine )) )
+ {
+ fprintf( stderr, gettext(
+ "Error while initializing GPOS extension.\n" ) );
+ goto Failure;
+ }
+
+ FOOTPRINT( initial_overhead );
+
+ /* Open and Load face */
+
+ 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 );
+ }
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( gettext( "Could not find or open %s.\n" ), filename );
+ if ( error )
+ {
+ fprintf( stderr, gettext( "Error while opening %s.\n" ), filename );
+ goto Failure;
+ }
+
+ FOOTPRINT( face_object );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+ num_glyphs = properties.num_Glyphs;
+
+ /* Now do various dumps */
+
+ if ( flag_names )
+ Print_Names();
+
+ if ( flag_encodings )
+ Print_Encodings();
+
+ if ( flag_cmap )
+ Print_Cmap();
+
+ if ( flag_sbits )
+ Print_SBits();
+
+ if ( flag_ttopen )
+ {
+ Print_GSUB();
+ Print_GPOS();
+ }
+
+#ifndef FREETYPE_DLL /* the statistics are meaningless if we use a DLL. */
+ if ( flag_memory )
+ Print_Memory();
+#endif
+
+ TT_Close_Face( face );
+ TT_Done_FreeType( engine );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+
+ Failure:
+ fprintf( stderr, " " );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+
+ return 0; /* never reached */
+}
+
+
+/* End */