ref: 3780273e3e000a728adc97d0a35642347037ca1b
parent: c2cd00443b761e7bef512fcb77cf91f11376e01d
author: Werner Lemberg <[email protected]>
date: Thu Apr 26 09:34:36 EDT 2001
* builds/unix/config.guess, builds/unix/config.sub: Updated to latest versions from gnu.org. * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag. * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed() uncoditionally. * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H. Fix compiler warnings. * src/base/ftcalc.c: Fix (potential) compiler warnings. * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit fixed-point square root computation. It is now used even with 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) * src/base/ftbbox.c: Removed invalid "#include FT_BEZIER_H" line. * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use direct computations with 16.16 values instead of sub-divisions. It is now slower, but proves a point :-) * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c: Fixed the bezier stack depths. * src/base/ftcalc.c (FT_MulFix): Minor rounding fix. * builds/beos: Added BeOS-specific files to the old build system (no changes were necessary to support BeOS in the Jamfile though). * ftconfig.h, ftoption.h: Updated "ftconfig.h" to detect 64-bit int types on platforms where Autoconf is not available). Also removed FTCALC_USE_LONG_LONG and replaced it with FT_CONFIG_OPTION_FORCE_INT64. * builds/win32/freetype.dsp: Updated the Visual C++ project file. Doesn't create a DLL yet. * cffgload.c: Removed a compilation warning.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,35 +1,49 @@
+2001-04-26 Werner Lemberg <[email protected]>
+
+ * builds/unix/config.guess, builds/unix/config.sub: Updated to
+ latest versions from gnu.org.
+
+ * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag.
+
+ * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed()
+ uncoditionally.
+ * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H.
+ Fix compiler warnings.
+ * src/base/ftcalc.c: Fix (potential) compiler warnings.
+
2001-04-26 David Turner <[email protected]>
- * src/base/ftcalc.c (FT_SqrtFixed): corrected/optimised the 32-bit
- fixed-point square root. it is now used even with 64-bits
- ints, as it's simply _much_ faster than calling FT_Sqrt64 :-)
+ * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit
+ fixed-point square root computation. It is now used even with
+ 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-)
- * src/base/ftbbox.c : removed invalid "#include FT_BEZIER_H" line
+ * src/base/ftbbox.c: Removed invalid "#include FT_BEZIER_H" line.
2001-04-25 David Turner <[email protected]>
- * src/base/ftbbox.c (BBox_Cubic_Check): rewrote function to use
- direct computations with 16.16 values instead of sub-divisions.
- It is now slower, but proves a point :-)
+ * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use
+ direct computations with 16.16 values instead of sub-divisions. It
+ is now slower, but proves a point :-)
- * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c :
- fixed the bezier stack depths..
+ * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c:
+ Fixed the bezier stack depths.
- * src/base/ftcalc.c (FT_MulFix): minor rounding fix
+ * src/base/ftcalc.c (FT_MulFix): Minor rounding fix.
- * builds/beos : added BeOS-specific files to the old build system
- (no changes were necessary to support BeOS in the Jamfile though)
+ * builds/beos: Added BeOS-specific files to the old build system
+ (no changes were necessary to support BeOS in the Jamfile though).
2001-04-20 David Turner <[email protected]>
- * ftconfig.h, ftoption.h: updated "ftconfig.h" to detect 64-bit int
- types on platforms where Autoconf is not available). Also removed
- FTCALC_USE_LONG_LONG and replaced it with FT_CONFIG_OPTION_FORCE_INT64
+ * ftconfig.h, ftoption.h: Updated "ftconfig.h" to detect 64-bit int
+ types on platforms where Autoconf is not available). Also removed
+ FTCALC_USE_LONG_LONG and replaced it with
+ FT_CONFIG_OPTION_FORCE_INT64.
- * builds/win32/freetype.dsp: updated the Visual C++ project file. Doesn't
- create a DLL yet..
+ * builds/win32/freetype.dsp: Updated the Visual C++ project file.
+ Doesn't create a DLL yet.
- * cffgload.c: removed a compilation warning
+ * cffgload.c: Removed a compilation warning.
2001-04-10 Tom Kacvinsky <[email protected]>
--- a/docs/docmaker.py
+++ b/docs/docmaker.py
@@ -10,11 +10,11 @@
import fileinput, sys, string, glob
-# the Project's title, this can be over-ridden from the command line with
-# an option
+# The Project's title. This can be overridden from the command line with
+# an option.
project_title = "Project"
-# The following defines the HTML header used by all generated pages
+# The following defines the HTML header used by all generated pages.
#
html_header_1 = """\
<html>
@@ -38,52 +38,54 @@
html_header_3=""" API Reference</h1></center>
"""
-# this is recomputed later when the project title changes
+
+# This is recomputed later when the project title changes.
+#
html_header = html_header_1 + project_title + html_header_2 + project_title + html_header_3
-# The HTML footer used by all generated pages
+# The HTML footer used by all generated pages.
#
html_footer = """\
</body>
</html>"""
-# The header and footer used for each section
+# The header and footer used for each section.
#
section_title_header = "<center><h1>"
section_title_footer = "</h1></center>"
-# The header and footer used for code segments
+# The header and footer used for code segments.
#
code_header = "<font color=blue><pre>"
code_footer = "</pre></font>"
-# Paragraph header and footer
+# Paragraph header and footer.
#
para_header = "<p>"
para_footer = "</p>"
-# Block header and footer
+# Block header and footer.
#
block_header = "<center><table width=75%><tr><td>"
block_footer = "</td></tr></table><hr width=75%></center>"
-# Description header/footer
+# Description header/footer.
#
description_header = "<center><table width=87%><tr><td>"
description_footer = "</td></tr></table></center><br>"
-# Marker header/inter/footer combination
+# Marker header/inter/footer combination.
#
marker_header = "<center><table width=87% cellpadding=5><tr bgcolor=#EEEEFF><td><em><b>"
marker_inter = "</b></em></td></tr><tr><td>"
marker_footer = "</td></tr></table></center>"
-# Source code extracts header/footer
+# Source code extracts header/footer.
#
source_header = "<center><table width=87%><tr bgcolor=#D6E8FF width=100%><td><pre>"
source_footer = "</pre></table></center><br>"
-# Chapter header/inter/footer
+# Chapter header/inter/footer.
#
chapter_header = "<center><table width=75%><tr><td><h2>"
chapter_inter = "</h2><ul>"
@@ -92,8 +94,8 @@
current_section = None
-# This function is used to sort the index. It's a simple lexicographical
-# sort, except that it places capital letters before small ones.
+# This function is used to sort the index. It is a simple lexicographical
+# sort, except that it places capital letters before lowercase ones.
#
def index_sort( s1, s2 ):
if not s1:
@@ -126,7 +128,7 @@
return 0
-# 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[:]
@@ -136,8 +138,8 @@
return new_list
-# translate a single line of source to HTML. This will convert
-# a "<" into "<.", ">" into ">.", etc..
+# Translate a single line of source to HTML. This will convert
+# a "<" into "<.", ">" into ">.", etc.
#
def html_format( line )
result = string.replace( line, "<", "<." )
@@ -146,8 +148,8 @@
return result
-# The FreeType 2 reference is extracted from the source files. These contain
-# various comment blocks that follow one of the following formats:
+# The FreeType 2 reference is extracted from the source files. These
+# contain various comment blocks that follow one of the following formats:
#
# /**************************
# *
@@ -176,7 +178,7 @@
# /**************************/
#
# Each block contains a list of markers; each one can be followed by
-# some arbitrary text or a list of fields. Here's an example:
+# some arbitrary text or a list of fields. Here an example:
#
# <Struct>
# MyStruct
@@ -195,15 +197,15 @@
#
# Each field is simply of the format: WORD :: TEXT...
#
-# Note that typically each comment block is followed by some source
-# code declaration that may need to be kept in the reference.
+# Note that typically each comment block is followed by some source code
+# declaration that may need to be kept in the reference.
#
-# Note that markers can alternatively be written as "@MARKER:"
-# instead of "<MARKER>". All marker identifiers are converted to
-# lower case during parsing in order to simply sorting.
+# Note that markers can alternatively be written as "@MARKER:" instead of
+# "<MARKER>". All marker identifiers are converted to lower case during
+# parsing in order to simply sorting.
#
-# We associate with each block the following source lines that do not
-# begin with a comment. For example, the following:
+# We associate with each block the following source lines that do not begin
+# with a comment. For example, the following:
#
# /**********************************
# *
@@ -211,24 +213,24 @@
# *
# */
#
-# bla_bla_bla
-# bilip_bilip
+# bla_bla_bla
+# bilip_bilip
#
# /* - this comment acts as a separator - */
#
-# blo_blo_blo
+# blo_blo_blo
#
#
-# will only keep the first two lines of sources with
-# the "blabla" block.
+# will only keep the first two lines of sources with
+# the "blabla" block.
#
-# However, the comment will be kept, with following source lines
-# if it contains a starting '#' or '@' as in:
+# However, the comment will be kept, with following source lines if it
+# contains a starting '#' or '@' as in:
#
-# /*@.....*/
-# /*#.....*/
-# /* @.....*/
-# /* #.....*/
+# /*@.....*/
+# /*#.....*/
+# /* @.....*/
+# /* #.....*/
#
@@ -235,14 +237,13 @@
#############################################################################
#
-# The DocCode class is used to store source code lines
+# 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.
+# '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'.
+# 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:
@@ -278,11 +279,11 @@
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
+ # The code footer should be directly appended to the last code
+ # line to avoid an additional blank line.
#
sys.stdout.write( code_header )
- for line in self.lines[0 : l+1]:
+ for line in self.lines[0 : l+1]:
sys.stdout.write( '\n' + html_format(line) )
sys.stdout.write( code_footer )
@@ -370,8 +371,9 @@
cursor = cursor + len( word ) + 1
- # handle trailing periods, commas, etc. at the end of
- # cross references.
+
+ # Handle trailing periods, commas, etc. at the end of cross
+ # references.
#
if extra:
if cursor + len( extra ) + 1 > max_width:
@@ -410,10 +412,9 @@
#
# DocContent is used to store the content of a given marker.
#
-# The "self.items" list contains (field,elements) records, where
-# "field" corresponds to a given structure fields or function
-# parameter (indicated by a "::"), or NULL for a normal section
-# of text/code.
+# The "self.items" list contains (field,elements) records, where "field"
+# corresponds to a given structure fields or function parameter (indicated
+# by a "::"), or NULL for a normal section of text/code.
#
# Hence, the following example:
#
@@ -436,8 +437,8 @@
#
# in 'self.items'.
#
-# The DocContent object is entirely built at creation time; you must
-# pass a list of input text lines in the "lines_list" parameter.
+# The DocContent object is entirely built at creation time; you must pass a
+# list of input text lines in the "lines_list" parameter.
#
class DocContent:
@@ -449,7 +450,7 @@
paragraph = None # represents the current DocParagraph
code = None # represents the current DocCode
- elements = [] # the list of elements for the current field,
+ elements = [] # the list of elements for the current field;
# contains DocParagraph or DocCode objects
field = None # the current field
@@ -633,20 +634,18 @@
#############################################################################
#
-#
-# The DocBlock class is used to store a given comment block. It contains
+# The DocBlock class is used to store a given comment block. It contains
# a list of markers, as well as a list of contents for each marker.
#
-# "self.items" is a list of (marker, contents) elements, where
-# 'marker' is a lowercase marker string, and 'contents' is a DocContent
-# object.
+# "self.items" is a list of (marker, contents) elements, where 'marker' is
+# a lowercase marker string, and 'contents' is a DocContent object.
#
-# "self.source" is simply a list of text lines taken from the
-# uncommented source itself.
+# "self.source" is simply a list of text lines taken from the uncommented
+# source itself.
#
# Finally, "self.name" is a simple identifier used to uniquely identify
-# the block. It is taken from the first word of the first
-# paragraph of the first marker of a given block, i.e:
+# the block. It is taken from the first word of the first paragraph of the
+# first marker of a given block, i.e:
#
# <Type> Goo
# <Description> Bla bla bla
@@ -708,6 +707,7 @@
# This function adds a new element to 'self.items'.
+ #
# 'marker' is a marker string, or None.
# 'lines' is a list of text lines used to compute a list of
# DocContent objects.
@@ -726,7 +726,7 @@
l = len( lines )
# add a new marker only if its marker and its content list
- # aren't empty
+ # are not empty
#
if l > 0 and marker:
content = DocContent( lines )
@@ -931,14 +931,13 @@
abstract = block.find_content( "abstract" )
if self.sections.has_key( name ):
- # There is already a section with this name in our
- # list. We will try to complete it.
+ # There is already a section with this name in our list. We
+ # will try to complete it.
#
section = self.sections[name]
if section.abstract:
- # This section already has an abstract defined;
- # simply check that the new section doesn't
- # provide a new one.
+ # This section already has an abstract defined; simply check
+ # that the new section doesn't provide a new one.
#
if abstract:
section.block.print_error(
@@ -949,8 +948,8 @@
"second definition in " +
"'" + block.location() + "'" )
else:
- # The old section didn't contain an abstract; we are
- # now going to replace it.
+ # The old section didn't contain an abstract; we are now
+ # going to replace it.
#
section.abstract = abstract
section.description = block.find_content( "description" )
@@ -979,8 +978,8 @@
def prepare_files( self, file_prefix = None ):
- # prepare the section list, by computing section filenames
- # and the index
+ # prepare the section list, by computing section filenames and the
+ # index
#
if file_prefix:
prefix = file_prefix + "-"
@@ -996,8 +995,8 @@
else:
section.title = "UNKNOWN_SECTION_TITLE!"
- # sort section elements according to the <order> marker if
- # available
+
+ # sort section elements according to the <order> marker if available
#
for section in self.sections.values():
order = section.block.find_content( "order" )
@@ -1101,7 +1100,7 @@
-# Filter a given list of DocBlocks. Returns a new list of DocBlock objects
+# Filter a given list of DocBlocks. Returns a new list of DocBlock objects
# that only contains element whose "type" (i.e. first marker) is in the
# "types" parameter.
#
@@ -1152,7 +1151,8 @@
if block.name:
content = block.find_content( "chapter" )
if content:
- # it's a chapter definition -- add it to our list
+ # a chapter definition -- add it to our list
+ #
chapter = DocChapter( block )
self.chapters.append( chapter )
else:
@@ -1216,6 +1216,7 @@
print chapter_footer
# list lost sections
+ #
if self.lost_sections:
print chapter_header + "OTHER SECTIONS:" + chapter_inter
@@ -1234,6 +1235,7 @@
print chapter_footer
# index
+ #
print chapter_header + '<a href="' + self.section_list.index_filename + '">Index</a>' + chapter_footer
print html_footer
@@ -1265,8 +1267,8 @@
return block.section != None
-# Perform a lexicographical comparison of two DocBlock
-# objects. Returns -1, 0 or 1.
+# Perform a lexicographical comparison of two DocBlock objects. Returns -1,
+# 0 or 1.
#
def block_lexicographical_compare( b1, b2 ):
if not b1.name:
@@ -1285,7 +1287,7 @@
return 1
-# dump a list block as a single HTML page
+# Dump a list block as a single HTML page.
#
def dump_html_1( block_list ):
print html_header
@@ -1349,7 +1351,7 @@
# 1 - parse comment format 1
# 2 - parse comment format 2
#
- # 4 - wait for beginning of source (or comment ??)
+ # 4 - wait for beginning of source (or comment?)
# 5 - process source
#
comment = []
@@ -1414,15 +1416,15 @@
#
elif format == 1:
- # If the line doesn't begin with a "*", something went
- # wrong, and we must exit, and forget the current block.
+ # If the line doesn't begin with a "*", something went wrong,
+ # and we must exit, and forget the current block.
#
if l == 0 or line2[0] != '*':
block = []
format = 0
- # Otherwise, we test for an end of block, which is an
- # arbitrary number of '*', followed by '/'.
+ # Otherwise, we test for an end of block, which is an arbitrary
+ # number of '*', followed by '/'.
#
else:
i = 1
@@ -1449,8 +1451,8 @@
#
elif format == 2:
- # If the line doesn't begin with '/*' and end with '*/',
- # this is the end of the format 2 format.
+ # If the line doesn't begin with '/*' and end with '*/', this is
+ # the end of the format 2 format.
#
if l < 4 or line2[: 2] != '/*' or line2[-2 :] != '*/':
if block != []:
@@ -1538,7 +1540,7 @@
## section_list.dump_html_index()
-# If called from the command line
+# if called from the command line
#
if __name__ == '__main__':
main( sys.argv )
--- a/include/freetype/config/ftheader.h
+++ b/include/freetype/config/ftheader.h
@@ -342,10 +342,11 @@
/* */
/* @description: */
/* A macro used in #include statements to name the file containing */
- /* a small useful API to handle bezier arcs. Note that you _must_ */
- /* include FT_FREETYPE_H or FT_IMAGE_H before this header.. */
+ /* a small useful API to handle bezier arcs. Note that you _must_ */
+ /* include FT_FREETYPE_H or FT_IMAGE_H before this header. */
/* */
#define FT_BEZIER_H <freetype/ftbezier.h>
+
/*************************************************************************/
/* */
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -146,9 +146,9 @@
FT_Int32 y );
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
-
FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x );
+
+#ifdef FT_CONFIG_OPTION_OLD_CALCS
#define SQRT_64( z ) FT_Sqrt64( &z )
--- a/src/base/ftbbox.c
+++ b/src/base/ftbbox.c
@@ -28,6 +28,7 @@
#include FT_BBOX_H
#include FT_IMAGE_H
#include FT_OUTLINE_H
+#include FT_INTERNAL_CALC_H
typedef struct TBBox_Rec_
@@ -36,8 +37,8 @@
FT_BBox bbox;
} TBBox_Rec;
-
+
/*************************************************************************/
/* */
/* <Function> */
@@ -214,7 +215,7 @@
FT_Pos* min,
FT_Pos* max )
{
- FT_Pos stack[32*3+1], *arc;
+ FT_Pos stack[32*3 + 1], *arc;
arc = stack;
@@ -253,7 +254,7 @@
}
}
- /* Unknown direction - split the arc in two */
+ /* Unknown direction -- split the arc in two */
arc[6] = y4;
arc[1] = y1 = ( y1 + y2 ) / 2;
arc[5] = y4 = ( y4 + y3 ) / 2;
@@ -285,15 +286,28 @@
FT_Pos* min,
FT_Pos* max )
{
- FT_Pos a = y4 - 3*y3 + 3*y2 - y1;
- FT_Pos b = y3 - 2*y2 + y1;
- FT_Pos c = y2 - y1;
- FT_Pos d = y1;
- FT_Pos y;
- FT_Fixed uu;
-
- /* the polynom is "a*x^3 + 3b*x^2 + 3c*x + d", however, we also */
- /* have dP/dx(u) = 0, which implies that P(u) = b*u^2 + 2c*u + d */
+ /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */
+ FT_Pos b = y3 - 2*y2 + y1;
+ FT_Pos c = y2 - y1;
+ FT_Pos d = y1;
+ FT_Pos y;
+ FT_Fixed uu;
+
+ FT_UNUSED ( y4 );
+
+
+ /* The polynom is */
+ /* */
+ /* a*x^3 + 3b*x^2 + 3c*x + d . */
+ /* */
+ /* However, we also have */
+ /* */
+ /* dP/dx(u) = 0 , */
+ /* */
+ /* which implies that */
+ /* */
+ /* P(u) = b*u^2 + 2c*u + d */
+
if ( u > 0 && u < 0x10000L )
{
uu = FT_MulFix( u, u );
@@ -316,7 +330,7 @@
/* always compare first and last points */
if ( y1 < *min ) *min = y1;
else if ( y1 > *max ) *max = y1;
-
+
if ( y4 < *min ) *min = y4;
else if ( y4 > *max ) *max = y4;
@@ -334,38 +348,40 @@
return;
}
- /* there are some split points, now, find them.. */
+ /* There are some split points. Find them. */
{
FT_Pos a = y4 - 3*y3 + 3*y2 - y1;
FT_Pos b = y3 - 2*y2 + y1;
FT_Pos c = y2 - y1;
- FT_Pos d, t1;
+ FT_Pos d;
FT_Fixed t;
-
- /* we need to solve "ax�+2bx+c" here, without floating points !! */
- /* the trick is to normalize to a different representation in order */
- /* to use our 16.16 fixed point routines.. */
+
+
+ /* we need to solve "ax^2+2bx+c" here, without floating points! */
+ /* The trick is to normalize to a different representation in order */
+ /* to use our 16.16 fixed point routines. */
/* */
- /* we're going to compute FT_MulFix(b,b) and FT_MulFix(a,c) after */
- /* the normalisation. these values must fit in a single 16.16 */
+ /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after the */
+ /* the normalization. These values must fit into a single 16.16 */
/* value. */
/* */
- /* we normalize a, b and c to "8.16" fixed float values to ensure */
- /* that their product is held in a "16.16" value.. */
+ /* We normalize a, b, and c to "8.16" fixed float values to ensure */
+ /* that their product is held in a "16.16" value. */
/* */
{
FT_ULong t1, t2;
int shift = 0;
-
+
+
t1 = (FT_ULong)((a >= 0) ? a : -a );
t2 = (FT_ULong)((b >= 0) ? b : -b );
t1 |= t2;
t2 = (FT_ULong)((c >= 0) ? c : -c );
t1 |= t2;
-
- if ( t1 == 0 ) /* all coefficients are 0 !! */
+
+ if ( t1 == 0 ) /* all coefficients are 0! */
return;
-
+
if ( t1 > 0xFFFFFFL )
{
do
@@ -372,9 +388,8 @@
{
shift--;
t1 >>= 1;
- }
- while ( t1 > 0xFFFFFFL );
-
+ } while ( t1 > 0xFFFFFFL );
+
a >>= shift;
b >>= shift;
c >>= shift;
@@ -385,9 +400,8 @@
{
shift++;
t1 <<= 1;
- }
- while ( t1 < 0x800000L );
-
+ } while ( t1 < 0x800000L );
+
a <<= shift;
b <<= shift;
c <<= shift;
@@ -399,7 +413,7 @@
{
if ( b != 0 )
{
- t = - FT_DivFix( c, b )/2;
+ t = - FT_DivFix( c, b ) / 2;
test_cubic_zero( y1, y2, y3, y4, t, min, max );
}
}
@@ -412,23 +426,23 @@
if ( d == 0 )
{
- /* there is a single split point, at -b/a */
+ /* there is a single split point at -b/a */
t = - FT_DivFix( b, a );
test_cubic_zero( y1, y2, y3, y4, t, min, max );
}
else
{
- /* there are two solutions, we need to filter them though */
+ /* there are two solutions; we need to filter them though */
d = FT_SqrtFixed( (FT_Int32)d );
t = - FT_DivFix( b - d, a );
test_cubic_zero( y1, y2, y3, y4, t, min, max );
-
+
t = - FT_DivFix( b + d, a );
test_cubic_zero( y1, y2, y3, y4, t, min, max );
}
}
}
- }
+ }
#endif
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -239,32 +239,30 @@
FT_UInt32 y,
FT_Int64 *z )
{
- {
- FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+ FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2;
- lo1 = x & 0x0000FFFFU; hi1 = x >> 16;
- lo2 = y & 0x0000FFFFU; hi2 = y >> 16;
+ lo1 = x & 0x0000FFFFU; hi1 = x >> 16;
+ lo2 = y & 0x0000FFFFU; hi2 = y >> 16;
- lo = lo1 * lo2;
- i1 = lo1 * hi2;
- i2 = lo2 * hi1;
- hi = hi1 * hi2;
+ lo = lo1 * lo2;
+ i1 = lo1 * hi2;
+ i2 = lo2 * hi1;
+ hi = hi1 * hi2;
- /* Check carry overflow of i1 + i2 */
- i1 += i2;
- hi += (FT_UInt32)( i1 < i2 ) << 16;
+ /* Check carry overflow of i1 + i2 */
+ i1 += i2;
+ hi += (FT_UInt32)( i1 < i2 ) << 16;
- hi += i1 >> 16;
- i1 = i1 << 16;
+ hi += i1 >> 16;
+ i1 = i1 << 16;
- /* Check carry overflow of i1 + lo */
- lo += i1;
- hi += ( lo < i1 );
+ /* Check carry overflow of i1 + lo */
+ lo += i1;
+ hi += ( lo < i1 );
- z->lo = lo;
- z->hi = hi;
- }
+ z->lo = lo;
+ z->hi = hi;
}
@@ -271,18 +269,19 @@
static FT_UInt32
ft_div64by32( FT_UInt32 hi,
FT_UInt32 lo,
- FT_UInt32 y )
+ FT_UInt32 y )
{
FT_UInt r, q;
- FT_Int i;
-
+ FT_Int i;
+
+
q = 0;
- r = hi;
-
- if ( r >= y )
- return (FT_UInt32)0x7FFFFFFF;
-
- i = 32;
+ r = hi;
+
+ if ( r >= y )
+ return (FT_UInt32)0x7FFFFFFFL;
+
+ i = 32;
do
{
r <<= 1;
@@ -295,10 +294,9 @@
q |= 1;
}
lo <<= 1;
- }
- while (--i);
-
- return q;
+ } while ( --i );
+
+ return q;
}
@@ -310,6 +308,7 @@
{
register FT_UInt32 lo, hi, max;
+
max = x->lo > y->lo ? x->lo : y->lo;
lo = x->lo + y->lo;
hi = x->hi + y->hi + ( lo < max );
@@ -319,8 +318,6 @@
}
-
-
/* documentation is in freetype.h */
FT_EXPORT_DEF( FT_Long ) FT_MulDiv( FT_Long a,
@@ -327,7 +324,7 @@
FT_Long b,
FT_Long c )
{
- long s;
+ long s;
if ( a == 0 || b == c )
@@ -347,10 +344,10 @@
ft_multo64( a, b, &temp );
-
- temp2.hi = 0;
- temp2.lo = (FT_UInt32)(c >> 1);
- FT_Add64( &temp, &temp2, &temp );
+
+ temp2.hi = 0;
+ temp2.lo = (FT_UInt32)(c >> 1);
+ FT_Add64( &temp, &temp2, &temp );
a = ft_div64by32( temp.hi, temp.lo, b );
}
else
@@ -440,7 +437,7 @@
FT_Int32 y,
FT_Int64 *z )
{
- FT_Int32 s;
+ FT_Int32 s;
s = x; x = ABS( x );
@@ -447,6 +444,7 @@
s ^= y; y = ABS( y );
ft_multo64( x, y, z );
+
if ( s < 0 )
{
z->lo = (FT_UInt32)-(FT_Int32)z->lo;
@@ -476,7 +474,7 @@
if ( x->hi == 0 )
{
if ( y > 0 )
- q = (x->lo + (y >> 1)) / y;
+ q = ( x->lo + ( y >> 1 ) ) / y;
else
q = 0x7FFFFFFFL;
@@ -484,6 +482,7 @@
}
q = ft_div64by32( x->hi, x->lo, y );
+
return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
}
@@ -563,20 +562,20 @@
}
-
#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
#endif /* FT_LONG64 */
- /* a not-so-fast but working 16.16 fixed point square root function */
+ /* a not-so-fast but working 16.16 fixed point square root function */
+
FT_EXPORT_DEF( FT_Int32 ) FT_SqrtFixed( FT_Int32 x )
{
FT_UInt32 root, rem_hi, rem_lo, test_div;
FT_Int count;
+
root = 0;
if ( x > 0 )
@@ -584,19 +583,19 @@
rem_hi = 0;
rem_lo = x;
count = 24;
- do
+ do
{
- rem_hi = (rem_hi << 2) | (rem_lo >> 30);
+ rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 );
rem_lo <<= 2;
root <<= 1;
- test_div = (root << 1) + 1;
+ test_div = ( root << 1 ) + 1;
+
if ( rem_hi >= test_div )
{
rem_hi -= test_div;
root += 1;
}
- }
- while (--count);
+ } while ( --count );
}
return (FT_Int32)root;
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -247,7 +247,7 @@
TScan last_ey;
- FT_Vector bez_stack[32 * 3+1];
+ FT_Vector bez_stack[32 * 3 + 1];
int lev_stack[32];
FT_Outline outline;