diff options
Diffstat (limited to 'Build/source/libs/freetype2/freetype-src/src/tools')
4 files changed, 190 insertions, 61 deletions
diff --git a/Build/source/libs/freetype2/freetype-src/src/tools/apinames.c b/Build/source/libs/freetype2/freetype-src/src/tools/apinames.c index 9f81b1a6c72..73bc99de5d9 100644 --- a/Build/source/libs/freetype2/freetype-src/src/tools/apinames.c +++ b/Build/source/libs/freetype2/freetype-src/src/tools/apinames.c @@ -90,14 +90,14 @@ names_add( const char* name, max_names += (max_names >> 1) + 4; the_names = (NameRec*)realloc( the_names, sizeof ( the_names[0] ) * max_names ); - if ( the_names == NULL ) + if ( !the_names ) panic( "not enough memory" ); } nm = &the_names[num_names++]; nm->hash = h; nm->name = (char*)malloc( len+1 ); - if ( nm->name == NULL ) + if ( !nm->name ) panic( "not enough memory" ); memcpy( nm->name, name, len ); @@ -159,7 +159,7 @@ names_dump( FILE* out, char temp[512]; - if ( dll_name == NULL ) + if ( !dll_name ) { fprintf( stderr, "you must provide a DLL name with the -d option!\n" ); @@ -168,7 +168,7 @@ names_dump( FILE* out, /* we must omit the .dll suffix from the library name */ dot = strchr( dll_name, '.' ); - if ( dot != NULL ) + if ( dot ) { int len = dot - dll_name; @@ -190,7 +190,7 @@ names_dump( FILE* out, case OUTPUT_NETWARE_IMP: { - if ( dll_name != NULL ) + if ( dll_name ) fprintf( out, " (%s)\n", dll_name ); for ( nn = 0; nn < num_names - 1; nn++ ) fprintf( out, " %s,\n", the_names[nn].name ); @@ -371,7 +371,7 @@ int main( int argc, const char* const* argv ) arg += 2; out = fopen( arg, "wt" ); - if ( out == NULL ) + if ( !out ) { fprintf( stderr, "could not open '%s' for writing\n", argv[2] ); exit(3); @@ -440,7 +440,7 @@ int main( int argc, const char* const* argv ) { FILE* file = fopen( argv[0], "rb" ); - if ( file == NULL ) + if ( !file ) fprintf( stderr, "unable to open '%s'\n", argv[0] ); else { diff --git a/Build/source/libs/freetype2/freetype-src/src/tools/ftfuzzer/ftfuzzer.cc b/Build/source/libs/freetype2/freetype-src/src/tools/ftfuzzer/ftfuzzer.cc index 39f2b393240..31834a5f926 100644 --- a/Build/source/libs/freetype2/freetype-src/src/tools/ftfuzzer/ftfuzzer.cc +++ b/Build/source/libs/freetype2/freetype-src/src/tools/ftfuzzer/ftfuzzer.cc @@ -52,11 +52,23 @@ static int InitResult; - struct FT_Global { - FT_Global() { + struct FT_Global + { + FT_Global() + { InitResult = FT_Init_FreeType( &library ); + if ( InitResult ) + return; + + // try to activate Adobe's CFF engine; it might not be the default + unsigned int cff_hinting_engine = FT_CFF_HINTING_ADOBE; + FT_Property_Set( library, + "cff", + "hinting-engine", &cff_hinting_engine ); } - ~FT_Global() { + + ~FT_Global() + { FT_Done_FreeType( library ); } }; @@ -64,6 +76,62 @@ FT_Global global_ft; + // We want to select n values at random (without repitition), + // with 0 < n <= N. The algorithm is taken from TAoCP, Vol. 2 + // (Algorithm S, selection sampling technique) + struct Random + { + int n; + int N; + + int t; // total number of values so far + int m; // number of selected values so far + + uint32_t r; // the current pseudo-random number + + Random( int n_, + int N_ ) + : n( n_ ), + N( N_ ) + { + t = 0; + m = 0; + + // Ideally, this should depend on the input file, + // for example, taking the sha256 as input; + // however, this is overkill for fuzzying tests. + r = 12345; + } + + int get() + { + if ( m >= n ) + return -1; + + Redo: + // We can't use `rand': different C libraries might provide + // different implementations of this function. As a replacement, + // we use a 32bit version of the `xorshift' algorithm. + r ^= r << 13; + r ^= r >> 17; + r ^= r << 5; + + double U = double( r ) / UINT32_MAX; + + if ( ( N - t ) * U >= ( n - m ) ) + { + t++; + goto Redo; + } + + t++; + m++; + + return t; + } + }; + + static int archive_read_entry_data( struct archive *ar, vector<FT_Byte> *vw ) @@ -246,23 +314,33 @@ FT_Attach_Stream( face, &open_args ); } - // loop over all bitmap stroke sizes - // and an arbitrary size for outlines - for ( int fixed_sizes_index = 0; - fixed_sizes_index < face->num_fixed_sizes + 1; - fixed_sizes_index++ ) + // loop over an arbitrary size for outlines (index 0) + // and up to ten arbitrarily selected bitmap stroke sizes (index 1-10) + int max_idx = face->num_fixed_sizes < 10 + ? face->num_fixed_sizes + : 10; + + Random pool( max_idx, face->num_fixed_sizes ); + + for ( int idx = 0; idx <= max_idx; idx++ ) { FT_Int32 flags = load_flags; - if ( !fixed_sizes_index ) + if ( !idx ) { // set up 20pt at 72dpi as an arbitrary size - FT_Set_Char_Size( face, 20, 20, 72, 72 ); + if ( FT_Set_Char_Size( face, 20 * 64, 20 * 64, 72, 72 ) ) + continue; flags |= FT_LOAD_NO_BITMAP; } else { - FT_Select_Size( face, fixed_sizes_index - 1 ); + // bitmap strokes are not active for glyph variations + if ( instance_index ) + continue; + + if ( FT_Select_Size( face, pool.get() - 1 ) ) + continue; flags |= FT_LOAD_COLOR; } diff --git a/Build/source/libs/freetype2/freetype-src/src/tools/ftrandom/ftrandom.c b/Build/source/libs/freetype2/freetype-src/src/tools/ftrandom/ftrandom.c index ff311690927..ab5cfc98b6c 100644 --- a/Build/source/libs/freetype2/freetype-src/src/tools/ftrandom/ftrandom.c +++ b/Build/source/libs/freetype2/freetype-src/src/tools/ftrandom/ftrandom.c @@ -177,7 +177,7 @@ FT_Set_Char_Size( face, 0, font_size, 72, 72 ); - for ( gid = 0; gid < face->num_glyphs; ++gid ) + for ( gid = 0; gid < face->num_glyphs; gid++ ) { if ( check_outlines && FT_IS_SCALABLE( face ) ) @@ -225,7 +225,7 @@ num = face->num_faces; FT_Done_Face( face ); - for ( i = 0; i < num; ++i ) + for ( i = 0; i < num; i++ ) { if ( !FT_New_Face( context, testfont, i, &face ) ) TestFace( face ); @@ -246,16 +246,16 @@ char* pt; - if ( extensions == NULL ) + if ( !extensions ) return true; pt = strrchr( filename, '.' ); - if ( pt == NULL ) + if ( !pt ) return false; if ( pt < strrchr( filename, '/' ) ) return false; - for ( i = 0; extensions[i] != NULL; ++i ) + for ( i = 0; extensions[i] != NULL; i++ ) if ( strcasecmp( pt + 1, extensions[i] ) == 0 || strcasecmp( pt, extensions[i] ) == 0 ) return true; @@ -273,7 +273,7 @@ item->isbinary = item->isascii = item->ishex = false; foo = fopen( item->name, "rb" ); - if ( foo != NULL ) + if ( foo ) { /* Try to guess the file type from the first few characters... */ int ch1 = getc( foo ); @@ -300,8 +300,8 @@ else if ( ch1 == '%' && ch2 == '!' ) { /* Random PostScript */ - if ( strstr( item->name, ".pfa" ) != NULL || - strstr( item->name, ".PFA" ) != NULL ) + if ( strstr( item->name, ".pfa" ) || + strstr( item->name, ".PFA" ) ) item->ishex = true; else item->isascii = true; @@ -357,14 +357,14 @@ max = 0; fcnt = 0; - for ( i = 0; fontdirs[i] != NULL; ++i ) + for ( i = 0; fontdirs[i] != NULL; i++ ) { DIR* examples; struct dirent* ent; examples = opendir( fontdirs[i] ); - if ( examples == NULL ) + if ( !examples ) { fprintf( stderr, "Can't open example font directory `%s'\n", @@ -378,13 +378,13 @@ "%s/%s", fontdirs[i], ent->d_name ); if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) ) continue; - if ( extensions == NULL || extmatch( buffer, extensions ) ) + if ( !extensions || extmatch( buffer, extensions ) ) { if ( fcnt >= max ) { max += 100; fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) ); - if ( fontlist == NULL ) + if ( !fontlist ) { fprintf( stderr, "Can't allocate memory\n" ); exit( 1 ); @@ -395,7 +395,7 @@ fontlist[fcnt].len = statb.st_size; figurefiletype( &fontlist[fcnt] ); - ++fcnt; + fcnt++; } } @@ -438,20 +438,20 @@ char* newfont ) { static char buffer[8096]; - FILE *good, *new; + FILE *good, *newf; size_t len; unsigned int i, err_cnt; good = fopen( item->name, "r" ); - if ( good == NULL ) + if ( !good ) { fprintf( stderr, "Can't open `%s'\n", item->name ); return false; } - new = fopen( newfont, "w+" ); - if ( new == NULL ) + newf = fopen( newfont, "w+" ); + if ( !newf ) { fprintf( stderr, "Can't create temporary output file `%s'\n", newfont ); @@ -459,19 +459,19 @@ } while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 ) - fwrite( buffer, 1, len, new ); + fwrite( buffer, 1, len, newf ); fclose( good ); err_cnt = getErrorCnt( item ); - for ( i = 0; i < err_cnt; ++i ) + for ( i = 0; i < err_cnt; i++ ) { - fseek( new, getRandom( 0, (int)( item->len - 1 ) ), SEEK_SET ); + fseek( newf, getRandom( 0, (int)( item->len - 1 ) ), SEEK_SET ); if ( item->isbinary ) - putc( getRandom( 0, 0xFF ), new ); + putc( getRandom( 0, 0xFF ), newf ); else if ( item->isascii ) - putc( getRandom( 0x20, 0x7E ), new ); + putc( getRandom( 0x20, 0x7E ), newf ); else { int hex = getRandom( 0, 15 ); @@ -482,18 +482,18 @@ else hex += 'A' - 10; - putc( hex, new ); + putc( hex, newf ); } } - if ( ferror( new ) ) + if ( ferror( newf ) ) { - fclose( new ); + fclose( newf ); unlink( newfont ); return false; } - fclose( new ); + fclose( newf ); return true; } @@ -609,14 +609,14 @@ dirs = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) ); exts = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) ); - for ( i = 1; i < argc; ++i ) + for ( i = 1; i < argc; i++ ) { char* pt = argv[i]; char* end; if ( pt[0] == '-' && pt[1] == '-' ) - ++pt; + pt++; if ( strcmp( pt, "-all" ) == 0 ) allexts = true; @@ -701,7 +701,7 @@ dirs = default_dir_list; } - if ( testfile != NULL ) + if ( testfile ) ExecuteTest( testfile ); /* This should never return */ time( &now ); diff --git a/Build/source/libs/freetype2/freetype-src/src/tools/glnames.py b/Build/source/libs/freetype2/freetype-src/src/tools/glnames.py index 0729c2b28d7..3569f06ee91 100755 --- a/Build/source/libs/freetype2/freetype-src/src/tools/glnames.py +++ b/Build/source/libs/freetype2/freetype-src/src/tools/glnames.py @@ -415,7 +415,7 @@ t1_expert_encoding = \ # This data has been taken literally from the files `glyphlist.txt' # and `zapfdingbats.txt' version 2.0, Sept 2002. It is available from # -# http://sourceforge.net/adobe/aglfn/ +# https://github.com/adobe-type-tools/agl-aglfn # adobe_glyph_list = """\ A;0041 @@ -4920,8 +4920,17 @@ class StringTable: def dump( self, file ): write = file.write - write( " static const char " + self.master_table + - "[" + repr( self.total ) + "] =\n" ) + write( "#ifndef DEFINE_PS_TABLES\n" ) + write( "#ifdef __cplusplus\n" ) + write( ' extern "C"\n' ) + write( "#else\n" ) + write( " extern\n" ) + write( "#endif\n" ) + write( "#endif\n" ) + write( " const char " + self.master_table + + "[" + repr( self.total ) + "]\n" ) + write( "#ifdef DEFINE_PS_TABLES\n" ) + write( " =\n" ) write( " {\n" ) line = "" @@ -4930,7 +4939,10 @@ class StringTable: line += string.join( ( re.findall( ".", name ) ), "','" ) line += "', 0,\n" - write( line + " };\n\n\n" ) + write( line ) + write( " }\n" ) + write( "#endif /* DEFINE_PS_TABLES */\n" ) + write( " ;\n\n\n" ) def dump_sublist( self, file, table_name, macro_name, sublist ): write = file.write @@ -4938,8 +4950,17 @@ class StringTable: write( " /* Values are offsets into the `" + self.master_table + "' table */\n\n" ) - write( " static const short " + table_name + - "[" + macro_name + "] =\n" ) + write( "#ifndef DEFINE_PS_TABLES\n" ) + write( "#ifdef __cplusplus\n" ) + write( ' extern "C"\n' ) + write( "#else\n" ) + write( " extern\n" ) + write( "#endif\n" ) + write( "#endif\n" ) + write( " const short " + table_name + + "[" + macro_name + "]\n" ) + write( "#ifdef DEFINE_PS_TABLES\n" ) + write( " =\n" ) write( " {\n" ) line = " " @@ -4955,7 +4976,11 @@ class StringTable: col = 0 comma = ",\n " - write( line + "\n };\n\n\n" ) + write( line ) + write( "\n" ) + write( " }\n" ) + write( "#endif /* DEFINE_PS_TABLES */\n" ) + write( " ;\n\n\n" ) # We now store the Adobe Glyph List in compressed form. The list is put @@ -5188,8 +5213,17 @@ def dump_encoding( file, encoding_name, encoding_list ): write = file.write write( " /* the following are indices into the SID name table */\n" ) - write( " static const unsigned short " + encoding_name + - "[" + repr( len( encoding_list ) ) + "] =\n" ) + write( "#ifndef DEFINE_PS_TABLES\n" ) + write( "#ifdef __cplusplus\n" ) + write( ' extern "C"\n' ) + write( "#else\n" ) + write( " extern\n" ) + write( "#endif\n" ) + write( "#endif\n" ) + write( " const unsigned short " + encoding_name + + "[" + repr( len( encoding_list ) ) + "]\n" ) + write( "#ifdef DEFINE_PS_TABLES\n" ) + write( " =\n" ) write( " {\n" ) line = " " @@ -5204,14 +5238,27 @@ def dump_encoding( file, encoding_name, encoding_list ): col = 0 comma = ",\n " - write( line + "\n };\n\n\n" ) + write( line ) + write( "\n" ) + write( " }\n" ) + write( "#endif /* DEFINE_PS_TABLES */\n" ) + write( " ;\n\n\n" ) def dump_array( the_array, write, array_name ): """dumps a given encoding""" - write( " static const unsigned char " + array_name + - "[" + repr( len( the_array ) ) + "L] =\n" ) + write( "#ifndef DEFINE_PS_TABLES\n" ) + write( "#ifdef __cplusplus\n" ) + write( ' extern "C"\n' ) + write( "#else\n" ) + write( " extern\n" ) + write( "#endif\n" ) + write( "#endif\n" ) + write( " const unsigned char " + array_name + + "[" + repr( len( the_array ) ) + "L]\n" ) + write( "#ifdef DEFINE_PS_TABLES\n" ) + write( " =\n" ) write( " {\n" ) line = "" @@ -5232,7 +5279,11 @@ def dump_array( the_array, write, array_name ): write( line ) line = "" - write( line + "\n };\n\n\n" ) + write( line ) + write( "\n" ) + write( " }\n" ) + write( "#endif /* DEFINE_PS_TABLES */\n" ) + write( " ;\n\n\n" ) def main(): @@ -5267,7 +5318,7 @@ def main(): write( "/* */\n" ) write( "/* PostScript glyph names. */\n" ) write( "/* */\n" ) - write( "/* Copyright 2005-2015 by */\n" ) + write( "/* Copyright 2005-2016 by */\n" ) write( "/* David Turner, Robert Wilhelm, and Werner Lemberg. */\n" ) write( "/* */\n" ) write( "/* This file is part of the FreeType project, and may only be used, */\n" ) |