summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/freetype/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/freetype/src/tools')
-rw-r--r--src/3rdparty/freetype/src/tools/afblue.pl548
-rw-r--r--src/3rdparty/freetype/src/tools/apinames.c55
-rw-r--r--src/3rdparty/freetype/src/tools/chktrcmp.py4
-rw-r--r--src/3rdparty/freetype/src/tools/cordic.py62
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/content.py229
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/docmaker.py39
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/formatter.py73
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/sources.py236
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/tohtml.py478
-rw-r--r--src/3rdparty/freetype/src/tools/docmaker/utils.py81
-rw-r--r--src/3rdparty/freetype/src/tools/ftrandom/README2
-rw-r--r--src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c38
-rw-r--r--src/3rdparty/freetype/src/tools/glnames.py214
-rw-r--r--src/3rdparty/freetype/src/tools/test_afm.c2
-rw-r--r--src/3rdparty/freetype/src/tools/test_bbox.c34
-rw-r--r--src/3rdparty/freetype/src/tools/test_trig.c98
16 files changed, 1603 insertions, 590 deletions
diff --git a/src/3rdparty/freetype/src/tools/afblue.pl b/src/3rdparty/freetype/src/tools/afblue.pl
new file mode 100644
index 0000000000..60fe6966a8
--- /dev/null
+++ b/src/3rdparty/freetype/src/tools/afblue.pl
@@ -0,0 +1,548 @@
+#! /usr/bin/perl -w
+# -*- Perl -*-
+#
+# afblue.pl
+#
+# Process a blue zone character data file.
+#
+# Copyright 2013, 2014 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+use strict;
+use warnings;
+use English '-no_match_vars';
+use open ':std', ':encoding(UTF-8)';
+
+
+my $prog = $PROGRAM_NAME;
+$prog =~ s| .* / ||x; # Remove path.
+
+die "usage: $prog datafile < infile > outfile\n" if $#ARGV != 0;
+
+
+my $datafile = $ARGV[0];
+
+my %diversions; # The extracted and massaged data from `datafile'.
+my @else_stack; # Booleans to track else-clauses.
+my @name_stack; # Stack of integers used for names of aux. variables.
+
+my $curr_enum; # Name of the current enumeration.
+my $curr_array; # Name of the current array.
+my $curr_max; # Name of the current maximum value.
+
+my $curr_enum_element; # Name of the current enumeration element.
+my $curr_offset; # The offset relative to current aux. variable.
+my $curr_elem_size; # The size of the current string or block.
+
+my $have_sections = 0; # Boolean; set if start of a section has been seen.
+my $have_strings; # Boolean; set if current section contains strings.
+my $have_blocks; # Boolean; set if current section contains blocks.
+
+my $have_enum_element; # Boolean; set if we have an enumeration element.
+my $in_string; # Boolean; set if a string has been parsed.
+
+my $num_sections = 0; # Number of sections seen so far.
+
+my $last_aux; # Name of last auxiliary variable.
+
+
+# Regular expressions.
+
+# [<ws>] <enum_name> <ws> <array_name> <ws> <max_name> [<ws>] ':' [<ws>] '\n'
+my $section_re = qr/ ^ \s* (\S+) \s+ (\S+) \s+ (\S+) \s* : \s* $ /x;
+
+# [<ws>] <enum_element_name> [<ws>] '\n'
+my $enum_element_re = qr/ ^ \s* ( [A-Za-z0-9_]+ ) \s* $ /x;
+
+# '#' <preprocessor directive> '\n'
+my $preprocessor_re = qr/ ^ \# /x;
+
+# [<ws>] '/' '/' <comment> '\n'
+my $comment_re = qr| ^ \s* // |x;
+
+# empty line
+my $whitespace_only_re = qr/ ^ \s* $ /x;
+
+# [<ws>] '"' <string> '"' [<ws>] '\n' (<string> doesn't contain newlines)
+my $string_re = qr/ ^ \s*
+ " ( (?> (?: (?> [^"\\]+ ) | \\. )* ) ) "
+ \s* $ /x;
+
+# [<ws>] '{' <block> '}' [<ws>] '\n' (<block> can contain newlines)
+my $block_start_re = qr/ ^ \s* \{ /x;
+
+# We need the capturing group for `split' to make it return the separator
+# tokens (i.e., the opening and closing brace) also.
+my $brace_re = qr/ ( [{}] ) /x;
+
+
+sub Warn
+{
+ my $message = shift;
+ warn "$datafile:$INPUT_LINE_NUMBER: warning: $message\n";
+}
+
+
+sub Die
+{
+ my $message = shift;
+ die "$datafile:$INPUT_LINE_NUMBER: error: $message\n";
+}
+
+
+my $warned_before = 0;
+
+sub warn_before
+{
+ Warn("data before first section gets ignored") unless $warned_before;
+ $warned_before = 1;
+}
+
+
+sub strip_newline
+{
+ chomp;
+ s/ \x0D $ //x;
+}
+
+
+sub end_curr_string
+{
+ # Append final null byte to string.
+ if ($have_strings)
+ {
+ push @{$diversions{$curr_array}}, " '\\0',\n" if $in_string;
+
+ $curr_offset++;
+ $in_string = 0;
+ }
+}
+
+
+sub update_max_elem_size
+{
+ if ($curr_elem_size)
+ {
+ my $max = pop @{$diversions{$curr_max}};
+ $max = $curr_elem_size if $curr_elem_size > $max;
+ push @{$diversions{$curr_max}}, $max;
+ }
+}
+
+
+sub convert_non_ascii_char
+{
+ # A UTF-8 character outside of the printable ASCII range, with possibly a
+ # leading backslash character.
+ my $s = shift;
+
+ # Here we count characters, not bytes.
+ $curr_elem_size += length $s;
+
+ utf8::encode($s);
+ $s = uc unpack 'H*', $s;
+
+ $curr_offset += $s =~ s/\G(..)/'\\x$1', /sg;
+
+ return $s;
+}
+
+
+sub convert_ascii_chars
+{
+ # A series of ASCII characters in the printable range.
+ my $s = shift;
+
+ # We ignore spaces.
+ $s =~ s/ //g;
+
+ my $count = $s =~ s/\G(.)/'$1', /g;
+ $curr_offset += $count;
+ $curr_elem_size += $count;
+
+ return $s;
+}
+
+
+sub convert_literal
+{
+ my $s = shift;
+ my $orig = $s;
+
+ # ASCII printables and space
+ my $safe_re = '\x20-\x7E';
+ # ASCII printables and space, no backslash
+ my $safe_no_backslash_re = '\x20-\x5B\x5D-\x7E';
+
+ $s =~ s{
+ (?: \\? ( [^$safe_re] )
+ | ( (?: [$safe_no_backslash_re]
+ | \\ [$safe_re] )+ ) )
+ }
+ {
+ defined($1) ? convert_non_ascii_char($1)
+ : convert_ascii_chars($2)
+ }egx;
+
+ # We assume that `$orig' doesn't contain `*/'
+ return $s . " /* $orig */";
+}
+
+
+sub aux_name
+{
+ return "af_blue_" . $num_sections. "_" . join('_', @name_stack);
+}
+
+
+sub aux_name_next
+{
+ $name_stack[$#name_stack]++;
+ my $name = aux_name();
+ $name_stack[$#name_stack]--;
+
+ return $name;
+}
+
+
+sub enum_val_string
+{
+ # Build string that holds code to save the current offset in an
+ # enumeration element.
+ my $aux = shift;
+
+ my $add = ($last_aux eq "af_blue_" . $num_sections . "_0" )
+ ? ""
+ : "$last_aux + ";
+
+ return " $aux = $add$curr_offset,\n";
+}
+
+
+
+# Process data file.
+
+open(DATA, $datafile) || die "$prog: can't open \`$datafile': $OS_ERROR\n";
+
+while (<DATA>)
+{
+ strip_newline();
+
+ next if /$comment_re/;
+ next if /$whitespace_only_re/;
+
+ if (/$section_re/)
+ {
+ Warn("previous section is empty") if ($have_sections
+ && !$have_strings
+ && !$have_blocks);
+
+ end_curr_string();
+ update_max_elem_size();
+
+ # Save captured groups from `section_re'.
+ $curr_enum = $1;
+ $curr_array = $2;
+ $curr_max = $3;
+
+ $curr_enum_element = "";
+ $curr_offset = 0;
+
+ Warn("overwriting already defined enumeration \`$curr_enum'")
+ if exists($diversions{$curr_enum});
+ Warn("overwriting already defined array \`$curr_array'")
+ if exists($diversions{$curr_array});
+ Warn("overwriting already defined maximum value \`$curr_max'")
+ if exists($diversions{$curr_max});
+
+ $diversions{$curr_enum} = [];
+ $diversions{$curr_array} = [];
+ $diversions{$curr_max} = [];
+
+ push @{$diversions{$curr_max}}, 0;
+
+ @name_stack = ();
+ push @name_stack, 0;
+
+ $have_sections = 1;
+ $have_strings = 0;
+ $have_blocks = 0;
+
+ $have_enum_element = 0;
+ $in_string = 0;
+
+ $num_sections++;
+ $curr_elem_size = 0;
+
+ $last_aux = aux_name();
+
+ next;
+ }
+
+ if (/$preprocessor_re/)
+ {
+ if ($have_sections)
+ {
+ # Having preprocessor conditionals complicates the computation of
+ # correct offset values. We have to introduce auxiliary enumeration
+ # elements with the name `af_blue_<s>_<n1>_<n2>_...' that store
+ # offsets to be used in conditional clauses. `<s>' is the number of
+ # sections seen so far, `<n1>' is the number of `#if' and `#endif'
+ # conditionals seen so far in the topmost level, `<n2>' the number of
+ # `#if' and `#endif' conditionals seen so far one level deeper, etc.
+ # As a consequence, uneven values are used within a clause, and even
+ # values after a clause, since the C standard doesn't allow the
+ # redefinition of an enumeration value. For example, the name
+ # `af_blue_5_1_6' is used to construct enumeration values in the fifth
+ # section after the third (second-level) if-clause within the first
+ # (top-level) if-clause. After the first top-level clause has
+ # finished, `af_blue_5_2' is used. The current offset is then
+ # relative to the value stored in the current auxiliary element.
+
+ if (/ ^ \# \s* if /x)
+ {
+ push @else_stack, 0;
+
+ $name_stack[$#name_stack]++;
+
+ push @{$diversions{$curr_enum}}, enum_val_string(aux_name());
+ $last_aux = aux_name();
+
+ push @name_stack, 0;
+
+ $curr_offset = 0;
+ }
+ elsif (/ ^ \# \s* elif /x)
+ {
+ Die("unbalanced #elif") unless @else_stack;
+
+ pop @name_stack;
+
+ push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next());
+ $last_aux = aux_name();
+
+ push @name_stack, 0;
+
+ $curr_offset = 0;
+ }
+ elsif (/ ^ \# \s* else /x)
+ {
+ my $prev_else = pop @else_stack;
+ Die("unbalanced #else") unless defined($prev_else);
+ Die("#else already seen") if $prev_else;
+ push @else_stack, 1;
+
+ pop @name_stack;
+
+ push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next());
+ $last_aux = aux_name();
+
+ push @name_stack, 0;
+
+ $curr_offset = 0;
+ }
+ elsif (/ ^ (\# \s*) endif /x)
+ {
+ my $prev_else = pop @else_stack;
+ Die("unbalanced #endif") unless defined($prev_else);
+
+ pop @name_stack;
+
+ # If there is no else-clause for an if-clause, we add one. This is
+ # necessary to have correct offsets.
+ if (!$prev_else)
+ {
+ # Use amount of whitespace from `endif'.
+ push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next())
+ . $1 . "else\n";
+ $last_aux = aux_name();
+
+ $curr_offset = 0;
+ }
+
+ $name_stack[$#name_stack]++;
+
+ push @{$diversions{$curr_enum}}, enum_val_string(aux_name());
+ $last_aux = aux_name();
+
+ $curr_offset = 0;
+ }
+
+ # Handle (probably continued) preprocessor lines.
+ CONTINUED_LOOP:
+ {
+ do
+ {
+ strip_newline();
+
+ push @{$diversions{$curr_enum}}, $ARG . "\n";
+ push @{$diversions{$curr_array}}, $ARG . "\n";
+
+ last CONTINUED_LOOP unless / \\ $ /x;
+
+ } while (<DATA>);
+ }
+ }
+ else
+ {
+ warn_before();
+ }
+
+ next;
+ }
+
+ if (/$enum_element_re/)
+ {
+ end_curr_string();
+ update_max_elem_size();
+
+ $curr_enum_element = $1;
+ $have_enum_element = 1;
+ $curr_elem_size = 0;
+
+ next;
+ }
+
+ if (/$string_re/)
+ {
+ if ($have_sections)
+ {
+ Die("strings and blocks can't be mixed in a section") if $have_blocks;
+
+ # Save captured group from `string_re'.
+ my $string = $1;
+
+ if ($have_enum_element)
+ {
+ push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element);
+ $have_enum_element = 0;
+ }
+
+ $string = convert_literal($string);
+
+ push @{$diversions{$curr_array}}, " $string\n";
+
+ $have_strings = 1;
+ $in_string = 1;
+ }
+ else
+ {
+ warn_before();
+ }
+
+ next;
+ }
+
+ if (/$block_start_re/)
+ {
+ if ($have_sections)
+ {
+ Die("strings and blocks can't be mixed in a section") if $have_strings;
+
+ my $depth = 0;
+ my $block = "";
+ my $block_end = 0;
+
+ # Count braces while getting the block.
+ BRACE_LOOP:
+ {
+ do
+ {
+ strip_newline();
+
+ foreach my $substring (split(/$brace_re/))
+ {
+ if ($block_end)
+ {
+ Die("invalid data after last matching closing brace")
+ if $substring !~ /$whitespace_only_re/;
+ }
+
+ $block .= $substring;
+
+ if ($substring eq '{')
+ {
+ $depth++;
+ }
+ elsif ($substring eq '}')
+ {
+ $depth--;
+
+ $block_end = 1 if $depth == 0;
+ }
+ }
+
+ # If we are here, we have run out of substrings, so get next line
+ # or exit.
+ last BRACE_LOOP if $block_end;
+
+ $block .= "\n";
+
+ } while (<DATA>);
+ }
+
+ if ($have_enum_element)
+ {
+ push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element);
+ $have_enum_element = 0;
+ }
+
+ push @{$diversions{$curr_array}}, $block . ",\n";
+
+ $curr_offset++;
+ $curr_elem_size++;
+
+ $have_blocks = 1;
+ }
+ else
+ {
+ warn_before();
+ }
+
+ next;
+ }
+
+ # Garbage. We weren't able to parse the data.
+ Die("syntax error");
+}
+
+# Finalize data.
+end_curr_string();
+update_max_elem_size();
+
+
+# Filter stdin to stdout, replacing `@...@' templates.
+
+sub emit_diversion
+{
+ my $diversion_name = shift;
+ return (exists($diversions{$1})) ? "@{$diversions{$1}}"
+ : "@" . $diversion_name . "@";
+}
+
+
+$LIST_SEPARATOR = '';
+
+my $s1 = "This file has been generated by the Perl script \`$prog',";
+my $s1len = length $s1;
+my $s2 = "using data from file \`$datafile'.";
+my $s2len = length $s2;
+my $slen = ($s1len > $s2len) ? $s1len : $s2len;
+
+print "/* " . $s1 . " " x ($slen - $s1len) . " */\n"
+ . "/* " . $s2 . " " x ($slen - $s2len) . " */\n"
+ . "\n";
+
+while (<STDIN>)
+{
+ s/ @ ( [A-Za-z0-9_]+? ) @ / emit_diversion($1) /egx;
+ print;
+}
+
+# EOF
diff --git a/src/3rdparty/freetype/src/tools/apinames.c b/src/3rdparty/freetype/src/tools/apinames.c
index 7f191e19c9..c85df721a0 100644
--- a/src/3rdparty/freetype/src/tools/apinames.c
+++ b/src/3rdparty/freetype/src/tools/apinames.c
@@ -10,7 +10,7 @@
* accepted if you are using GCC for compilation (and probably by
* other compilers too).
*
- * Author: David Turner, 2005, 2006, 2008, 2009
+ * Author: David Turner, 2005, 2006, 2008-2013
*
* This code is explicitly placed into the public domain.
*
@@ -22,7 +22,7 @@
#include <ctype.h>
#define PROGRAM_NAME "apinames"
-#define PROGRAM_VERSION "0.1"
+#define PROGRAM_VERSION "0.2"
#define LINEBUFF_SIZE 1024
@@ -31,7 +31,8 @@ typedef enum OutputFormat_
OUTPUT_LIST = 0, /* output the list of names, one per line */
OUTPUT_WINDOWS_DEF, /* output a Windows .DEF file for Visual C++ or Mingw */
OUTPUT_BORLAND_DEF, /* output a Windows .DEF file for Borland C++ */
- OUTPUT_WATCOM_LBC /* output a Watcom Linker Command File */
+ OUTPUT_WATCOM_LBC, /* output a Watcom Linker Command File */
+ OUTPUT_NETWARE_IMP /* output a NetWare ImportFile */
} OutputFormat;
@@ -59,8 +60,9 @@ static void
names_add( const char* name,
const char* end )
{
- int nn, len, h;
- Name nm;
+ unsigned int h;
+ int nn, len;
+ Name nm;
if ( end <= name )
return;
@@ -86,7 +88,8 @@ names_add( const char* name,
if ( num_names >= max_names )
{
max_names += (max_names >> 1) + 4;
- the_names = (NameRec*)realloc( the_names, sizeof(the_names[0])*max_names );
+ the_names = (NameRec*)realloc( the_names,
+ sizeof ( the_names[0] ) * max_names );
if ( the_names == NULL )
panic( "not enough memory" );
}
@@ -115,7 +118,8 @@ name_compare( const void* name1,
static void
names_sort( void )
{
- qsort( the_names, (size_t)num_names, sizeof(the_names[0]), name_compare );
+ qsort( the_names, (size_t)num_names,
+ sizeof ( the_names[0] ), name_compare );
}
@@ -126,6 +130,7 @@ names_dump( FILE* out,
{
int nn;
+
switch ( format )
{
case OUTPUT_WINDOWS_DEF:
@@ -150,23 +155,26 @@ names_dump( FILE* out,
case OUTPUT_WATCOM_LBC:
{
- /* we must omit the .dll suffix from the library name */
- char temp[512];
- char* dot;
+ const char* dot;
+
if ( dll_name == NULL )
{
fprintf( stderr,
- "you must provide a DLL name with the -d option !!\n" );
- exit(4);
+ "you must provide a DLL name with the -d option!\n" );
+ exit( 4 );
}
+ /* we must omit the .dll suffix from the library name */
dot = strchr( dll_name, '.' );
if ( dot != NULL )
{
- int len = (dot - dll_name);
- if ( len > (int)(sizeof(temp)-1) )
- len = sizeof(temp)-1;
+ char temp[512];
+ int len = dot - dll_name;
+
+
+ if ( len > (int)( sizeof ( temp ) - 1 ) )
+ len = sizeof ( temp ) - 1;
memcpy( temp, dll_name, len );
temp[len] = 0;
@@ -180,6 +188,16 @@ names_dump( FILE* out,
}
break;
+ case OUTPUT_NETWARE_IMP:
+ {
+ if ( dll_name != NULL )
+ fprintf( out, " (%s)\n", dll_name );
+ for ( nn = 0; nn < num_names - 1; nn++ )
+ fprintf( out, " %s,\n", the_names[nn].name );
+ fprintf( out, " %s\n", the_names[num_names - 1].name );
+ }
+ break;
+
default: /* LIST */
for ( nn = 0; nn < num_names; nn++ )
fprintf( out, "%s\n", the_names[nn].name );
@@ -201,7 +219,7 @@ typedef enum State_
static int
read_header_file( FILE* file, int verbose )
{
- static char buff[ LINEBUFF_SIZE+1 ];
+ static char buff[LINEBUFF_SIZE + 1];
State state = STATE_START;
while ( !feof( file ) )
@@ -304,6 +322,7 @@ usage( void )
" -w : output .DEF file for Visual C++ and Mingw\n"
" -wB : output .DEF file for Borland C++\n"
" -wW : output Watcom Linker Response File\n"
+ " -wN : output NetWare Import File\n"
"\n";
fprintf( stderr,
@@ -387,6 +406,10 @@ int main( int argc, const char* const* argv )
format = OUTPUT_WATCOM_LBC;
break;
+ case 'N':
+ format = OUTPUT_NETWARE_IMP;
+ break;
+
case 0:
break;
diff --git a/src/3rdparty/freetype/src/tools/chktrcmp.py b/src/3rdparty/freetype/src/tools/chktrcmp.py
index d0f342e6bd..ce6500c7e2 100644
--- a/src/3rdparty/freetype/src/tools/chktrcmp.py
+++ b/src/3rdparty/freetype/src/tools/chktrcmp.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
#
# Check trace components in FreeType 2 source.
-# Author: suzuki toshiya, 2009
+# Author: suzuki toshiya, 2009, 2013
#
# This code is explicitly into the public domain.
@@ -15,7 +15,7 @@ USED_COMPONENT = {}
KNOWN_COMPONENT = {}
SRC_FILE_DIRS = [ "src" ]
-TRACE_DEF_FILES = [ "include/freetype/internal/fttrace.h" ]
+TRACE_DEF_FILES = [ "include/internal/fttrace.h" ]
# --------------------------------------------------------------
diff --git a/src/3rdparty/freetype/src/tools/cordic.py b/src/3rdparty/freetype/src/tools/cordic.py
index 3f80c5f09a..6742c90dfe 100644
--- a/src/3rdparty/freetype/src/tools/cordic.py
+++ b/src/3rdparty/freetype/src/tools/cordic.py
@@ -2,65 +2,20 @@
import sys, math
#units = 64*65536.0 # don't change !!
-units = 256
+units = 180 * 2**16
scale = units/math.pi
shrink = 1.0
comma = ""
-def calc_val( x ):
- global units, shrink
- angle = math.atan(x)
- shrink = shrink * math.cos(angle)
- return angle/math.pi * units
-
-def print_val( n, x ):
- global comma
-
- lo = int(x)
- hi = lo + 1
- alo = math.atan(lo)
- ahi = math.atan(hi)
- ax = math.atan(2.0**n)
-
- errlo = abs( alo - ax )
- errhi = abs( ahi - ax )
-
- if ( errlo < errhi ):
- hi = lo
-
- sys.stdout.write( comma + repr( int(hi) ) )
- comma = ", "
-
-
print ""
print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units"
-# compute range of "i"
-r = [-1]
-r = r + range(32)
-
-for n in r:
-
- if n >= 0:
- x = 1.0/(2.0**n) # tangent value
- else:
- x = 2.0**(-n)
+for n in range(1,32):
- angle = math.atan(x) # arctangent
- angle2 = angle*scale # arctangent in FT_Angle units
+ x = 0.5**n # tangent value
- # determine which integer value for angle gives the best tangent
- lo = int(angle2)
- hi = lo + 1
- tlo = math.tan(lo/scale)
- thi = math.tan(hi/scale)
-
- errlo = abs( tlo - x )
- errhi = abs( thi - x )
-
- angle2 = hi
- if errlo < errhi:
- angle2 = lo
+ angle = math.atan(x) # arctangent
+ angle2 = round(angle*scale) # arctangent in FT_Angle units
if angle2 <= 0:
break
@@ -68,12 +23,11 @@ for n in r:
sys.stdout.write( comma + repr( int(angle2) ) )
comma = ", "
- shrink = shrink * math.cos( angle2/scale)
-
+ shrink /= math.sqrt( 1 + x*x )
print
print "shrink factor = " + repr( shrink )
-print "shrink factor 2 = " + repr( shrink * (2.0**32) )
-print "expansion factor = " + repr(1/shrink)
+print "shrink factor 2 = " + repr( int( shrink * (2**32) ) )
+print "expansion factor = " + repr( 1/shrink )
print ""
diff --git a/src/3rdparty/freetype/src/tools/docmaker/content.py b/src/3rdparty/freetype/src/tools/docmaker/content.py
index b398955b81..adea6f1d70 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/content.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/content.py
@@ -1,57 +1,81 @@
-# Content (c) 2002, 2004, 2006, 2007, 2008, 2009
-# David Turner <david@freetype.org>
#
-# This file contains routines used to parse the content of documentation
-# comment blocks and build more structured objects out of them.
+# content.py
#
+# Parse comment blocks to build content blocks (library file).
+#
+# Copyright 2002, 2004, 2006-2009, 2012-2014 by
+# David Turner.
+#
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+#
+# This file contains routines to parse documentation comment blocks,
+# building more structured objects out of them.
+#
+
from sources import *
-from utils import *
+from utils import *
+
import string, re
-# this regular expression is used to detect code sequences. these
-# are simply code fragments embedded in '{' and '}' like in:
#
-# {
-# x = y + z;
-# if ( zookoo == 2 )
-# {
-# foobar();
-# }
-# }
+# Regular expressions to detect code sequences. `Code sequences' are simply
+# code fragments embedded in '{' and '}', as demonstrated in the following
+# example.
+#
+# {
+# x = y + z;
+# if ( zookoo == 2 )
+# {
+# foobar();
+# }
+# }
#
-# note that indentation of the starting and ending accolades must be
-# exactly the same. the code sequence can contain accolades at greater
-# indentation
+# Note that the indentation of the first opening brace and the last closing
+# brace must be exactly the same. The code sequence itself should have a
+# larger indentation than the surrounding braces.
#
re_code_start = re.compile( r"(\s*){\s*$" )
re_code_end = re.compile( r"(\s*)}\s*$" )
-# this regular expression is used to isolate identifiers from
-# other text
#
-re_identifier = re.compile( r'(\w*)' )
-
-
-# we collect macros ending in `_H'; while outputting the object data, we use
-# this info together with the object's file location to emit the appropriate
-# header file macro and name before the object itself
+# A regular expression to isolate identifiers from other text.
#
-re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' )
+re_identifier = re.compile( r'((?:\w|-)*)' )
-#############################################################################
#
-# The DocCode class is used to store source code lines.
+# We collect macro names ending in `_H' (group 1), as defined in
+# `config/ftheader.h'. While outputting the object data, we use this info
+# together with the object's file location (group 2) to emit the appropriate
+# header file macro and its associated file name before the object itself.
#
-# 'self.lines' contains a set of source code lines that will be dumped as
-# HTML in a <PRE> tag.
+# Example:
#
-# The object is filled line by line by the parser; it strips the leading
-# "margin" space from each input line before storing it in 'self.lines'.
+# #define FT_FREETYPE_H <freetype.h>
#
+re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' )
+
+
+################################################################
+##
+## DOC CODE CLASS
+##
+## The `DocCode' class is used to store source code lines.
+##
+## `self.lines' contains a set of source code lines that will be dumped as
+## HTML in a <PRE> tag.
+##
+## The object is filled line by line by the parser; it strips the leading
+## `margin' space from each input line before storing it in `self.lines'.
+##
class DocCode:
def __init__( self, margin, lines ):
@@ -77,12 +101,14 @@ class DocCode:
-#############################################################################
-#
-# The DocPara class is used to store "normal" text paragraph.
-#
-# 'self.words' contains the list of words that make up the paragraph
-#
+################################################################
+##
+## DOC PARA CLASS
+##
+## `Normal' text paragraphs are stored in the `DocPara' class.
+##
+## `self.words' contains the list of words that make up the paragraph.
+##
class DocPara:
def __init__( self, lines ):
@@ -123,17 +149,18 @@ class DocPara:
return result
-
-#############################################################################
-#
-# The DocField class is used to store a list containing either DocPara or
-# DocCode objects. Each DocField also has an optional "name" which is used
-# when the object corresponds to a field or value definition
-#
+################################################################
+##
+## DOC FIELD CLASS
+##
+## The `DocField' class stores a list containing either `DocPara' or
+## `DocCode' objects. Each DocField object also has an optional `name'
+## that is used when the object corresponds to a field or value definition.
+##
class DocField:
def __init__( self, name, lines ):
- self.name = name # can be None for normal paragraphs/sources
+ self.name = name # can be `None' for normal paragraphs/sources
self.items = [] # list of items
mode_none = 0 # start parsing mode
@@ -143,14 +170,14 @@ class DocField:
margin = -1 # current code sequence indentation
cur_lines = []
- # now analyze the markup lines to see if they contain paragraphs,
- # code sequences or fields definitions
+ # analyze the markup lines to check whether they contain paragraphs,
+ # code sequences, or fields definitions
#
start = 0
mode = mode_none
for l in lines:
- # are we parsing a code sequence ?
+ # are we parsing a code sequence?
if mode == mode_code:
m = re_code_end.match( l )
if m and len( m.group( 1 ) ) <= margin:
@@ -161,10 +188,10 @@ class DocField:
cur_lines = []
mode = mode_none
else:
- # nope, continue the code sequence
+ # otherwise continue the code sequence
cur_lines.append( l[margin:] )
else:
- # start of code sequence ?
+ # start of code sequence?
m = re_code_start.match( l )
if m:
# save current lines
@@ -222,13 +249,29 @@ class DocField:
return result
-
-# this regular expression is used to detect field definitions
#
-re_field = re.compile( r"\s*(\w*|\w(\w|\.)*\w)\s*::" )
-
-
-
+# A regular expression to detect field definitions.
+#
+# Examples:
+#
+# foo ::
+# foo.bar ::
+#
+re_field = re.compile( r"""
+ \s*
+ (
+ \w*
+ |
+ \w (\w | \.)* \w
+ )
+ \s* ::
+ """, re.VERBOSE )
+
+
+################################################################
+##
+## DOC MARKUP CLASS
+##
class DocMarkup:
def __init__( self, tag, lines ):
@@ -242,7 +285,7 @@ class DocMarkup:
for l in lines:
m = re_field.match( l )
if m:
- # we detected the start of a new field definition
+ # We detected the start of a new field definition.
# first, save the current one
if cur_lines:
@@ -268,15 +311,6 @@ class DocMarkup:
except:
return None
- def get_start( self ):
- try:
- result = ""
- for word in self.fields[0].items[0].words:
- result = result + " " + word
- return result[1:]
- except:
- return "ERROR"
-
def dump( self, margin ):
print " " * margin + "<" + self.tag + ">"
for f in self.fields:
@@ -284,7 +318,10 @@ class DocMarkup:
print " " * margin + "</" + self.tag + ">"
-
+################################################################
+##
+## DOC CHAPTER CLASS
+##
class DocChapter:
def __init__( self, block ):
@@ -300,7 +337,10 @@ class DocChapter:
self.order = []
-
+################################################################
+##
+## DOC SECTION CLASS
+##
class DocSection:
def __init__( self, name = "Other" ):
@@ -329,18 +369,21 @@ class DocSection:
self.title = title
self.abstract = block.get_markup_words( "abstract" )
self.description = block.get_markup_items( "description" )
- self.order = block.get_markup_words( "order" )
+ self.order = block.get_markup_words_all( "order" )
return
def reorder( self ):
self.block_names = sort_order_list( self.block_names, self.order )
-
+################################################################
+##
+## CONTENT PROCESSOR CLASS
+##
class ContentProcessor:
def __init__( self ):
- """initialize a block content processor"""
+ """Initialize a block content processor."""
self.reset()
self.sections = {} # dictionary of documentation sections
@@ -351,8 +394,8 @@ class ContentProcessor:
self.headers = {} # dictionary of header macros
def set_section( self, section_name ):
- """set current section during parsing"""
- if not self.sections.has_key( section_name ):
+ """Set current section during parsing."""
+ if not section_name in self.sections:
section = DocSection( section_name )
self.sections[section_name] = section
self.section = section
@@ -363,15 +406,14 @@ class ContentProcessor:
chapter = DocChapter( block )
self.chapters.append( chapter )
-
def reset( self ):
- """reset the content processor for a new block"""
+ """Reset the content processor for a new block."""
self.markups = []
self.markup = None
self.markup_lines = []
def add_markup( self ):
- """add a new markup section"""
+ """Add a new markup section."""
if self.markup and self.markup_lines:
# get rid of last line of markup if it's empty
@@ -387,8 +429,8 @@ class ContentProcessor:
self.markup_lines = []
def process_content( self, content ):
- """process a block content and return a list of DocMarkup objects
- corresponding to it"""
+ """Process a block content and return a list of DocMarkup objects
+ corresponding to it."""
markup = None
markup_lines = []
first = 1
@@ -446,7 +488,7 @@ class ContentProcessor:
# listed there
for chap in self.chapters:
for sec in chap.order:
- if self.sections.has_key( sec ):
+ if sec in self.sections:
section = self.sections[sec]
section.chapter = chap
section.reorder()
@@ -461,6 +503,7 @@ class ContentProcessor:
others = []
for sec in self.sections.values():
if not sec.chapter:
+ sec.reorder()
others.append( sec )
# create a new special chapter for all remaining sections
@@ -472,7 +515,10 @@ class ContentProcessor:
self.chapters.append( chap )
-
+################################################################
+##
+## DOC BLOCK CLASS
+##
class DocBlock:
def __init__( self, source, follow, processor ):
@@ -549,24 +595,31 @@ class DocBlock:
return self.source.location()
def get_markup( self, tag_name ):
- """return the DocMarkup corresponding to a given tag in a block"""
+ """Return the DocMarkup corresponding to a given tag in a block."""
for m in self.markups:
if m.tag == string.lower( tag_name ):
return m
return None
- def get_markup_name( self, tag_name ):
- """return the name of a given primary markup in a block"""
+ def get_markup_words( self, tag_name ):
try:
m = self.get_markup( tag_name )
- return m.get_name()
+ return m.fields[0].items[0].words
except:
- return None
+ return []
- def get_markup_words( self, tag_name ):
+ def get_markup_words_all( self, tag_name ):
try:
m = self.get_markup( tag_name )
- return m.fields[0].items[0].words
+ words = []
+ for item in m.fields[0].items:
+ # We honour empty lines in an `<Order>' section element by
+ # adding the sentinel `/empty/'. The formatter should then
+ # convert it to an appropriate representation in the
+ # `section_enter' function.
+ words += item.words
+ words.append( "/empty/" )
+ return words
except:
return []
diff --git a/src/3rdparty/freetype/src/tools/docmaker/docmaker.py b/src/3rdparty/freetype/src/tools/docmaker/docmaker.py
index 1d9de9fbff..4fb1abf235 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/docmaker.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/docmaker.py
@@ -1,16 +1,26 @@
#!/usr/bin/env python
#
-# DocMaker (c) 2002, 2004, 2008 David Turner <david@freetype.org>
+# docmaker.py
#
-# This program is a re-write of the original DocMaker took used
-# to generate the API Reference of the FreeType font engine
-# by converting in-source comments into structured HTML.
+# Convert source code markup to HTML documentation.
#
-# This new version is capable of outputting XML data, as well
-# as accepts more liberal formatting options.
+# Copyright 2002, 2004, 2008, 2013, 2014 by
+# David Turner.
#
-# It also uses regular expression matching and substitution
-# to speed things significantly.
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+#
+# This program is a re-write of the original DocMaker tool used to generate
+# the API Reference of the FreeType font rendering engine by converting
+# in-source comments into structured HTML.
+#
+# This new version is capable of outputting XML data as well as accepting
+# more liberal formatting options. It also uses regular expression matching
+# and substitution to speed up operation significantly.
#
from sources import *
@@ -39,13 +49,13 @@ def usage():
def main( argv ):
- """main program loop"""
+ """Main program loop."""
global output_dir
try:
- opts, args = getopt.getopt( sys.argv[1:], \
- "ht:o:p:", \
+ opts, args = getopt.getopt( sys.argv[1:],
+ "ht:o:p:",
["help", "title=", "output=", "prefix="] )
except getopt.GetoptError:
usage()
@@ -56,7 +66,6 @@ def main( argv ):
sys.exit( 1 )
# process options
- #
project_title = "Project"
project_prefix = None
output_dir = None
@@ -90,7 +99,9 @@ def main( argv ):
# process sections
content_processor.finish()
- formatter = HtmlFormatter( content_processor, project_title, project_prefix )
+ formatter = HtmlFormatter( content_processor,
+ project_title,
+ project_prefix )
formatter.toc_dump()
formatter.index_dump()
@@ -98,9 +109,7 @@ def main( argv ):
# if called from the command line
-#
if __name__ == '__main__':
main( sys.argv )
-
# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/formatter.py b/src/3rdparty/freetype/src/tools/docmaker/formatter.py
index f62ce676c1..7152c019d7 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/formatter.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/formatter.py
@@ -1,19 +1,37 @@
-# Formatter (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org>
#
+# formatter.py
+#
+# Convert parsed content blocks to a structured document (library file).
+#
+# Copyright 2002, 2004, 2007, 2008, 2014 by
+# David Turner.
+#
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+#
+# This is the base Formatter class. Its purpose is to convert a content
+# processor's data into specific documents (i.e., table of contents, global
+# index, and individual API reference indices).
+#
+# You need to sub-class it to output anything sensible. For example, the
+# file `tohtml.py' contains the definition of the `HtmlFormatter' sub-class
+# to output HTML.
+#
+
from sources import *
from content import *
from utils import *
-# This is the base Formatter class. Its purpose is to convert
-# a content processor's data into specific documents (i.e., table of
-# contents, global index, and individual API reference indices).
-#
-# You need to sub-class it to output anything sensible. For example,
-# the file tohtml.py contains the definition of the HtmlFormatter sub-class
-# used to output -- you guessed it -- HTML.
-#
+################################################################
+##
+## FORMATTER CLASS
+##
class Formatter:
def __init__( self, processor ):
@@ -36,20 +54,22 @@ class Formatter:
self.add_identifier( field.name, block )
self.block_index = self.identifiers.keys()
- self.block_index.sort( index_sort )
+ self.block_index.sort( key = index_key )
def add_identifier( self, name, block ):
- if self.identifiers.has_key( name ):
+ if name in self.identifiers:
# duplicate name!
- sys.stderr.write( \
- "WARNING: duplicate definition for '" + name + "' in " + \
- block.location() + ", previous definition in " + \
- self.identifiers[name].location() + "\n" )
+ sys.stderr.write( "WARNING: duplicate definition for"
+ + " '" + name + "' "
+ + "in " + block.location() + ", "
+ + "previous definition in "
+ + self.identifiers[name].location()
+ + "\n" )
else:
self.identifiers[name] = block
#
- # Formatting the table of contents
+ # formatting the table of contents
#
def toc_enter( self ):
pass
@@ -97,7 +117,7 @@ class Formatter:
close_output( output )
#
- # Formatting the index
+ # formatting the index
#
def index_enter( self ):
pass
@@ -128,7 +148,7 @@ class Formatter:
close_output( output )
#
- # Formatting a section
+ # formatting a section
#
def section_enter( self, section ):
pass
@@ -162,7 +182,22 @@ class Formatter:
self.section_enter( section )
for name in section.block_names:
- block = self.identifiers[name]
+ skip_entry = 0
+ try:
+ block = self.identifiers[name]
+ # `block_names' can contain field names also,
+ # which we filter out
+ for markup in block.markups:
+ if markup.tag == 'values':
+ for field in markup.fields:
+ if field.name == name:
+ skip_entry = 1
+ except:
+ skip_entry = 1 # this happens e.g. for `/empty/' entries
+
+ if skip_entry:
+ continue
+
self.block_enter( block )
for markup in block.markups[1:]: # always ignore first markup!
diff --git a/src/3rdparty/freetype/src/tools/docmaker/sources.py b/src/3rdparty/freetype/src/tools/docmaker/sources.py
index 7b68c07019..61ecc22c40 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/sources.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/sources.py
@@ -1,62 +1,70 @@
-# Sources (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009
-# David Turner <david@freetype.org>
#
+# sources.py
#
-# this file contains definitions of classes needed to decompose
-# C sources files into a series of multi-line "blocks". There are
-# two kinds of blocks:
+# Convert source code comments to multi-line blocks (library file).
#
-# - normal blocks, which contain source code or ordinary comments
+# Copyright 2002-2004, 2006-2009, 2012-2014 by
+# David Turner.
#
-# - documentation blocks, which have restricted formatting, and
-# whose text always start with a documentation markup tag like
-# "<Function>", "<Type>", etc..
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+#
+# This library file contains definitions of classes needed to decompose C
+# source code files into a series of multi-line `blocks'. There are two
+# kinds of blocks.
#
-# the routines used to process the content of documentation blocks
-# are not contained here, but in "content.py"
+# - Normal blocks, which contain source code or ordinary comments.
#
-# the classes and methods found here only deal with text parsing
-# and basic documentation block extraction
+# - Documentation blocks, which have restricted formatting, and whose text
+# always start with a documentation markup tag like `<Function>',
+# `<Type>', etc.
+#
+# The routines to process the content of documentation blocks are contained
+# in file `content.py'; the classes and methods found here only deal with
+# text parsing and basic documentation block extraction.
#
-import fileinput, re, sys, os, string
+import fileinput, re, sys, os, string
################################################################
##
-## BLOCK FORMAT PATTERN
+## SOURCE BLOCK FORMAT CLASS
+##
+## A simple class containing compiled regular expressions to detect
+## potential documentation format block comments within C source code.
##
-## A simple class containing compiled regular expressions used
-## to detect potential documentation format block comments within
-## C source code
+## The `column' pattern must contain a group to `unbox' the content of
+## documentation comment blocks.
##
-## note that the 'column' pattern must contain a group that will
-## be used to "unbox" the content of documentation comment blocks
+## Later on, paragraphs are converted to long lines, which simplifies the
+## regular expressions that act upon the text.
##
class SourceBlockFormat:
def __init__( self, id, start, column, end ):
- """create a block pattern, used to recognize special documentation blocks"""
+ """Create a block pattern, used to recognize special documentation
+ blocks."""
self.id = id
self.start = re.compile( start, re.VERBOSE )
self.column = re.compile( column, re.VERBOSE )
self.end = re.compile( end, re.VERBOSE )
-
#
-# format 1 documentation comment blocks look like the following:
+# Format 1 documentation comment blocks.
#
-# /************************************/
+# /************************************/ (at least 2 asterisks)
# /* */
# /* */
# /* */
-# /************************************/
+# /************************************/ (at least 2 asterisks)
#
-# we define a few regular expressions here to detect them
-#
-
start = r'''
\s* # any number of whitespace
/\*{2,}/ # followed by '/' and at least two asterisks then '/'
@@ -75,16 +83,13 @@ re_source_block_format1 = SourceBlockFormat( 1, start, column, start )
#
-# format 2 documentation comment blocks look like the following:
+# Format 2 documentation comment blocks.
#
# /************************************ (at least 2 asterisks)
# *
+# * (1 asterisk)
# *
-# *
-# *
-# **/ (1 or more asterisks at the end)
-#
-# we define a few regular expressions here to detect them
+# */ (1 or more asterisks)
#
start = r'''
\s* # any number of whitespace
@@ -93,9 +98,9 @@ start = r'''
'''
column = r'''
- \s* # any number of whitespace
- \*{1}(?!/) # followed by precisely one asterisk not followed by `/'
- (.*) # then anything (group1)
+ \s* # any number of whitespace
+ \*{1}(?![*/]) # followed by precisely one asterisk not followed by `/'
+ (.*) # then anything (group1)
'''
end = r'''
@@ -107,51 +112,101 @@ re_source_block_format2 = SourceBlockFormat( 2, start, column, end )
#
-# the list of supported documentation block formats, we could add new ones
-# relatively easily
+# The list of supported documentation block formats. We could add new ones
+# quite easily.
#
re_source_block_formats = [re_source_block_format1, re_source_block_format2]
#
-# the following regular expressions corresponds to markup tags
-# within the documentation comment blocks. they're equivalent
-# despite their different syntax
+# The following regular expressions correspond to markup tags within the
+# documentation comment blocks. They are equivalent despite their different
+# syntax.
+#
+# A markup tag consists of letters or character `-', to be found in group 1.
#
-# notice how each markup tag _must_ begin a new line
+# Notice that a markup tag _must_ begin a new paragraph.
#
-re_markup_tag1 = re.compile( r'''\s*<(\w*)>''' ) # <xxxx> format
-re_markup_tag2 = re.compile( r'''\s*@(\w*):''' ) # @xxxx: format
+re_markup_tag1 = re.compile( r'''\s*<((?:\w|-)*)>''' ) # <xxxx> format
+re_markup_tag2 = re.compile( r'''\s*@((?:\w|-)*):''' ) # @xxxx: format
#
-# the list of supported markup tags, we could add new ones relatively
-# easily
+# The list of supported markup tags. We could add new ones quite easily.
#
re_markup_tags = [re_markup_tag1, re_markup_tag2]
+
+#
+# A regular expression to detect a cross reference, after markup tags have
+# been stripped off. Group 1 is the reference, group 2 the rest of the
+# line.
#
-# used to detect a cross-reference, after markup tags have been stripped
+# A cross reference consists of letters, digits, or characters `-' and `_'.
#
-re_crossref = re.compile( r'@(\w*)(.*)' )
+re_crossref = re.compile( r'@((?:\w|-)*)(.*)' ) # @foo
#
-# used to detect italic and bold styles in paragraph text
+# Two regular expressions to detect italic and bold markup, respectively.
+# Group 1 is the markup, group 2 the rest of the line.
#
-re_italic = re.compile( r"_(\w(\w|')*)_(.*)" ) # _italic_
-re_bold = re.compile( r"\*(\w(\w|')*)\*(.*)" ) # *bold*
+# Note that the markup is limited to words consisting of letters, digits,
+# the character `_', or an apostrophe (but not as the first character).
+#
+re_italic = re.compile( r"_(\w(?:\w|')*)_(.*)" ) # _italic_
+re_bold = re.compile( r"\*(\w(?:\w|')*)\*(.*)" ) # *bold*
#
-# used to detect the end of commented source lines
+# This regular expression code to identify an URL has been taken from
+#
+# http://mail.python.org/pipermail/tutor/2002-September/017228.html
#
-re_source_sep = re.compile( r'\s*/\*\s*\*/' )
+# (with slight modifications).
+#
+urls = r'(?:https?|telnet|gopher|file|wais|ftp)'
+ltrs = r'\w'
+gunk = r'/#~:.?+=&%@!\-'
+punc = r'.:?\-'
+any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs,
+ 'gunk' : gunk,
+ 'punc' : punc }
+url = r"""
+ (
+ \b # start at word boundary
+ %(urls)s : # need resource and a colon
+ [%(any)s] +? # followed by one or more of any valid
+ # character, but be conservative and
+ # take only what you need to...
+ (?= # [look-ahead non-consumptive assertion]
+ [%(punc)s]* # either 0 or more punctuation
+ (?: # [non-grouping parentheses]
+ [^%(any)s] | $ # followed by a non-url char
+ # or end of the string
+ )
+ )
+ )
+ """ % {'urls' : urls,
+ 'any' : any,
+ 'punc' : punc }
+
+re_url = re.compile( url, re.VERBOSE | re.MULTILINE )
#
-# used to perform cross-reference within source output
+# A regular expression that stops collection of comments for the current
+# block.
+#
+re_source_sep = re.compile( r'\s*/\*\s*\*/' ) # /* */
+
+#
+# A regular expression to find possible C identifiers while outputting
+# source code verbatim, covering things like `*foo' or `(bar'. Group 1 is
+# the prefix, group 2 the identifier -- since we scan lines from left to
+# right, sequentially splitting the source code into prefix and identifier
+# is fully sufficient for our purposes.
#
re_source_crossref = re.compile( r'(\W*)(\w*)' )
#
-# a list of reserved source keywords
+# A regular expression that matches a list of reserved C source keywords.
#
re_source_keywords = re.compile( '''\\b ( typedef |
struct |
@@ -179,24 +234,16 @@ re_source_keywords = re.compile( '''\\b ( typedef |
##
## SOURCE BLOCK CLASS
##
-## A SourceProcessor is in charge of reading a C source file
-## and decomposing it into a series of different "SourceBlocks".
-## each one of these blocks can be made of the following data:
-##
-## - A documentation comment block that starts with "/**" and
-## whose exact format will be discussed later
+## There are two important fields in a `SourceBlock' object.
##
-## - normal sources lines, including comments
+## self.lines
+## A list of text lines for the corresponding block.
##
-## the important fields in a text block are the following ones:
-##
-## self.lines : a list of text lines for the corresponding block
-##
-## self.content : for documentation comment blocks only, this is the
-## block content that has been "unboxed" from its
-## decoration. This is None for all other blocks
-## (i.e. sources or ordinary comments with no starting
-## markup tag)
+## self.content
+## For documentation comment blocks only, this is the block content
+## that has been `unboxed' from its decoration. This is `None' for all
+## other blocks (i.e., sources or ordinary comments with no starting
+## markup tag)
##
class SourceBlock:
@@ -233,7 +280,7 @@ class SourceBlock:
def location( self ):
return "(" + self.filename + ":" + repr( self.lineno ) + ")"
- # debugging only - not used in normal operations
+ # debugging only -- not used in normal operations
def dump( self ):
if self.content:
print "{{{content start---"
@@ -250,39 +297,38 @@ class SourceBlock:
print line
-
################################################################
##
## SOURCE PROCESSOR CLASS
##
-## The SourceProcessor is in charge of reading a C source file
-## and decomposing it into a series of different "SourceBlock"
-## objects.
+## The `SourceProcessor' is in charge of reading a C source file and
+## decomposing it into a series of different `SourceBlock' objects.
##
-## each one of these blocks can be made of the following data:
+## A SourceBlock object consists of the following data.
##
-## - A documentation comment block that starts with "/**" and
-## whose exact format will be discussed later
+## - A documentation comment block using one of the layouts above. Its
+## exact format will be discussed later.
##
-## - normal sources lines, include comments
+## - Normal sources lines, including comments.
##
##
class SourceProcessor:
def __init__( self ):
- """initialize a source processor"""
+ """Initialize a source processor."""
self.blocks = []
self.filename = None
self.format = None
self.lines = []
def reset( self ):
- """reset a block processor, clean all its blocks"""
+ """Reset a block processor and clean up all its blocks."""
self.blocks = []
self.format = None
def parse_file( self, filename ):
- """parse a C source file, and add its blocks to the processor's list"""
+ """Parse a C source file and add its blocks to the processor's
+ list."""
self.reset()
self.filename = filename
@@ -301,16 +347,16 @@ class SourceProcessor:
self.process_normal_line( line )
else:
if self.format.end.match( line ):
- # that's a normal block end, add it to 'lines' and
- # create a new block
+ # A normal block end. Add it to `lines' and create a
+ # new block
self.lines.append( line )
self.add_block_lines()
elif self.format.column.match( line ):
- # that's a normal column line, add it to 'lines'
+ # A normal column line. Add it to `lines'.
self.lines.append( line )
else:
- # humm.. this is an unexpected block end,
- # create a new block, but don't process the line
+ # An unexpected block end. Create a new block, but
+ # don't process the line.
self.add_block_lines()
# we need to process the line again
@@ -320,7 +366,8 @@ class SourceProcessor:
self.add_block_lines()
def process_normal_line( self, line ):
- """process a normal line and check whether it is the start of a new block"""
+ """Process a normal line and check whether it is the start of a new
+ block."""
for f in re_source_block_formats:
if f.start.match( line ):
self.add_block_lines()
@@ -330,9 +377,12 @@ class SourceProcessor:
self.lines.append( line )
def add_block_lines( self ):
- """add the current accumulated lines and create a new block"""
+ """Add the current accumulated lines and create a new block."""
if self.lines != []:
- block = SourceBlock( self, self.filename, self.lineno, self.lines )
+ block = SourceBlock( self,
+ self.filename,
+ self.lineno,
+ self.lines )
self.blocks.append( block )
self.format = None
@@ -340,7 +390,7 @@ class SourceProcessor:
# debugging only, not used in normal operations
def dump( self ):
- """print all blocks in a processor"""
+ """Print all blocks in a processor."""
for b in self.blocks:
b.dump()
diff --git a/src/3rdparty/freetype/src/tools/docmaker/tohtml.py b/src/3rdparty/freetype/src/tools/docmaker/tohtml.py
index fffa120973..05fc08a92d 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/tohtml.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/tohtml.py
@@ -1,5 +1,19 @@
-# ToHTML (c) 2002, 2003, 2005, 2006, 2007, 2008
-# David Turner <david@freetype.org>
+#
+# tohtml.py
+#
+# A sub-class container of the `Formatter' class to produce HTML.
+#
+# Copyright 2002, 2003, 2005-2008, 2013, 2014 by
+# David Turner.
+#
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+
+# The parent class is contained in file `formatter.py'.
+
from sources import *
from content import *
@@ -8,7 +22,7 @@ from formatter import *
import time
-# The following defines the HTML header used by all generated pages.
+# The following strings define the HTML header used by all generated pages.
html_header_1 = """\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
@@ -21,62 +35,125 @@ html_header_1 = """\
html_header_2 = """\
API Reference</title>
<style type="text/css">
+ a:link { color: #0000EF; }
+ a:visited { color: #51188E; }
+ a:hover { color: #FF0000; }
+
body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
color: #000000;
- background: #FFFFFF; }
+ background: #FFFFFF;
+ width: 87%;
+ margin: auto; }
+
+ div.section { width: 75%;
+ margin: auto; }
+ div.section hr { margin: 4ex 0 1ex 0; }
+ div.section h4 { background-color: #EEEEFF;
+ font-size: medium;
+ font-style: oblique;
+ font-weight: bold;
+ margin: 3ex 0 1.5ex 9%;
+ padding: 0.3ex 0 0.3ex 1%; }
+ div.section p { margin: 1.5ex 0 1.5ex 10%; }
+ div.section pre { margin: 3ex 0 3ex 9%;
+ background-color: #D6E8FF;
+ padding: 2ex 0 2ex 1%; }
+ div.section table.fields { width: 90%;
+ margin: 1.5ex 0 1.5ex 10%; }
+ div.section table.toc { width: 95%;
+ margin: 1.5ex 0 1.5ex 5%; }
+ div.timestamp { text-align: center;
+ font-size: 69%;
+ margin: 1.5ex 0 1.5ex 0; }
- p { text-align: justify; }
h1 { text-align: center; }
- li { text-align: justify; }
- td { padding: 0 0.5em 0 0.5em; }
- td.left { padding: 0 0.5em 0 0.5em;
- text-align: left; }
+ h3 { font-size: medium;
+ margin: 4ex 0 1.5ex 0; }
- a:link { color: #0000EF; }
- a:visited { color: #51188E; }
- a:hover { color: #FF0000; }
+ p { text-align: justify; }
+
+ pre.colored { color: blue; }
span.keyword { font-family: monospace;
text-align: left;
white-space: pre;
color: darkblue; }
- pre.colored { color: blue; }
+ table.fields td.val { font-weight: bold;
+ text-align: right;
+ width: 30%;
+ vertical-align: baseline;
+ padding: 1ex 1em 1ex 0; }
+ table.fields td.desc { vertical-align: baseline;
+ padding: 1ex 0 1ex 1em; }
+ table.fields td.desc p:first-child { margin: 0; }
+ table.fields td.desc p { margin: 1.5ex 0 0 0; }
+ table.index { margin: 6ex auto 6ex auto;
+ border: 0;
+ border-collapse: separate;
+ border-spacing: 1em 0.3ex; }
+ table.index tr { padding: 0; }
+ table.index td { padding: 0; }
+ table.index-toc-link { width: 100%;
+ border: 0;
+ border-spacing: 0;
+ margin: 1ex 0 1ex 0; }
+ table.index-toc-link td.left { padding: 0 0.5em 0 0.5em;
+ font-size: 83%;
+ text-align: left; }
+ table.index-toc-link td.middle { padding: 0 0.5em 0 0.5em;
+ font-size: 83%;
+ text-align: center; }
+ table.index-toc-link td.right { padding: 0 0.5em 0 0.5em;
+ font-size: 83%;
+ text-align: right; }
+ table.synopsis { margin: 6ex auto 6ex auto;
+ border: 0;
+ border-collapse: separate;
+ border-spacing: 2em 0.6ex; }
+ table.synopsis tr { padding: 0; }
+ table.synopsis td { padding: 0; }
+ table.toc td.link { width: 30%;
+ text-align: right;
+ vertical-align: baseline;
+ padding: 1ex 1em 1ex 0; }
+ table.toc td.desc { vertical-align: baseline;
+ padding: 1ex 0 1ex 1em;
+ text-align: left; }
+ table.toc td.desc p:first-child { margin: 0;
+ text-align: left; }
+ table.toc td.desc p { margin: 1.5ex 0 0 0;
+ text-align: left; }
- ul.empty { list-style-type: none; }
</style>
</head>
<body>
"""
-html_header_3 = """
-<table align=center><tr><td><font size=-1>[<a href="\
+html_header_3l = """
+<table class="index-toc-link"><tr><td class="left">[<a href="\
"""
-html_header_3i = """
-<table align=center><tr><td width="100%"></td>
-<td><font size=-1>[<a href="\
+html_header_3r = """
+<table class="index-toc-link"><tr><td class="right">[<a href="\
"""
html_header_4 = """\
-">Index</a>]</font></td>
-<td width="100%"></td>
-<td><font size=-1>[<a href="\
+">Index</a>]</td><td class="right">[<a href="\
"""
-html_header_5 = """\
-">TOC</a>]</font></td></tr></table>
-<center><h1>\
+html_header_5t = """\
+">TOC</a>]</td></tr></table>
+<h1>\
"""
-html_header_5t = """\
-">Index</a>]</font></td>
-<td width="100%"></td></tr></table>
-<center><h1>\
+html_header_5i = """\
+">Index</a>]</td></tr></table>
+<h1>\
"""
html_header_6 = """\
- API Reference</h1></center>
+ API Reference</h1>
"""
@@ -87,8 +164,8 @@ html_footer = """\
"""
# The header and footer used for each section.
-section_title_header = "<center><h1>"
-section_title_footer = "</h1></center>"
+section_title_header = "<h1>"
+section_title_footer = "</h1>"
# The header and footer used for code segments.
code_header = '<pre class="colored">'
@@ -99,66 +176,65 @@ para_header = "<p>"
para_footer = "</p>"
# Block header and footer.
-block_header = '<table align=center width="75%"><tr><td>'
+block_header = '<div class="section">'
block_footer_start = """\
-</td></tr></table>
-<hr width="75%">
-<table align=center width="75%"><tr><td><font size=-2>[<a href="\
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="\
"""
block_footer_middle = """\
-">Index</a>]</font></td>
-<td width="100%"></td>
-<td><font size=-2>[<a href="\
+">Index</a>]</td>\
+<td class="middle">[<a href="#">Top</a>]</td>\
+<td class="right">[<a href="\
"""
block_footer_end = """\
-">TOC</a>]</font></td></tr></table>
+">TOC</a>]</td></tr></table></div>
"""
# Description header/footer.
-description_header = '<table align=center width="87%"><tr><td>'
-description_footer = "</td></tr></table><br>"
+description_header = ""
+description_footer = ""
# Marker header/inter/footer combination.
-marker_header = '<table align=center width="87%" cellpadding=5><tr bgcolor="#EEEEFF"><td><em><b>'
-marker_inter = "</b></em></td></tr><tr><td>"
-marker_footer = "</td></tr></table>"
+marker_header = "<h4>"
+marker_inter = "</h4>"
+marker_footer = ""
# Header location header/footer.
-header_location_header = '<table align=center width="87%"><tr><td>'
-header_location_footer = "</td></tr></table><br>"
+header_location_header = "<p>"
+header_location_footer = "</p>"
# Source code extracts header/footer.
-source_header = '<table align=center width="87%"><tr bgcolor="#D6E8FF"><td><pre>\n'
-source_footer = "\n</pre></table><br>"
+source_header = "<pre>"
+source_footer = "</pre>"
# Chapter header/inter/footer.
-chapter_header = '<br><table align=center width="75%"><tr><td><h2>'
-chapter_inter = '</h2><ul class="empty"><li>'
-chapter_footer = '</li></ul></td></tr></table>'
+chapter_header = """\
+<div class="section">
+<h2>\
+"""
+chapter_inter = '</h2>'
+chapter_footer = '</div>'
# Index footer.
index_footer_start = """\
<hr>
-<table><tr><td width="100%"></td>
-<td><font size=-2>[<a href="\
+<table class="index-toc-link"><tr><td class="right">[<a href="\
"""
index_footer_end = """\
-">TOC</a>]</font></td></tr></table>
+">TOC</a>]</td></tr></table>
"""
# TOC footer.
toc_footer_start = """\
<hr>
-<table><tr><td><font size=-2>[<a href="\
+<table class="index-toc-link"><tr><td class="left">[<a href="\
"""
toc_footer_end = """\
-">Index</a>]</font></td>
-<td width="100%"></td>
-</tr></table>
+">Index</a>]</td></tr></table>
"""
-# source language keyword coloration/styling
+# Source language keyword coloration and styling.
keyword_prefix = '<span class="keyword">'
keyword_suffix = '</span>'
@@ -166,95 +242,78 @@ section_synopsis_header = '<h2>Synopsis</h2>'
section_synopsis_footer = ''
-# Translate a single line of source to HTML. This will convert
-# a "<" into "&lt.", ">" into "&gt.", etc.
+# Translate a single line of source to HTML. This converts `<', `>', and
+# `&' into `&lt;',`&gt;', and `&amp;'.
+#
def html_quote( line ):
- result = string.replace( line, "&", "&amp;" )
- result = string.replace( result, "<", "&lt;" )
- result = string.replace( result, ">", "&gt;" )
+ result = string.replace( line, "&", "&amp;" )
+ result = string.replace( result, "<", "&lt;" )
+ result = string.replace( result, ">", "&gt;" )
return result
-# same as 'html_quote', but ignores left and right brackets
-def html_quote0( line ):
- return string.replace( line, "&", "&amp;" )
-
-
-def dump_html_code( lines, prefix = "" ):
- # clean the last empty lines
- l = len( self.lines )
- while l > 0 and string.strip( self.lines[l - 1] ) == "":
- l = l - 1
-
- # The code footer should be directly appended to the last code
- # line to avoid an additional blank line.
- print prefix + code_header,
- for line in self.lines[0 : l + 1]:
- print '\n' + prefix + html_quote( line ),
- print prefix + code_footer,
-
-
-
+################################################################
+##
+## HTML FORMATTER CLASS
+##
class HtmlFormatter( Formatter ):
def __init__( self, processor, project_title, file_prefix ):
Formatter.__init__( self, processor )
- global html_header_1, html_header_2, html_header_3
- global html_header_4, html_header_5, html_footer
+ global html_header_1
+ global html_header_2
+ global html_header_3l, html_header_3r
+ global html_header_4
+ global html_header_5t, html_header_5i
+ global html_header_6
+ global html_footer
if file_prefix:
file_prefix = file_prefix + "-"
else:
file_prefix = ""
- self.headers = processor.headers
- self.project_title = project_title
- self.file_prefix = file_prefix
- self.html_header = html_header_1 + project_title + \
- html_header_2 + \
- html_header_3 + file_prefix + "index.html" + \
- html_header_4 + file_prefix + "toc.html" + \
- html_header_5 + project_title + \
- html_header_6
-
- self.html_index_header = html_header_1 + project_title + \
- html_header_2 + \
- html_header_3i + file_prefix + "toc.html" + \
- html_header_5 + project_title + \
- html_header_6
-
- self.html_toc_header = html_header_1 + project_title + \
- html_header_2 + \
- html_header_3 + file_prefix + "index.html" + \
- html_header_5t + project_title + \
- html_header_6
-
- self.html_footer = "<center><font size=""-2"">generated on " + \
- time.asctime( time.localtime( time.time() ) ) + \
- "</font></center>" + html_footer
+ self.headers = processor.headers
+ self.project_title = project_title
+ self.file_prefix = file_prefix
+ self.html_header = (
+ html_header_1 + project_title
+ + html_header_2
+ + html_header_3l + file_prefix + "index.html"
+ + html_header_4 + file_prefix + "toc.html"
+ + html_header_5t + project_title
+ + html_header_6 )
+ self.html_index_header = (
+ html_header_1 + project_title
+ + html_header_2
+ + html_header_3r + file_prefix + "toc.html"
+ + html_header_5t + project_title
+ + html_header_6 )
+ self.html_toc_header = (
+ html_header_1 + project_title
+ + html_header_2
+ + html_header_3l + file_prefix + "index.html"
+ + html_header_5i + project_title
+ + html_header_6 )
+ self.html_footer = (
+ '<div class="timestamp">generated on '
+ + time.asctime( time.localtime( time.time() ) )
+ + "</div>" + html_footer )
self.columns = 3
def make_section_url( self, section ):
return self.file_prefix + section.name + ".html"
- def make_block_url( self, block ):
- return self.make_section_url( block.section ) + "#" + block.name
-
- def make_html_words( self, words ):
- """ convert a series of simple words into some HTML text """
- line = ""
- if words:
- line = html_quote( words[0] )
- for w in words[1:]:
- line = line + " " + html_quote( w )
-
- return line
+ def make_block_url( self, block, name = None ):
+ if name == None:
+ name = block.name
+ return self.make_section_url( block.section ) + "#" + name
def make_html_word( self, word ):
- """analyze a simple word to detect cross-references and styling"""
- # look for cross-references
+ """Analyze a simple word to detect cross-references and markup."""
+ # handle cross-references
m = re_crossref.match( word )
if m:
try:
@@ -265,35 +324,38 @@ class HtmlFormatter( Formatter ):
return '<a href="' + url + '">' + name + '</a>' + rest
except:
# we detected a cross-reference to an unknown item
- sys.stderr.write( \
- "WARNING: undefined cross reference '" + name + "'.\n" )
+ sys.stderr.write( "WARNING: undefined cross reference"
+ + " '" + name + "'.\n" )
return '?' + name + '?' + rest
- # look for italics and bolds
+ # handle markup for italic and bold
m = re_italic.match( word )
if m:
name = m.group( 1 )
- rest = m.group( 3 )
+ rest = m.group( 2 )
return '<i>' + name + '</i>' + rest
m = re_bold.match( word )
if m:
name = m.group( 1 )
- rest = m.group( 3 )
+ rest = m.group( 2 )
return '<b>' + name + '</b>' + rest
return html_quote( word )
def make_html_para( self, words ):
- """ convert words of a paragraph into tagged HTML text, handle xrefs """
+ """Convert words of a paragraph into tagged HTML text. Also handle
+ cross references."""
line = ""
if words:
line = self.make_html_word( words[0] )
for word in words[1:]:
line = line + " " + self.make_html_word( word )
+ # handle hyperlinks
+ line = re_url.sub( r'<a href="\1">\1</a>', line )
# convert `...' quotations into real left and right single quotes
- line = re.sub( r"(^|\W)`(.*?)'(\W|$)", \
- r'\1&lsquo;\2&rsquo;\3', \
+ line = re.sub( r"(^|\W)`(.*?)'(\W|$)",
+ r'\1&lsquo;\2&rsquo;\3',
line )
# convert tilde into non-breakable space
line = string.replace( line, "~", "&nbsp;" )
@@ -301,7 +363,7 @@ class HtmlFormatter( Formatter ):
return para_header + line + para_footer
def make_html_code( self, lines ):
- """ convert a code sequence to HTML """
+ """Convert a code sequence to HTML."""
line = code_header + '\n'
for l in lines:
line = line + html_quote( l ) + '\n'
@@ -309,7 +371,7 @@ class HtmlFormatter( Formatter ):
return line + code_footer
def make_html_items( self, items ):
- """ convert a field's content into some valid HTML """
+ """Convert a field's content into HTML."""
lines = []
for item in items:
if item.lines:
@@ -324,7 +386,9 @@ class HtmlFormatter( Formatter ):
def print_html_field( self, field ):
if field.name:
- print "<table><tr valign=top><td><b>" + field.name + "</b></td><td>"
+ print( '<table><tr valign="top"><td><b>'
+ + field.name
+ + "</b></td><td>" )
print self.make_html_items( field.items )
@@ -345,12 +409,24 @@ class HtmlFormatter( Formatter ):
result = result + prefix + '<b>' + name + '</b>'
elif re_source_keywords.match( name ):
# this is a C keyword
- result = result + prefix + keyword_prefix + name + keyword_suffix
- elif self.identifiers.has_key( name ):
+ result = ( result + prefix
+ + keyword_prefix + name + keyword_suffix )
+ elif name in self.identifiers:
# this is a known identifier
block = self.identifiers[name]
- result = result + prefix + '<a href="' + \
- self.make_block_url( block ) + '">' + name + '</a>'
+ id = block.name
+
+ # link to a field ID if possible
+ for markup in block.markups:
+ if markup.tag == 'values':
+ for field in markup.fields:
+ if field.name:
+ id = name
+
+ result = ( result + prefix
+ + '<a href="'
+ + self.make_block_url( block, id )
+ + '">' + name + '</a>' )
else:
result = result + html_quote( line[:length] )
@@ -362,15 +438,11 @@ class HtmlFormatter( Formatter ):
return result
def print_html_field_list( self, fields ):
- print "<p></p>"
- print "<table cellpadding=3 border=0>"
+ print '<table class="fields">'
for field in fields:
- if len( field.name ) > 22:
- print "<tr valign=top><td colspan=0><b>" + field.name + "</b></td></tr>"
- print "<tr valign=top><td></td><td>"
- else:
- print "<tr valign=top><td><b>" + field.name + "</b></td><td>"
-
+ print ( '<tr><td class="val" id="' + field.name + '">'
+ + field.name
+ + '</td><td class="desc">' )
self.print_html_items( field.items )
print "</td></tr>"
print "</table>"
@@ -379,10 +451,9 @@ class HtmlFormatter( Formatter ):
table_fields = []
for field in markup.fields:
if field.name:
- # we begin a new series of field or value definitions, we
- # will record them in the 'table_fields' list before outputting
- # all of them as a single table
- #
+ # We begin a new series of field or value definitions. We
+ # record them in the `table_fields' list before outputting
+ # all of them as a single table.
table_fields.append( field )
else:
if table_fields:
@@ -395,7 +466,7 @@ class HtmlFormatter( Formatter ):
self.print_html_field_list( table_fields )
#
- # Formatting the index
+ # formatting the index
#
def index_enter( self ):
print self.html_index_header
@@ -407,11 +478,11 @@ class HtmlFormatter( Formatter ):
self.index_items[name] = url
def index_exit( self ):
- # block_index already contains the sorted list of index names
+ # `block_index' already contains the sorted list of index names
count = len( self.block_index )
- rows = ( count + self.columns - 1 ) / self.columns
+ rows = ( count + self.columns - 1 ) // self.columns
- print "<table align=center border=0 cellpadding=0 cellspacing=0>"
+ print '<table class="index">'
for r in range( rows ):
line = "<tr>"
for c in range( self.columns ):
@@ -419,7 +490,8 @@ class HtmlFormatter( Formatter ):
if i < count:
bname = self.block_index[r + c * rows]
url = self.index_items[bname]
- line = line + '<td><a href="' + url + '">' + bname + '</a></td>'
+ line = ( line + '<td><a href="' + url + '">'
+ + bname + '</a></td>' )
else:
line = line + '<td></td>'
line = line + "</tr>"
@@ -427,9 +499,9 @@ class HtmlFormatter( Formatter ):
print "</table>"
- print index_footer_start + \
- self.file_prefix + "toc.html" + \
- index_footer_end
+ print( index_footer_start
+ + self.file_prefix + "toc.html"
+ + index_footer_end )
print self.html_footer
@@ -442,21 +514,20 @@ class HtmlFormatter( Formatter ):
Formatter.index_dump( self, index_filename )
#
- # Formatting the table of content
+ # formatting the table of contents
#
def toc_enter( self ):
print self.html_toc_header
- print "<center><h1>Table of Contents</h1></center>"
+ print "<h1>Table of Contents</h1>"
def toc_chapter_enter( self, chapter ):
- print chapter_header + string.join( chapter.title ) + chapter_inter
- print "<table cellpadding=5>"
+ print chapter_header + string.join( chapter.title ) + chapter_inter
+ print '<table class="toc">'
def toc_section_enter( self, section ):
- print '<tr valign=top><td class="left">'
- print '<a href="' + self.make_section_url( section ) + '">' + \
- section.title + '</a></td><td>'
-
+ print ( '<tr><td class="link">'
+ + '<a href="' + self.make_section_url( section ) + '">'
+ + section.title + '</a></td><td class="desc">' )
print self.make_html_para( section.abstract )
def toc_section_exit( self, section ):
@@ -467,14 +538,14 @@ class HtmlFormatter( Formatter ):
print chapter_footer
def toc_index( self, index_filename ):
- print chapter_header + \
- '<a href="' + index_filename + '">Global Index</a>' + \
- chapter_inter + chapter_footer
+ print( chapter_header
+ + '<a href="' + index_filename + '">Global Index</a>'
+ + chapter_inter + chapter_footer )
def toc_exit( self ):
- print toc_footer_start + \
- self.file_prefix + "index.html" + \
- toc_footer_end
+ print( toc_footer_start
+ + self.file_prefix + "index.html"
+ + toc_footer_end )
print self.html_footer
@@ -488,14 +559,12 @@ class HtmlFormatter( Formatter ):
Formatter.toc_dump( self, toc_filename, index_filename )
#
- # Formatting sections
+ # formatting sections
#
def section_enter( self, section ):
print self.html_header
- print section_title_header
- print section.title
- print section_title_footer
+ print section_title_header + section.title + section_title_footer
maxwidth = 0
for b in section.blocks.values():
@@ -503,32 +572,43 @@ class HtmlFormatter( Formatter ):
maxwidth = len( b.name )
width = 70 # XXX magic number
- if maxwidth <> 0:
+ if maxwidth > 0:
# print section synopsis
print section_synopsis_header
- print "<table align=center cellspacing=5 cellpadding=0 border=0>"
+ print '<table class="synopsis">'
- columns = width / maxwidth
+ columns = width // maxwidth
if columns < 1:
columns = 1
count = len( section.block_names )
- rows = ( count + columns - 1 ) / columns
+ # don't handle last entry if it is empty
+ if section.block_names[-1] == "/empty/":
+ count -= 1
+ rows = ( count + columns - 1 ) // columns
for r in range( rows ):
line = "<tr>"
for c in range( columns ):
i = r + c * rows
- line = line + '<td></td><td>'
+ line = line + '<td>'
if i < count:
name = section.block_names[i]
- line = line + '<a href="#' + name + '">' + name + '</a>'
+ if name == "/empty/":
+ # it can happen that a complete row is empty, and
+ # without a proper `filler' the browser might
+ # collapse the row to a much smaller height (or
+ # even omit it completely)
+ line = line + "&nbsp;"
+ else:
+ line = ( line + '<a href="#' + name + '">'
+ + name + '</a>' )
line = line + '</td>'
line = line + "</tr>"
print line
- print "</table><br><br>"
+ print "</table>"
print section_synopsis_footer
print description_header
@@ -540,7 +620,7 @@ class HtmlFormatter( Formatter ):
# place html anchor if needed
if block.name:
- print '<h4><a name="' + block.name + '">' + block.name + '</a></h4>'
+ print( '<h3 id="' + block.name + '">' + block.name + '</h3>' )
# dump the block C source lines now
if block.code:
@@ -548,16 +628,17 @@ class HtmlFormatter( Formatter ):
for f in self.headers.keys():
if block.source.filename.find( f ) >= 0:
header = self.headers[f] + ' (' + f + ')'
- break;
-
+ break
+
# if not header:
-# sys.stderr.write( \
-# 'WARNING: No header macro for ' + block.source.filename + '.\n' )
+# sys.stderr.write(
+# "WARNING: No header macro for"
+# + " '" + block.source.filename + "'.\n" )
if header:
- print header_location_header
- print 'Defined in ' + header + '.'
- print header_location_footer
+ print ( header_location_header
+ + 'Defined in ' + header + '.'
+ + header_location_footer )
print source_header
for l in block.code:
@@ -579,15 +660,16 @@ class HtmlFormatter( Formatter ):
print marker_footer
def block_exit( self, block ):
- print block_footer_start + self.file_prefix + "index.html" + \
- block_footer_middle + self.file_prefix + "toc.html" + \
- block_footer_end
+ print( block_footer_start + self.file_prefix + "index.html"
+ + block_footer_middle + self.file_prefix + "toc.html"
+ + block_footer_end )
def section_exit( self, section ):
print html_footer
def section_dump_all( self ):
for section in self.sections:
- self.section_dump( section, self.file_prefix + section.name + '.html' )
+ self.section_dump( section,
+ self.file_prefix + section.name + '.html' )
# eof
diff --git a/src/3rdparty/freetype/src/tools/docmaker/utils.py b/src/3rdparty/freetype/src/tools/docmaker/utils.py
index 1d96658c7d..b35823ab74 100644
--- a/src/3rdparty/freetype/src/tools/docmaker/utils.py
+++ b/src/3rdparty/freetype/src/tools/docmaker/utils.py
@@ -1,48 +1,42 @@
-# Utils (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org>
#
-
-import string, sys, os, glob
-
-# current output directory
+# utils.py
#
-output_dir = None
-
-
-# This function is used to sort the index. It is a simple lexicographical
-# sort, except that it places capital letters before lowercase ones.
+# Auxiliary functions for the `docmaker' tool (library file).
#
-def index_sort( s1, s2 ):
- if not s1:
- return -1
-
- if not s2:
- return 1
-
- l1 = len( s1 )
- l2 = len( s2 )
- m1 = string.lower( s1 )
- m2 = string.lower( s2 )
+# Copyright 2002, 2004, 2007, 2008, 2014 by
+# David Turner.
+#
+# This file is part of the FreeType project, and may only be used,
+# modified, and distributed under the terms of the FreeType project
+# license, LICENSE.TXT. By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
- for i in range( l1 ):
- if i >= l2 or m1[i] > m2[i]:
- return 1
- if m1[i] < m2[i]:
- return -1
+import string, sys, os, glob, itertools
- if s1[i] < s2[i]:
- return -1
- if s1[i] > s2[i]:
- return 1
+# current output directory
+#
+output_dir = None
- if l2 > l1:
- return -1
- return 0
+# A function that generates a sorting key. We want lexicographical order
+# (primary key) except that capital letters are sorted before lowercase
+# ones (secondary key).
+#
+# The primary key is implemented by lowercasing the input. The secondary
+# key is simply the original data appended, character by character. For
+# example, the sort key for `FT_x' is `fFtT__xx', while the sort key for
+# `ft_X' is `fftt__xX'. Since ASCII codes of uppercase letters are
+# numerically smaller than the codes of lowercase letters, `fFtT__xx' gets
+# sorted before `fftt__xX'.
+#
+def index_key( s ):
+ return string.join( itertools.chain( *zip( s.lower(), s ) ) )
-# Sort input_list, placing the elements of order_list in front.
+# Sort `input_list', placing the elements of `order_list' in front.
#
def sort_order_list( input_list, order_list ):
new_list = order_list[:]
@@ -52,9 +46,9 @@ def sort_order_list( input_list, order_list ):
return new_list
-# Open the standard output to a given project documentation file. Use
-# "output_dir" to determine the filename location if necessary and save the
-# old stdout in a tuple that is returned by this function.
+# Divert standard output to a given project documentation file. Use
+# `output_dir' to determine the filename location if necessary and save the
+# old stdout handle in a tuple that is returned by this function.
#
def open_output( filename ):
global output_dir
@@ -69,7 +63,7 @@ def open_output( filename ):
return ( new_file, old_stdout )
-# Close the output that was returned by "close_output".
+# Close the output that was returned by `open_output'.
#
def close_output( output ):
output[0].close()
@@ -83,15 +77,16 @@ def check_output():
if output_dir:
if output_dir != "":
if not os.path.isdir( output_dir ):
- sys.stderr.write( "argument" + " '" + output_dir + "' " + \
- "is not a valid directory" )
+ sys.stderr.write( "argument"
+ + " '" + output_dir + "' "
+ + "is not a valid directory" )
sys.exit( 2 )
else:
output_dir = None
def file_exists( pathname ):
- """checks that a given file exists"""
+ """Check that a given file exists."""
result = 1
try:
file = open( pathname, "r" )
@@ -104,12 +99,12 @@ def file_exists( pathname ):
def make_file_list( args = None ):
- """builds a list of input files from command-line arguments"""
+ """Build a list of input files from command-line arguments."""
file_list = []
# sys.stderr.write( repr( sys.argv[1 :] ) + '\n' )
if not args:
- args = sys.argv[1 :]
+ args = sys.argv[1:]
for pathname in args:
if string.find( pathname, '*' ) >= 0:
diff --git a/src/3rdparty/freetype/src/tools/ftrandom/README b/src/3rdparty/freetype/src/tools/ftrandom/README
index c093f15e81..71bf05323d 100644
--- a/src/3rdparty/freetype/src/tools/ftrandom/README
+++ b/src/3rdparty/freetype/src/tools/ftrandom/README
@@ -43,6 +43,6 @@ Arguments are:
--rasterize Call FT_Render_Glyph as well as loading it.
--result <dir> This is the directory in which test files are
placed.
- --test <file> Run a single test on a pre-generated testcase.
+ --test <file> Run a single test on a pre-generated testcase.
Done in the current process so it can be debugged
more easily.
diff --git a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c
index 4daac0dc1d..9a5b632673 100644
--- a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c
+++ b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005, 2007, 2008 by George Williams */
+/* Copyright (C) 2005, 2007, 2008, 2013 by George Williams */
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -184,7 +184,6 @@
{
FT_Library context;
FT_Face face;
- int i, num;
if ( FT_Init_FreeType( &context ) )
@@ -203,6 +202,9 @@
TestFace( face );
else
{
+ int i, num;
+
+
num = face->num_faces;
FT_Done_Face( face );
@@ -327,12 +329,9 @@
FindFonts( char** fontdirs,
char** extensions )
{
- DIR* examples;
- struct dirent* ent;
-
- int i, max;
- char buffer[1025];
- struct stat statb;
+ int i, max;
+ char buffer[1025];
+ struct stat statb;
max = 0;
@@ -340,6 +339,10 @@
for ( i = 0; fontdirs[i] != NULL; ++i )
{
+ DIR* examples;
+ struct dirent* ent;
+
+
examples = opendir( fontdirs[i] );
if ( examples == NULL )
{
@@ -446,9 +449,9 @@
fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET );
if ( item->isbinary )
- putc( getRandom( 0, 0xff ), new );
+ putc( getRandom( 0, 0xFF ), new );
else if ( item->isascii )
- putc( getRandom( 0x20, 0x7e ), new );
+ putc( getRandom( 0x20, 0x7E ), new );
else
{
int hex = getRandom( 0, 15 );
@@ -555,7 +558,6 @@
char** argv )
{
char **dirs, **exts;
- char *pt, *end;
int dcnt = 0, ecnt = 0, rset = false, allexts = false;
int i;
time_t now;
@@ -567,7 +569,10 @@
for ( i = 1; i < argc; ++i )
{
- pt = argv[i];
+ char* pt = argv[i];
+ char* end;
+
+
if ( pt[0] == '-' && pt[1] == '-' )
++pt;
@@ -633,12 +638,21 @@
}
if ( allexts )
+ {
+ free( exts );
exts = NULL;
+ }
else if ( ecnt == 0 )
+ {
+ free( exts );
exts = default_ext_list;
+ }
if ( dcnt == 0 )
+ {
+ free( dirs );
dirs = default_dir_list;
+ }
if ( testfile != NULL )
ExecuteTest( testfile ); /* This should never return */
diff --git a/src/3rdparty/freetype/src/tools/glnames.py b/src/3rdparty/freetype/src/tools/glnames.py
index 55573b22fe..8810bf57f1 100644
--- a/src/3rdparty/freetype/src/tools/glnames.py
+++ b/src/3rdparty/freetype/src/tools/glnames.py
@@ -6,7 +6,7 @@
#
-# Copyright 1996-2000, 2003, 2005, 2007, 2008 by
+# Copyright 1996-2000, 2003, 2005, 2007, 2008, 2011 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
@@ -151,7 +151,7 @@ mac_standard_names = \
# The list of standard `SID' glyph names. For the official list,
# see Annex A of document at
#
-# http://partners.adobe.com/asn/developer/pdfs/tn/5176.CFF.pdf.
+# http://partners.adobe.com/public/developer/en/font/5176.CFF.pdf .
#
sid_standard_names = \
[
@@ -412,11 +412,10 @@ t1_expert_encoding = \
]
-# This data has been taken literally from the file `glyphlist.txt',
-# version 2.0, 22 Sept 2002. It is available from
+# This data has been taken literally from the files `glyphlist.txt'
+# and `zapfdingbats.txt' version 2.0, Sept 2002. It is available from
#
-# http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
-# http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt
+# http://sourceforge.net/adobe/aglfn/
#
adobe_glyph_list = """\
A;0041
@@ -4700,6 +4699,207 @@ zretroflexhook;0290
zstroke;01B6
zuhiragana;305A
zukatakana;30BA
+a100;275E
+a101;2761
+a102;2762
+a103;2763
+a104;2764
+a105;2710
+a106;2765
+a107;2766
+a108;2767
+a109;2660
+a10;2721
+a110;2665
+a111;2666
+a112;2663
+a117;2709
+a118;2708
+a119;2707
+a11;261B
+a120;2460
+a121;2461
+a122;2462
+a123;2463
+a124;2464
+a125;2465
+a126;2466
+a127;2467
+a128;2468
+a129;2469
+a12;261E
+a130;2776
+a131;2777
+a132;2778
+a133;2779
+a134;277A
+a135;277B
+a136;277C
+a137;277D
+a138;277E
+a139;277F
+a13;270C
+a140;2780
+a141;2781
+a142;2782
+a143;2783
+a144;2784
+a145;2785
+a146;2786
+a147;2787
+a148;2788
+a149;2789
+a14;270D
+a150;278A
+a151;278B
+a152;278C
+a153;278D
+a154;278E
+a155;278F
+a156;2790
+a157;2791
+a158;2792
+a159;2793
+a15;270E
+a160;2794
+a161;2192
+a162;27A3
+a163;2194
+a164;2195
+a165;2799
+a166;279B
+a167;279C
+a168;279D
+a169;279E
+a16;270F
+a170;279F
+a171;27A0
+a172;27A1
+a173;27A2
+a174;27A4
+a175;27A5
+a176;27A6
+a177;27A7
+a178;27A8
+a179;27A9
+a17;2711
+a180;27AB
+a181;27AD
+a182;27AF
+a183;27B2
+a184;27B3
+a185;27B5
+a186;27B8
+a187;27BA
+a188;27BB
+a189;27BC
+a18;2712
+a190;27BD
+a191;27BE
+a192;279A
+a193;27AA
+a194;27B6
+a195;27B9
+a196;2798
+a197;27B4
+a198;27B7
+a199;27AC
+a19;2713
+a1;2701
+a200;27AE
+a201;27B1
+a202;2703
+a203;2750
+a204;2752
+a205;276E
+a206;2770
+a20;2714
+a21;2715
+a22;2716
+a23;2717
+a24;2718
+a25;2719
+a26;271A
+a27;271B
+a28;271C
+a29;2722
+a2;2702
+a30;2723
+a31;2724
+a32;2725
+a33;2726
+a34;2727
+a35;2605
+a36;2729
+a37;272A
+a38;272B
+a39;272C
+a3;2704
+a40;272D
+a41;272E
+a42;272F
+a43;2730
+a44;2731
+a45;2732
+a46;2733
+a47;2734
+a48;2735
+a49;2736
+a4;260E
+a50;2737
+a51;2738
+a52;2739
+a53;273A
+a54;273B
+a55;273C
+a56;273D
+a57;273E
+a58;273F
+a59;2740
+a5;2706
+a60;2741
+a61;2742
+a62;2743
+a63;2744
+a64;2745
+a65;2746
+a66;2747
+a67;2748
+a68;2749
+a69;274A
+a6;271D
+a70;274B
+a71;25CF
+a72;274D
+a73;25A0
+a74;274F
+a75;2751
+a76;25B2
+a77;25BC
+a78;25C6
+a79;2756
+a7;271E
+a81;25D7
+a82;2758
+a83;2759
+a84;275A
+a85;276F
+a86;2771
+a87;2772
+a88;2773
+a89;2768
+a8;271F
+a90;2769
+a91;276C
+a92;276D
+a93;276A
+a94;276B
+a95;2774
+a96;2775
+a97;275B
+a98;275C
+a99;275D
+a9;2720
"""
@@ -5067,7 +5267,7 @@ def main():
write( "/* */\n" )
write( "/* PostScript glyph names. */\n" )
write( "/* */\n" )
- write( "/* Copyright 2005, 2008 by */\n" )
+ write( "/* Copyright 2005, 2008, 2011 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" )
diff --git a/src/3rdparty/freetype/src/tools/test_afm.c b/src/3rdparty/freetype/src/tools/test_afm.c
index f5f99363ca..24cd0c4f0e 100644
--- a/src/3rdparty/freetype/src/tools/test_afm.c
+++ b/src/3rdparty/freetype/src/tools/test_afm.c
@@ -118,7 +118,7 @@
if ( argc < 2 )
- return FT_Err_Invalid_Argument;
+ return FT_ERR( Invalid_Argument );
error = FT_Init_FreeType( &library );
if ( error )
diff --git a/src/3rdparty/freetype/src/tools/test_bbox.c b/src/3rdparty/freetype/src/tools/test_bbox.c
index e085c5b3d6..64b82c384b 100644
--- a/src/3rdparty/freetype/src/tools/test_bbox.c
+++ b/src/3rdparty/freetype/src/tools/test_bbox.c
@@ -88,6 +88,26 @@
};
+ /* dummy outline #3 with bbox of [0 100 128 128] precisely */
+ static FT_Vector dummy_vec_3[4] =
+ {
+ XVEC( 100.0, 127.0 ),
+ XVEC( 200.0, 127.0 ),
+ XVEC( 0.0, 136.0 ),
+ XVEC( 0.0, 100.0 )
+ };
+
+ static FT_Outline dummy_outline_3 =
+ {
+ 1,
+ 4,
+ dummy_vec_3,
+ dummy_tag_1,
+ dummy_contour_1,
+ 0
+ };
+
+
static void
dump_outline( FT_Outline* outline )
{
@@ -125,12 +145,14 @@
FT_Outline_Get_CBox( outline, &bbox );
time0 = get_time() - time0;
- printf( "time = %5.2f cbox = [%.2f %.2f %.2f %.2f]\n",
+ printf( "time = %6.3f cbox = [%8.4f %8.4f %8.4f %8.4f]\n",
((double)time0/10000.0),
XVAL( bbox.xMin ),
XVAL( bbox.yMin ),
XVAL( bbox.xMax ),
XVAL( bbox.yMax ) );
+ printf( "cbox_hex = [%08X %08X %08X %08X]\n",
+ bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );
time0 = get_time();
@@ -138,15 +160,17 @@
FT_Outline_Get_BBox( outline, &bbox );
time0 = get_time() - time0;
- printf( "time = %5.2f bbox = [%.2f %.2f %.2f %.2f]\n",
+ printf( "time = %6.3f bbox = [%8.4f %8.4f %8.4f %8.4f]\n",
((double)time0/10000.0),
XVAL( bbox.xMin ),
XVAL( bbox.yMin ),
XVAL( bbox.xMax ),
XVAL( bbox.yMax ) );
+ printf( "bbox_hex = [%08X %08X %08X %08X]\n",
+ bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );
}
-#define REPEAT 100000L
+#define REPEAT 1000000L
int main( int argc, char** argv )
{
@@ -155,6 +179,10 @@
printf( "outline #2\n" );
profile_outline( &dummy_outline_2, REPEAT );
+
+ printf( "outline #3\n" );
+ profile_outline( &dummy_outline_3, REPEAT );
+
return 0;
}
diff --git a/src/3rdparty/freetype/src/tools/test_trig.c b/src/3rdparty/freetype/src/tools/test_trig.c
index 8c8a544aa9..99ac1cf174 100644
--- a/src/3rdparty/freetype/src/tools/test_trig.c
+++ b/src/3rdparty/freetype/src/tools/test_trig.c
@@ -8,9 +8,8 @@
#define PI 3.14159265358979323846
#define SPI (PI/FT_ANGLE_PI)
-/* the precision in 16.16 fixed float points of the checks. Expect */
-/* between 2 and 5 noise LSB bits during operations, due to */
-/* rounding errors.. */
+/* the precision in 16.16 fixed-point checks. Expect between 2 and 5 */
+/* noise LSB bits during operations, due to rounding errors.. */
#define THRESHOLD 64
static error = 0;
@@ -18,14 +17,16 @@
static void
test_cos( void )
{
- FT_Fixed f1, f2;
- double d1, d2;
- int i;
+ int i;
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Fixed f1, f2;
+ double d2;
+
+
f1 = FT_Cos(i);
- d1 = f1/65536.0;
d2 = cos( i*SPI );
f2 = (FT_Fixed)(d2*65536.0);
@@ -39,18 +40,19 @@
}
-
static void
test_sin( void )
{
- FT_Fixed f1, f2;
- double d1, d2;
- int i;
+ int i;
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Fixed f1, f2;
+ double d2;
+
+
f1 = FT_Sin(i);
- d1 = f1/65536.0;
d2 = sin( i*SPI );
f2 = (FT_Fixed)(d2*65536.0);
@@ -67,14 +69,16 @@
static void
test_tan( void )
{
- FT_Fixed f1, f2;
- double d1, d2;
- int i;
+ int i;
- for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 )
+
+ for ( i = 0; i < FT_ANGLE_PI2 - 0x2000000L; i += 0x10000L )
{
+ FT_Fixed f1, f2;
+ double d2;
+
+
f1 = FT_Tan(i);
- d1 = f1/65536.0;
d2 = tan( i*SPI );
f2 = (FT_Fixed)(d2*65536.0);
@@ -91,12 +95,16 @@
static void
test_atan2( void )
{
- FT_Fixed c2, s2;
- double l, a, c1, s1;
- int i, j;
+ int i;
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Fixed c2, s2;
+ double l, a, c1, s1;
+ int j;
+
+
l = 5.0;
a = i*SPI;
@@ -118,16 +126,20 @@
}
}
+
static void
test_unit( void )
{
- FT_Vector v;
- double a, c1, s1;
- FT_Fixed c2, s2;
- int i;
+ int i;
+
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Vector v;
+ double a, c1, s1;
+ FT_Fixed c2, s2;
+
+
FT_Vector_Unit( &v, i );
a = ( i*SPI );
c1 = cos(a);
@@ -151,12 +163,15 @@
static void
test_length( void )
{
- FT_Vector v;
- FT_Fixed l, l2;
- int i;
+ int i;
+
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Vector v;
+ FT_Fixed l, l2;
+
+
l = (FT_Fixed)(500.0*65536.0);
v.x = (FT_Fixed)( l * cos( i*SPI ) );
v.y = (FT_Fixed)( l * sin( i*SPI ) );
@@ -175,19 +190,26 @@
static void
test_rotate( void )
{
- FT_Fixed c2, s2, c4, s4;
- FT_Vector v;
- double l, ra, a, c1, s1, cra, sra, c3, s3;
- int i, j, rotate;
+ int rotate;
+
- for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 )
+ for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000L )
{
+ double ra, cra, sra;
+ int i;
+
+
ra = rotate*SPI;
cra = cos( ra );
sra = sin( ra );
- for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+ for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L )
{
+ FT_Fixed c2, s2, c4, s4;
+ FT_Vector v;
+ double l, a, c1, s1, c3, s3;
+
+
l = 500.0;
a = i*SPI;