ref: b211651ac9a40f3ed2d25474dcf9a9e09c8a81dd
parent: 8d3e6ecc3cf9af0d7c484960ca1dbe649245c08a
author: Werner Lemberg <[email protected]>
date: Fri Sep 12 12:27:48 EDT 2008
* autogen.sh, builds/unix/configure.raw, include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor beautifying. * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, include/freetype/ftlcdfil.h: Protect against FreeType 1. Some other minor fixes. * devel/ftoption.h: Synchronize with include/freetype/config/ftoption.h. Formatting, documentation improvements.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,63 +1,130 @@
+2008-09-13 Werner Lemberg <[email protected]>
+
+ * autogen.sh, builds/unix/configure.raw,
+ include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor
+ beautifying.
+
+ * include/freetype/ftadvanc.h, include/freetype/ftgasp.h,
+ include/freetype/ftlcdfil.h: Protect against FreeType 1.
+ Some other minor fixes.
+
+ * devel/ftoption.h: Synchronize with
+ include/freetype/config/ftoption.h.
+
2008-09-11 Werner Lemberg <[email protected]>
* src/base/ftbase.c: Include ftadvanc.c.
-2008-09-11 suzuki toshiya <[email protected]>
+2008-09-11 suzuki toshiya <[email protected]>
* builds/unix/ftconfig.in: Duplicate the cpp computation of
FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h.
- If FT_USE_AUTOCONF_SIZEOF_TYPES is defined, the cpp computation
- is disabled and the statically configured sizes are used.
- This fixes Savannah bug #21250
+ (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp
+ computation is disabled and the statically configured sizes are
+ used. This fixes Savannah bug #21250.
- * builds/unix/configure.raw: Add the checks to compare the
- cpp computation results of the bit length of int and long
- versus the sizes detected by running configure. If the results
- are different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to
- prioritize the results detected by running configure.
- New option --{enable|disable}-biarch-config is added to
- define or undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually.
+ * builds/unix/configure.raw: Add the checks to compare the cpp
+ computation results of the bit length of int and long versus the
+ sizes detected by running `configure'. If the results are
+ different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the
+ results.
+ New option --{enable|disable}-biarch-config is added to define or
+ undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually.
-2008-09-05 suzuki toshiya <[email protected]>
+2008-09-05 suzuki toshiya <[email protected]>
- * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon
- or ApplicationService framework is missing. Although this
- value is not used in building of FreeType2, it is written in
- freetype2.pc and freetype-config.
+ * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or
+ ApplicationService framework is missing. Although this value is not
+ used in building of FreeType2, it is written in `freetype2.pc' and
+ `freetype-config'.
-2008-09-01 david turner <[email protected]>
+2008-09-01 david turner <[email protected]>
- * include/freetype/ftcache.h, src/cache/ftccmap.c:
- modify FTC_CMapCache_Lookup to accept a negative cmap index
- to mean "use default cached FT_Face's charmap". This fixes
- Savannah issue #22625
+ * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap
+ index to mean `use default cached FT_Face's charmap'. This fixes
+ Savannah bug #22625.
+ * include/freetype/ftcache.h: Document it.
- * include/freetype/ftoption.h, include/freetype/ftconfig.h,
- builds/unix/ftconfig.in, include/freetype/freetype.h,
- src/base/ftcalc.c:
- Make FT_MulFix an inlined function. Also provide an assembler
- implementation for ARM architectures. this is done to speedup
+
+ Make FT_MulFix an inlined function. This is done to speed up
FreeType a little (on x86 3% when loading+hinting, 10% when
- rendering, ARM savings are more important though).
- Disable this by undefining FT_CONFIG_OPTION_INLINE_MULFIX in
- ftconfig.h
+ rendering, ARM savings are more important though). Disable this by
+ undefining FT_CONFIG_OPTION_INLINE_MULFIX.
- * include/freetype/ftadvanc.h, src/base/ftadvanc.c,
- include/freetype/config/ftheader.h, include/freetype/freetype.h,
- src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
- src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
- src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
- src/type1/t1gload.h, src/type1/t1gload.c:
- Add a new header named FT_ADVANCES_H declaring some new APIs
- to extract the advances of one or more glyphs without necessarily
- loading their outlines. Also provide 'fast loaders' for the
- TrueType, Type1 and CFF font drivers (more to come later)
+ Use of assembler code can now be controlled with
+ FT_CONFIG_OPTION_NO_ASSEMBLER.
- * autogen.sh: add checks for minimum version of the 'autotools'
- stuff.
+ * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in
+ [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler
+ implementation.
+ [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler
+ implementation taken from `ftcalc.c'.
+ [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro
+ which is defined to the platform-specific assembler implementation
+ of FT_MulFix.
+ [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER]
+ (FT_MULFIX_INLINED): New macro.
-2008-08-29 suzuki toshiya <[email protected]>
+ * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER,
+ FT_CONFIG_OPTION_INLINE_MULFIX): New macros.
+ * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED.
+
+ * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and
+ FT_MULFIX_INLINED.
+
+
+ Add a new header named FT_ADVANCES_H declaring some new APIs to
+ extract the advances of one or more glyphs without necessarily
+ loading their outlines. Also provide `fast loaders' for the
+ TrueType, Type1, and CFF font drivers (more to come later).
+
+ * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files.
+
+ * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro.
+ * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro.
+
+ * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc):
+ `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed',
+ respectively.
+
+ * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add
+ ftadvanc.c.
+
+ * src/cff/cffdrivr.c (cff_get_advances): New function.
+ (cff_driver_class): Register it.
+
+ * src/cff/cffgload.c (cff_decoder_set_width_only): New function.
+ (cff_decoder_parse_charstrings): Handle `width_only'.
+ (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY.
+
+ * src/cff/cffgload.h (cff_decoder): New element `width_only'.
+ (cff_decoder_set_width_only): New declaration.
+
+ * src/truetype/ttdriver.c (tt_get_advances): New function.
+ (tt_driver_class): Register it.
+
+ * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to...
+ (TT_Get_HMetrics, TT_Get_VMetrics): This.
+ Update callers.
+ * src/truetype/ttgload.h: Declare them.
+
+ * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New
+ function.
+ * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances.
+
+
+ Add checks for minimum version of the `autotools' stuff.
+
+ * autogen.sh: Implement it.
+ (get_major_version, get_minor_version, get_patch_version,
+ compare_to_minimum_version, check_tool_version): New auxiliary
+ functions.
+
+ * README.CVS: Document it.
+
+2008-08-29 suzuki toshiya <[email protected]>
+
* src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in
ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ).
@@ -73,7 +140,7 @@
(afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug
#24119.
-2008-08-19 suzuki toshiya <[email protected]>
+2008-08-19 suzuki toshiya <[email protected]>
* src/base/ftobjs.c (FT_Stream_New): Initialize *astream always,
even if passed library or arguments are invalid. This fixes a bug
@@ -83,7 +150,7 @@
(FT_Open_Face): Ditto (stream).
(load_face_in_embedded_rfork): Ditto (stream2).
-2008-08-18 suzuki toshiya <[email protected]>
+2008-08-18 suzuki toshiya <[email protected]>
* src/base/ftmac.c: Add a fallback to guess the availability of the
`ResourceIndex' type. It is used when built without configure
@@ -92,13 +159,13 @@
* builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0
explicitly, even if `ResourceIndex' is unavailable.
-2008-08-18 suzuki toshiya <[email protected]>
+2008-08-18 suzuki toshiya <[email protected]>
* builds/unix/configure.raw: In checking of Mac OS X features,
all-in-one header file `Carbon.h' is replaced by the minimum
header file `CoreServices.h', similar to current src/base/ftmac.c.
-2008-08-18 suzuki toshiya <[email protected]>
+2008-08-18 suzuki toshiya <[email protected]>
* src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of
sub-header when its code_count is 0. Many Japanese Dynalab fonts
@@ -285,7 +352,7 @@
* src/tools/docmaker/tohtml.py (make_html_para): Implement it.
Update header files accordingly.
-2008-06-24 suzuki toshiya <[email protected]>
+2008-06-24 suzuki toshiya <[email protected]>
* builds/unix/configure.raw: Check type `ResourceIndex' explicitly
and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5
@@ -318,7 +385,7 @@
* docs/CHANGES: Updated.
-2008-06-22 suzuki toshiya <[email protected]>
+2008-06-22 suzuki toshiya <[email protected]>
* builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option
but LDFLAGS does not, import it to LDFLAGS. The option is used to
@@ -549,7 +616,7 @@
* docs/CHANGES: Updated.
-2008-05-18 David Turner <[email protected]>
+2008-05-18 David Turner <[email protected]>
* src/psnames/psmodule.c (ft_wgl_extra_unicodes,
ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets,
@@ -1869,7 +1936,7 @@
* src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to
zero in case of error. This fixes Savannah bug #19689.
-2007-04-25 Boris Letocha <[email protected]>
+2007-04-25 Boris Letocha <[email protected]>
* src/truetype/ttobjs.c: Fix a typo that created a speed regression
in the TrueType bytecode loader.
--- a/README.CVS
+++ b/README.CVS
@@ -13,13 +13,13 @@
should work too, of course. Note that autogen.sh also sets up proper
file permissions for the `configure' and auxiliary scripts.
-The autogen.sh script now checks the version of your installed auto tools
-to see if they match the numbers above. If not, it will complain and suggest
-either upgrading or using an environment variable to point to a more recent
-version of the required tool(s).
+The autogen.sh script now checks the version of above three packages
+whether they match the numbers above. Otherwise it will complain and
+suggest either upgrading or using an environment variable to point to
+a more recent version of the required tool(s).
-Note that 'aclocal' is provided by the 'automake' package on Linux, and
-that 'libtoolize' is called 'glibtoolize' on Darwin (OS X)
+Note that `aclocal' is provided by the `automake' package on Linux,
+and that `libtoolize' is called `glibtoolize' on Darwin (OS X).
For static builds which don't use platform specific optimizations, no
--- a/autogen.sh
+++ b/autogen.sh
@@ -20,78 +20,78 @@
fi
}
-# extract major version
get_major_version ()
{
- echo $1 | sed -e 's/\([0-9]\+\)\..*/\1/g'
+ echo $1 | sed -e 's/\([0-9]\+\)\..*/\1/g'
}
get_minor_version ()
{
- echo $1 | sed -e 's/[0-9]\+\.\([0-9]\+\).*/\1/g'
+ echo $1 | sed -e 's/[0-9]\+\.\([0-9]\+\).*/\1/g'
}
get_patch_version ()
{
- # tricky, some version numbers don't include a patch
- # separated with a point, but something like 1.4-p6
- #
- patch=`echo $1 | sed -e 's/[0-9]\+\.[0-9]\+\.\([0-9]\+\).*/\1/g'`
+ # tricky: some version numbers don't include a patch
+ # separated with a point, but something like 1.4-p6
+ patch=`echo $1 | sed -e 's/[0-9]\+\.[0-9]\+\.\([0-9]\+\).*/\1/g'`
+ if test "$patch" = "$1"; then
+ patch=`echo $1 | sed -e 's/[0-9]\+\.[0-9]\+\-p\([0-9]\+\).*/\1/g'`
+ # if there isn't any patch number, default to 0
if test "$patch" = "$1"; then
- patch=`echo $1 | sed -e 's/[0-9]\+\.[0-9]\+\-p\([0-9]\+\).*/\1/g'`
- # if there isn't any patch number, default to 0
- if test "$patch" = "$1"; then
- patch=0
- fi
+ patch=0
fi
- echo $patch
+ fi
+ echo $patch
}
# $1: version to check
# $2: minimum version
+
compare_to_minimum_version ()
{
- MAJOR1=`get_major_version $1`
- MAJOR2=`get_major_version $2`
- if test $MAJOR1 -lt $MAJOR2; then
- echo 0
+ MAJOR1=`get_major_version $1`
+ MAJOR2=`get_major_version $2`
+ if test $MAJOR1 -lt $MAJOR2; then
+ echo 0
+ return
+ else
+ if test $MAJOR1 -gt $MAJOR2; then
+ echo 1
return
- else
- if test $MAJOR1 -gt $MAJOR2; then
- echo 1
- return
- fi
fi
+ fi
- MINOR1=`get_minor_version $1`
- MINOR2=`get_minor_version $2`
- if test $MINOR1 -lt $MINOR2; then
- echo 0
+ MINOR1=`get_minor_version $1`
+ MINOR2=`get_minor_version $2`
+ if test $MINOR1 -lt $MINOR2; then
+ echo 0
+ return
+ else
+ if test $MINOR1 -gt $MINOR2; then
+ echo 1
return
- else
- if test $MINOR1 -gt $MINOR2; then
- echo 1
- return
- fi
fi
+ fi
- PATCH1=`get_patch_version $1`
- PATCH2=`get_patch_version $2`
- if test $PATCH1 -lt $PATCH2; then
- echo 0
- else
- echo 1
- fi
+ PATCH1=`get_patch_version $1`
+ PATCH2=`get_patch_version $2`
+ if test $PATCH1 -lt $PATCH2; then
+ echo 0
+ else
+ echo 1
+ fi
}
-
-# check that version of a given tool against a minimum version number
+# check the version of a given tool against a minimum version number
+#
# $1: tool path
-# $2: tool usual name (e.g. 'aclocal')
-# $3: tool variable (e.g. 'ACLOCAL')
+# $2: tool usual name (e.g. `aclocal')
+# $3: tool variable (e.g. `ACLOCAL')
# $4: minimum version to check against
-# $5: option field index used to extract the tool version from the output of --version
-#
+# $5: option field index used to extract the tool version from the
+# output of --version
+
check_tool_version ()
{
field=$5
@@ -101,10 +101,11 @@
version=`$1 --version | head -1 | cut -d ' ' -f $field`
version_check=`compare_to_minimum_version $version $4`
if test "$version_check"x = 0x; then
- echo "ERROR: You $2 version is too old. minimum version $4 is required (yours is $version)"
- echo "please upgrade or use the $3 variable to point to a more recent one"
- echo ""
- exit 1
+ echo "ERROR: Your version of the \`$2' tool is too old."
+ echo " Minimum version $4 is required (yours is version $version)."
+ echo " Please upgrade or use the $3 variable to point to a more recent one."
+ echo ""
+ exit 1
fi
}
@@ -129,9 +130,9 @@
AUTOCONF=autoconf
fi
-check_tool_version $ACLOCAL aclocal ACLOCAL 1.10.1
+check_tool_version $ACLOCAL aclocal ACLOCAL 1.10.1
check_tool_version $LIBTOOLIZE libtoolize LIBTOOLIZE 2.2.4
-check_tool_version $AUTOCONF autoconf AUTOCONF 2.62
+check_tool_version $AUTOCONF autoconf AUTOCONF 2.62
# This sets freetype_major, freetype_minor, and freetype_patch.
eval `sed -nf version.sed include/freetype/freetype.h`
--- a/builds/unix/configure.raw
+++ b/builds/unix/configure.raw
@@ -126,7 +126,7 @@
AC_CHECK_SIZEOF([long])
-# checks for cpp computation of size of int and long ftconfig.in works
+# check whether cpp computation of size of int and long in ftconfig.in works
AC_MSG_CHECKING([cpp computation of bit length in ftconfig.in works])
orig_CPPFLAGS="${CPPFLAGS}"
@@ -133,6 +133,7 @@
CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
ac_clean_files="ft2build.h ftoption.h ftstdlib.h"
touch ft2build.h ftoption.h ftstdlib.h
+
cat > conftest.c <<\_ACEOF
#include <limits.h>
#define FT_CONFIG_OPTIONS_H "ftoption.h"
@@ -147,41 +148,45 @@
echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long}
echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long}
echo >> conftest.c "#endif"
+
${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh
eval `cat conftest.sh`
${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h
-if test x != "x${ac_cpp_ft_sizeof_int}" -a x != x"${ac_cpp_ft_sizeof_long}"
-then
+
+if test x != "x${ac_cpp_ft_sizeof_int}" \
+ -a x != x"${ac_cpp_ft_sizeof_long}"; then
unset ft_use_autoconf_sizeof_types
else
- ft_use_autoconf_sizeof_types="yes"
+ ft_use_autoconf_sizeof_types=yes
fi
+
AC_ARG_ENABLE(biarch-config,
[ --enable-biarch-config install biarch ftconfig.h to support multiple
- architechtures by single file], [], [])
+ architectures by single file], [], [])
case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in
- :yes:yes: )
- AC_MSG_RESULT([broken but use])
+ :yes:yes:)
+ AC_MSG_RESULT([broken but use it])
unset ft_use_autoconf_sizeof_types
;;
- ::no: )
- AC_MSG_RESULT([works but ignore])
- ft_use_autoconf_sizeof_types="yes"
+ ::no:)
+ AC_MSG_RESULT([works but ignore it])
+ ft_use_autoconf_sizeof_types=yes
;;
- ::yes: | ::: )
+ ::yes: | :::)
AC_MSG_RESULT([yes])
unset ft_use_autoconf_sizeof_types
;;
- * )
+ *)
AC_MSG_RESULT([no])
- ft_use_autoconf_sizeof_types="yes"
+ ft_use_autoconf_sizeof_types=yes
;;
esac
-if test xyes = x"${ft_use_autoconf_sizeof_types}"
-then
+
+if test x"${ft_use_autoconf_sizeof_types}" = xyes; then
AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES])
fi
+
CPPFLAGS="${orig_CPPFLAGS}"
--- a/builds/unix/ftconfig.in
+++ b/builds/unix/ftconfig.in
@@ -4,7 +4,7 @@
/* */
/* UNIX-specific configuration file (specification only). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -77,12 +77,14 @@
#undef FT_USE_AUTOCONF_SIZEOF_TYPES
#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES
+
#undef SIZEOF_INT
#undef SIZEOF_LONG
#define FT_SIZEOF_INT SIZEOF_INT
#define FT_SIZEOF_LONG SIZEOF_LONG
-#else /* ! FT_USE_AUTOCONF_SIZEOF_TYPES */
+#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */
+
/* Following cpp computation of the bit length of int and long */
/* is copied from default include/freetype/config/ftconfig.h. */
/* If any improvement is required for this file, it should be */
@@ -112,8 +114,9 @@
#error "Unsupported size of `long' type!"
#endif
-#endif /* ! FT_USE_AUTOCONF_SIZEOF_TYPES */
+#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */
+
/* Preferred alignment of data */
#define FT_ALIGNMENT 8
@@ -242,79 +245,13 @@
#endif /* FT_SIZEOF_LONG == 8 */
-#if !defined(FT_CONFIG_OPTION_NO_ASSEMBLER)
-/* provide assembler fragments for performance-critical
- * functions. these must be defined static __inline__
- * with GCC
- */
-#if defined(__GNUC__)
-# if defined(__arm__) && !defined(__thumb__)
-# define FT_MULFIX_ASSEMBLER FT_MulFix_arm
- static __inline__ FT_Int32
- FT_MulFix_arm( FT_Int32 a, FT_Int32 b )
- {
- register FT_Int32 t, t2;
- asm __volatile__ (
- "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
- "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
- "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
- "adds %1, %1, %0\n\t" /* %1 += %0 */
- "adc %2, %2, #0\n\t" /* %2 += carry */
- "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
- "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
- : "=r"(a), "=&r"(t2), "=&r"(t)
- : "r"(a), "r"(b)
- );
- return a;
- }
-# endif /* __arm__ */
-
-# if defined(i386)
-# define FT_MULFIX_ASSEMBLER FT_MulFix_i386
- static __inline__ FT_Int32
- FT_MulFix_i386( FT_Int32 a, FT_Int32 b )
- {
- register FT_Int32 result;
-
- __asm__ __volatile__ (
- "imul %%edx\n"
- "movl %%edx, %%ecx\n"
- "sarl $31, %%ecx\n"
- "addl $0x8000, %%ecx\n"
- "addl %%ecx, %%eax\n"
- "adcl $0, %%edx\n"
- "shrl $16, %%eax\n"
- "shll $16, %%edx\n"
- "addl %%edx, %%eax\n"
- : "=a"(result), "+d"(b)
- : "a"(a)
- : "%ecx"
- );
- return result;
- }
-# endif /* i386 */
-#endif /* __GNUC__ */
-#endif /* !NO_ASSEMBLER */
-
-#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
-# ifdef FT_MULFIX_ASSEMBLER
-# define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
-# endif
-#endif
-
-
-#define FT_BEGIN_STMNT do {
-#define FT_END_STMNT } while ( 0 )
-#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
-
-
/*************************************************************************/
/* */
/* A 64-bit data type will create compilation problems if you compile */
- /* in strict ANSI mode. To avoid them, we disable their use if */
- /* __STDC__ is defined. You can however ignore this rule by */
- /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
+ /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
+ /* is defined. You can however ignore this rule by defining the */
+ /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
/* */
#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
@@ -330,6 +267,82 @@
#endif /* __STDC__ */
#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+ /* Provide assembler fragments for performance-critical functions. */
+ /* These must be defined `static __inline__' with GCC. */
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ static __inline__ FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ asm __volatile__ (
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
+ "adds %1, %1, %0\n\t" /* %1 += %0 */
+ "adc %2, %2, #0\n\t" /* %2 += carry */
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
+ "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
+ : "=r"(a), "=&r"(t2), "=&r"(t)
+ : "r"(a), "r"(b) );
+ return a;
+ }
+
+#endif /* __arm__ && !__thumb__ */
+
+#if defined( i386 )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ static __inline__ FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x8000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $16, %%eax\n"
+ "shll $16, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "+d"(b)
+ : "a"(a)
+ : "%ecx" );
+ return result;
+ }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
+#endif
+#endif
#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
--- a/devel/ftoption.h
+++ b/devel/ftoption.h
@@ -117,6 +117,27 @@
/*************************************************************************/
/* */
+ /* If this macro is defined, do not try to use an assembler version of */
+ /* performance-critical functions (e.g. FT_MulFix). You should only do */
+ /* that to verify that the assembler function works properly, or to */
+ /* execute benchmark tests of the various implementations. */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, try to use an inlined assembler version of */
+ /* the `FT_MulFix' function, which is a `hotspot' when loading and */
+ /* hinting glyphs, and which should be executed as fast as possible. */
+ /* */
+ /* Note that if your compiler or CPU is not supported, this will default */
+ /* to the standard and portable implementation found in `ftcalc.c'. */
+ /* */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+ /*************************************************************************/
+ /* */
/* LZW-compressed file support. */
/* */
/* FreeType now handles font files that have been compressed with the */
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -4,7 +4,7 @@
/* */
/* ANSI-specific configuration file (specification only). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -43,6 +43,7 @@
#include FT_CONFIG_OPTIONS_H
#include FT_CONFIG_STANDARD_LIBRARY_H
+
FT_BEGIN_HEADER
@@ -212,6 +213,7 @@
#error "no 32bit type found -- please check your configuration files"
#endif
+
/* look up an integer type that is at least 32 bits */
#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
@@ -225,68 +227,7 @@
#endif
-#if !defined(FT_CONFIG_OPTION_NO_ASSEMBLER)
-/* provide assembler fragments for performance-critical
- * functions. these must be defined static __inline__
- * with GCC
- */
-#if defined(__GNUC__)
-# if defined(__arm__) && !defined(__thumb__)
-# define FT_MULFIX_ASSEMBLER FT_MulFix_arm
- static __inline__ FT_Int32
- FT_MulFix_arm( FT_Int32 a, FT_Int32 b )
- {
- register FT_Int32 t, t2;
- asm __volatile__ (
- "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
- "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
- "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
- "adds %1, %1, %0\n\t" /* %1 += %0 */
- "adc %2, %2, #0\n\t" /* %2 += carry */
- "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
- "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
- : "=r"(a), "=&r"(t2), "=&r"(t)
- : "r"(a), "r"(b)
- );
- return a;
- }
-# endif /* __arm__ */
-
-# if defined(i386)
-# define FT_MULFIX_ASSEMBLER FT_MulFix_i386
- static __inline__ FT_Int32
- FT_MulFix_i386( FT_Int32 a, FT_Int32 b )
- {
- register FT_Int32 result;
-
- __asm__ __volatile__ (
- "imul %%edx\n"
- "movl %%edx, %%ecx\n"
- "sarl $31, %%ecx\n"
- "addl $0x8000, %%ecx\n"
- "addl %%ecx, %%eax\n"
- "adcl $0, %%edx\n"
- "shrl $16, %%eax\n"
- "shll $16, %%edx\n"
- "addl %%edx, %%eax\n"
- : "=a"(result), "+d"(b)
- : "a"(a)
- : "%ecx"
- );
- return result;
- }
-# endif /* i386 */
-#endif /* __GNUC__ */
-#endif /* !NO_ASSEMBLER */
-
-#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
-# ifdef FT_MULFIX_ASSEMBLER
-# define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
-# endif
-#endif
-
-
/* determine whether we have a 64-bit int type for platforms without */
/* Autoconf */
#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
@@ -328,17 +269,12 @@
#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
-#define FT_BEGIN_STMNT do {
-#define FT_END_STMNT } while ( 0 )
-#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
-
-
/*************************************************************************/
/* */
/* A 64-bit data type will create compilation problems if you compile */
- /* in strict ANSI mode. To avoid them, we disable their use if */
- /* __STDC__ is defined. You can however ignore this rule by */
- /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
+ /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
+ /* is defined. You can however ignore this rule by defining the */
+ /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
/* */
#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
@@ -351,6 +287,86 @@
#endif /* __STDC__ */
#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+ /* Provide assembler fragments for performance-critical functions. */
+ /* These must be defined `static __inline__' with GCC. */
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ asm __volatile__ (
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
+ "adds %1, %1, %0\n\t" /* %1 += %0 */
+ "adc %2, %2, #0\n\t" /* %2 += carry */
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
+ "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
+ : "=r"(a), "=&r"(t2), "=&r"(t)
+ : "r"(a), "r"(b) );
+ return a;
+ }
+
+#endif /* __arm__ && !__thumb__ */
+
+#if defined( i386 )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x8000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $16, %%eax\n"
+ "shll $16, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "+d"(b)
+ : "a"(a)
+ : "%ecx" );
+ return result;
+ }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
+#endif
+#endif
#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
--- a/include/freetype/config/ftheader.h
+++ b/include/freetype/config/ftheader.h
@@ -728,6 +728,7 @@
*/
#define FT_GASP_H <freetype/ftgasp.h>
+
/*************************************************************************
*
* @macro:
@@ -735,9 +736,10 @@
*
* @description:
* A macro used in #include statements to name the file containing the
- * FreeType~2 API which returns individual and ranged glyph advances
+ * FreeType~2 API which returns individual and ranged glyph advances.
*/
-#define FT_ADVANCES_H <freetype/ftadvanc.h>
+#define FT_ADVANCES_H <freetype/ftadvanc.h>
+
/* */
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -112,25 +112,26 @@
/* file `ftconfig.h' either statically or through the */
/* `configure' script on supported platforms. */
/* */
-#undef FT_CONFIG_OPTION_FORCE_INT64
+#undef FT_CONFIG_OPTION_FORCE_INT64
/*************************************************************************/
/* */
- /* When this macro is defined, do not try to use an assembler version */
- /* of performance-critical functions (e.g. FT_MulFix). you should only */
- /* do that to verify that the assembler function works properly, or even */
- /* to benchmarks the various implementations... */
+ /* If this macro is defined, do not try to use an assembler version of */
+ /* performance-critical functions (e.g. FT_MulFix). You should only do */
+ /* that to verify that the assembler function works properly, or to */
+ /* execute benchmark tests of the various implementations. */
/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
/*************************************************************************/
/* */
- /* When this macro is defined, try to use an inlined assembler version */
- /* of the FT_MulFix function, which appears to be a hotspot when loading */
- /* and hinting glyphs. */
+ /* If this macro is defined, try to use an inlined assembler version of */
+ /* the `FT_MulFix' function, which is a `hotspot' when loading and */
+ /* hinting glyphs, and which should be executed as fast as possible. */
/* */
- /* note that if your compiler/cpu isn't supported, this will default to */
- /* the standard and portable implementation found in src/base/ftcalc.c */
+ /* Note that if your compiler or CPU is not supported, this will default */
+ /* to the standard and portable implementation found in `ftcalc.c'. */
/* */
#define FT_CONFIG_OPTION_INLINE_MULFIX
@@ -183,7 +184,7 @@
/* Do not #undef this macro here since the build system might define */
/* it for certain configurations only. */
/* */
-/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
/*************************************************************************/
@@ -224,8 +225,8 @@
/* Do not #undef these macros here since the build system might define */
/* them for certain configurations only. */
/* */
-/* #define FT_EXPORT(x) extern x */
-/* #define FT_EXPORT_DEF(x) x */
+/* #define FT_EXPORT(x) extern x */
+/* #define FT_EXPORT_DEF(x) x */
/*************************************************************************/
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -1056,9 +1056,7 @@
#define FT_FACE_FLAG_HINTER ( 1L << 11 )
#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 )
- /* */
-
/*************************************************************************
*
* @macro:
@@ -1167,9 +1165,7 @@
#define FT_HAS_FIXED_SIZES( face ) \
( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
- /* */
-
/*************************************************************************
*
* @macro:
@@ -1231,7 +1227,7 @@
/*************************************************************************/
/* */
- /* <Constant> */
+ /* <Const> */
/* FT_STYLE_FLAG_XXX */
/* */
/* <Description> */
@@ -2432,14 +2428,14 @@
#define FT_LOAD_MONOCHROME 0x1000
#define FT_LOAD_LINEAR_DESIGN 0x2000
#define FT_LOAD_NO_AUTOHINT 0x8000U
-#define FT_LOAD_ADVANCE_ONLY 0x10000U
+#define FT_LOAD_ADVANCE_ONLY 0x10000UL
- /* used internally only by certain font drivers ! */
-#define FT_LOAD_SBITS_ONLY 0x4000
-
/* */
+ /* used internally only by certain font drivers! */
+#define FT_LOAD_SBITS_ONLY 0x4000
+
/**************************************************************************
*
* @enum:
@@ -3439,6 +3435,12 @@
FT_Long c );
+ /* */
+
+ /* The following #if 0 ... #endif is for the documentation formatter, */
+ /* hiding the internal `FT_MULFIX_INLINED' macro. */
+
+#if 0
/*************************************************************************/
/* */
/* <Function> */
@@ -3468,13 +3470,21 @@
/* _second_ argument of this function; this can make a great */
/* difference. */
/* */
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+
+ /* */
+#endif
+
#ifdef FT_MULFIX_INLINED
-# define FT_MulFix(a,b) FT_MULFIX_INLINED(a,b)
+#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b )
#else
FT_EXPORT( FT_Long )
FT_MulFix( FT_Long a,
FT_Long b );
#endif
+
/*************************************************************************/
/* */
--- a/include/freetype/ftadvanc.h
+++ b/include/freetype/ftadvanc.h
@@ -2,9 +2,9 @@
/* */
/* ftadvanc.h */
/* */
-/* FreeType access the glyph advances (specification only). */
+/* Quick computation of advance widths (specification only). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
+/* Copyright 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -15,12 +15,42 @@
/* */
/***************************************************************************/
-#ifndef __FREETYPE_ADVANCE_H__
-#define __FREETYPE_ADVANCE_H__
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
#include <ft2build.h>
#include FT_FREETYPE_H
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * quick_advance
+ *
+ * @title:
+ * Quick retrieval of advance values
+ *
+ * @abstract:
+ * Retrieve horizontal and vertical advance values without processing
+ * glyph outlines, if possible.
+ *
+ * @description:
+ * This section contains functions to quickly extract advance values
+ * without handling glyph outlines, if possible.
+ */
+
+
/*************************************************************************/
/* */
/* <Const> */
@@ -27,21 +57,22 @@
/* FT_ADVANCE_FLAG_FAST_ONLY */
/* */
/* <Description> */
- /* a bit-flag to be or-ed to the 'flags' parameter of the */
- /* @FT_Get_Advance and @FT_Get_Advances. */
+ /* A bit-flag to be OR-ed with the `flags' parameter of the */
+ /* @FT_Get_Advance and @FT_Get_Advances functions. */
/* */
- /* when set, it indicates that you want these functions to fail */
- /* if the corresponding hinting mode or font driver doesn't */
- /* allow for very quick advance computation. */
+ /* If set, it indicates that you want these functions to fail if the */
+ /* corresponding hinting mode or font driver doesn't allow for very */
+ /* quick advance computation. */
/* */
- /* typically, unscaled, unhinted, bitmapped and light-hinted glyphs */
- /* can have their advance width(s) computed very quickly. */
+ /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */
+ /* or light-hinted can have their advance width computed very */
+ /* quickly. */
/* */
- /* not so for normal and bytecode hinted modes, which require */
- /* loading/scaling/hinting the glyph outline instead, which is */
- /* extremely slow by comparison */
+ /* Normal and bytecode hinted modes, which require loading, scaling, */
+ /* and hinting of the glyph outline, are extremely slow by */
+ /* comparison. */
/* */
-#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000U
+#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL
/*************************************************************************/
@@ -50,33 +81,37 @@
/* FT_Get_Advance */
/* */
/* <Description> */
- /* Retrieve the advance of a given glyph outline in a @FT_Face. */
- /* by default, the unhinted advance is returned in font units */
+ /* Retrieve the advance value of a given glyph outline in an */
+ /* @FT_Face. By default, the unhinted advance is returned in font */
+ /* units. */
/* */
/* <Input> */
- /* face :: source @FT_Face handle */
- /* gindex :: glyph index */
- /* load_flags :: a set of bit-flags similar to those used */
- /* when calling @FT_Load_Glyph, used to determine */
- /* what kind of advances you need. */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph, used to determine what kind */
+ /* of advances you need. */
/* <Output> */
- /* padvance :: the advance value, in either font units or 16.16 */
+ /* padvance :: The advance value, in either font units or 16.16 */
/* format. */
/* */
- /* if @FT_LOAD_VERTICAL_LAYOUT is set, this is the */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */
/* vertical advance corresponding to a vertical layout. */
- /* otherwise, it's the horizontal advance in an */
+ /* Otherwise, it is the horizontal advance in a */
/* horizontal layout. */
+ /* */
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
/* <Note> */
/* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
- /* if the corresponding's font backend doesn't have a quick way to */
+ /* if the corresponding font backend doesn't have a quick way to */
/* retrieve the advances. */
/* */
- /* A scaled advance is returned in 16.16 format, but isn't */
- /* transformed by the affine transform specified by @FT_Set_Transform */
+ /* A scaled advance is returned in 16.16 format but isn't transformed */
+ /* by the affine transformation specified by @FT_Set_Transform. */
/* */
FT_EXPORT( FT_Error )
FT_Get_Advance( FT_Face face,
@@ -84,6 +119,7 @@
FT_UInt load_flags,
FT_Fixed *padvance );
+
/*************************************************************************/
/* */
/* <Function> */
@@ -90,34 +126,40 @@
/* FT_Get_Advances */
/* */
/* <Description> */
- /* Retrieve the advance of several glyph outlines in a @FT_Face. */
- /* by default, the unhinted advances are returned in font units */
+ /* Retrieve the advance values of several glyph outlines in an */
+ /* @FT_Face. By default, the unhinted advances are returned in font */
+ /* units. */
/* */
/* <Input> */
- /* face :: source @FT_Face handle */
- /* start :: first glyph index */
- /* count :: number of advances you want to retrieve */
- /* load_flags :: a set of bit-flags similar to those used when */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* start :: The first glyph index. */
+ /* */
+ /* count :: The number of advance values you want to retrieve. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
/* calling @FT_Load_Glyph. */
/* */
/* <Output> */
- /* padvance :: the advances, in either font units or 16.16 format. */
- /* this array must contain at least 'count' elements */
+ /* padvance :: The advances, in either font units or 16.16 format. */
+ /* This array must contain at least `count' elements. */
/* */
- /* if @FT_LOAD_VERTICAL_LAYOUT is set, these are the */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */
/* vertical advances corresponding to a vertical layout. */
- /* otherwise, they are the horizontal advances in an */
+ /* Otherwise, they are the horizontal advances in a */
/* horizontal layout. */
+ /* */
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
/* <Note> */
/* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
- /* if the corresponding's font backend doesn't have a quick way to */
+ /* if the corresponding font backend doesn't have a quick way to */
/* retrieve the advances. */
/* */
- /* Scaled advances are returned in 16.16 format, but aren't */
- /* transformed by the affine transform specified by @FT_Set_Transform */
+ /* Scaled advances are returned in 16.16 format but aren't */
+ /* transformed by the affine transformation specified by */
+ /* @FT_Set_Transform. */
/* */
FT_EXPORT( FT_Error )
FT_Get_Advances( FT_Face face,
@@ -128,4 +170,10 @@
/* */
-#endif /* __FREETYPE_ADVANCE_H__ */
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
--- a/include/freetype/ftcache.h
+++ b/include/freetype/ftcache.h
@@ -609,8 +609,8 @@
* The source face ID.
*
* cmap_index ::
- * The index of the charmap in the source face.
- * Any negative value means to use the cache FT_Face's default charmap.
+ * The index of the charmap in the source face. Any negative value
+ * means to use the cache @FT_Face's default charmap.
*
* char_code ::
* The character code (in the corresponding charmap).
--- a/include/freetype/ftchapters.h
+++ b/include/freetype/ftchapters.h
@@ -90,6 +90,7 @@
/* computations */
/* list_processing */
/* outline_processing */
+/* quick_advance */
/* bitmap_handling */
/* raster */
/* glyph_stroker */
--- a/include/freetype/ftgasp.h
+++ b/include/freetype/ftgasp.h
@@ -22,6 +22,13 @@
#include <ft2build.h>
#include FT_FREETYPE_H
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
/***************************************************************************
*
* @section:
--- a/include/freetype/ftlcdfil.h
+++ b/include/freetype/ftlcdfil.h
@@ -23,6 +23,12 @@
#include <ft2build.h>
#include FT_FREETYPE_H
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
FT_BEGIN_HEADER
--- a/include/freetype/internal/ftdriver.h
+++ b/include/freetype/internal/ftdriver.h
@@ -91,11 +91,13 @@
(*FT_CharMap_CharNextFunc)( FT_CharMap charmap,
FT_Long charcode );
+
typedef FT_Error
(*FT_Face_GetKerningFunc)( FT_Face face,
FT_UInt left_glyph,
FT_UInt right_glyph,
FT_Vector* kerning );
+
typedef FT_Error
(*FT_Face_AttachFunc)( FT_Face face,
--- a/src/base/Jamfile
+++ b/src/base/Jamfile
@@ -1,6 +1,6 @@
# FreeType 2 src/base Jamfile
#
-# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 by
+# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
--- a/src/base/ftadvanc.c
+++ b/src/base/ftadvanc.c
@@ -1,7 +1,26 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.c */
+/* */
+/* Quick computation of advance widths (body). */
+/* */
+/* Copyright 2008 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. */
+/* */
+/***************************************************************************/
+
+
#include <ft2build.h>
#include FT_ADVANCES_H
#include FT_INTERNAL_OBJECTS_H
+
static FT_Error
_ft_face_scale_advances( FT_Face face,
FT_Fixed* advances,
@@ -11,38 +30,43 @@
FT_Fixed scale;
FT_UInt nn;
- if ( (flags & FT_LOAD_NO_SCALE) )
+
+ if ( flags & FT_LOAD_NO_SCALE )
return FT_Err_Ok;
if ( face->size == NULL )
return FT_Err_Invalid_Size_Handle;
- if ( !(flags & FT_LOAD_VERTICAL_LAYOUT) )
- scale = face->size->metrics.x_scale;
- else
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
scale = face->size->metrics.y_scale;
+ else
+ scale = face->size->metrics.x_scale;
- /* this must be the same computation than to get linearHori/VertAdvance
- * (see FT_Load_Glyph() implementation in src/base/ftobjs.c */
- for (nn = 0; nn < count; nn++)
+ /* this must be the same computation as to get linearHori/VertAdvance */
+ /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c */
+
+ for ( nn = 0; nn < count; nn++ )
advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
- return 0;
+ return FT_Err_Ok;
}
-/* at the moment, we can perform fast advance retrieval only in
- the following cases:
+ /* at the moment, we can perform fast advance retrieval only in */
+ /* the following cases: */
+ /* */
+ /* - unscaled load */
+ /* - unhinted load */
+ /* - light-hinted load */
- - unscaled load
- - unhinted load
- - light-hinted load
- */
-#define LOAD_ADVANCE_FAST_CHECK(flags) \
- (((flags & (FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING)) != 0) || \
- FT_LOAD_TARGET_MODE(flags) == FT_RENDER_MODE_LIGHT)
+#define LOAD_ADVANCE_FAST_CHECK( flags ) \
+ ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \
+ FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
- FT_EXPORT_DEF(FT_Error)
+
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
FT_Get_Advance( FT_Face face,
FT_UInt gindex,
FT_UInt flags,
@@ -50,22 +74,24 @@
{
FT_Face_GetAdvancesFunc func;
+
if ( !face )
return FT_Err_Invalid_Face_Handle;
- if (gindex >= (FT_UInt) face->num_glyphs )
+ if ( gindex >= (FT_UInt)face->num_glyphs )
return FT_Err_Invalid_Glyph_Index;
func = face->driver->clazz->get_advances;
- if (func != NULL && LOAD_ADVANCE_FAST_CHECK(flags))
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
{
FT_Error error;
+
error = func( face, gindex, 1, flags, padvance );
- if (!error)
+ if ( !error )
return _ft_face_scale_advances( face, padvance, 1, flags );
- if (error != FT_Err_Unimplemented_Feature)
+ if ( error != FT_Err_Unimplemented_Feature )
return error;
}
@@ -73,7 +99,9 @@
}
- FT_EXPORT_DEF(FT_Error)
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
FT_Get_Advances( FT_Face face,
FT_UInt start,
FT_UInt count,
@@ -82,46 +110,54 @@
{
FT_Face_GetAdvancesFunc func;
FT_UInt num, end, nn;
- FT_Error error = 0;
+ FT_Error error = FT_Err_Ok;
+
if ( !face )
return FT_Err_Invalid_Face_Handle;
- num = (FT_UInt) face->num_glyphs;
+ num = (FT_UInt)face->num_glyphs;
end = start + count;
- if (start >= num || end < start || end > num)
+ if ( start >= num || end < start || end > num )
return FT_Err_Invalid_Glyph_Index;
- if (count == 0)
- return FT_Err_Ok;
+ if ( count == 0 )
+ return FT_Err_Ok;
func = face->driver->clazz->get_advances;
- if (func != NULL && LOAD_ADVANCE_FAST_CHECK(flags))
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
{
error = func( face, start, count, flags, padvances );
- if (!error) goto Exit;
+ if ( !error )
+ goto Exit;
- if (error != FT_Err_Unimplemented_Feature)
+ if ( error != FT_Err_Unimplemented_Feature )
return error;
}
- error = 0;
+ error = FT_Err_Ok;
- if ((flags & FT_ADVANCE_FLAG_FAST_ONLY) != 0)
+ if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
return FT_Err_Unimplemented_Feature;
flags |= FT_LOAD_ADVANCE_ONLY;
- for (nn = 0; nn < count; nn++)
+ for ( nn = 0; nn < count; nn++ )
{
- error = FT_Load_Glyph( face, start+nn, flags );
- if (error) break;
+ error = FT_Load_Glyph( face, start + nn, flags );
+ if ( error )
+ break;
- padvances[nn] = (flags & FT_LOAD_VERTICAL_LAYOUT)
- ? face->glyph->advance.x
- : face->glyph->advance.y;
+ padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? face->glyph->advance.x
+ : face->glyph->advance.y;
}
- if (error) return error;
+ if ( error )
+ return error;
+
Exit:
return _ft_face_scale_advances( face, padvances, count, flags );
}
+
+
+/* END */
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -38,8 +38,8 @@
#include FT_INTERNAL_DEBUG_H
#include FT_INTERNAL_OBJECTS_H
-#ifdef FT_MULFIX_INLINED
-#undef FT_MulFix
+#ifdef FT_MULFIX_INLINED
+#undef FT_MulFix
#endif
/* we need to define a 64-bits data type here */
@@ -197,18 +197,32 @@
FT_Long b )
{
#ifdef FT_MULFIX_ASSEMBLER
- return FT_MULFIX_ASSEMBLER(a,b);
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
#else
+
FT_Int s = 1;
FT_Long c;
- if ( a < 0 ) { a = -a; s = -1; }
- if ( b < 0 ) { b = -b; s = -s; }
+ if ( a < 0 )
+ {
+ a = -a;
+ s = -1;
+ }
+ if ( b < 0 )
+ {
+ b = -b;
+ s = -s;
+ }
+
c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
- return ( s > 0 ) ? c : -c ;
-#endif
+
+ return ( s > 0 ) ? c : -c;
+
+#endif /* FT_MULFIX_ASSEMBLER */
}
@@ -421,7 +435,9 @@
FT_Long b )
{
#ifdef FT_MULFIX_ASSEMBLER
- return FT_MULFIX_ASSEMBLER(a,b);
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
#elif 0
/*
--- a/src/base/rules.mk
+++ b/src/base/rules.mk
@@ -3,7 +3,7 @@
#
-# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007 by
+# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
@@ -46,7 +46,6 @@
$(BASE_DIR)/fttrigon.c \
$(BASE_DIR)/ftutil.c \
$(BASE_DIR)/ftadvanc.c
-
# Base layer `extensions' sources
#
--- a/src/cache/ftccmap.c
+++ b/src/cache/ftccmap.c
@@ -4,7 +4,7 @@
/* */
/* FreeType CharMap cache (body) */
/* */
-/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
+/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -290,14 +290,14 @@
FT_UInt32 hash;
FT_Int no_cmap_change = 0;
- if (cmap_index < 0)
+
+ if ( cmap_index < 0 )
{
- /* treat a negative cmap index as a special value that
- * means you don't want to change the FT_Face's character
- * map through this call. this can be useful when the
- * face requester callback already set the face's charmap
- * to the appropriate value.
- */
+ /* Treat a negative cmap index as a special value, meaning that you */
+ /* don't want to change the FT_Face's character map through this */
+ /* call. This can be useful if the face requester callback already */
+ /* sets the face's charmap to the appropriate value. */
+
no_cmap_change = 1;
cmap_index = 0;
}
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -4,7 +4,7 @@
/* */
/* OpenType font driver implementation (body). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -187,7 +187,7 @@
}
- FT_CALLBACK_DEF(FT_Error)
+ FT_CALLBACK_DEF( FT_Error )
cff_get_advances( FT_Face ftface,
FT_UInt start,
FT_UInt count,
@@ -194,24 +194,28 @@
FT_UInt flags,
FT_Fixed* advances )
{
- CFF_Face face = (CFF_Face) ftface;
+ CFF_Face face = (CFF_Face)ftface;
FT_UInt nn;
- FT_Error error = 0;
- FT_GlyphSlot slot = face->root.glyph;
+ FT_Error error = CFF_Err_Ok;
+ FT_GlyphSlot slot = face->root.glyph;
+
flags |= FT_LOAD_ADVANCE_ONLY;
- for (nn = 0; nn < count; nn++)
+ for ( nn = 0; nn < count; nn++ )
{
error = Load_Glyph( slot, face->root.size, start+nn, flags );
- if (error) break;
+ if ( error )
+ break;
- advances[nn] = (flags & FT_LOAD_VERTICAL_LAYOUT)
- ? slot->advance.y
- : slot->advance.x;
+ advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? slot->advance.y
+ : slot->advance.x;
}
+
return error;
}
+
/*
* GLYPH DICT SERVICE
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -384,6 +384,7 @@
decoder->hint_mode = hint_mode;
}
+
FT_LOCAL_DEF( void )
cff_decoder_set_width_only( CFF_Decoder* decoder )
{
@@ -390,6 +391,7 @@
decoder->width_only = 1;
}
+
/* this function is used to select the subfont */
/* and the locals subrs array */
FT_LOCAL_DEF( FT_Error )
@@ -1205,9 +1207,9 @@
decoder->glyph_width = decoder->nominal_width +
( stack[0] >> 16 );
- if (decoder->width_only)
+ if ( decoder->width_only )
{
- /* we only want the advance width, stop here */
+ /* we only want the advance width; stop here */
break;
}
@@ -2570,11 +2572,11 @@
cff_decoder_init( &decoder, face, size, glyph, hinting,
FT_LOAD_TARGET_MODE( load_flags ) );
- if ((load_flags & FT_LOAD_ADVANCE_ONLY) != 0)
+ if ( load_flags & FT_LOAD_ADVANCE_ONLY )
cff_decoder_set_width_only( &decoder );
decoder.builder.no_recurse =
- (FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
+ (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
/* now load the unscaled outline */
error = cff_get_glyph_data( face, glyph_index,
@@ -2681,7 +2683,7 @@
has_vertical_info = FT_BOOL( face->vertical_info &&
face->vertical.number_Of_VMetrics > 0 &&
- face->vertical.long_metrics != 0 );
+ face->vertical.long_metrics );
/* get the vertical metrics from the vtmx table if we have one */
if ( has_vertical_info )
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -4,7 +4,7 @@
/* */
/* TrueType font driver implementation (body). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -134,17 +134,20 @@
{
FT_UInt nn;
TT_Face face = (TT_Face) ttface;
- FT_Bool check = FT_BOOL(!(flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH));
+ FT_Bool check = FT_BOOL(
+ !( flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) );
+
/* XXX: TODO: check for sbits */
- if (flags & FT_LOAD_VERTICAL_LAYOUT)
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
{
- for (nn = 0; nn < count; nn++)
+ for ( nn = 0; nn < count; nn++ )
{
FT_Short tsb;
FT_UShort ah;
+
TT_Get_VMetrics( face, start + nn, check, &tsb, &ah );
advances[nn] = ah;
}
@@ -151,16 +154,18 @@
}
else
{
- for (nn = 0; nn < count; nn++)
+ for ( nn = 0; nn < count; nn++ )
{
FT_Short lsb;
FT_UShort aw;
+
TT_Get_HMetrics( face, start + nn, check, &lsb, &aw );
advances[nn] = aw;
}
}
- return 0;
+
+ return TT_Err_Ok;
}
/*************************************************************************/
--- a/src/truetype/ttgload.h
+++ b/src/truetype/ttgload.h
@@ -4,7 +4,7 @@
/* */
/* TrueType Glyph Loader (specification). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -34,7 +34,7 @@
FT_LOCAL( void )
TT_Init_Glyph_Loading( TT_Face face );
- FT_LOCAL(void)
+ FT_LOCAL( void )
TT_Get_HMetrics( TT_Face face,
FT_UInt idx,
FT_Bool check,
@@ -41,7 +41,7 @@
FT_Short* lsb,
FT_UShort* aw );
- FT_LOCAL(void)
+ FT_LOCAL( void )
TT_Get_VMetrics( TT_Face face,
FT_UInt idx,
FT_Bool check,
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -4,7 +4,7 @@
/* */
/* Type 1 Glyph Loader (body). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -215,12 +215,15 @@
FT_UInt nn;
FT_Error error;
- if (load_flags & FT_LOAD_VERTICAL_LAYOUT)
+ FT_UNUSED( load_flags );
+
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
{
- for (nn = 0; nn < count; nn++)
- advances[nn] = 0;
+ for ( nn = 0; nn < count; nn++ )
+ advances[nn] = 0;
- return T1_Err_Ok;
+ return T1_Err_Ok;
}
error = psaux->t1_decoder_funcs->init( &decoder,
@@ -235,14 +238,12 @@
if ( error )
return error;
- FT_UNUSED(load_flags);
-
decoder.builder.metrics_only = 1;
decoder.builder.load_points = 0;
- decoder.num_subrs = type1->num_subrs;
- decoder.subrs = type1->subrs;
- decoder.subrs_len = type1->subrs_len;
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
decoder.buildchar = face->buildchar;
decoder.len_buildchar = face->len_buildchar;
@@ -250,11 +251,12 @@
for ( nn = 0; nn < count; nn++ )
{
error = T1_Parse_Glyph( &decoder, first + nn );
- if (!error)
+ if ( !error )
advances[nn] = decoder.builder.advance.x;
else
advances[nn] = 0;
}
+
return T1_Err_Ok;
}
--- a/src/type1/t1gload.h
+++ b/src/type1/t1gload.h
@@ -4,7 +4,7 @@
/* */
/* Type 1 Glyph Loader (specification). */
/* */
-/* Copyright 1996-2001, 2002, 2003 by */
+/* Copyright 1996-2001, 2002, 2003, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */