summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorDobroslaw Kijowski2016-04-14 17:12:30 +0200
committerDobroslaw Kijowski2016-04-14 17:12:30 +0200
commitc229c4d2d44f613f18db5adf608842b405d59b5a (patch)
tree3220efc27e42fb149d3d8078204d407513bfc712
parent003889a9f9c2323e063b366b20ff0dd8b0b4234b (diff)
downloadaur-c229c4d2d44f613f18db5adf608842b405d59b5a.tar.gz
* Upgrade to 2.6.3.
* Download patches directly from github.
-rw-r--r--.SRCINFO28
-rw-r--r--01-freetype-2.6.2-enable-valid.patch20
-rw-r--r--02-upstream-2015.12.05.patch1098
-rw-r--r--03-infinality-2.6.2-2015.12.05.patch5881
-rw-r--r--CHANGELOG15
-rw-r--r--PKGBUILD32
-rw-r--r--infinality-settings-generic1137
-rwxr-xr-xinfinality-settings.sh74
-rwxr-xr-xxft-settings.sh15
9 files changed, 45 insertions, 8255 deletions
diff --git a/.SRCINFO b/.SRCINFO
index beca6422d42..6ed4256bb20 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,8 +1,8 @@
# Generated by mksrcinfo v8
-# Wed Feb 17 08:43:24 UTC 2016
+# Thu Apr 14 15:12:21 UTC 2016
pkgbase = freetype2-infinality
pkgdesc = TrueType font rendering library with Infinality patches and custom settings.
- pkgver = 2.6.2
+ pkgver = 2.6.3
pkgrel = 1
url = http://freetype.sourceforge.net
install = infinality.install
@@ -19,24 +19,24 @@ pkgbase = freetype2-infinality
depends = xorg-xrdb
depends = libpng
depends = harfbuzz
- provides = freetype2=2.6.2
+ provides = freetype2=2.6.3
provides = freetype2-infinality
provides = freetype2-infinality-ultimate
conflicts = freetype2
conflicts = freetype2-infinality
- source = http://downloads.sourceforge.net/sourceforge/freetype/freetype-2.6.2.tar.bz2
- source = 01-freetype-2.6.2-enable-valid.patch
- source = 02-upstream-2015.12.05.patch
- source = 03-infinality-2.6.2-2015.12.05.patch
- source = xft-settings.sh
- source = infinality-settings.sh
- source = infinality-settings-generic
- sha1sums = 29c22b85b77cb22cf95c13e7062e21f39fe6b17a
+ source = http://downloads.sourceforge.net/sourceforge/freetype/freetype-2.6.3.tar.bz2
+ source = 01-freetype-2.6.3-enable-valid.patch::https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/01-freetype-2.6.2-enable-valid.patch
+ source = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/02-upstream-2016.03.26.patch
+ source = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/03-infinality-2.6.3-2016.03.26.patch
+ source = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/xft-settings.sh
+ source = https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/infinality-settings.sh
+ source = infinality-settings-generic::https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/36b60ecefe1fd0e042cad51105b0ffb29315e577/freetype/generic_settings/infinality-settings.sh
+ sha1sums = 6c98bd5d0be313207c37ca23d25faf983486aee5
sha1sums = abf7a8f726ad6359533651a8942636880febf9f6
- sha1sums = 319c377ef4e3f6bc2f52acb893c9b880ef9578b4
- sha1sums = a19a000e778a0b29b0ef0623d566b12187b7f24a
+ sha1sums = dc527dc3b45bb5f17533e7e049d16c475007a945
+ sha1sums = fa848046558c4ac59ef77775ab4a1a9d7200417f
sha1sums = a1859f2eacae2046a9ef705ac2bcc4bdf4fd9717
- sha1sums = 5624c40049a73f8c75d01537212b4c7040f1761f
+ sha1sums = 44ca94634f894011db9ed7edbb105b50ca591e52
sha1sums = 4d219670cb9641b649f6ba0f2a799006f7c3c3c5
pkgname = freetype2-infinality
diff --git a/01-freetype-2.6.2-enable-valid.patch b/01-freetype-2.6.2-enable-valid.patch
deleted file mode 100644
index df81058b16d..00000000000
--- a/01-freetype-2.6.2-enable-valid.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/modules.cfg 2013-11-12 13:02:26.000000000 +0100
-+++ b/modules.cfg 2014-03-07 19:18:00.546655169 +0100
-@@ -110,7 +110,7 @@ RASTER_MODULES += smooth
- AUX_MODULES += cache
-
- # TrueType GX/AAT table validation. Needs ftgxval.c below.
--# AUX_MODULES += gxvalid
-+AUX_MODULES += gxvalid
-
- # Support for streams compressed with gzip (files with suffix .gz).
- #
-@@ -129,7 +129,7 @@ AUX_MODULES += bzip2
-
- # OpenType table validation. Needs ftotval.c below.
- #
--# AUX_MODULES += otvalid
-+AUX_MODULES += otvalid
-
- # Auxiliary PostScript driver component to share common code.
- #
diff --git a/02-upstream-2015.12.05.patch b/02-upstream-2015.12.05.patch
deleted file mode 100644
index d75206e149a..00000000000
--- a/02-upstream-2015.12.05.patch
+++ /dev/null
@@ -1,1098 +0,0 @@
-From f8c20577897d17fb8a62e64fa3bf3ebec0691608 Mon Sep 17 00:00:00 2001
-From: Alexei Podtelezhnikov <apodtele@gmail.com>
-Date: Sat, 28 Nov 2015 22:43:33 -0500
-Subject: [PATCH 2/2] * include/freetype/ftlcdfil.h: Documentation tweak.
-
----
- ChangeLog | 4 ++++
- include/freetype/ftlcdfil.h | 5 ++---
- 2 files changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/ChangeLog b/ChangeLog
-index 31c2ac9..9133021 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,3 +1,7 @@
-+2015-11-28 Alexei Podtelezhnikov <apodtele@gmail.com>
-+
-+ * include/freetype/ftlcdfil.h: Documentation tweak.
-+
- 2015-11-28 Werner Lemberg <wl@gnu.org>
-
- * Version 2.6.2 released.
-diff --git a/include/freetype/ftlcdfil.h b/include/freetype/ftlcdfil.h
-index 653ed36..a9dd3ea 100644
---- a/include/freetype/ftlcdfil.h
-+++ b/include/freetype/ftlcdfil.h
-@@ -250,9 +250,8 @@ FT_BEGIN_HEADER
- * @description:
- * Use this function to override the filter weights selected by
- * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple
-- * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
-- * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
-- * FT_LCD_FILTER_LEGACY.
-+ * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x08,
-+ * 0x4D, 0x56, 0x4D, 0x08) for FT_LCD_FILTER_DEFAULT.
- *
- * @input:
- * library ::
---
-2.6.2
-From 5b05bc6638df2cac9622f03338253a720604d1be Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Tue, 1 Dec 2015 12:09:02 +0100
-Subject: [PATCH 1/7] [type1] Avoid dangling pointer (#46572).
-
-* src/type1/t1afm.c (T1_Read_Metrics): Properly reset
-`face->afm_data'.
----
- ChangeLog | 7 +++++++
- src/type1/t1afm.c | 2 ++
- 2 files changed, 9 insertions(+)
-
-diff --git a/ChangeLog b/ChangeLog
-index 9133021..a9ce090 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,3 +1,10 @@
-+2015-12-01 Werner Lemberg <wl@gnu.org>
-+
-+ [type1] Avoid dangling pointer (#46572).
-+
-+ * src/type1/t1afm.c (T1_Read_Metrics): Properly reset
-+ `face->afm_data'.
-+
- 2015-11-28 Alexei Podtelezhnikov <apodtele@gmail.com>
-
- * include/freetype/ftlcdfil.h: Documentation tweak.
-diff --git a/src/type1/t1afm.c b/src/type1/t1afm.c
-index 7a7bf82..883a740 100644
---- a/src/type1/t1afm.c
-+++ b/src/type1/t1afm.c
-@@ -248,6 +248,8 @@
- FT_TRACE1(( "T1_Read_Metrics:"
- " Freeing previously attached metrics data.\n" ));
- T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
-+
-+ face->afm_data = NULL;
- }
-
- if ( FT_NEW( fi ) ||
---
-2.6.3
-
-From 1b740a00761f5f14200d6d60cec8fa416b2fcbde Mon Sep 17 00:00:00 2001
-From: Alexei Podtelezhnikov <apodtele@gmail.com>
-Date: Wed, 2 Dec 2015 00:30:57 -0500
-Subject: [PATCH 2/7] Minor rearrangement.
-
----
- include/freetype/freetype.h | 32 ++++++++++++++++----------------
- 1 file changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
-index 41379ea..f68718d 100644
---- a/include/freetype/freetype.h
-+++ b/include/freetype/freetype.h
-@@ -3015,6 +3015,22 @@ FT_BEGIN_HEADER
- /* the glyph image format, finding the relevant renderer, and */
- /* invoking it. */
- /* */
-+ /* <InOut> */
-+ /* slot :: A handle to the glyph slot containing the image to */
-+ /* convert. */
-+ /* */
-+ /* <Input> */
-+ /* render_mode :: This is the render mode used to render the glyph */
-+ /* image into a bitmap. See @FT_Render_Mode for a */
-+ /* list of possible values. */
-+ /* */
-+ /* <Return> */
-+ /* FreeType error code. 0~means success. */
-+ /* */
-+ /* <Note> */
-+ /* To get meaningful results, font scaling values must be set with */
-+ /* functions like @FT_Set_Char_Size before calling FT_Render_Glyph. */
-+ /* */
- /* When FreeType outputs a bitmap of a glyph, it really outputs an */
- /* alpha coverage map. If a pixel is completely covered by a */
- /* filled-in outline, the bitmap contains 0xFF at that pixel, meaning */
-@@ -3092,22 +3108,6 @@ FT_BEGIN_HEADER
- /* linear blending is done 3~times per pixel: red foreground subpixel */
- /* to red background subpixel and so on for green and blue. */
- /* */
-- /* <InOut> */
-- /* slot :: A handle to the glyph slot containing the image to */
-- /* convert. */
-- /* */
-- /* <Input> */
-- /* render_mode :: This is the render mode used to render the glyph */
-- /* image into a bitmap. See @FT_Render_Mode for a */
-- /* list of possible values. */
-- /* */
-- /* <Return> */
-- /* FreeType error code. 0~means success. */
-- /* */
-- /* <Note> */
-- /* To get meaningful results, font scaling values must be set with */
-- /* functions like @FT_Set_Char_Size before calling FT_Render_Glyph. */
-- /* */
- FT_EXPORT( FT_Error )
- FT_Render_Glyph( FT_GlyphSlot slot,
- FT_Render_Mode render_mode );
---
-2.6.3
-
-From a415473820fcbf365040cecb1ac2a382c41e825d Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Thu, 3 Dec 2015 07:49:46 +0100
-Subject: [PATCH 3/7] * builds/unix/install.mk (install): Remove stale
- `ft2build.h'.
-
----
- ChangeLog | 4 ++++
- builds/unix/install.mk | 3 +++
- 2 files changed, 7 insertions(+)
-
-diff --git a/ChangeLog b/ChangeLog
-index a9ce090..64cfbc1 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,3 +1,7 @@
-+2015-12-03 Werner Lemberg <wl@gnu.org>
-+
-+ * builds/unix/install.mk (install): Remove stale `ft2build.h'.
-+
- 2015-12-01 Werner Lemberg <wl@gnu.org>
-
- [type1] Avoid dangling pointer (#46572).
-diff --git a/builds/unix/install.mk b/builds/unix/install.mk
-index c7a20a3..fbe2d81 100644
---- a/builds/unix/install.mk
-+++ b/builds/unix/install.mk
-@@ -28,8 +28,11 @@
- # installing new files to avoid interferences with files installed by
- # previous FreeType versions (which use slightly different locations).
- #
-+# We also remove `$(includedir)/ft2build.h' for the same reason.
-+#
- install: $(PROJECT_LIBRARY)
- -$(DELDIR) $(DESTDIR)$(includedir)/freetype2
-+ -$(DELETE) $(DESTDIR)$(includedir)/ft2build.h
- $(MKINSTALLDIRS) $(DESTDIR)$(libdir) \
- $(DESTDIR)$(libdir)/pkgconfig \
- $(DESTDIR)$(includedir)/freetype2/freetype/config \
---
-2.6.3
-
-From 53696f03ce1c0e572609d375a44b348bb6097d30 Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Sat, 5 Dec 2015 07:44:16 +0100
-Subject: [PATCH 4/7] * src/autofit/afwarp.c: s/INT_MIN/FT_INT_MIN/.
-
----
- ChangeLog | 4 ++++
- src/autofit/afwarp.c | 2 +-
- 2 files changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/ChangeLog b/ChangeLog
-index 64cfbc1..51d951a 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,3 +1,7 @@
-+2015-12-05 Werner Lemberg <wl@gnu.org>
-+
-+ * src/autofit/afwarp.c: s/INT_MIN/FT_INT_MIN/.
-+
- 2015-12-03 Werner Lemberg <wl@gnu.org>
-
- * builds/unix/install.mk (install): Remove stale `ft2build.h'.
-diff --git a/src/autofit/afwarp.c b/src/autofit/afwarp.c
-index 59af4f0..ae92db1 100644
---- a/src/autofit/afwarp.c
-+++ b/src/autofit/afwarp.c
-@@ -193,7 +193,7 @@
-
- warper->best_scale = org_scale;
- warper->best_delta = org_delta;
-- warper->best_score = INT_MIN;
-+ warper->best_score = FT_INT_MIN;
- warper->best_distort = 0;
-
- axis = &hints->axis[dim];
---
-2.6.3
-
-From f7e6d51a75fb07685f64d16985363a3b2d79b52f Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Sat, 5 Dec 2015 13:08:45 +0100
-Subject: [PATCH 5/7] * src/autofit/afblue.hin (GET_UTF8_CHAR): Use
- `do...while(0)'.
-
-* src/autofit/afblue.h: Regenerated.
----
- ChangeLog | 6 ++++++
- src/autofit/afblue.h | 55 ++++++++++++++++++++++++++------------------------
- src/autofit/afblue.hin | 55 ++++++++++++++++++++++++++------------------------
- 3 files changed, 64 insertions(+), 52 deletions(-)
-
-diff --git a/ChangeLog b/ChangeLog
-index 51d951a..7446c25 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,5 +1,11 @@
- 2015-12-05 Werner Lemberg <wl@gnu.org>
-
-+ * src/autofit/afblue.hin (GET_UTF8_CHAR): Use `do...while(0)'.
-+
-+ * src/autofit/afblue.h: Regenerated.
-+
-+2015-12-05 Werner Lemberg <wl@gnu.org>
-+
- * src/autofit/afwarp.c: s/INT_MIN/FT_INT_MIN/.
-
- 2015-12-03 Werner Lemberg <wl@gnu.org>
-diff --git a/src/autofit/afblue.h b/src/autofit/afblue.h
-index c26a9c7..a79098a 100644
---- a/src/autofit/afblue.h
-+++ b/src/autofit/afblue.h
-@@ -28,32 +28,35 @@ FT_BEGIN_HEADER
-
- /* an auxiliary macro to decode a UTF-8 character -- since we only use */
- /* hard-coded, self-converted data, no error checking is performed */
--#define GET_UTF8_CHAR( ch, p ) \
-- ch = (unsigned char)*p++; \
-- if ( ch >= 0x80 ) \
-- { \
-- FT_UInt len; \
-- \
-- \
-- if ( ch < 0xE0 ) \
-- { \
-- len = 1; \
-- ch &= 0x1F; \
-- } \
-- else if ( ch < 0xF0 ) \
-- { \
-- len = 2; \
-- ch &= 0x0F; \
-- } \
-- else \
-- { \
-- len = 3; \
-- ch &= 0x07; \
-- } \
-- \
-- for ( ; len > 0; len-- ) \
-- ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-- }
-+#define GET_UTF8_CHAR( ch, p ) \
-+ do \
-+ { \
-+ ch = (unsigned char)*p++; \
-+ if ( ch >= 0x80 ) \
-+ { \
-+ FT_UInt len_; \
-+ \
-+ \
-+ if ( ch < 0xE0 ) \
-+ { \
-+ len_ = 1; \
-+ ch &= 0x1F; \
-+ } \
-+ else if ( ch < 0xF0 ) \
-+ { \
-+ len_ = 2; \
-+ ch &= 0x0F; \
-+ } \
-+ else \
-+ { \
-+ len_ = 3; \
-+ ch &= 0x07; \
-+ } \
-+ \
-+ for ( ; len_ > 0; len_-- ) \
-+ ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-+ } \
-+ } while ( 0 )
-
-
- /*************************************************************************/
-diff --git a/src/autofit/afblue.hin b/src/autofit/afblue.hin
-index ad43fe6..3f85ee7 100644
---- a/src/autofit/afblue.hin
-+++ b/src/autofit/afblue.hin
-@@ -25,32 +25,35 @@ FT_BEGIN_HEADER
-
- /* an auxiliary macro to decode a UTF-8 character -- since we only use */
- /* hard-coded, self-converted data, no error checking is performed */
--#define GET_UTF8_CHAR( ch, p ) \
-- ch = (unsigned char)*p++; \
-- if ( ch >= 0x80 ) \
-- { \
-- FT_UInt len; \
-- \
-- \
-- if ( ch < 0xE0 ) \
-- { \
-- len = 1; \
-- ch &= 0x1F; \
-- } \
-- else if ( ch < 0xF0 ) \
-- { \
-- len = 2; \
-- ch &= 0x0F; \
-- } \
-- else \
-- { \
-- len = 3; \
-- ch &= 0x07; \
-- } \
-- \
-- for ( ; len > 0; len-- ) \
-- ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-- }
-+#define GET_UTF8_CHAR( ch, p ) \
-+ do \
-+ { \
-+ ch = (unsigned char)*p++; \
-+ if ( ch >= 0x80 ) \
-+ { \
-+ FT_UInt len_; \
-+ \
-+ \
-+ if ( ch < 0xE0 ) \
-+ { \
-+ len_ = 1; \
-+ ch &= 0x1F; \
-+ } \
-+ else if ( ch < 0xF0 ) \
-+ { \
-+ len_ = 2; \
-+ ch &= 0x0F; \
-+ } \
-+ else \
-+ { \
-+ len_ = 3; \
-+ ch &= 0x07; \
-+ } \
-+ \
-+ for ( ; len_ > 0; len_-- ) \
-+ ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-+ } \
-+ } while ( 0 )
-
-
- /*************************************************************************/
---
-2.6.3
-
-From 453722db8e0e7319c35a40eb592d7ead7d6d0211 Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Sat, 5 Dec 2015 13:20:30 +0100
-Subject: [PATCH 6/7] * src/tools/afblue.pl (convert_ascii_chars): Don't ignore
- spaces.
-
-Instead, reduce multiple spaces to a single one. We need this later
-for supporting character clusters in `afblue.dat'.
----
- ChangeLog | 7 +++++++
- src/tools/afblue.pl | 15 +++++++++------
- 2 files changed, 16 insertions(+), 6 deletions(-)
-
-diff --git a/ChangeLog b/ChangeLog
-index 7446c25..b1801a8 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,5 +1,12 @@
- 2015-12-05 Werner Lemberg <wl@gnu.org>
-
-+ * src/tools/afblue.pl (convert_ascii_chars): Don't ignore spaces.
-+
-+ Instead, reduce multiple spaces to a single one. We need this later
-+ for supporting character clusters in `afblue.dat'.
-+
-+2015-12-05 Werner Lemberg <wl@gnu.org>
-+
- * src/autofit/afblue.hin (GET_UTF8_CHAR): Use `do...while(0)'.
-
- * src/autofit/afblue.h: Regenerated.
-diff --git a/src/tools/afblue.pl b/src/tools/afblue.pl
-index 56b6452..a9c11b2 100644
---- a/src/tools/afblue.pl
-+++ b/src/tools/afblue.pl
-@@ -38,7 +38,8 @@ 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 $curr_elem_size; # The number of non-space characters in the current string or
-+ # the number of elements in the current 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.
-@@ -159,12 +160,14 @@ sub convert_ascii_chars
- # A series of ASCII characters in the printable range.
- my $s = shift;
-
-- # We ignore spaces.
-- $s =~ s/ //g;
-+ # We reduce multiple space characters to a single one.
-+ $s =~ s/ +/ /g;
-
-- my $count = $s =~ s/\G(.)/'$1', /g;
-- $curr_offset += $count;
-- $curr_elem_size += $count;
-+ # Count all non-space characters. Note that `()' applies a list context
-+ # to the capture that is used to count the elements.
-+ $curr_elem_size += () = $s =~ /[^ ]/g;
-+
-+ $curr_offset += $s =~ s/\G(.)/'$1', /g;
-
- return $s;
- }
---
-2.6.3
-
-From a8a54c30603ddedef5a2a96615e9fd66504356bf Mon Sep 17 00:00:00 2001
-From: Werner Lemberg <wl@gnu.org>
-Date: Sat, 5 Dec 2015 13:26:44 +0100
-Subject: [PATCH 7/7] * src/autofit/afblue.dat: Separate blue zone characters
- with spaces.
-
-Another preparation for character cluster support.
-
-* src/autofit/afblue.c, src/autofit.afblue.h: Regenerated.
----
- ChangeLog | 8 +++
- src/autofit/afblue.c | 162 ++++++++++++++++++++++++------------------------
- src/autofit/afblue.dat | 163 +++++++++++++++++++++++++------------------------
- src/autofit/afblue.h | 104 +++++++++++++++----------------
- 4 files changed, 224 insertions(+), 213 deletions(-)
-
-diff --git a/ChangeLog b/ChangeLog
-index b1801a8..d696e8a 100644
---- a/ChangeLog
-+++ b/ChangeLog
-@@ -1,5 +1,13 @@
- 2015-12-05 Werner Lemberg <wl@gnu.org>
-
-+ * src/autofit/afblue.dat: Separate blue zone characters with spaces.
-+
-+ Another preparation for character cluster support.
-+
-+ * src/autofit/afblue.c, src/autofit.afblue.h: Regenerated.
-+
-+2015-12-05 Werner Lemberg <wl@gnu.org>
-+
- * src/tools/afblue.pl (convert_ascii_chars): Don't ignore spaces.
-
- Instead, reduce multiple spaces to a single one. We need this later
-diff --git a/src/autofit/afblue.c b/src/autofit/afblue.c
-index b871e0c..f528908 100644
---- a/src/autofit/afblue.c
-+++ b/src/autofit/afblue.c
-@@ -26,139 +26,139 @@
- af_blue_strings[] =
- {
- /* */
-- '\xD8', '\xA7', '\xD8', '\xA5', '\xD9', '\x84', '\xD9', '\x83', '\xD8', '\xB7', '\xD8', '\xB8', /* ا إ ل ك ط ظ */
-+ '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', /* ا إ ل ك ط ظ */
- '\0',
-- '\xD8', '\xAA', '\xD8', '\xAB', '\xD8', '\xB7', '\xD8', '\xB8', '\xD9', '\x83', /* ت ث ط ظ ك */
-+ '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83', /* ت ث ط ظ ك */
- '\0',
- '\xD9', '\x80', /* ـ */
- '\0',
-- '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\x9F', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD', /* БВЕПЗОСЭ */
-+ '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е П З О С Э */
- '\0',
-- '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\xA8', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD', /* БВЕШЗОСЭ */
-+ '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е Ш З О С Э */
- '\0',
-- '\xD1', '\x85', '\xD0', '\xBF', '\xD0', '\xBD', '\xD1', '\x88', '\xD0', '\xB5', '\xD0', '\xB7', '\xD0', '\xBE', '\xD1', '\x81', /* хпншезос */
-+ '\xD1', '\x85', ' ', '\xD0', '\xBF', ' ', '\xD0', '\xBD', ' ', '\xD1', '\x88', ' ', '\xD0', '\xB5', ' ', '\xD0', '\xB7', ' ', '\xD0', '\xBE', ' ', '\xD1', '\x81', /* х п н ш е з о с */
- '\0',
-- '\xD1', '\x80', '\xD1', '\x83', '\xD1', '\x84', /* руф */
-+ '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84', /* р у ф */
- '\0',
-- '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */
-+ '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */
- '\0',
-- '\xE0', '\xA4', '\x88', '\xE0', '\xA4', '\x90', '\xE0', '\xA4', '\x93', '\xE0', '\xA4', '\x94', '\xE0', '\xA4', '\xBF', '\xE0', '\xA5', '\x80', '\xE0', '\xA5', '\x8B', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */
-+ '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */
- '\0',
-- '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */
-+ '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */
- '\0',
-- '\xE0', '\xA5', '\x81', '\xE0', '\xA5', '\x83', /* ु ृ */
-+ '\xE0', '\xA5', '\x81', ' ', '\xE0', '\xA5', '\x83', /* ु ृ */
- '\0',
-- '\xCE', '\x93', '\xCE', '\x92', '\xCE', '\x95', '\xCE', '\x96', '\xCE', '\x98', '\xCE', '\x9F', '\xCE', '\xA9', /* ΓΒΕΖΘΟΩ */
-+ '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9', /* Γ Β Ε Ζ Θ Ο Ω */
- '\0',
-- '\xCE', '\x92', '\xCE', '\x94', '\xCE', '\x96', '\xCE', '\x9E', '\xCE', '\x98', '\xCE', '\x9F', /* ΒΔΖΞΘΟ */
-+ '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', /* Β Δ Ζ Ξ Θ Ο */
- '\0',
-- '\xCE', '\xB2', '\xCE', '\xB8', '\xCE', '\xB4', '\xCE', '\xB6', '\xCE', '\xBB', '\xCE', '\xBE', /* βθδζλξ */
-+ '\xCE', '\xB2', ' ', '\xCE', '\xB8', ' ', '\xCE', '\xB4', ' ', '\xCE', '\xB6', ' ', '\xCE', '\xBB', ' ', '\xCE', '\xBE', /* β θ δ ζ λ ξ */
- '\0',
-- '\xCE', '\xB1', '\xCE', '\xB5', '\xCE', '\xB9', '\xCE', '\xBF', '\xCF', '\x80', '\xCF', '\x83', '\xCF', '\x84', '\xCF', '\x89', /* αειοπστω */
-+ '\xCE', '\xB1', ' ', '\xCE', '\xB5', ' ', '\xCE', '\xB9', ' ', '\xCE', '\xBF', ' ', '\xCF', '\x80', ' ', '\xCF', '\x83', ' ', '\xCF', '\x84', ' ', '\xCF', '\x89', /* α ε ι ο π σ τ ω */
- '\0',
-- '\xCE', '\xB2', '\xCE', '\xB3', '\xCE', '\xB7', '\xCE', '\xBC', '\xCF', '\x81', '\xCF', '\x86', '\xCF', '\x87', '\xCF', '\x88', /* βγημρφχψ */
-+ '\xCE', '\xB2', ' ', '\xCE', '\xB3', ' ', '\xCE', '\xB7', ' ', '\xCE', '\xBC', ' ', '\xCF', '\x81', ' ', '\xCF', '\x86', ' ', '\xCF', '\x87', ' ', '\xCF', '\x88', /* β γ η μ ρ φ χ ψ */
- '\0',
-- '\xD7', '\x91', '\xD7', '\x93', '\xD7', '\x94', '\xD7', '\x97', '\xD7', '\x9A', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1', /* בדהחךכםס */
-+ '\xD7', '\x91', ' ', '\xD7', '\x93', ' ', '\xD7', '\x94', ' ', '\xD7', '\x97', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', /* ב ד ה ח ך כ ם ס */
- '\0',
-- '\xD7', '\x91', '\xD7', '\x98', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1', '\xD7', '\xA6', /* בטכםסצ */
-+ '\xD7', '\x91', ' ', '\xD7', '\x98', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', ' ', '\xD7', '\xA6', /* ב ט כ ם ס צ */
- '\0',
-- '\xD7', '\xA7', '\xD7', '\x9A', '\xD7', '\x9F', '\xD7', '\xA3', '\xD7', '\xA5', /* קךןףץ */
-+ '\xD7', '\xA7', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9F', ' ', '\xD7', '\xA3', ' ', '\xD7', '\xA5', /* ק ך ן ף ץ */
- '\0',
-- '\xE0', '\xBA', '\xB2', '\xE0', '\xBA', '\x94', '\xE0', '\xBA', '\xAD', '\xE0', '\xBA', '\xA1', '\xE0', '\xBA', '\xA5', '\xE0', '\xBA', '\xA7', '\xE0', '\xBA', '\xA3', '\xE0', '\xBA', '\x87', /* າ ດ ອ ມ ລ ວ ຣ ງ */
-+ '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\x94', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\xA1', ' ', '\xE0', '\xBA', '\xA5', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\x87', /* າ ດ ອ ມ ລ ວ ຣ ງ */
- '\0',
-- '\xE0', '\xBA', '\xB2', '\xE0', '\xBA', '\xAD', '\xE0', '\xBA', '\x9A', '\xE0', '\xBA', '\x8D', '\xE0', '\xBA', '\xA3', '\xE0', '\xBA', '\xAE', '\xE0', '\xBA', '\xA7', '\xE0', '\xBA', '\xA2', /* າ ອ ບ ຍ ຣ ຮ ວ ຢ */
-+ '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\x9A', ' ', '\xE0', '\xBA', '\x8D', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\xAE', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA2', /* າ ອ ບ ຍ ຣ ຮ ວ ຢ */
- '\0',
-- '\xE0', '\xBA', '\x9B', '\xE0', '\xBA', '\xA2', '\xE0', '\xBA', '\x9F', '\xE0', '\xBA', '\x9D', /* ປ ຢ ຟ ຝ */
-+ '\xE0', '\xBA', '\x9B', ' ', '\xE0', '\xBA', '\xA2', ' ', '\xE0', '\xBA', '\x9F', ' ', '\xE0', '\xBA', '\x9D', /* ປ ຢ ຟ ຝ */
- '\0',
-- '\xE0', '\xBB', '\x82', '\xE0', '\xBB', '\x84', '\xE0', '\xBB', '\x83', /* ໂ ໄ ໃ */
-+ '\xE0', '\xBB', '\x82', ' ', '\xE0', '\xBB', '\x84', ' ', '\xE0', '\xBB', '\x83', /* ໂ ໄ ໃ */
- '\0',
-- '\xE0', '\xBA', '\x87', '\xE0', '\xBA', '\x8A', '\xE0', '\xBA', '\x96', '\xE0', '\xBA', '\xBD', '\xE0', '\xBB', '\x86', '\xE0', '\xBA', '\xAF', /* ງ ຊ ຖ ຽ ໆ ຯ */
-+ '\xE0', '\xBA', '\x87', ' ', '\xE0', '\xBA', '\x8A', ' ', '\xE0', '\xBA', '\x96', ' ', '\xE0', '\xBA', '\xBD', ' ', '\xE0', '\xBB', '\x86', ' ', '\xE0', '\xBA', '\xAF', /* ງ ຊ ຖ ຽ ໆ ຯ */
- '\0',
-- 'T', 'H', 'E', 'Z', 'O', 'C', 'Q', 'S', /* THEZOCQS */
-+ 'T', ' ', 'H', ' ', 'E', ' ', 'Z', ' ', 'O', ' ', 'C', ' ', 'Q', ' ', 'S', /* T H E Z O C Q S */
- '\0',
-- 'H', 'E', 'Z', 'L', 'O', 'C', 'U', 'S', /* HEZLOCUS */
-+ 'H', ' ', 'E', ' ', 'Z', ' ', 'L', ' ', 'O', ' ', 'C', ' ', 'U', ' ', 'S', /* H E Z L O C U S */
- '\0',
-- 'f', 'i', 'j', 'k', 'd', 'b', 'h', /* fijkdbh */
-+ 'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h', /* f i j k d b h */
- '\0',
-- 'x', 'z', 'r', 'o', 'e', 's', 'c', /* xzroesc */
-+ 'x', ' ', 'z', ' ', 'r', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* x z r o e s c */
- '\0',
-- 'p', 'q', 'g', 'j', 'y', /* pqgjy */
-+ 'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y', /* p q g j y */
- '\0',
-- '\xE2', '\x82', '\x80', '\xE2', '\x82', '\x83', '\xE2', '\x82', '\x85', '\xE2', '\x82', '\x87', '\xE2', '\x82', '\x88', /* ₀₃₅₇₈ */
-+ '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x85', ' ', '\xE2', '\x82', '\x87', ' ', '\xE2', '\x82', '\x88', /* ₀ ₃ ₅ ₇ ₈ */
- '\0',
-- '\xE2', '\x82', '\x80', '\xE2', '\x82', '\x81', '\xE2', '\x82', '\x82', '\xE2', '\x82', '\x83', '\xE2', '\x82', '\x88', /* ₀₁₂₃₈ */
-+ '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x81', ' ', '\xE2', '\x82', '\x82', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x88', /* ₀ ₁ ₂ ₃ ₈ */
- '\0',
-- '\xE1', '\xB5', '\xA2', '\xE2', '\xB1', '\xBC', '\xE2', '\x82', '\x95', '\xE2', '\x82', '\x96', '\xE2', '\x82', '\x97', /* ᵢⱼₕₖₗ */
-+ '\xE1', '\xB5', '\xA2', ' ', '\xE2', '\xB1', '\xBC', ' ', '\xE2', '\x82', '\x95', ' ', '\xE2', '\x82', '\x96', ' ', '\xE2', '\x82', '\x97', /* ᵢ ⱼ ₕ ₖ ₗ */
- '\0',
-- '\xE2', '\x82', '\x90', '\xE2', '\x82', '\x91', '\xE2', '\x82', '\x92', '\xE2', '\x82', '\x93', '\xE2', '\x82', '\x99', '\xE2', '\x82', '\x9B', '\xE1', '\xB5', '\xA5', '\xE1', '\xB5', '\xA4', '\xE1', '\xB5', '\xA3', /* ₐₑₒₓₙₛᵥᵤᵣ */
-+ '\xE2', '\x82', '\x90', ' ', '\xE2', '\x82', '\x91', ' ', '\xE2', '\x82', '\x92', ' ', '\xE2', '\x82', '\x93', ' ', '\xE2', '\x82', '\x99', ' ', '\xE2', '\x82', '\x9B', ' ', '\xE1', '\xB5', '\xA5', ' ', '\xE1', '\xB5', '\xA4', ' ', '\xE1', '\xB5', '\xA3', /* ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ */
- '\0',
-- '\xE1', '\xB5', '\xA6', '\xE1', '\xB5', '\xA7', '\xE1', '\xB5', '\xA8', '\xE1', '\xB5', '\xA9', '\xE2', '\x82', '\x9A', /* ᵦᵧᵨᵩₚ */
-+ '\xE1', '\xB5', '\xA6', ' ', '\xE1', '\xB5', '\xA7', ' ', '\xE1', '\xB5', '\xA8', ' ', '\xE1', '\xB5', '\xA9', ' ', '\xE2', '\x82', '\x9A', /* ᵦ ᵧ ᵨ ᵩ ₚ */
- '\0',
-- '\xE2', '\x81', '\xB0', '\xC2', '\xB3', '\xE2', '\x81', '\xB5', '\xE2', '\x81', '\xB7', '\xE1', '\xB5', '\x80', '\xE1', '\xB4', '\xB4', '\xE1', '\xB4', '\xB1', '\xE1', '\xB4', '\xBC', /* ⁰³⁵⁷ᵀᴴᴱᴼ */
-+ '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB3', ' ', '\xE2', '\x81', '\xB5', ' ', '\xE2', '\x81', '\xB7', ' ', '\xE1', '\xB5', '\x80', ' ', '\xE1', '\xB4', '\xB4', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xBC', /* ⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ */
- '\0',
-- '\xE2', '\x81', '\xB0', '\xC2', '\xB9', '\xC2', '\xB2', '\xC2', '\xB3', '\xE1', '\xB4', '\xB1', '\xE1', '\xB4', '\xB8', '\xE1', '\xB4', '\xBC', '\xE1', '\xB5', '\x81', /* ⁰¹²³ᴱᴸᴼᵁ */
-+ '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB9', ' ', '\xC2', '\xB2', ' ', '\xC2', '\xB3', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xB8', ' ', '\xE1', '\xB4', '\xBC', ' ', '\xE1', '\xB5', '\x81', /* ⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ */
- '\0',
-- '\xE1', '\xB5', '\x87', '\xE1', '\xB5', '\x88', '\xE1', '\xB5', '\x8F', '\xCA', '\xB0', '\xCA', '\xB2', '\xE1', '\xB6', '\xA0', '\xE2', '\x81', '\xB1', /* ᵇᵈᵏʰʲᶠⁱ */
-+ '\xE1', '\xB5', '\x87', ' ', '\xE1', '\xB5', '\x88', ' ', '\xE1', '\xB5', '\x8F', ' ', '\xCA', '\xB0', ' ', '\xCA', '\xB2', ' ', '\xE1', '\xB6', '\xA0', ' ', '\xE2', '\x81', '\xB1', /* ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ */
- '\0',
-- '\xE1', '\xB5', '\x89', '\xE1', '\xB5', '\x92', '\xCA', '\xB3', '\xCB', '\xA2', '\xCB', '\xA3', '\xE1', '\xB6', '\x9C', '\xE1', '\xB6', '\xBB', /* ᵉᵒʳˢˣᶜᶻ */
-+ '\xE1', '\xB5', '\x89', ' ', '\xE1', '\xB5', '\x92', ' ', '\xCA', '\xB3', ' ', '\xCB', '\xA2', ' ', '\xCB', '\xA3', ' ', '\xE1', '\xB6', '\x9C', ' ', '\xE1', '\xB6', '\xBB', /* ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ */
- '\0',
-- '\xE1', '\xB5', '\x96', '\xCA', '\xB8', '\xE1', '\xB5', '\x8D', /* ᵖʸᵍ */
-+ '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D', /* ᵖ ʸ ᵍ */
- '\0',
-- '\xE0', '\xB0', '\x87', '\xE0', '\xB0', '\x8C', '\xE0', '\xB0', '\x99', '\xE0', '\xB0', '\x9E', '\xE0', '\xB0', '\xA3', '\xE0', '\xB0', '\xB1', '\xE0', '\xB1', '\xAF', /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */
-+ '\xE0', '\xB0', '\x87', ' ', '\xE0', '\xB0', '\x8C', ' ', '\xE0', '\xB0', '\x99', ' ', '\xE0', '\xB0', '\x9E', ' ', '\xE0', '\xB0', '\xA3', ' ', '\xE0', '\xB0', '\xB1', ' ', '\xE0', '\xB1', '\xAF', /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */
- '\0',
-- '\xE0', '\xB0', '\x85', '\xE0', '\xB0', '\x95', '\xE0', '\xB0', '\x9A', '\xE0', '\xB0', '\xB0', '\xE0', '\xB0', '\xBD', '\xE0', '\xB1', '\xA8', '\xE0', '\xB1', '\xAC', /* అ క చ ర ఽ ౨ ౬ */
-+ '\xE0', '\xB0', '\x85', ' ', '\xE0', '\xB0', '\x95', ' ', '\xE0', '\xB0', '\x9A', ' ', '\xE0', '\xB0', '\xB0', ' ', '\xE0', '\xB0', '\xBD', ' ', '\xE0', '\xB1', '\xA8', ' ', '\xE0', '\xB1', '\xAC', /* అ క చ ర ఽ ౨ ౬ */
- '\0',
-- '\xE0', '\xB8', '\x9A', '\xE0', '\xB9', '\x80', '\xE0', '\xB9', '\x81', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\x81', '\xE0', '\xB8', '\xB2', /* บ เ แ อ ก า */
-+ '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB9', '\x80', ' ', '\xE0', '\xB9', '\x81', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\x81', ' ', '\xE0', '\xB8', '\xB2', /* บ เ แ อ ก า */
- '\0',
-- '\xE0', '\xB8', '\x9A', '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\xA9', '\xE0', '\xB8', '\xAF', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\xA2', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */
-+ '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\xA9', ' ', '\xE0', '\xB8', '\xAF', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\xA2', ' ', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */
- '\0',
-- '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\x9D', '\xE0', '\xB8', '\x9F', /* ป ฝ ฟ */
-+ '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\x9D', ' ', '\xE0', '\xB8', '\x9F', /* ป ฝ ฟ */
- '\0',
-- '\xE0', '\xB9', '\x82', '\xE0', '\xB9', '\x83', '\xE0', '\xB9', '\x84', /* โ ใ ไ */
-+ '\xE0', '\xB9', '\x82', ' ', '\xE0', '\xB9', '\x83', ' ', '\xE0', '\xB9', '\x84', /* โ ใ ไ */
- '\0',
-- '\xE0', '\xB8', '\x8E', '\xE0', '\xB8', '\x8F', '\xE0', '\xB8', '\xA4', '\xE0', '\xB8', '\xA6', /* ฎ ฏ ฤ ฦ */
-+ '\xE0', '\xB8', '\x8E', ' ', '\xE0', '\xB8', '\x8F', ' ', '\xE0', '\xB8', '\xA4', ' ', '\xE0', '\xB8', '\xA6', /* ฎ ฏ ฤ ฦ */
- '\0',
-- '\xE0', '\xB8', '\x8D', '\xE0', '\xB8', '\x90', /* ญ ฐ */
-+ '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90', /* ญ ฐ */
- '\0',
-- '\xE0', '\xB9', '\x90', '\xE0', '\xB9', '\x91', '\xE0', '\xB9', '\x93', /* ๐ ๑ ๓ */
-+ '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93', /* ๐ ๑ ๓ */
- #ifdef AF_CONFIG_OPTION_CJK
- '\0',
-- '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0', /* 他们你來們到和地 */
-- '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1', '\xE5', '\xB8', '\xAD', '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x83', /* 对對就席我时時會 */
-- '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\x83', '\xBD', '\xE8', '\x88', '\xB0', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99', /* 来為能舰說说这這 */
-- '\xE9', '\xBD', '\x8A', '|', /* 齊 | */
-- '\xE5', '\x86', '\x9B', '\xE5', '\x90', '\x8C', '\xE5', '\xB7', '\xB2', '\xE6', '\x84', '\xBF', '\xE6', '\x97', '\xA2', '\xE6', '\x98', '\x9F', '\xE6', '\x98', '\xAF', '\xE6', '\x99', '\xAF', /* 军同已愿既星是景 */
-- '\xE6', '\xB0', '\x91', '\xE7', '\x85', '\xA7', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\xA8', '\xE7', '\xBD', '\xAE', '\xE8', '\xA6', '\x81', /* 民照现現理用置要 */
-- '\xE8', '\xBB', '\x8D', '\xE9', '\x82', '\xA3', '\xE9', '\x85', '\x8D', '\xE9', '\x87', '\x8C', '\xE9', '\x96', '\x8B', '\xE9', '\x9B', '\xB7', '\xE9', '\x9C', '\xB2', '\xE9', '\x9D', '\xA2', /* 軍那配里開雷露面 */
-- '\xE9', '\xA1', '\xBE', /* 顾 */
-- '\0',
-- '\xE4', '\xB8', '\xAA', '\xE4', '\xB8', '\xBA', '\xE4', '\xBA', '\xBA', '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xA5', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', /* 个为人他以们你來 */
-- '\xE5', '\x80', '\x8B', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\xA4', '\xA7', '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1', /* 個們到和大对對就 */
-- '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x89', '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\xA6', '\x81', '\xE8', '\xAA', '\xAA', /* 我时時有来為要說 */
-- '\xE8', '\xAF', '\xB4', '|', /* 说 | */
-- '\xE4', '\xB8', '\xBB', '\xE4', '\xBA', '\x9B', '\xE5', '\x9B', '\xA0', '\xE5', '\xAE', '\x83', '\xE6', '\x83', '\xB3', '\xE6', '\x84', '\x8F', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\x9F', /* 主些因它想意理生 */
-- '\xE7', '\x95', '\xB6', '\xE7', '\x9C', '\x8B', '\xE7', '\x9D', '\x80', '\xE7', '\xBD', '\xAE', '\xE8', '\x80', '\x85', '\xE8', '\x87', '\xAA', '\xE8', '\x91', '\x97', '\xE8', '\xA3', '\xA1', /* 當看着置者自著裡 */
-- '\xE8', '\xBF', '\x87', '\xE8', '\xBF', '\x98', '\xE8', '\xBF', '\x9B', '\xE9', '\x80', '\xB2', '\xE9', '\x81', '\x8E', '\xE9', '\x81', '\x93', '\xE9', '\x82', '\x84', '\xE9', '\x87', '\x8C', /* 过还进進過道還里 */
-- '\xE9', '\x9D', '\xA2', /* 面 */
-+ '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 他 们 你 來 們 到 和 地 */
-+ ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB8', '\xAD', ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x83', /* 对 對 就 席 我 时 時 會 */
-+ ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\x88', '\xB0', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 来 為 能 舰 說 说 这 這 */
-+ ' ', '\xE9', '\xBD', '\x8A', ' ', '|', /* 齊 | */
-+ ' ', '\xE5', '\x86', '\x9B', ' ', '\xE5', '\x90', '\x8C', ' ', '\xE5', '\xB7', '\xB2', ' ', '\xE6', '\x84', '\xBF', ' ', '\xE6', '\x97', '\xA2', ' ', '\xE6', '\x98', '\x9F', ' ', '\xE6', '\x98', '\xAF', ' ', '\xE6', '\x99', '\xAF', /* 军 同 已 愿 既 星 是 景 */
-+ ' ', '\xE6', '\xB0', '\x91', ' ', '\xE7', '\x85', '\xA7', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\xA8', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\xA6', '\x81', /* 民 照 现 現 理 用 置 要 */
-+ ' ', '\xE8', '\xBB', '\x8D', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x85', '\x8D', ' ', '\xE9', '\x87', '\x8C', ' ', '\xE9', '\x96', '\x8B', ' ', '\xE9', '\x9B', '\xB7', ' ', '\xE9', '\x9C', '\xB2', ' ', '\xE9', '\x9D', '\xA2', /* 軍 那 配 里 開 雷 露 面 */
-+ ' ', '\xE9', '\xA1', '\xBE', /* 顾 */
-+ '\0',
-+ '\xE4', '\xB8', '\xAA', ' ', '\xE4', '\xB8', '\xBA', ' ', '\xE4', '\xBA', '\xBA', ' ', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xA5', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', /* 个 为 人 他 以 们 你 來 */
-+ ' ', '\xE5', '\x80', '\x8B', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\xA4', '\xA7', ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', /* 個 們 到 和 大 对 對 就 */
-+ ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x89', ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\xA6', '\x81', ' ', '\xE8', '\xAA', '\xAA', /* 我 时 時 有 来 為 要 說 */
-+ ' ', '\xE8', '\xAF', '\xB4', ' ', '|', /* 说 | */
-+ ' ', '\xE4', '\xB8', '\xBB', ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE5', '\x9B', '\xA0', ' ', '\xE5', '\xAE', '\x83', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x84', '\x8F', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\x9F', /* 主 些 因 它 想 意 理 生 */
-+ ' ', '\xE7', '\x95', '\xB6', ' ', '\xE7', '\x9C', '\x8B', ' ', '\xE7', '\x9D', '\x80', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\x80', '\x85', ' ', '\xE8', '\x87', '\xAA', ' ', '\xE8', '\x91', '\x97', ' ', '\xE8', '\xA3', '\xA1', /* 當 看 着 置 者 自 著 裡 */
-+ ' ', '\xE8', '\xBF', '\x87', ' ', '\xE8', '\xBF', '\x98', ' ', '\xE8', '\xBF', '\x9B', ' ', '\xE9', '\x80', '\xB2', ' ', '\xE9', '\x81', '\x8E', ' ', '\xE9', '\x81', '\x93', ' ', '\xE9', '\x82', '\x84', ' ', '\xE9', '\x87', '\x8C', /* 过 还 进 進 過 道 還 里 */
-+ ' ', '\xE9', '\x9D', '\xA2', /* 面 */
- #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
- '\0',
-- '\xE4', '\xBA', '\x9B', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0', /* 些们你來們到和地 */
-- '\xE5', '\xA5', '\xB9', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE5', '\xB0', '\xB1', '\xE5', '\xB9', '\xB4', '\xE5', '\xBE', '\x97', '\xE6', '\x83', '\x85', '\xE6', '\x9C', '\x80', /* 她将將就年得情最 */
-- '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE7', '\x90', '\x86', '\xE8', '\x83', '\xBD', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99', /* 样樣理能說说这這 */
-- '\xE9', '\x80', '\x9A', '|', /* 通 | */
-- '\xE5', '\x8D', '\xB3', '\xE5', '\x90', '\x97', '\xE5', '\x90', '\xA7', '\xE5', '\x90', '\xAC', '\xE5', '\x91', '\xA2', '\xE5', '\x93', '\x81', '\xE5', '\x93', '\x8D', '\xE5', '\x97', '\x8E', /* 即吗吧听呢品响嗎 */
-- '\xE5', '\xB8', '\x88', '\xE5', '\xB8', '\xAB', '\xE6', '\x94', '\xB6', '\xE6', '\x96', '\xAD', '\xE6', '\x96', '\xB7', '\xE6', '\x98', '\x8E', '\xE7', '\x9C', '\xBC', '\xE9', '\x96', '\x93', /* 师師收断斷明眼間 */
-- '\xE9', '\x97', '\xB4', '\xE9', '\x99', '\x85', '\xE9', '\x99', '\x88', '\xE9', '\x99', '\x90', '\xE9', '\x99', '\xA4', '\xE9', '\x99', '\xB3', '\xE9', '\x9A', '\x8F', '\xE9', '\x9A', '\x9B', /* 间际陈限除陳随際 */
-- '\xE9', '\x9A', '\xA8', /* 隨 */
-- '\0',
-- '\xE4', '\xBA', '\x8B', '\xE5', '\x89', '\x8D', '\xE5', '\xAD', '\xB8', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE6', '\x83', '\x85', '\xE6', '\x83', '\xB3', '\xE6', '\x88', '\x96', /* 事前學将將情想或 */
-- '\xE6', '\x94', '\xBF', '\xE6', '\x96', '\xAF', '\xE6', '\x96', '\xB0', '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE6', '\xB0', '\x91', '\xE6', '\xB2', '\x92', '\xE6', '\xB2', '\xA1', /* 政斯新样樣民沒没 */
-- '\xE7', '\x84', '\xB6', '\xE7', '\x89', '\xB9', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x83', '\xE7', '\xAC', '\xAC', '\xE7', '\xB6', '\x93', '\xE8', '\xB0', '\x81', /* 然特现現球第經谁 */
-- '\xE8', '\xB5', '\xB7', '|', /* 起 | */
-- '\xE4', '\xBE', '\x8B', '\xE5', '\x88', '\xA5', '\xE5', '\x88', '\xAB', '\xE5', '\x88', '\xB6', '\xE5', '\x8A', '\xA8', '\xE5', '\x8B', '\x95', '\xE5', '\x90', '\x97', '\xE5', '\x97', '\x8E', /* 例別别制动動吗嗎 */
-- '\xE5', '\xA2', '\x9E', '\xE6', '\x8C', '\x87', '\xE6', '\x98', '\x8E', '\xE6', '\x9C', '\x9D', '\xE6', '\x9C', '\x9F', '\xE6', '\x9E', '\x84', '\xE7', '\x89', '\xA9', '\xE7', '\xA1', '\xAE', /* 增指明朝期构物确 */
-- '\xE7', '\xA7', '\x8D', '\xE8', '\xAA', '\xBF', '\xE8', '\xB0', '\x83', '\xE8', '\xB2', '\xBB', '\xE8', '\xB4', '\xB9', '\xE9', '\x82', '\xA3', '\xE9', '\x83', '\xBD', '\xE9', '\x96', '\x93', /* 种調调費费那都間 */
-- '\xE9', '\x97', '\xB4', /* 间 */
-+ ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 些 们 你 來 們 到 和 地 */
-+ ' ', '\xE5', '\xA5', '\xB9', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB9', '\xB4', ' ', '\xE5', '\xBE', '\x97', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x9C', '\x80', /* 她 将 將 就 年 得 情 最 */
-+ ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE7', '\x90', '\x86', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 样 樣 理 能 說 说 这 這 */
-+ ' ', '\xE9', '\x80', '\x9A', ' ', '|', /* 通 | */
-+ ' ', '\xE5', '\x8D', '\xB3', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x90', '\xA7', ' ', '\xE5', '\x90', '\xAC', ' ', '\xE5', '\x91', '\xA2', ' ', '\xE5', '\x93', '\x81', ' ', '\xE5', '\x93', '\x8D', ' ', '\xE5', '\x97', '\x8E', /* 即 吗 吧 听 呢 品 响 嗎 */
-+ ' ', '\xE5', '\xB8', '\x88', ' ', '\xE5', '\xB8', '\xAB', ' ', '\xE6', '\x94', '\xB6', ' ', '\xE6', '\x96', '\xAD', ' ', '\xE6', '\x96', '\xB7', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE7', '\x9C', '\xBC', ' ', '\xE9', '\x96', '\x93', /* 师 師 收 断 斷 明 眼 間 */
-+ ' ', '\xE9', '\x97', '\xB4', ' ', '\xE9', '\x99', '\x85', ' ', '\xE9', '\x99', '\x88', ' ', '\xE9', '\x99', '\x90', ' ', '\xE9', '\x99', '\xA4', ' ', '\xE9', '\x99', '\xB3', ' ', '\xE9', '\x9A', '\x8F', ' ', '\xE9', '\x9A', '\x9B', /* 间 际 陈 限 除 陳 随 際 */
-+ ' ', '\xE9', '\x9A', '\xA8', /* 隨 */
-+ '\0',
-+ '\xE4', '\xBA', '\x8B', ' ', '\xE5', '\x89', '\x8D', ' ', '\xE5', '\xAD', '\xB8', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x88', '\x96', /* 事 前 學 将 將 情 想 或 */
-+ ' ', '\xE6', '\x94', '\xBF', ' ', '\xE6', '\x96', '\xAF', ' ', '\xE6', '\x96', '\xB0', ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE6', '\xB0', '\x91', ' ', '\xE6', '\xB2', '\x92', ' ', '\xE6', '\xB2', '\xA1', /* 政 斯 新 样 樣 民 沒 没 */
-+ ' ', '\xE7', '\x84', '\xB6', ' ', '\xE7', '\x89', '\xB9', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x83', ' ', '\xE7', '\xAC', '\xAC', ' ', '\xE7', '\xB6', '\x93', ' ', '\xE8', '\xB0', '\x81', /* 然 特 现 現 球 第 經 谁 */
-+ ' ', '\xE8', '\xB5', '\xB7', ' ', '|', /* 起 | */
-+ ' ', '\xE4', '\xBE', '\x8B', ' ', '\xE5', '\x88', '\xA5', ' ', '\xE5', '\x88', '\xAB', ' ', '\xE5', '\x88', '\xB6', ' ', '\xE5', '\x8A', '\xA8', ' ', '\xE5', '\x8B', '\x95', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x97', '\x8E', /* 例 別 别 制 动 動 吗 嗎 */
-+ ' ', '\xE5', '\xA2', '\x9E', ' ', '\xE6', '\x8C', '\x87', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE6', '\x9C', '\x9D', ' ', '\xE6', '\x9C', '\x9F', ' ', '\xE6', '\x9E', '\x84', ' ', '\xE7', '\x89', '\xA9', ' ', '\xE7', '\xA1', '\xAE', /* 增 指 明 朝 期 构 物 确 */
-+ ' ', '\xE7', '\xA7', '\x8D', ' ', '\xE8', '\xAA', '\xBF', ' ', '\xE8', '\xB0', '\x83', ' ', '\xE8', '\xB2', '\xBB', ' ', '\xE8', '\xB4', '\xB9', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x83', '\xBD', ' ', '\xE9', '\x96', '\x93', /* 种 調 调 費 费 那 都 間 */
-+ ' ', '\xE9', '\x97', '\xB4', /* 间 */
- #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
- #endif /* AF_CONFIG_OPTION_CJK */
- '\0',
-diff --git a/src/autofit/afblue.dat b/src/autofit/afblue.dat
-index 1b52378..117f025 100644
---- a/src/autofit/afblue.dat
-+++ b/src/autofit/afblue.dat
-@@ -20,9 +20,8 @@
- // labels separated by whitespace and followed by a colon (everything in a
- // single line); the first label gives the name of the enumeration template,
- // the second the name of the array template, and the third the name of the
--// `maximum' template, holding the size of the largest array element. The
--// script then fills the corresponding templates (indicated by `@'
--// characters around the name).
-+// `maximum' template. The script then fills the corresponding templates
-+// (indicated by `@' characters around the name).
- //
- // A section contains one or more data records. Each data record consists
- // of two or more lines. The first line holds the enumeration name, and the
-@@ -30,15 +29,20 @@
- //
- // There are two possible representations for array data.
- //
--// - A string of characters in UTF-8 encoding enclosed in double quotes,
--// using C syntax. There can be only one string per line, thus the
--// starting and ending double quote must be the first and last character
--// in the line, respectively, ignoring whitespace before and after the
--// string. Space characters within the string are ignored too. If there
--// are multiple strings (in multiple lines), they are concatenated to a
--// single string. In the output, a string gets represented as a series of
--// singles bytes, followed by a zero byte. The enumeration values simply
--// hold byte offsets to the start of the corresponding strings.
-+// - A string of characters or character clusters (for example, representing
-+// Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double
-+// quotes, using C syntax, where the elements are separated by spaces.
-+// There can be only one string per line, thus the starting and ending
-+// double quote must be the first and last character in the line,
-+// respectively, ignoring whitespace before and after the string. If
-+// there are multiple strings (in multiple lines), they are concatenated
-+// to a single string. In the output, a string gets represented as a
-+// series of singles bytes, followed by a zero byte. The enumeration
-+// values simply hold byte offsets to the start of the corresponding
-+// strings.
-+//
-+// For strings, the `maximum' template holds the maximum number of
-+// non-space characters in all strings.
- //
- // - Data blocks enclosed in balanced braces, which get copied verbatim and
- // which can span multiple lines. The opening brace of a block must be
-@@ -47,6 +51,9 @@
- // character after each block and counts the number of blocks to set the
- // enumeration values.
- //
-+// For data blocks, the `maximum' template holds the maximum number of
-+// array elements.
-+//
- // A section can contain either strings only or data blocks only.
- //
- // A comment line starts with `//'; it gets removed. A preprocessor
-@@ -80,16 +87,14 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
- "ـ"
-
- AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
-- "БВЕПЗОСЭ"
-+ "Б В Е П З О С Э"
- AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
-- "БВЕШЗОСЭ"
-+ "Б В Е Ш З О С Э"
- AF_BLUE_STRING_CYRILLIC_SMALL
-- "хпншезос"
-+ "х п н ш е з о с"
- AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
-- "руф"
-+ "р у ф"
-
-- // we separate the letters with spaces to avoid ligatures;
-- // this is just for convenience to simplify reading
- AF_BLUE_STRING_DEVANAGARI_BASE
- "क म अ आ थ ध भ श"
- AF_BLUE_STRING_DEVANAGARI_TOP
-@@ -103,22 +108,22 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
- "ु ृ"
-
- AF_BLUE_STRING_GREEK_CAPITAL_TOP
-- "ΓΒΕΖΘΟΩ"
-+ "Γ Β Ε Ζ Θ Ο Ω"
- AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
-- "ΒΔΖΞΘΟ"
-+ "Β Δ Ζ Ξ Θ Ο"
- AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
-- "βθδζλξ"
-+ "β θ δ ζ λ ξ"
- AF_BLUE_STRING_GREEK_SMALL
-- "αειοπστω"
-+ "α ε ι ο π σ τ ω"
- AF_BLUE_STRING_GREEK_SMALL_DESCENDER
-- "βγημρφχψ"
-+ "β γ η μ ρ φ χ ψ"
-
- AF_BLUE_STRING_HEBREW_TOP
-- "בדהחךכםס"
-+ "ב ד ה ח ך כ ם ס"
- AF_BLUE_STRING_HEBREW_BOTTOM
-- "בטכםסצ"
-+ "ב ט כ ם ס צ"
- AF_BLUE_STRING_HEBREW_DESCENDER
-- "קךןףץ"
-+ "ק ך ן ף ץ"
-
- AF_BLUE_STRING_LAO_TOP
- "າ ດ ອ ມ ລ ວ ຣ ງ"
-@@ -132,43 +137,41 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
- "ງ ຊ ຖ ຽ ໆ ຯ"
-
- AF_BLUE_STRING_LATIN_CAPITAL_TOP
-- "THEZOCQS"
-+ "T H E Z O C Q S"
- AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
-- "HEZLOCUS"
-+ "H E Z L O C U S"
- AF_BLUE_STRING_LATIN_SMALL_F_TOP
-- "fijkdbh"
-+ "f i j k d b h"
- AF_BLUE_STRING_LATIN_SMALL
-- "xzroesc"
-+ "x z r o e s c"
- AF_BLUE_STRING_LATIN_SMALL_DESCENDER
-- "pqgjy"
-+ "p q g j y"
-
- // we assume that both the subscript and superscript ranges
- // don't contain oldstyle digits (actually, most fonts probably
- // have digits only in those ranges)
- AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
-- "₀₃₅₇₈"
-+ "₀ ₃ ₅ ₇ ₈"
- AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
-- "₀₁₂₃₈"
-+ "₀ ₁ ₂ ₃ ₈"
- AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
-- "ᵢⱼₕₖₗ"
-+ "ᵢ ⱼ ₕ ₖ ₗ"
- AF_BLUE_STRING_LATIN_SUBS_SMALL
-- "ₐₑₒₓₙₛᵥᵤᵣ"
-+ "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ"
- AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
-- "ᵦᵧᵨᵩₚ"
-+ "ᵦ ᵧ ᵨ ᵩ ₚ"
-
- AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
-- "⁰³⁵⁷ᵀᴴᴱᴼ"
-+ "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ"
- AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
-- "⁰¹²³ᴱᴸᴼᵁ"
-+ "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ"
- AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
-- "ᵇᵈᵏʰʲᶠⁱ"
-+ "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ"
- AF_BLUE_STRING_LATIN_SUPS_SMALL
-- "ᵉᵒʳˢˣᶜᶻ"
-+ "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ"
- AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
-- "ᵖʸᵍ"
-+ "ᵖ ʸ ᵍ"
-
-- // we separate the letters with spaces to avoid ligatures;
-- // this is just for convenience to simplify reading
- AF_BLUE_STRING_TELUGU_TOP
- "ఇ ఌ ఙ ఞ ణ ఱ ౯"
- AF_BLUE_STRING_TELUGU_BOTTOM
-@@ -193,44 +196,44 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
- #ifdef AF_CONFIG_OPTION_CJK
-
- AF_BLUE_STRING_CJK_TOP
-- "他们你來們到和地"
-- "对對就席我时時會"
-- "来為能舰說说这這"
-- "齊 |"
-- "军同已愿既星是景"
-- "民照现現理用置要"
-- "軍那配里開雷露面"
-- "顾"
-+ "他 们 你 來 們 到 和 地"
-+ " 对 對 就 席 我 时 時 會"
-+ " 来 為 能 舰 說 说 这 這"
-+ " 齊 |"
-+ " 军 同 已 愿 既 星 是 景"
-+ " 民 照 现 現 理 用 置 要"
-+ " 軍 那 配 里 開 雷 露 面"
-+ " 顾"
- AF_BLUE_STRING_CJK_BOTTOM
-- "个为人他以们你來"
-- "個們到和大对對就"
-- "我时時有来為要說"
-- "说 |"
-- "主些因它想意理生"
-- "當看着置者自著裡"
-- "过还进進過道還里"
-- "面"
-+ "个 为 人 他 以 们 你 來"
-+ " 個 們 到 和 大 对 對 就"
-+ " 我 时 時 有 来 為 要 說"
-+ " 说 |"
-+ " 主 些 因 它 想 意 理 生"
-+ " 當 看 着 置 者 自 著 裡"
-+ " 过 还 进 進 過 道 還 里"
-+ " 面"
-
- #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
-
- AF_BLUE_STRING_CJK_LEFT
-- "些们你來們到和地"
-- "她将將就年得情最"
-- "样樣理能說说这這"
-- "通 |"
-- "即吗吧听呢品响嗎"
-- "师師收断斷明眼間"
-- "间际陈限除陳随際"
-- "隨"
-+ " 些 们 你 來 們 到 和 地"
-+ " 她 将 將 就 年 得 情 最"
-+ " 样 樣 理 能 說 说 这 這"
-+ " 通 |"
-+ " 即 吗 吧 听 呢 品 响 嗎"
-+ " 师 師 收 断 斷 明 眼 間"
-+ " 间 际 陈 限 除 陳 随 際"
-+ " 隨"
- AF_BLUE_STRING_CJK_RIGHT
-- "事前學将將情想或"
-- "政斯新样樣民沒没"
-- "然特现現球第經谁"
-- "起 |"
-- "例別别制动動吗嗎"
-- "增指明朝期构物确"
-- "种調调費费那都間"
-- "间"
-+ "事 前 學 将 將 情 想 或"
-+ " 政 斯 新 样 樣 民 沒 没"
-+ " 然 特 现 現 球 第 經 谁"
-+ " 起 |"
-+ " 例 別 别 制 动 動 吗 嗎"
-+ " 增 指 明 朝 期 构 物 确"
-+ " 种 調 调 費 费 那 都 間"
-+ " 间"
-
- #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
-
-@@ -307,11 +310,11 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
- //
- // Characters in a blue string are *not* automatically classified. Instead,
- // first come the characters used for the overshoot value, then the
--// character `|', then the characters used for the reference value. The
--// blue zone is then set up by the mean values of all reference values and
--// all overshoot values, respectively. Both horizontal and vertical blue
--// zones (i.e., adjusting vertical and horizontal coordinate values,
--// respectively) are supported.
-+// character `|', then the characters used for the reference value
-+// (everything separated by space characters). The blue zone is then set up
-+// by the mean values of all reference values and all overshoot values,
-+// respectively. Both horizontal and vertical blue zones (i.e., adjusting
-+// vertical and horizontal coordinate values, respectively) are supported.
- //
- // For the cjk auto-hinter, the overshoot should be smaller than the
- // reference for top zones, and vice versa for bottom zones.
-diff --git a/src/autofit/afblue.h b/src/autofit/afblue.h
-index a79098a..2ee1ed1 100644
---- a/src/autofit/afblue.h
-+++ b/src/autofit/afblue.h
-@@ -78,62 +78,62 @@ FT_BEGIN_HEADER
- typedef enum AF_Blue_String_
- {
- AF_BLUE_STRING_ARABIC_TOP = 0,
-- AF_BLUE_STRING_ARABIC_BOTTOM = 13,
-- AF_BLUE_STRING_ARABIC_JOIN = 24,
-- AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 27,
-- AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 44,
-- AF_BLUE_STRING_CYRILLIC_SMALL = 61,
-- AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 78,
-- AF_BLUE_STRING_DEVANAGARI_BASE = 85,
-- AF_BLUE_STRING_DEVANAGARI_TOP = 110,
-- AF_BLUE_STRING_DEVANAGARI_HEAD = 135,
-- AF_BLUE_STRING_DEVANAGARI_BOTTOM = 160,
-- AF_BLUE_STRING_GREEK_CAPITAL_TOP = 167,
-- AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 182,
-- AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 195,
-- AF_BLUE_STRING_GREEK_SMALL = 208,
-- AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 225,
-- AF_BLUE_STRING_HEBREW_TOP = 242,
-- AF_BLUE_STRING_HEBREW_BOTTOM = 259,
-- AF_BLUE_STRING_HEBREW_DESCENDER = 272,
-- AF_BLUE_STRING_LAO_TOP = 283,
-- AF_BLUE_STRING_LAO_BOTTOM = 308,
-- AF_BLUE_STRING_LAO_ASCENDER = 333,
-- AF_BLUE_STRING_LAO_LARGE_ASCENDER = 346,
-- AF_BLUE_STRING_LAO_DESCENDER = 356,
-- AF_BLUE_STRING_LATIN_CAPITAL_TOP = 375,
-- AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 384,
-- AF_BLUE_STRING_LATIN_SMALL_F_TOP = 393,
-- AF_BLUE_STRING_LATIN_SMALL = 401,
-- AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 409,
-- AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 415,
-- AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 431,
-- AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 447,
-- AF_BLUE_STRING_LATIN_SUBS_SMALL = 463,
-- AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 491,
-- AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 507,
-- AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 531,
-- AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 553,
-- AF_BLUE_STRING_LATIN_SUPS_SMALL = 573,
-- AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 592,
-- AF_BLUE_STRING_TELUGU_TOP = 601,
-- AF_BLUE_STRING_TELUGU_BOTTOM = 623,
-- AF_BLUE_STRING_THAI_TOP = 645,
-- AF_BLUE_STRING_THAI_BOTTOM = 664,
-- AF_BLUE_STRING_THAI_ASCENDER = 686,
-- AF_BLUE_STRING_THAI_LARGE_ASCENDER = 696,
-- AF_BLUE_STRING_THAI_DESCENDER = 706,
-- AF_BLUE_STRING_THAI_LARGE_DESCENDER = 719,
-- AF_BLUE_STRING_THAI_DIGIT_TOP = 726,
-- af_blue_1_1 = 735,
-+ AF_BLUE_STRING_ARABIC_BOTTOM = 18,
-+ AF_BLUE_STRING_ARABIC_JOIN = 33,
-+ AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 36,
-+ AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 60,
-+ AF_BLUE_STRING_CYRILLIC_SMALL = 84,
-+ AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 108,
-+ AF_BLUE_STRING_DEVANAGARI_BASE = 117,
-+ AF_BLUE_STRING_DEVANAGARI_TOP = 149,
-+ AF_BLUE_STRING_DEVANAGARI_HEAD = 181,
-+ AF_BLUE_STRING_DEVANAGARI_BOTTOM = 213,
-+ AF_BLUE_STRING_GREEK_CAPITAL_TOP = 221,
-+ AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 242,
-+ AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 260,
-+ AF_BLUE_STRING_GREEK_SMALL = 278,
-+ AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 302,
-+ AF_BLUE_STRING_HEBREW_TOP = 326,
-+ AF_BLUE_STRING_HEBREW_BOTTOM = 350,
-+ AF_BLUE_STRING_HEBREW_DESCENDER = 368,
-+ AF_BLUE_STRING_LAO_TOP = 383,
-+ AF_BLUE_STRING_LAO_BOTTOM = 415,
-+ AF_BLUE_STRING_LAO_ASCENDER = 447,
-+ AF_BLUE_STRING_LAO_LARGE_ASCENDER = 463,
-+ AF_BLUE_STRING_LAO_DESCENDER = 475,
-+ AF_BLUE_STRING_LATIN_CAPITAL_TOP = 499,
-+ AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 515,
-+ AF_BLUE_STRING_LATIN_SMALL_F_TOP = 531,
-+ AF_BLUE_STRING_LATIN_SMALL = 545,
-+ AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 559,
-+ AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 569,
-+ AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 589,
-+ AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 609,
-+ AF_BLUE_STRING_LATIN_SUBS_SMALL = 629,
-+ AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 665,
-+ AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 685,
-+ AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 716,
-+ AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 745,
-+ AF_BLUE_STRING_LATIN_SUPS_SMALL = 771,
-+ AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 796,
-+ AF_BLUE_STRING_TELUGU_TOP = 807,
-+ AF_BLUE_STRING_TELUGU_BOTTOM = 835,
-+ AF_BLUE_STRING_THAI_TOP = 863,
-+ AF_BLUE_STRING_THAI_BOTTOM = 887,
-+ AF_BLUE_STRING_THAI_ASCENDER = 915,
-+ AF_BLUE_STRING_THAI_LARGE_ASCENDER = 927,
-+ AF_BLUE_STRING_THAI_DESCENDER = 939,
-+ AF_BLUE_STRING_THAI_LARGE_DESCENDER = 955,
-+ AF_BLUE_STRING_THAI_DIGIT_TOP = 963,
-+ af_blue_1_1 = 974,
- #ifdef AF_CONFIG_OPTION_CJK
- AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1,
-- AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 153,
-- af_blue_1_1_1 = af_blue_1_1 + 304,
-+ AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203,
-+ af_blue_1_1_1 = af_blue_1_1 + 404,
- #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
- AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1,
-- AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 153,
-- af_blue_1_1_2 = af_blue_1_1_1 + 304,
-+ AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 204,
-+ af_blue_1_1_2 = af_blue_1_1_1 + 405,
- #else
- af_blue_1_1_2 = af_blue_1_1_1 + 0,
- #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
---
-2.6.3
-
diff --git a/03-infinality-2.6.2-2015.12.05.patch b/03-infinality-2.6.2-2015.12.05.patch
deleted file mode 100644
index 7a4a07243e7..00000000000
--- a/03-infinality-2.6.2-2015.12.05.patch
+++ /dev/null
@@ -1,5881 +0,0 @@
-diff --git a/builds/freetype.mk b/builds/freetype.mk
-index 1cc7e29..c73ae68 100644
---- a/builds/freetype.mk
-+++ b/builds/freetype.mk
-@@ -161,6 +161,7 @@ FT_CFLAGS = $(CPPFLAGS) \
- $(CFLAGS) \
- $DFT2_BUILD_LIBRARY \
- $DFT_CONFIG_MODULES_H="<ftmodule.h>" \
-+ $D_GNU_SOURCE \
- $(FTOPTION_FLAG)
-
-
-diff --git a/configure b/configure
-index fd52581..bb81fb8 100755
---- a/configure
-+++ b/configure
-@@ -13,6 +13,8 @@
- # Call the `configure' script located in `builds/unix'.
- #
-
-+export LDFLAGS="$LDFLAGS -lm"
-+
- rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk
-
- # respect GNUMAKE environment variable for backwards compatibility
-diff --git a/devel/ftoption.h b/devel/ftoption.h
-index f68b3ad..fb01836 100644
---- a/devel/ftoption.h
-+++ b/devel/ftoption.h
-@@ -607,6 +607,17 @@ FT_BEGIN_HEADER
-
- /*************************************************************************/
- /* */
-+ /* Define FT_CONFIG_OPTION_INFINALITY_PATCHSET if you want to enable */
-+ /* all additional infinality patches, which are configured via env */
-+ /* variables. */
-+ /* */
-+ /* This option requires TT_CONFIG_OPTION_SUBPIXEL_HINTING to */
-+ /* defined. */
-+ /* */
-+#define FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+
-+ /*************************************************************************/
-+ /* */
- /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */
- /* of the TrueType bytecode interpreter is used that doesn't implement */
- /* any of the patented opcodes and algorithms. The patents related to */
-diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
-index b481f8f..b05932a 100644
---- a/include/freetype/config/ftoption.h
-+++ b/include/freetype/config/ftoption.h
-@@ -92,7 +92,7 @@ FT_BEGIN_HEADER
- /* This is done to allow FreeType clients to run unmodified, forcing */
- /* them to display normal gray-level anti-aliased glyphs. */
- /* */
--/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-
- /*************************************************************************/
-@@ -602,11 +602,22 @@ FT_BEGIN_HEADER
- /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */
- /* defined. */
- /* */
--/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-+#define TT_CONFIG_OPTION_SUBPIXEL_HINTING
-
-
- /*************************************************************************/
- /* */
-+ /* Define FT_CONFIG_OPTION_INFINALITY_PATCHSET if you want to enable */
-+ /* all additional infinality patches, which are configured via env */
-+ /* variables. */
-+ /* */
-+ /* This option requires TT_CONFIG_OPTION_SUBPIXEL_HINTING to */
-+ /* defined. */
-+ /* */
-+#define FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+
-+ /*************************************************************************/
-+ /* */
- /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */
- /* of the TrueType bytecode interpreter is used that doesn't implement */
- /* any of the patented opcodes and algorithms. The patents related to */
-diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
-index 53851e7..c20e7d3 100644
---- a/src/autofit/aflatin.c
-+++ b/src/autofit/aflatin.c
-@@ -24,7 +24,10 @@
- #include "afpic.h"
- #include "aflatin.h"
- #include "aferrors.h"
--
-+#include "strings.h"
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "../base/ftinf.h"
-+#endif
-
- #ifdef AF_CONFIG_OPTION_USE_WARPER
- #include "afwarp.h"
-@@ -40,6 +43,10 @@
- #undef FT_COMPONENT
- #define FT_COMPONENT trace_aflatin
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+FT_Pos infinality_cur_width = 0;
-+#endif
-+
-
- /* needed for computation of round vs. flat segments */
- #define FLAT_THRESHOLD( x ) ( x / 14 )
-@@ -916,7 +923,10 @@
- FT_Pos delta;
- AF_LatinAxis axis;
- FT_UInt nn;
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Bool adjust_heights = FALSE;
-+ if(ftinf) adjust_heights=ftinf->autohint_increase_glyph_heights;
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
-
- if ( dim == AF_DIMENSION_HORZ )
- {
-@@ -944,7 +954,7 @@
- {
- AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT];
- AF_LatinBlue blue = NULL;
--
-+ int threshold = 40;
-
- for ( nn = 0; nn < Axis->blue_count; nn++ )
- {
-@@ -954,7 +964,12 @@
- break;
- }
- }
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( adjust_heights &&
-+ metrics->root.scaler.face->size->metrics.x_ppem < 15 &&
-+ metrics->root.scaler.face->size->metrics.x_ppem > 5 )
-+ threshold = 52;
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- if ( blue )
- {
- FT_Pos scaled;
-@@ -1110,7 +1125,13 @@
-
- /* a blue zone is only active if it is less than 3/4 pixels tall */
- dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );
-+
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* Do at low ppems ( ~< 200 ), in order to prevent fringes */
-+ if ( dist <= 256 && dist >= -256 )
-+#else
- if ( dist <= 48 && dist >= -48 )
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- {
- #if 0
- FT_Pos delta1;
-@@ -1161,7 +1182,12 @@
- delta2 = -delta2;
-
- blue->ref.fit = FT_PIX_ROUND( blue->ref.cur );
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* Round to prevent fringes */
-+ blue->shoot.fit = FT_PIX_ROUND( blue->ref.fit - delta2 );
-+#else
- blue->shoot.fit = blue->ref.fit - delta2;
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
-
- #endif
-
-@@ -2015,7 +2041,10 @@
- dist = edge->fpos - blue->shoot.org;
- if ( dist < 0 )
- dist = -dist;
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* round down to pixels */
-+ /*dist = FT_MulFix( dist, scale ) & ~63;*/
-+#endif
- dist = FT_MulFix( dist, scale );
- if ( dist < best_dist )
- {
-@@ -2190,8 +2219,17 @@
- FT_Pos dist = width;
- FT_Int sign = 0;
- FT_Int vertical = ( dim == AF_DIMENSION_VERT );
--
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Int infinality_dist = 0;
-+ FT_UInt autohint_snap_stem_height = 0;
-+ if( ftinf ) autohint_snap_stem_height=ftinf->autohint_snap_stem_height;
-+ if ( autohint_snap_stem_height > 100 )
-+ autohint_snap_stem_height = 100;
-+ else if ( autohint_snap_stem_height < 0 )
-+ autohint_snap_stem_height = 0;
-+
-+ if ( autohint_snap_stem_height == 0 )
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
- axis->extra_light )
- return width;
-@@ -2201,9 +2239,73 @@
- dist = -width;
- sign = 1;
- }
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* Calculate snap value differently than standard freetype */
-+ if ( autohint_snap_stem_height > 0 &&
-+ ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
-+ ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) )
-+ {
-+ infinality_dist = af_latin_snap_width( axis->widths,
-+ axis->width_count, dist );
-+
-+ if ( metrics->root.scaler.face->size->metrics.x_ppem > 9 &&
-+ axis->width_count > 0 &&
-+ abs( axis->widths[0].cur - infinality_dist ) < 32 &&
-+ axis->widths[0].cur > 52 )
-+ {
-+ if ( strstr( metrics->root.scaler.face->style_name, "Regular" ) ||
-+ strstr( metrics->root.scaler.face->style_name, "Book" ) ||
-+ strstr( metrics->root.scaler.face->style_name, "Medium" ) ||
-+ strcmp( metrics->root.scaler.face->style_name, "Italic" ) == 0 ||
-+ strcmp( metrics->root.scaler.face->style_name, "Oblique" ) == 0 )
-+ {
-+ /* regular weight */
-+ if ( axis->widths[0].cur < 64 )
-+ infinality_dist = 64;
-+ else if ( axis->widths[0].cur < 88 )
-+ infinality_dist = 64;
-+ else if ( axis->widths[0].cur < 160 )
-+ infinality_dist = 128;
-+ else if ( axis->widths[0].cur < 240 )
-+ infinality_dist = 190;
-+ else infinality_dist = ( infinality_dist ) & ~63;
-+ }
-+ else
-+ {
-+ /* bold gets a different threshold */
-+ if ( axis->widths[0].cur < 64 )
-+ infinality_dist = 64 ;
-+ else if ( axis->widths[0].cur < 108 )
-+ infinality_dist = 64;
-+ else if ( axis->widths[0].cur < 160 )
-+ infinality_dist = 128;
-+ else if ( axis->widths[0].cur < 222 )
-+ infinality_dist = 190;
-+ else if ( axis->widths[0].cur < 288 )
-+ infinality_dist = 254;
-+ else infinality_dist = ( infinality_dist + 16 ) & ~63;
-+ }
-+
-+ }
-+ if ( infinality_dist < 52 )
-+ {
-+ if ( metrics->root.scaler.face->size->metrics.x_ppem < 9 )
-+ {
-+ if ( infinality_dist < 32 )
-+ infinality_dist = 32;
-+ }
-+ else
-+ infinality_dist = 64;
-+ }
-+ }
-+ else if ( autohint_snap_stem_height < 100 &&
-+ ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
-+ ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) )
-+#else
-
-- if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
-+ if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
- ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- {
- /* smooth hinting process: very lightly quantize the stem width */
-
-@@ -2263,6 +2365,9 @@
- }
- }
- else
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( autohint_snap_stem_height < 100 )
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- {
- /* strong hinting process: snap the stem width to integer pixels */
-
-@@ -2270,7 +2375,10 @@
-
-
- dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( autohint_snap_stem_height > 0 )
-+ goto Done_Width;
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- if ( vertical )
- {
- /* in the case of vertical hinting, always round */
-@@ -2333,6 +2441,32 @@
- }
-
- Done_Width:
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( axis->widths[0].cur > 42 )
-+ /* weighted average */
-+ dist = (dist * ( 100 - autohint_snap_stem_height )
-+ + infinality_dist * autohint_snap_stem_height ) / 100;
-+
-+ {
-+ int factor = 100;
-+ if ( axis->standard_width < 100 )
-+ factor = axis->standard_width;
-+
-+ if ( metrics->root.scaler.face->size->metrics.x_ppem >= 9 && dist < 52 )
-+ dist += ( (52 - dist) * factor ) / 100;
-+ if ( metrics->root.scaler.face->size->metrics.x_ppem < 9 && dist < 32 )
-+ dist += ( (32 - dist) * factor ) / 100;
-+
-+ if ( axis->standard_width > 100 &&
-+ metrics->root.scaler.face->size->metrics.x_ppem >= 11 &&
-+ dist < 64 )
-+ dist = 64;
-+ if ( axis->standard_width > 100 &&
-+ metrics->root.scaler.face->size->metrics.x_ppem >= 9 &&
-+ dist < 52 )
-+ dist = 52;
-+ }
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- if ( sign )
- dist = -dist;
-
-@@ -2354,6 +2488,8 @@
- base_edge->flags,
- stem_edge->flags );
-
-+/* if fitted_width causes stem_edge->pos to land basically on top of an existing
-+ * stem_edge->pos, then add or remove 64. Need to figure out a way to do this */
-
- stem_edge->pos = base_edge->pos + fitted_width;
-
-@@ -2915,8 +3051,11 @@
- int dim;
-
- AF_LatinAxis axis;
--
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Int emboldening_strength = 0;
-+ FT_Bool use_various_tweaks = FALSE;
-+ if( ftinf ) use_various_tweaks=ftinf->use_various_tweaks;
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- error = af_glyph_hints_reload( hints, outline );
- if ( error )
- goto Exit;
-@@ -2986,7 +3125,11 @@
- }
-
- af_glyph_hints_save( hints, outline );
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ {
-+ infinality_cur_width = metrics->axis->widths[0].cur;
-+ }
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- Exit:
- return error;
- }
-diff --git a/src/autofit/aflatin.h b/src/autofit/aflatin.h
-index dd75ef3..257265e 100644
---- a/src/autofit/aflatin.h
-+++ b/src/autofit/aflatin.h
-@@ -62,6 +62,9 @@ FT_BEGIN_HEADER
-
- #define AF_LATIN_MAX_WIDTHS 16
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ extern FT_Pos infinality_cur_width;
-+#endif
-
- #define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */
- #define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */
-diff --git a/src/base/Jamfile b/src/base/Jamfile
-index e39fb09..a33e9a1 100644
---- a/src/base/Jamfile
-+++ b/src/base/Jamfile
-@@ -55,6 +55,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ;
- ftglyph
- ftgxval
- ftinit
-+ ftinf
- ftlcdfil
- ftmm
- ftotval
-diff --git a/src/base/ftbase.c b/src/base/ftbase.c
-index 253dfb7..59d2d17 100644
---- a/src/base/ftbase.c
-+++ b/src/base/ftbase.c
-@@ -33,6 +33,9 @@
- #include "ftstream.c"
- #include "fttrigon.c"
- #include "ftutil.c"
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "ftinf.c"
-+#endif
-
- #ifdef FT_MACINTOSH
- #include "ftmac.c"
-diff --git a/src/base/ftinf.c b/src/base/ftinf.c
-new file mode 100644
-index 0000000..cef285d
---- /dev/null
-+++ b/src/base/ftinf.c
-@@ -0,0 +1,359 @@
-+#include <stdlib.h>
-+#include "ftinf.h"
-+#define true 1
-+#define false 0
-+
-+#define on 1
-+#define off 0
-+#define end (-128)
-+
-+#define sw2pv 18 /* STEM_WIDTH_2_PPEM */
-+#define maxp 100 /* MAX_PPEM */
-+
-+typedef signed char pv; /* ppm and values type */
-+/* the arrays start with existence flag + values */
-+typedef struct sa_rules_s {
-+ const char *name;
-+ pv always_use_100[1+4+1];
-+ pv brightness[1+2+1];
-+ pv contrast[1+2+1];
-+ pv edge_detection[1+4+1];
-+ pv m[1+4+1];
-+ pv bearing_correction[1+2+1];
-+ pv spacing[1+5+1];
-+ pv start[1+5+1];
-+ pv stem_scaling[1+6+1];
-+ pv stem_translating[1+2+1];
-+ pv stem_translating_only[1+10+1];
-+ pv stem_widths[1+4]; /* these end with maxp */
-+ pv synthesize_stems[1+2+1];
-+} sa_rules_t;
-+
-+#pragma GCC diagnostic ignored "-Wpedantic" /* C99 struct initializer tags are needed */
-+#pragma GCC diagnostic ignored "-Wunused-function"
-+
-+const ftinf_t *ftinf;
-+/* final settings, updated from environment */
-+ftinf_t _env;
-+
-+/* rules and hashing function */
-+#include "ftinf_rh.c"
-+
-+/* rules selection */
-+void ftinf_fill_stem_values( Stem_Data *stem_values,
-+ const char *family, int ppem, int use_known ){
-+ /* set the defaults */
-+ stem_values->bearing_correction = TRUE;
-+ stem_values->brightness = 0.0;
-+ stem_values->contrast = 0.0;
-+ stem_values->edge_detection = FALSE;
-+ stem_values->m = -1;
-+ stem_values->stem_scaling = -1;
-+ stem_values->stem_spacing = -1;
-+ stem_values->stem_start = -1;
-+ stem_values->stem_translating = 0;
-+ stem_values->stem_translating_only = -1024;
-+ stem_values->stem_width = -1;
-+ stem_values->synth_stems = FALSE;
-+ stem_values->use_100 = FALSE;
-+ /* pick from known rules if requested and they exist for current family */
-+ if( !use_known )
-+ return;
-+ else {
-+ const sa_rules_t *r=ftinf_rules( family );
-+ int i;
-+ if( r==NULL ) return;
-+ if( r->stem_widths[0]==on )
-+ for( i=1; r->stem_widths[i]!=maxp; ++i )
-+ if( ppem < r->stem_widths[i] ){
-+ stem_values->stem_width = i-1;
-+ break;
-+ }
-+
-+ if( r->stem_scaling[0]==on )
-+ for( i=1; r->stem_scaling[i]!=end; i+=2 )
-+ if( ppem==r->stem_scaling[i] ){
-+ stem_values->stem_scaling = r->stem_scaling[i+1];
-+ break;
-+ }
-+
-+ if( r->m[0]==on )
-+ for( i=1; r->m[i]!=end; i+=2 )
-+ if( ppem==r->m[i] ){
-+ stem_values->m = r->m[i+1];
-+ break;
-+ }
-+
-+ if( r->stem_translating_only[0]==on )
-+ for( i=1; r->stem_translating_only[i]!=end; i+=2 )
-+ if( ppem==r->stem_translating_only[i] || r->stem_translating_only[i]==0 ){
-+ stem_values->stem_translating_only = r->stem_translating_only[i+1];
-+ break;
-+ }
-+
-+ if( r->stem_translating[0]==on )
-+ for( i=1; r->stem_translating[i]!=end; i+=2 )
-+ if( ppem==r->stem_translating[i] || r->stem_translating[i]==0 ){
-+ stem_values->stem_translating = r->stem_translating[i+1];
-+ break;
-+ }
-+
-+ if( r->always_use_100[0]==on )
-+ for( i=1; r->always_use_100[i]!=end; i+=2 )
-+ if( ppem>=r->always_use_100[i] && ppem<=r->always_use_100[i+1] ){
-+ stem_values->use_100 = TRUE;
-+ break;
-+ }
-+
-+ if( r->synthesize_stems[0]==on )
-+ for( i=1; r->synthesize_stems[i]!=end; i+=2 )
-+ if( ppem>=r->synthesize_stems[i] && ppem<=r->synthesize_stems[i+1] ){
-+ stem_values->synth_stems = TRUE;
-+ break;
-+ }
-+
-+ if( r->edge_detection[0]==on )
-+ for( i=1; r->edge_detection[i]!=end; i+=2 )
-+ if( ppem>=r->edge_detection[i] && ppem<=r->edge_detection[i+1] ){
-+ stem_values->edge_detection = TRUE;
-+ break;
-+ }
-+
-+ if( r->bearing_correction[0]==on )
-+ for( i=1; r->bearing_correction[i]!=end; i+=2 )
-+ if( ppem>=r->bearing_correction[i] && ppem<=r->bearing_correction[i+1] ){
-+ stem_values->bearing_correction = FALSE;
-+ break;
-+ }
-+
-+#if(0)
-+ if( r->brightness[0]==on )
-+ for( i=1; r->brightness[i]!=end; i+=2 )
-+ if( ppem==r->brightness[i]||r->brightness[i]==0 ){
-+ stem_values->brightness=r->brightness[i+1]*(1.0f/300.0f);
-+ break;
-+ }
-+
-+ if( r->contrast[0]==on )
-+ for( i=1; r->contrast[i]!=end; i+=2 )
-+ if( ppem==r->contrast[i]||r->contrast[i]==0 ){
-+ stem_values->contrast=r->contrast[i+1]*(1.0f/300.0f);
-+ break;
-+ }
-+ if( r->spacing[0]==on ){
-+ /* not used by original code */
-+ }
-+ if( r->start[0]==on ){
-+ /* not used by original code */
-+ }
-+#endif
-+ }
-+ return;
-+}
-+
-+void ftinf_get_bc( const char *family, int ppem, float *brightness, float *contrast ){
-+ const sa_rules_t *r=ftinf_rules( family );
-+ *brightness=0;
-+ *contrast=0;
-+ if( r ){
-+ int i;
-+ if( r->brightness[0]==on )
-+ for( i=1; r->brightness[i]!=end; i+=2 )
-+ if( ppem==r->brightness[i]||r->brightness[i]==0 ){
-+ *brightness=r->brightness[i+1]*(1.0f/300.0f);
-+ break;
-+ }
-+
-+ if( r->contrast[0]==on )
-+ for( i=1; r->contrast[i]!=end; i+=2 )
-+ if( ppem==r->contrast[i]||r->contrast[i]==0 ){
-+ *contrast=r->contrast[i+1]*(1.0f/300.0f);
-+ break;
-+ }
-+ }
-+ return;
-+}
-+
-+static int
-+bool_val( const char *s ){
-+ if ( s != NULL )
-+ return strcasecmp(s, "true") == 0
-+ || strcasecmp(s, "1") == 0
-+ || strcasecmp(s, "on") == 0
-+ || strcasecmp(s, "yes") ==0;
-+ else
-+ return 0;
-+}
-+
-+static int
-+int_val( const char *s, int min, int max ){
-+ int val;
-+ sscanf ( s, "%d", &val );
-+ if ( val > max )
-+ val = max;
-+ else if ( val < min )
-+ val = min;
-+ return val;
-+}
-+
-+/* settings and hashing function */
-+#include "ftinf_sh.c"
-+
-+/*
-+ Get active Infinality settings
-+ */
-+void ftinf_env(){
-+ const char *s;
-+ ftinf=ftinf_settings( getenv( "INFINALITY_FT" ) );
-+
-+ if( ftinf==NULL ){
-+ ftinf=ftinf_settings( "ultimate3" );
-+ /* this should always succeed */
-+#if(0)
-+ if( ftinf==NULL ){
-+ /* put an error here */
-+ exit(-1);
-+ }
-+#endif
-+ }
-+ _env=ftinf[0]; /* copy as defaults */
-+
-+ /* check if custom environment values are set and update with them */
-+ s=getenv( "INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS" );
-+ if( s ) _env.autohint_increase_glyph_heights=bool_val( s );
-+ s=getenv( "INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT" );
-+ if( s ) _env.autohint_snap_stem_height=int_val( s, 0, 100 );
-+ s=getenv( "INFINALITY_FT_USE_VARIOUS_TWEAKS" );
-+ if( s ) _env.use_various_tweaks=bool_val( s );
-+ s=getenv( "INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS" );
-+ if( s ) _env.use_known_settings_on_selected_fonts=bool_val(s);
-+#if(0) /* not used (naming error also) */
-+ s=getenv( "INFINALITY_FT_AUTOHINT_MINIMUM_STEM_WIDTH" );
-+ if( s ) _env.autohint_minimum_stem_height=int_val( s, 0, 100 );
-+#endif
-+ s=getenv( "INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE" );
-+ if( s ) sscanf( s, "%d", &_env.stem_snapping_sliding_scale );
-+ s=getenv( "INFINALITY_FT_STEM_ALIGNMENT_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.stem_alignment_strength );
-+ s=getenv( "INFINALITY_FT_STEM_FITTING_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.stem_fitting_strength );
-+ s=getenv( "INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH" );
-+ if( s ) _env.chromeos_style_sharpening_strength=int_val( s, 0, 100 );
-+ s=getenv( "INFINALITY_FT_BRIGHTNESS" );
-+ if( s ) sscanf( s, "%d", &_env.brightness );
-+ s=getenv( "INFINALITY_FT_CONTRAST" );
-+ if( s ) sscanf( s, "%d", &_env.contrast );
-+ s=getenv( "INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH" );
-+ if( s ) _env.windows_style_sharpening_strength=int_val( s, 0, 100 );
-+ s=getenv( "INFINALITY_FT_GAMMA_CORRECTION" );
-+ if( s ){
-+ float *f=_env.gamma_correction;
-+ sscanf ( s, "%f %f", &f[0], &f[1] );
-+ if( f[1] < 1.0f ) f[1]=1.0f;
-+ }
-+ s=getenv( "INFINALITY_FT_FRINGE_FILTER_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.fringe_filter_strength );
-+ s=getenv( "INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.grayscale_filter_strength );
-+ s=getenv( "INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.autohint_horizontal_stem_darken_strength );
-+ s=getenv( "INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH" );
-+ if( s ) sscanf( s, "%d", &_env.autohint_vertical_stem_darken_strength );
-+ s=getenv( "INFINALITY_FT_GLOBAL_EMBOLDEN_X_VALUE" );
-+ if( s ) sscanf( s, "%d", &_env.global_embolden_x_value );
-+ s=getenv( "INFINALITY_FT_GLOBAL_EMBOLDEN_Y_VALUE" );
-+ if( s ) sscanf( s, "%d", &_env.global_embolden_y_value );
-+ s=getenv( "INFINALITY_FT_BOLD_EMBOLDEN_X_VALUE" );
-+ if( s ) sscanf( s, "%d", &_env.bold_embolden_x_value );
-+ s=getenv( "INFINALITY_FT_BOLD_EMBOLDEN_Y_VALUE" );
-+ if( s ) sscanf( s, "%d", &_env.bold_embolden_y_value );
-+ s=getenv( "INFINALITY_FT_FILTER_PARAMS" );
-+ if( s ) {
-+ int *f=_env.filter_params;
-+ if( sscanf( s, "%d %d %d %d %d", f+1, f+2, f+3, f+4, f+5 )==5 )
-+ f[0]=on;
-+ else
-+ f[0]=off; /* FIXME: put a warning? */
-+ }
-+ /* do the range verifications as in original code */
-+ if ( _env.stem_snapping_sliding_scale > maxp )
-+ _env.stem_snapping_sliding_scale = 0;
-+ else if ( _env.stem_snapping_sliding_scale < 0 )
-+ _env.stem_snapping_sliding_scale = 0;
-+ if (_env.stem_snapping_sliding_scale < 11 &&
-+ _env.stem_snapping_sliding_scale > 0 )
-+ _env.stem_snapping_sliding_scale = 11;
-+
-+ if ( _env.stem_alignment_strength > 100 )
-+ _env.stem_alignment_strength = 100;
-+ else if ( _env.stem_alignment_strength < 0 )
-+ _env.stem_alignment_strength = 0;
-+
-+ if ( _env.stem_fitting_strength > 100 )
-+ _env.stem_fitting_strength = 100;
-+ else if ( _env.stem_fitting_strength < 0 )
-+ _env.stem_fitting_strength = 0;
-+
-+ if ( _env.chromeos_style_sharpening_strength > 100 )
-+ _env.chromeos_style_sharpening_strength = 100;
-+ else if ( _env.chromeos_style_sharpening_strength < 0 )
-+ _env.chromeos_style_sharpening_strength = 0;
-+
-+ if ( _env.brightness > 100 )
-+ _env.brightness = 100;
-+ else if ( _env.brightness < -100 )
-+ _env.brightness = 0;
-+
-+ if ( _env.contrast > 100 )
-+ _env.contrast = 100;
-+ else if ( _env.contrast < -100 )
-+ _env.contrast = 0;
-+
-+ if ( _env.windows_style_sharpening_strength > 100 )
-+ _env.windows_style_sharpening_strength = 100;
-+ else if ( _env.windows_style_sharpening_strength < 0 )
-+ _env.windows_style_sharpening_strength = 0;
-+
-+ if ( _env.fringe_filter_strength > 100 )
-+ _env.fringe_filter_strength = 100;
-+ else if ( _env.fringe_filter_strength < 0 )
-+ _env.fringe_filter_strength = 0;
-+
-+ if ( _env.grayscale_filter_strength > 100 )
-+ _env.grayscale_filter_strength = 100;
-+ else if ( _env.grayscale_filter_strength < 0 )
-+ _env.grayscale_filter_strength = 0;
-+
-+ if ( _env.autohint_horizontal_stem_darken_strength > 100 )
-+ _env.autohint_horizontal_stem_darken_strength = 100;
-+ else if ( _env.autohint_horizontal_stem_darken_strength < 0 )
-+ _env.autohint_horizontal_stem_darken_strength = 0;
-+
-+ if ( _env.autohint_vertical_stem_darken_strength > 100 )
-+ _env.autohint_vertical_stem_darken_strength = 100;
-+ else if ( _env.autohint_horizontal_stem_darken_strength < 0 )
-+ _env.autohint_vertical_stem_darken_strength = 0;
-+
-+ if ( _env.global_embolden_x_value > 128 )
-+ _env.global_embolden_x_value = 128;
-+ else if ( _env.global_embolden_x_value < -128 )
-+ _env.global_embolden_x_value = -128;
-+
-+ if ( _env.global_embolden_y_value > 128 )
-+ _env.global_embolden_y_value = 128;
-+ else if ( _env.global_embolden_y_value < -128 )
-+ _env.global_embolden_y_value = -128;
-+
-+ if ( _env.bold_embolden_x_value > 128 )
-+ _env.bold_embolden_x_value = 128;
-+ else if (_env.bold_embolden_x_value < -128 )
-+ _env.bold_embolden_x_value = -128;
-+
-+ if ( _env.bold_embolden_y_value > 128 )
-+ _env.bold_embolden_y_value = 128;
-+ else if ( _env.bold_embolden_y_value < -128 )
-+ _env.bold_embolden_y_value = -128;
-+
-+ /* point to the combined and checked settings */
-+ ftinf=&_env;
-+}
-diff --git a/src/base/ftinf.h b/src/base/ftinf.h
-new file mode 100644
-index 0000000..dc35f48
---- /dev/null
-+++ b/src/base/ftinf.h
-@@ -0,0 +1,64 @@
-+#ifndef _FTINF_H_
-+#define _FTINF_H_
-+/*
-+ Stem snapping rules
-+ (base freetype typedefs assumed already included)
-+ */
-+typedef struct
-+{
-+ FT_Int stem_width;
-+ FT_Int stem_spacing;
-+ FT_Int stem_start;
-+ FT_Int stem_scaling;
-+ FT_Int stem_translating_only;
-+ FT_Int stem_translating;
-+ float brightness;
-+ float contrast;
-+ FT_Bool use_100;
-+ FT_Bool synth_stems;
-+ FT_Bool edge_detection;
-+ FT_Bool bearing_correction;
-+ FT_Int m;
-+} Stem_Data;
-+
-+/*
-+ Infinality settings
-+ */
-+typedef struct ftinf_s {
-+ const char *name;
-+ int autohint_horizontal_stem_darken_strength;
-+ int autohint_snap_stem_height;
-+ int autohint_increase_glyph_heights;
-+ int autohint_vertical_stem_darken_strength;
-+ int bold_embolden_x_value;
-+ int bold_embolden_y_value;
-+ int brightness;
-+ int chromeos_style_sharpening_strength;
-+ int contrast;
-+ int filter_params[6]; /* 1st one used as existence flag */
-+ int fringe_filter_strength;
-+ float gamma_correction[2];
-+ int global_embolden_x_value;
-+ int global_embolden_y_value;
-+ int grayscale_filter_strength;
-+ int stem_alignment_strength;
-+ int stem_fitting_strength;
-+ int stem_snapping_sliding_scale;
-+ int use_known_settings_on_selected_fonts;
-+ int use_various_tweaks;
-+ int windows_style_sharpening_strength;
-+} ftinf_t;
-+
-+extern FT_Pos infinality_cur_width; /* defined in aflatin.c */
-+
-+extern const ftinf_t *ftinf; /* active settings */
-+
-+extern void ftinf_fill_stem_values( Stem_Data *stem_values,
-+ const char *family, int ppem, int use_known );
-+extern void ftinf_get_bc( const char *family, int ppem,
-+ float *brightness, float *contrast );
-+
-+/* get values from environment (FIXME: maybe update with using user files) */
-+extern void ftinf_env();
-+
-+#endif
-diff --git a/src/base/ftinf_rh.c b/src/base/ftinf_rh.c
-new file mode 100644
-index 0000000..4cd6f1a
---- /dev/null
-+++ b/src/base/ftinf_rh.c
-@@ -0,0 +1,628 @@
-+/* ANSI-C code produced by gperf version 3.1 */
-+/* Command-line: gperf ftinf_rh.gperf */
-+/* Computed positions: -k'1,$' */
-+
-+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
-+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
-+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
-+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
-+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
-+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
-+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
-+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
-+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
-+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
-+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
-+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
-+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
-+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
-+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
-+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
-+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
-+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
-+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
-+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
-+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
-+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-+/* The character set is not based on ISO-646. */
-+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-+#endif
-+
-+#line 9 "ftinf_rh.gperf"
-+
-+#include <ctype.h>
-+static const struct sa_rules_s* _rules_get( const char*str, unsigned len );
-+/* maximum key range = 82, duplicates = 0 */
-+
-+#ifdef __GNUC__
-+__inline
-+#else
-+#ifdef __cplusplus
-+inline
-+#endif
-+#endif
-+static unsigned int
-+_rules_hash (register const char *str, register unsigned int len)
-+{
-+ static const unsigned char asso_values[] =
-+ {
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 0, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 5, 45, 5,
-+ 35, 25, 35, 35, 50, 45, 85, 85, 0, 25,
-+ 40, 5, 0, 85, 50, 20, 20, 0, 10, 10,
-+ 85, 10, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-+ 85, 85, 85, 85, 85, 85
-+ };
-+ return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
-+}
-+
-+#ifdef __GNUC__
-+__inline
-+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-+__attribute__ ((__gnu_inline__))
-+#endif
-+#endif
-+const struct sa_rules_s *
-+_rules_get (register const char *str, register unsigned int len)
-+{
-+ enum
-+ {
-+ TOTAL_KEYWORDS = 58,
-+ MIN_WORD_LENGTH = 3,
-+ MAX_WORD_LENGTH = 24,
-+ MIN_HASH_VALUE = 3,
-+ MAX_HASH_VALUE = 84
-+ };
-+
-+ static const struct sa_rules_s wordlist[] =
-+ {
-+#line 15 "ftinf_rh.gperf"
-+{ .name="---",
-+ .synthesize_stems={on, 13, 13, end}
-+},
-+#line 253 "ftinf_rh.gperf"
-+{ .name="ubuntu",
-+ .always_use_100={on, 12, 13, 15, 15, end}
-+},
-+#line 31 "ftinf_rh.gperf"
-+{ .name="arial",
-+ .always_use_100={on, 0, maxp, end},
-+ .edge_detection={on, 11, 11, 13, 13, end},
-+ .spacing={on, 10, 11, 23, 25, 30, end},
-+ .start={on, 11, 18, 23, 30, 30, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, 16, -24, end}
-+},
-+#line 87 "ftinf_rh.gperf"
-+{ .name="corbel",
-+ .stem_translating_only={on, 10, 16, end},
-+ .stem_widths={on, 10, 21, maxp}
-+},
-+#line 71 "ftinf_rh.gperf"
-+{ .name="canwell",
-+ .stem_scaling={on, 13, 0, end}
-+},
-+#line 216 "ftinf_rh.gperf"
-+{ .name="pragmata",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 67 "ftinf_rh.gperf"
-+{ .name="cantarell",
-+ .stem_translating_only={on, 11, 0, 12, 0, end},
-+ .stem_widths={on, 10, 22, maxp,}
-+},
-+#line 39 "ftinf_rh.gperf"
-+{ .name="arimo",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 8, 8, 32, 9, 32, end}
-+},
-+#line 207 "ftinf_rh.gperf"
-+{ .name="optima",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end},
-+ .stem_scaling={on, 17, 1, end},
-+ .stem_translating_only={on, 10, 0, 11, 0, 12, 0, end}
-+},
-+#line 63 "ftinf_rh.gperf"
-+{ .name="candara",
-+ .stem_scaling={on, 14, 1, 17, 1, end},
-+ .stem_translating_only={on, 10, 16, end}
-+},
-+#line 77 "ftinf_rh.gperf"
-+{ .name="comfortaa",
-+ .stem_widths={on, 10, 19, 22, maxp},
-+ .stem_scaling={on, 11, 0, end}
-+},
-+#line 161 "ftinf_rh.gperf"
-+{ .name="liberation mono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 18 "ftinf_rh.gperf"
-+{ .name="andale mono",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_scaling={on, 11, 1, end},
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+#line 256 "ftinf_rh.gperf"
-+{ .name="verdana",
-+ .always_use_100={on, 0, 14, 16, maxp, end},
-+ .stem_scaling={on, 12, 1, 15, 1, end},
-+ .stem_translating_only={on, 8, 16, 15, 16, 14, 32, 18, 32, 19, 24, end}
-+},
-+#line 74 "ftinf_rh.gperf"
-+{ .name="century gothic",
-+ .stem_widths={on, 10, 22, maxp,}
-+},
-+#line 91 "ftinf_rh.gperf"
-+{ .name="courier new",
-+ .always_use_100={on, 12, 12, end},
-+ .edge_detection={on, 10, 12, end},
-+ .m={on, 13, 1, 14, 1, end}
-+},
-+#line 23 "ftinf_rh.gperf"
-+{ .name="arial narrow",
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+#line 185 "ftinf_rh.gperf"
-+{ .name="luxi sans",
-+ .always_use_100={on, 13, 13, end},
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+#line 225 "ftinf_rh.gperf"
-+{ .name="samba",
-+ .stem_scaling={on, 11, 0, end}
-+},
-+#line 233 "ftinf_rh.gperf"
-+{ .name="tahoma",
-+ .always_use_100={on, 11, 11, 14, maxp, end},
-+ .edge_detection={on, 11, 11, end},
-+ .spacing={on, 10, 12, 18, 18, 30, end},
-+ .start={on, 14, 17, 30, 100, 100, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 7, 32, 8, 32, 9, 32, end},
-+},
-+#line 164 "ftinf_rh.gperf"
-+{ .name="liberation sans narrow",
-+ .stem_widths={on,10, 22, maxp,}
-+},
-+#line 81 "ftinf_rh.gperf"
-+{ .name="consolas",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 8, 32, 9, 32, end},
-+ .stem_widths={on, 10, 20, maxp,},
-+ .stem_scaling={on, 11, 1, end}
-+},
-+#line 203 "ftinf_rh.gperf"
-+{ .name="open sans",
-+ .stem_translating_only={on, 10, 16, 9, 16, end},
-+ .stem_widths={on, 10, 20, maxp,}
-+},
-+#line 167 "ftinf_rh.gperf"
-+{ .name="liberation sans",
-+ .edge_detection={on, 11, 11, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 8, 8, 32, 9, 32, end},
-+ .stem_widths={on,10, 19, maxp,}
-+},
-+#line 193 "ftinf_rh.gperf"
-+{ .name="monaco",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 101 "ftinf_rh.gperf"
-+{ .name="cousine",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 176 "ftinf_rh.gperf"
-+{ .name="lucida grande",
-+ .stem_scaling={on, 13, 1, end},
-+ .stem_translating_only={on, 13, 24, 14, 24, 8, 16, 9, 16, end},
-+ .stem_widths={on, 10, 16, sw2pv, maxp},
-+},
-+#line 173 "ftinf_rh.gperf"
-+{ .name="lucida console",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 196 "ftinf_rh.gperf"
-+{ .name="myriad pro",
-+ .stem_scaling={on, 14, 1, 17, 1, end},
-+ .stem_translating_only={on, 10, 16, 11, 0, 9, 16, end}
-+},
-+#line 26 "ftinf_rh.gperf"
-+{ .name="arial unicode ms",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, end}
-+},
-+#line 213 "ftinf_rh.gperf"
-+{ .name="palatino linotype",
-+ .edge_detection={on, 0, 100, end}
-+},
-+#line 181 "ftinf_rh.gperf"
-+{ .name="lucida sans unicode",
-+ .stem_translating_only={on, 13, 24, 14, 24, 8, 16, 9, 16, end},
-+ .stem_widths={on,10, 16, sw2pv, maxp,}
-+},
-+#line 140 "ftinf_rh.gperf"
-+{ .name="futura",
-+ .stem_widths={on, 10, 14, sw2pv, maxp,}
-+},
-+#line 147 "ftinf_rh.gperf"
-+{ .name="georgia",
-+ .stem_translating_only={on, 13, 16, 14, 16, 15, 0, end}
-+},
-+#line 125 "ftinf_rh.gperf"
-+{ .name="freemono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 200 "ftinf_rh.gperf"
-+{ .name="nina",
-+ .stem_scaling={on, 11, 0, 12, 0, 13, 0, end}
-+},
-+#line 121 "ftinf_rh.gperf"
-+{ .name="essential pragmatapro",
-+ .always_use_100={on, 0, maxp, end},
-+ .m={on, 13, 0, 14, 0, end}
-+},
-+#line 247 "ftinf_rh.gperf"
-+{ .name="trebuchet ms",
-+ .always_use_100={on, 13, 13, end},
-+ .stem_scaling={on, 13, 0, 17, 0, 20, 1, end},
-+ .stem_translating_only={on, 10, 16, 11, 0, 8, 32, 9, 32, end},
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+#line 114 "ftinf_rh.gperf"
-+{ .name="droid sans mono",
-+ .m={on, 12, 0, end}
-+},
-+#line 104 "ftinf_rh.gperf"
-+{ .name="dejavu sans mono",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 7, 16, 8, 32, 9, 16, end}
-+},
-+#line 57 "ftinf_rh.gperf"
-+{ .name="calibri",
-+ .always_use_100={on, 23, maxp, end},
-+ .stem_scaling={on, 15, 1, 17, 1, 18, 1, end},
-+ .stem_translating_only={on, 10, 16, 15, 0, end},
-+ .stem_widths={on, 1, 10, 19, maxp,}
-+},
-+#line 156 "ftinf_rh.gperf"
-+{ .name="inconsolata",
-+ .stem_scaling={on, 12, 1, 15, 1, end},
-+ .stem_translating_only={on, 10, 24, 9, 32, end},
-+ .stem_widths={on, 10, 23, maxp,},
-+},
-+#line 96 "ftinf_rh.gperf"
-+{ .name="courier",
-+ .always_use_100={on, 0, maxp, end},
-+ .m={on, 13, 1, 14, 1, end},
-+ .stem_translating_only={on, 13, 16, 15, 0, end}
-+},
-+#line 128 "ftinf_rh.gperf"
-+{ .name="freesans",
-+ .always_use_100={on, 0, maxp, end},
-+ .edge_detection={on, 11, 11, 13, 13, end},
-+ .spacing={on, 10, 12, 18, 18, 30, end},
-+ .start={on, 10, 18, 18, 25, 30, end},
-+ .stem_scaling={on, 16, 0, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 9, 8, end}
-+},
-+#line 150 "ftinf_rh.gperf"
-+{ .name="gill sans",
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+#line 117 "ftinf_rh.gperf"
-+{ .name="droid sans",
-+ .always_use_100={on, 12, 12, 15, 15, end},
-+ .stem_translating_only={on, 8, 16, 9, 16, end}
-+},
-+#line 108 "ftinf_rh.gperf"
-+{ .name="dejavu sans",
-+ .always_use_100={on, 10, 14, 16, 17, end},
-+ .m={on, 12, 0, end},
-+ .stem_scaling={on, 12, 1, end},
-+ .stem_translating_only={on, 8, 16, 15, -20, end}
-+},
-+#line 219 "ftinf_rh.gperf"
-+{ .name="raleway",
-+ .stem_scaling={on, 15, 0, end}
-+},
-+#line 153 "ftinf_rh.gperf"
-+{ .name="helvetica cy",
-+ .stem_widths={on, 10, 23, maxp,}
-+},
-+#line 228 "ftinf_rh.gperf"
-+{ .name="segoe ui",
-+ .always_use_100={on, 11, 12, 14, 14, end},
-+ .stem_translating_only={on, 10, 0, 7, 32, 8, 16, 9, 24, end},
-+ .stem_widths={on, 10, 23, maxp,}
-+},
-+#line 48 "ftinf_rh.gperf"
-+{ .name="bitstream vera sans mono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+#line 241 "ftinf_rh.gperf"
-+{ .name="times new roman",
-+ .always_use_100={on, 14, 14, 16, 16, end},
-+ .bearing_correction={0, 100, end},
-+ .stem_scaling={on, 17, 1, end},
-+ .stem_translating_only={on, 17, 8, end}
-+},
-+#line 222 "ftinf_rh.gperf"
-+{ .name="rokkitt",
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+#line 143 "ftinf_rh.gperf"
-+{ .name="garamond",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end}
-+},
-+#line 137 "ftinf_rh.gperf"
-+{ .name="freeserif",
-+ .stem_scaling={on, 13, 1, 17, 1, end}
-+},
-+#line 189 "ftinf_rh.gperf"
-+{ .name="microsoft sans serif",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, end}
-+},
-+#line 44 "ftinf_rh.gperf"
-+{ .name="baskerville",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end}
-+},
-+#line 51 "ftinf_rh.gperf"
-+{ .name="bitstream vera sans",
-+ .always_use_100={on, 10, 14, 16, 17, end},
-+ .m={on, 12, 0, end},
-+ .stem_scaling={on ,12, 1, end},
-+ .stem_translating_only={on, 8, 16, end}
-+}
-+ };
-+
-+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
-+ {
-+ register int key = _rules_hash (str, len);
-+
-+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
-+ {
-+ register const struct sa_rules_s *resword;
-+
-+ switch (key - 3)
-+ {
-+ case 0:
-+ resword = &wordlist[0];
-+ goto compare;
-+ case 3:
-+ resword = &wordlist[1];
-+ goto compare;
-+ case 7:
-+ resword = &wordlist[2];
-+ goto compare;
-+ case 8:
-+ resword = &wordlist[3];
-+ goto compare;
-+ case 9:
-+ resword = &wordlist[4];
-+ goto compare;
-+ case 10:
-+ resword = &wordlist[5];
-+ goto compare;
-+ case 11:
-+ resword = &wordlist[6];
-+ goto compare;
-+ case 12:
-+ resword = &wordlist[7];
-+ goto compare;
-+ case 13:
-+ resword = &wordlist[8];
-+ goto compare;
-+ case 14:
-+ resword = &wordlist[9];
-+ goto compare;
-+ case 16:
-+ resword = &wordlist[10];
-+ goto compare;
-+ case 17:
-+ resword = &wordlist[11];
-+ goto compare;
-+ case 18:
-+ resword = &wordlist[12];
-+ goto compare;
-+ case 19:
-+ resword = &wordlist[13];
-+ goto compare;
-+ case 21:
-+ resword = &wordlist[14];
-+ goto compare;
-+ case 23:
-+ resword = &wordlist[15];
-+ goto compare;
-+ case 24:
-+ resword = &wordlist[16];
-+ goto compare;
-+ case 26:
-+ resword = &wordlist[17];
-+ goto compare;
-+ case 27:
-+ resword = &wordlist[18];
-+ goto compare;
-+ case 28:
-+ resword = &wordlist[19];
-+ goto compare;
-+ case 29:
-+ resword = &wordlist[20];
-+ goto compare;
-+ case 30:
-+ resword = &wordlist[21];
-+ goto compare;
-+ case 31:
-+ resword = &wordlist[22];
-+ goto compare;
-+ case 32:
-+ resword = &wordlist[23];
-+ goto compare;
-+ case 33:
-+ resword = &wordlist[24];
-+ goto compare;
-+ case 34:
-+ resword = &wordlist[25];
-+ goto compare;
-+ case 35:
-+ resword = &wordlist[26];
-+ goto compare;
-+ case 36:
-+ resword = &wordlist[27];
-+ goto compare;
-+ case 37:
-+ resword = &wordlist[28];
-+ goto compare;
-+ case 38:
-+ resword = &wordlist[29];
-+ goto compare;
-+ case 39:
-+ resword = &wordlist[30];
-+ goto compare;
-+ case 41:
-+ resword = &wordlist[31];
-+ goto compare;
-+ case 43:
-+ resword = &wordlist[32];
-+ goto compare;
-+ case 44:
-+ resword = &wordlist[33];
-+ goto compare;
-+ case 45:
-+ resword = &wordlist[34];
-+ goto compare;
-+ case 46:
-+ resword = &wordlist[35];
-+ goto compare;
-+ case 48:
-+ resword = &wordlist[36];
-+ goto compare;
-+ case 49:
-+ resword = &wordlist[37];
-+ goto compare;
-+ case 52:
-+ resword = &wordlist[38];
-+ goto compare;
-+ case 53:
-+ resword = &wordlist[39];
-+ goto compare;
-+ case 54:
-+ resword = &wordlist[40];
-+ goto compare;
-+ case 58:
-+ resword = &wordlist[41];
-+ goto compare;
-+ case 59:
-+ resword = &wordlist[42];
-+ goto compare;
-+ case 60:
-+ resword = &wordlist[43];
-+ goto compare;
-+ case 61:
-+ resword = &wordlist[44];
-+ goto compare;
-+ case 62:
-+ resword = &wordlist[45];
-+ goto compare;
-+ case 63:
-+ resword = &wordlist[46];
-+ goto compare;
-+ case 64:
-+ resword = &wordlist[47];
-+ goto compare;
-+ case 69:
-+ resword = &wordlist[48];
-+ goto compare;
-+ case 70:
-+ resword = &wordlist[49];
-+ goto compare;
-+ case 71:
-+ resword = &wordlist[50];
-+ goto compare;
-+ case 72:
-+ resword = &wordlist[51];
-+ goto compare;
-+ case 74:
-+ resword = &wordlist[52];
-+ goto compare;
-+ case 75:
-+ resword = &wordlist[53];
-+ goto compare;
-+ case 76:
-+ resword = &wordlist[54];
-+ goto compare;
-+ case 77:
-+ resword = &wordlist[55];
-+ goto compare;
-+ case 78:
-+ resword = &wordlist[56];
-+ goto compare;
-+ case 81:
-+ resword = &wordlist[57];
-+ goto compare;
-+ }
-+ return 0;
-+ compare:
-+ {
-+ register const char *s = resword->name;
-+
-+ if (*str == *s && !strcmp (str + 1, s + 1))
-+ return resword;
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+#line 261 "ftinf_rh.gperf"
-+
-+
-+static const sa_rules_t*
-+ftinf_rules( const char *name ){
-+ if( name ){
-+ enum {
-+ max_wlen=31
-+ };
-+ char buf[max_wlen+1];
-+ int len=strlen( name );
-+ if( len <= max_wlen ){
-+ const sa_rules_t *p;
-+ int i;
-+ for( i=0; i<len; ++i )
-+ buf[i]=tolower( name[i] );
-+ buf[len]='\0';
-+ p=_rules_get( buf, len );
-+ if( p ) return p;
-+ }
-+ }
-+ return NULL;
-+}
-+/*
-+ gperf --output-file=ftinf_rh.c ftinf_rh.gperf
-+*/
-diff --git a/src/base/ftinf_rh.gperf b/src/base/ftinf_rh.gperf
-new file mode 100644
-index 0000000..e25f9b6
---- /dev/null
-+++ b/src/base/ftinf_rh.gperf
-@@ -0,0 +1,285 @@
-+%struct-type
-+%define slot-name name
-+%enum
-+%switch=1
-+%readonly-tables
-+%omit-struct-type
-+%define lookup-function-name _rules_get
-+%define hash-function-name _rules_hash
-+%{
-+#include <ctype.h>
-+static const struct sa_rules_s* _rules_get( const char*str, unsigned len );
-+%}
-+struct sa_rules_s;
-+%%
-+{ .name="---",
-+ .synthesize_stems={on, 13, 13, end}
-+},
-+{ .name="andale mono",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_scaling={on, 11, 1, end},
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+{ .name="arial narrow",
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+{ .name="arial unicode ms",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, end}
-+},
-+{ .name="arial",
-+ .always_use_100={on, 0, maxp, end},
-+ .edge_detection={on, 11, 11, 13, 13, end},
-+ .spacing={on, 10, 11, 23, 25, 30, end},
-+ .start={on, 11, 18, 23, 30, 30, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, 16, -24, end}
-+},
-+{ .name="arimo",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 8, 8, 32, 9, 32, end}
-+},
-+{ .name="baskerville",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end}
-+},
-+{ .name="bitstream vera sans mono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="bitstream vera sans",
-+ .always_use_100={on, 10, 14, 16, 17, end},
-+ .m={on, 12, 0, end},
-+ .stem_scaling={on ,12, 1, end},
-+ .stem_translating_only={on, 8, 16, end}
-+},
-+{ .name="calibri",
-+ .always_use_100={on, 23, maxp, end},
-+ .stem_scaling={on, 15, 1, 17, 1, 18, 1, end},
-+ .stem_translating_only={on, 10, 16, 15, 0, end},
-+ .stem_widths={on, 1, 10, 19, maxp,}
-+},
-+{ .name="candara",
-+ .stem_scaling={on, 14, 1, 17, 1, end},
-+ .stem_translating_only={on, 10, 16, end}
-+},
-+{ .name="cantarell",
-+ .stem_translating_only={on, 11, 0, 12, 0, end},
-+ .stem_widths={on, 10, 22, maxp,}
-+},
-+{ .name="canwell",
-+ .stem_scaling={on, 13, 0, end}
-+},
-+{ .name="century gothic",
-+ .stem_widths={on, 10, 22, maxp,}
-+},
-+{ .name="comfortaa",
-+ .stem_widths={on, 10, 19, 22, maxp},
-+ .stem_scaling={on, 11, 0, end}
-+},
-+{ .name="consolas",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 8, 32, 9, 32, end},
-+ .stem_widths={on, 10, 20, maxp,},
-+ .stem_scaling={on, 11, 1, end}
-+},
-+{ .name="corbel",
-+ .stem_translating_only={on, 10, 16, end},
-+ .stem_widths={on, 10, 21, maxp}
-+},
-+{ .name="courier new",
-+ .always_use_100={on, 12, 12, end},
-+ .edge_detection={on, 10, 12, end},
-+ .m={on, 13, 1, 14, 1, end}
-+},
-+{ .name="courier",
-+ .always_use_100={on, 0, maxp, end},
-+ .m={on, 13, 1, 14, 1, end},
-+ .stem_translating_only={on, 13, 16, 15, 0, end}
-+},
-+{ .name="cousine",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="dejavu sans mono",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 7, 16, 8, 32, 9, 16, end}
-+},
-+{ .name="dejavu sans",
-+ .always_use_100={on, 10, 14, 16, 17, end},
-+ .m={on, 12, 0, end},
-+ .stem_scaling={on, 12, 1, end},
-+ .stem_translating_only={on, 8, 16, 15, -20, end}
-+},
-+{ .name="droid sans mono",
-+ .m={on, 12, 0, end}
-+},
-+{ .name="droid sans",
-+ .always_use_100={on, 12, 12, 15, 15, end},
-+ .stem_translating_only={on, 8, 16, 9, 16, end}
-+},
-+{ .name="essential pragmatapro",
-+ .always_use_100={on, 0, maxp, end},
-+ .m={on, 13, 0, 14, 0, end}
-+},
-+{ .name="freemono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="freesans",
-+ .always_use_100={on, 0, maxp, end},
-+ .edge_detection={on, 11, 11, 13, 13, end},
-+ .spacing={on, 10, 12, 18, 18, 30, end},
-+ .start={on, 10, 18, 18, 25, 30, end},
-+ .stem_scaling={on, 16, 0, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 16, 9, 8, end}
-+},
-+{ .name="freeserif",
-+ .stem_scaling={on, 13, 1, 17, 1, end}
-+},
-+{ .name="futura",
-+ .stem_widths={on, 10, 14, sw2pv, maxp,}
-+},
-+{ .name="garamond",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end}
-+},
-+{ .name="georgia",
-+ .stem_translating_only={on, 13, 16, 14, 16, 15, 0, end}
-+},
-+{ .name="gill sans",
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+{ .name="helvetica cy",
-+ .stem_widths={on, 10, 23, maxp,}
-+},
-+{ .name="inconsolata",
-+ .stem_scaling={on, 12, 1, 15, 1, end},
-+ .stem_translating_only={on, 10, 24, 9, 32, end},
-+ .stem_widths={on, 10, 23, maxp,},
-+},
-+{ .name="liberation mono",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="liberation sans narrow",
-+ .stem_widths={on,10, 22, maxp,}
-+},
-+{ .name="liberation sans",
-+ .edge_detection={on, 11, 11, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 10, 8, 8, 32, 9, 32, end},
-+ .stem_widths={on,10, 19, maxp,}
-+},
-+{ .name="lucida console",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="lucida grande",
-+ .stem_scaling={on, 13, 1, end},
-+ .stem_translating_only={on, 13, 24, 14, 24, 8, 16, 9, 16, end},
-+ .stem_widths={on, 10, 16, sw2pv, maxp},
-+},
-+{ .name="lucida sans unicode",
-+ .stem_translating_only={on, 13, 24, 14, 24, 8, 16, 9, 16, end},
-+ .stem_widths={on,10, 16, sw2pv, maxp,}
-+},
-+{ .name="luxi sans",
-+ .always_use_100={on, 13, 13, end},
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+{ .name="microsoft sans serif",
-+ .always_use_100={on, 0, maxp, end},
-+ .stem_translating_only={on, 10, 16, 8, 32, 9, 32, end}
-+},
-+{ .name="monaco",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="myriad pro",
-+ .stem_scaling={on, 14, 1, 17, 1, end},
-+ .stem_translating_only={on, 10, 16, 11, 0, 9, 16, end}
-+},
-+{ .name="nina",
-+ .stem_scaling={on, 11, 0, 12, 0, 13, 0, end}
-+},
-+{ .name="open sans",
-+ .stem_translating_only={on, 10, 16, 9, 16, end},
-+ .stem_widths={on, 10, 20, maxp,}
-+},
-+{ .name="optima",
-+ .brightness={on, 0, -20, end},
-+ .contrast={on, 0, 25, end},
-+ .stem_scaling={on, 17, 1, end},
-+ .stem_translating_only={on, 10, 0, 11, 0, 12, 0, end}
-+},
-+{ .name="palatino linotype",
-+ .edge_detection={on, 0, 100, end}
-+},
-+{ .name="pragmata",
-+ .always_use_100={on, 0, maxp, end}
-+},
-+{ .name="raleway",
-+ .stem_scaling={on, 15, 0, end}
-+},
-+{ .name="rokkitt",
-+ .stem_widths={on, 10, 21, maxp,}
-+},
-+{ .name="samba",
-+ .stem_scaling={on, 11, 0, end}
-+},
-+{ .name="segoe ui",
-+ .always_use_100={on, 11, 12, 14, 14, end},
-+ .stem_translating_only={on, 10, 0, 7, 32, 8, 16, 9, 24, end},
-+ .stem_widths={on, 10, 23, maxp,}
-+},
-+{ .name="tahoma",
-+ .always_use_100={on, 11, 11, 14, maxp, end},
-+ .edge_detection={on, 11, 11, end},
-+ .spacing={on, 10, 12, 18, 18, 30, end},
-+ .start={on, 14, 17, 30, 100, 100, end},
-+ .stem_translating={on, 11, 32, end},
-+ .stem_translating_only={on, 7, 32, 8, 32, 9, 32, end},
-+},
-+{ .name="times new roman",
-+ .always_use_100={on, 14, 14, 16, 16, end},
-+ .bearing_correction={0, 100, end},
-+ .stem_scaling={on, 17, 1, end},
-+ .stem_translating_only={on, 17, 8, end}
-+},
-+{ .name="trebuchet ms",
-+ .always_use_100={on, 13, 13, end},
-+ .stem_scaling={on, 13, 0, 17, 0, 20, 1, end},
-+ .stem_translating_only={on, 10, 16, 11, 0, 8, 32, 9, 32, end},
-+ .stem_widths={on, 10, 17, sw2pv, maxp,}
-+},
-+{ .name="ubuntu",
-+ .always_use_100={on, 12, 13, 15, 15, end}
-+},
-+{ .name="verdana",
-+ .always_use_100={on, 0, 14, 16, maxp, end},
-+ .stem_scaling={on, 12, 1, 15, 1, end},
-+ .stem_translating_only={on, 8, 16, 15, 16, 14, 32, 18, 32, 19, 24, end}
-+},
-+%%
-+
-+static const sa_rules_t*
-+ftinf_rules( const char *name ){
-+ if( name ){
-+ enum {
-+ max_wlen=31
-+ };
-+ char buf[max_wlen+1];
-+ int len=strlen( name );
-+ if( len <= max_wlen ){
-+ const sa_rules_t *p;
-+ int i;
-+ for( i=0; i<len; ++i )
-+ buf[i]=tolower( name[i] );
-+ buf[len]='\0';
-+ p=_rules_get( buf, len );
-+ if( p ) return p;
-+ }
-+ }
-+ return NULL;
-+}
-+/*
-+ gperf --output-file=ftinf_rh.c ftinf_rh.gperf
-+*/
-diff --git a/src/base/ftinf_sh.c b/src/base/ftinf_sh.c
-new file mode 100644
-index 0000000..7fc2222
---- /dev/null
-+++ b/src/base/ftinf_sh.c
-@@ -0,0 +1,465 @@
-+/* ANSI-C code produced by gperf version 3.1 */
-+/* Command-line: gperf ftinf_sh.gperf */
-+/* Computed positions: -k'1,$' */
-+
-+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
-+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
-+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
-+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
-+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
-+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
-+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
-+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
-+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
-+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
-+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
-+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
-+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
-+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
-+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
-+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
-+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
-+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
-+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
-+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
-+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
-+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
-+/* The character set is not based on ISO-646. */
-+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
-+#endif
-+
-+#line 9 "ftinf_sh.gperf"
-+
-+#include <ctype.h>
-+static const struct ftinf_s* _settings_get( const char*str, unsigned len);
-+/* maximum key range = 37, duplicates = 0 */
-+
-+#ifdef __GNUC__
-+__inline
-+#else
-+#ifdef __cplusplus
-+inline
-+#endif
-+#endif
-+static unsigned int
-+_settings_hash (register const char *str, register unsigned int len)
-+{
-+ static const unsigned char asso_values[] =
-+ {
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 13,
-+ 8, 30, 25, 20, 40, 10, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 5, 40, 0,
-+ 0, 0, 40, 40, 10, 0, 40, 40, 15, 5,
-+ 10, 0, 10, 40, 40, 0, 0, 0, 0, 0,
-+ 0, 0, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-+ 40, 40, 40, 40, 40, 40
-+ };
-+ return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
-+}
-+
-+#ifdef __GNUC__
-+__inline
-+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-+__attribute__ ((__gnu_inline__))
-+#endif
-+#endif
-+const struct ftinf_s *
-+_settings_get (register const char *str, register unsigned int len)
-+{
-+ enum
-+ {
-+ TOTAL_KEYWORDS = 22,
-+ MIN_WORD_LENGTH = 3,
-+ MAX_WORD_LENGTH = 14,
-+ MIN_HASH_VALUE = 3,
-+ MAX_HASH_VALUE = 39
-+ };
-+
-+ static const struct ftinf_s wordlist[] =
-+ {
-+#line 76 "ftinf_sh.gperf"
-+{ .name="osx",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .bold_embolden_x_value=16,
-+ .brightness=10,
-+ .contrast=20,
-+ .filter_params={on, 3, 32, 38, 32, 3},
-+ .gamma_correction={1000, 80},
-+ .global_embolden_y_value=8,
-+ .grayscale_filter_strength=25,
-+},
-+#line 37 "ftinf_sh.gperf"
-+{ .name="ipad",
-+ .filter_params={on, 0, 0, 100, 0, 0},
-+ .gamma_correction={1000, 80},
-+ .grayscale_filter_strength=100
-+},
-+#line 114 "ftinf_sh.gperf"
-+{ .name="shove",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=100,
-+ .stem_fitting_strength=100,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+#line 126 "ftinf_sh.gperf"
-+{ .name="ubuntu",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=-10,
-+ .contrast=15,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={1000, 80},
-+ .use_various_tweaks=true
-+},
-+#line 27 "ftinf_sh.gperf"
-+{ .name="classic",
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .filter_params={on, 6, 25, 38, 25, 6},
-+ .gamma_correction={0, 100},
-+ .use_various_tweaks=true
-+},
-+#line 34 "ftinf_sh.gperf"
-+{ .name="disabled",
-+ .gamma_correction={0, 100},
-+},
-+#line 100 "ftinf_sh.gperf"
-+{ .name="sharpened",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=25,
-+ .stem_snapping_sliding_scale=40,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+#line 42 "ftinf_sh.gperf"
-+{ .name="infinality",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=25,
-+ .stem_snapping_sliding_scale=40,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=5
-+},
-+#line 15 "ftinf_sh.gperf"
-+{ .name="custom",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 8, 24, 48, 24, 8},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=75,
-+ .stem_fitting_strength=50,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+#line 180 "ftinf_sh.gperf"
-+{ .name="vanilla",
-+ .filter_params={on, 6, 25, 38, 25, 6},
-+ .gamma_correction={0, 100},
-+},
-+#line 184 "ftinf_sh.gperf"
-+{ .name="windows7light",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .contrast=20,
-+ .filter_params={on, 20, 25, 38, 25, 05},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 160},
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=100
-+},
-+#line 226 "ftinf_sh.gperf"
-+{ .name="windowsxplight",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=20,
-+ .contrast=30,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 120},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+#line 64 "ftinf_sh.gperf"
-+{ .name="nudge",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_various_tweaks=true,
-+},
-+#line 144 "ftinf_sh.gperf"
-+{ .name="ultimate2",
-+ .filter_params={on, 6, 22, 36, 22, 6},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+#line 197 "ftinf_sh.gperf"
-+{ .name="windows7",
-+ .filter_params={on, 20, 25, 42, 25, 06},
-+ .fringe_filter_strength=100,
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .windows_style_sharpening_strength=65,
-+ .gamma_correction={1000, 120},
-+ .brightness=10,
-+ .contrast=20,
-+ .use_various_tweaks=true,
-+ .autohint_snap_stem_height=100,
-+ .use_known_settings_on_selected_fonts=true,
-+},
-+#line 210 "ftinf_sh.gperf"
-+{ .name="windowsxp",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=10,
-+ .contrast=20,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 120},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+#line 56 "ftinf_sh.gperf"
-+{ .name="linux",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .gamma_correction={0, 100},
-+ .use_various_tweaks=true
-+},
-+#line 135 "ftinf_sh.gperf"
-+{ .name="ultimate1",
-+ .filter_params={on, 4, 22, 38, 22, 4},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+#line 87 "ftinf_sh.gperf"
-+{ .name="push",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=75,
-+ .stem_fitting_strength=50,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+#line 171 "ftinf_sh.gperf"
-+{ .name="ultimate5",
-+ .filter_params={on, 12, 28, 42, 28, 12},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+#line 162 "ftinf_sh.gperf"
-+{ .name="ultimate4",
-+ .filter_params={on, 10, 25, 37, 25, 10},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+#line 153 "ftinf_sh.gperf"
-+{ .name="ultimate3",
-+ .filter_params={on, 8, 24, 36, 24, 8},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+}
-+ };
-+
-+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
-+ {
-+ register int key = _settings_hash (str, len);
-+
-+ if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)
-+ {
-+ register const struct ftinf_s *resword;
-+
-+ switch (key - 3)
-+ {
-+ case 0:
-+ resword = &wordlist[0];
-+ goto compare;
-+ case 1:
-+ resword = &wordlist[1];
-+ goto compare;
-+ case 2:
-+ resword = &wordlist[2];
-+ goto compare;
-+ case 3:
-+ resword = &wordlist[3];
-+ goto compare;
-+ case 4:
-+ resword = &wordlist[4];
-+ goto compare;
-+ case 5:
-+ resword = &wordlist[5];
-+ goto compare;
-+ case 6:
-+ resword = &wordlist[6];
-+ goto compare;
-+ case 7:
-+ resword = &wordlist[7];
-+ goto compare;
-+ case 8:
-+ resword = &wordlist[8];
-+ goto compare;
-+ case 9:
-+ resword = &wordlist[9];
-+ goto compare;
-+ case 10:
-+ resword = &wordlist[10];
-+ goto compare;
-+ case 11:
-+ resword = &wordlist[11];
-+ goto compare;
-+ case 12:
-+ resword = &wordlist[12];
-+ goto compare;
-+ case 14:
-+ resword = &wordlist[13];
-+ goto compare;
-+ case 15:
-+ resword = &wordlist[14];
-+ goto compare;
-+ case 16:
-+ resword = &wordlist[15];
-+ goto compare;
-+ case 17:
-+ resword = &wordlist[16];
-+ goto compare;
-+ case 19:
-+ resword = &wordlist[17];
-+ goto compare;
-+ case 21:
-+ resword = &wordlist[18];
-+ goto compare;
-+ case 26:
-+ resword = &wordlist[19];
-+ goto compare;
-+ case 31:
-+ resword = &wordlist[20];
-+ goto compare;
-+ case 36:
-+ resword = &wordlist[21];
-+ goto compare;
-+ }
-+ return 0;
-+ compare:
-+ {
-+ register const char *s = resword->name;
-+
-+ if (*str == *s && !strcmp (str + 1, s + 1))
-+ return resword;
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+#line 242 "ftinf_sh.gperf"
-+
-+
-+static const ftinf_t*
-+ftinf_settings( const char *name ){
-+ if( name ){
-+ enum {
-+ max_wlen=31
-+ };
-+ char buf[max_wlen+1];
-+ int len=strlen( name );
-+ if( len <= max_wlen ){
-+ const ftinf_t *p;
-+ int i;
-+ for( i=0; i<len; ++i )
-+ buf[i]=tolower( name[i] );
-+ buf[len]='\0';
-+ p=_settings_get( buf, len );
-+ if( p ) return p;
-+ }
-+ }
-+ return NULL;
-+}
-+/*
-+ gperf --output-file=ftinf_sh.c ftinf_sh.gperf
-+*/
-diff --git a/src/base/ftinf_sh.gperf b/src/base/ftinf_sh.gperf
-new file mode 100644
-index 0000000..ba5fc0a
---- /dev/null
-+++ b/src/base/ftinf_sh.gperf
-@@ -0,0 +1,266 @@
-+%struct-type
-+%define slot-name name
-+%enum
-+%switch=1
-+%readonly-tables
-+%omit-struct-type
-+%define lookup-function-name _settings_get
-+%define hash-function-name _settings_hash
-+%{
-+#include <ctype.h>
-+static const struct ftinf_s* _settings_get( const char*str, unsigned len);
-+%}
-+struct ftinf_s;
-+%%
-+{ .name="custom",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 8, 24, 48, 24, 8},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=75,
-+ .stem_fitting_strength=50,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+{ .name="classic",
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .filter_params={on, 6, 25, 38, 25, 6},
-+ .gamma_correction={0, 100},
-+ .use_various_tweaks=true
-+},
-+{ .name="disabled",
-+ .gamma_correction={0, 100},
-+},
-+{ .name="ipad",
-+ .filter_params={on, 0, 0, 100, 0, 0},
-+ .gamma_correction={1000, 80},
-+ .grayscale_filter_strength=100
-+},
-+{ .name="infinality",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=25,
-+ .stem_snapping_sliding_scale=40,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=5
-+},
-+{ .name="linux",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .gamma_correction={0, 100},
-+ .use_various_tweaks=true
-+},
-+{ .name="nudge",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_various_tweaks=true,
-+},
-+{ .name="osx",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .bold_embolden_x_value=16,
-+ .brightness=10,
-+ .contrast=20,
-+ .filter_params={on, 3, 32, 38, 32, 3},
-+ .gamma_correction={1000, 80},
-+ .global_embolden_y_value=8,
-+ .grayscale_filter_strength=25,
-+},
-+{ .name="push",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=75,
-+ .stem_fitting_strength=50,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+{ .name="sharpened",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=25,
-+ .stem_fitting_strength=25,
-+ .stem_snapping_sliding_scale=40,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+{ .name="shove",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_increase_glyph_heights=true,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=100,
-+ .stem_fitting_strength=100,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true
-+},
-+{ .name="ubuntu",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=-10,
-+ .contrast=15,
-+ .filter_params={on, 11, 22, 38, 22, 11},
-+ .gamma_correction={1000, 80},
-+ .use_various_tweaks=true
-+},
-+{ .name="ultimate1",
-+ .filter_params={on, 4, 22, 38, 22, 4},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+{ .name="ultimate2",
-+ .filter_params={on, 6, 22, 36, 22, 6},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+{ .name="ultimate3",
-+ .filter_params={on, 8, 24, 36, 24, 8},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+{ .name="ultimate4",
-+ .filter_params={on, 10, 25, 37, 25, 10},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+{ .name="ultimate5",
-+ .filter_params={on, 12, 28, 42, 28, 12},
-+ .fringe_filter_strength=25,
-+ .gamma_correction={0, 100},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=25
-+},
-+{ .name="vanilla",
-+ .filter_params={on, 6, 25, 38, 25, 6},
-+ .gamma_correction={0, 100},
-+},
-+{ .name="windows7light",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .contrast=20,
-+ .filter_params={on, 20, 25, 38, 25, 05},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 160},
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=100
-+},
-+{ .name="windows7",
-+ .filter_params={on, 20, 25, 42, 25, 06},
-+ .fringe_filter_strength=100,
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .windows_style_sharpening_strength=65,
-+ .gamma_correction={1000, 120},
-+ .brightness=10,
-+ .contrast=20,
-+ .use_various_tweaks=true,
-+ .autohint_snap_stem_height=100,
-+ .use_known_settings_on_selected_fonts=true,
-+},
-+{ .name="windowsxp",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=10,
-+ .contrast=20,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 120},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+{ .name="windowsxplight",
-+ .autohint_horizontal_stem_darken_strength=10,
-+ .autohint_snap_stem_height=100,
-+ .autohint_vertical_stem_darken_strength=25,
-+ .brightness=20,
-+ .contrast=30,
-+ .filter_params={on, 6, 25, 44, 25, 6},
-+ .fringe_filter_strength=100,
-+ .gamma_correction={1000, 120},
-+ .stem_alignment_strength=15,
-+ .stem_fitting_strength=15,
-+ .stem_snapping_sliding_scale=30,
-+ .use_known_settings_on_selected_fonts=true,
-+ .use_various_tweaks=true,
-+ .windows_style_sharpening_strength=65
-+},
-+%%
-+
-+static const ftinf_t*
-+ftinf_settings( const char *name ){
-+ if( name ){
-+ enum {
-+ max_wlen=31
-+ };
-+ char buf[max_wlen+1];
-+ int len=strlen( name );
-+ if( len <= max_wlen ){
-+ const ftinf_t *p;
-+ int i;
-+ for( i=0; i<len; ++i )
-+ buf[i]=tolower( name[i] );
-+ buf[len]='\0';
-+ p=_settings_get( buf, len );
-+ if( p ) return p;
-+ }
-+ }
-+ return NULL;
-+}
-+/*
-+ gperf --output-file=ftinf_sh.c ftinf_sh.gperf
-+*/
-diff --git a/src/base/ftinit.c b/src/base/ftinit.c
-index b65a91d..54c06f9 100644
---- a/src/base/ftinit.c
-+++ b/src/base/ftinit.c
-@@ -43,7 +43,9 @@
- #include FT_INTERNAL_DEBUG_H
- #include FT_MODULE_H
- #include "basepic.h"
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "ftinf.h"
-+#endif
-
- /*************************************************************************/
- /* */
-@@ -253,9 +255,13 @@
- error = FT_New_Library( memory, alibrary );
- if ( error )
- FT_Done_Memory( memory );
-- else
-+ else {
- FT_Add_Default_Modules( *alibrary );
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* get Infinality settings */
-+ ftinf_env();
-+#endif
-+ }
- return error;
- }
-
-diff --git a/src/base/ftlcdfil.c b/src/base/ftlcdfil.c
-index 5ee7e0a..9c9e9e4 100644
---- a/src/base/ftlcdfil.c
-+++ b/src/base/ftlcdfil.c
-@@ -22,7 +22,10 @@
- #include FT_LCD_FILTER_H
- #include FT_IMAGE_H
- #include FT_INTERNAL_OBJECTS_H
--
-+#include <math.h>
-+#include <string.h>
-+#include <strings.h>
-+#include "ftinf.h"
-
- #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-@@ -305,11 +308,36 @@
- FT_Library_SetLcdFilter( FT_Library library,
- FT_LcdFilter filter )
- {
-- static const FT_Byte default_filter[5] =
-- { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
- static const FT_Byte light_filter[5] =
- { 0x00, 0x55, 0x56, 0x55, 0x00 };
--
-+#ifndef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ static const FT_Byte default_filter[5] =
-+ { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
-+#else
-+ FT_Byte default_filter[5];
-+ if( ftinf && ftinf->filter_params[0] )
-+ {
-+ const int *f=ftinf->filter_params;
-+ /* Assume we were given integers [0-100] get them to [0-255] */
-+ int val; /* 2611=2.55*1024 */
-+ val=(f[1]*2611+512)>>10; if( val > 255 ) val=255;
-+ default_filter[0] = (FT_Byte) val;
-+ val=(f[2]*2611+512)>>10; if( val > 255 ) val=255;
-+ default_filter[1] = (FT_Byte) val;
-+ val=(f[3]*2611+512)>>10; if( val > 255 ) val=255;
-+ default_filter[2] = (FT_Byte) val;
-+ val=(f[4]*2611+512)>>10; if( val > 255 ) val=255;
-+ default_filter[3] = (FT_Byte) val;
-+ val=(f[5]*2611+512)>>10; if( val > 255 ) val=255;
-+ default_filter[4] = (FT_Byte) val;
-+ } else {
-+ default_filter[0]=0x08;
-+ default_filter[1]=0x4d;
-+ default_filter[2]=0x56;
-+ default_filter[3]=0x4d;
-+ default_filter[4]=0x08;
-+ }
-+#endif
-
- if ( !library )
- return FT_THROW( Invalid_Library_Handle );
-diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
-index ea40396..7156a0b 100644
---- a/src/base/ftobjs.c
-+++ b/src/base/ftobjs.c
-@@ -40,7 +40,9 @@
- #ifdef FT_CONFIG_OPTION_MAC_FONTS
- #include "ftbase.h"
- #endif
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "ftinf.h"
-+#endif
-
- #ifdef FT_DEBUG_LEVEL_TRACE
-
-@@ -78,6 +80,11 @@
-
- #define GRID_FIT_METRICS
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include <strings.h>
-+#include <stdlib.h>
-+#include "../autofit/aflatin.h"
-+#endif
-
- FT_BASE_DEF( FT_Pointer )
- ft_service_list_lookup( FT_ServiceDesc service_descriptors,
-@@ -554,6 +561,25 @@
- ft_lookup_glyph_renderer( FT_GlyphSlot slot );
-
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ static void
-+ ft_glyphslot_enlarge_metrics( FT_GlyphSlot slot,
-+ FT_Render_Mode mode )
-+ {
-+ FT_Glyph_Metrics* metrics = &slot->metrics;
-+ FT_Pos enlarge_cbox = 0;
-+
-+
-+ /* enlarge for grayscale rendering */
-+ if ( mode == FT_RENDER_MODE_NORMAL )
-+ enlarge_cbox = 64;
-+
-+ metrics->horiBearingX -= enlarge_cbox;
-+ metrics->width += 2 * enlarge_cbox;
-+ }
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
-+
-+
- #ifdef GRID_FIT_METRICS
- static void
- ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot,
-@@ -612,8 +638,18 @@
- FT_Bool autohint = FALSE;
- FT_Module hinter;
- TT_Face ttface = (TT_Face)face;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-
-+ FT_Bool use_various_tweaks = FALSE;
-+ if( ftinf ) use_various_tweaks=ftinf->use_various_tweaks;
-
-+ /* Force autohint if no tt instructions */
-+ /* NOTE: NEEDS TO BE RUN LATER IN CODE???? */
-+ /*if ( use_various_tweaks &&
-+ ttface->num_locations &&
-+ ttface->max_profile.maxSizeOfInstructions == 0 )
-+ load_flags |= FT_LOAD_FORCE_AUTOHINT;*/
-+#endif
- if ( !face || !face->size || !face->glyph )
- return FT_THROW( Invalid_Face_Handle );
-
-@@ -702,6 +738,18 @@
- {
- FT_AutoHinter_Interface hinting;
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( use_various_tweaks )
-+ {
-+ /* Force slight hinting over full hinting always */
-+ load_flags &= ~FT_LOAD_TARGET_LCD;
-+ load_flags &= ~FT_LOAD_TARGET_LCD_V;
-+ load_flags &= ~FT_LOAD_TARGET_MONO;
-+ load_flags &= ~FT_LOAD_TARGET_NORMAL;
-+ load_flags |= FT_LOAD_TARGET_LIGHT;
-+ /*printf("%d ", load_flags);*/
-+ }
-+#endif
-
- /* try to load embedded bitmaps first if available */
- /* */
-@@ -747,6 +795,18 @@
- if ( error )
- goto Exit;
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ infinality_cur_width = 0;
-+
-+ {
-+ /* fix for sdl_ttf */
-+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
-+
-+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-+ ft_glyphslot_enlarge_metrics( slot, mode );
-+ }
-+#endif
-+
- if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
- {
- /* check that the loaded outline is correct */
-@@ -4724,6 +4784,11 @@
- /* That's ok now */
- *alibrary = library;
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* get Infinality settings */
-+ ftinf_env();
-+#endif
-+
- return FT_Err_Ok;
-
- #ifdef FT_CONFIG_OPTION_PIC
-diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c
-index 201ceab..4c8746d 100644
---- a/src/base/ftoutln.c
-+++ b/src/base/ftoutln.c
-@@ -29,7 +29,9 @@
- #include FT_INTERNAL_CALC_H
- #include FT_INTERNAL_DEBUG_H
- #include FT_TRIGONOMETRY_H
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "ftinf.h"
-+#endif
-
- /*************************************************************************/
- /* */
-@@ -910,7 +912,13 @@
- FT_Vector* points;
- FT_Int c, first, last;
- FT_Int orientation;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Bool use_various_tweaks = FALSE;
-+ if( ftinf ) use_various_tweaks=ftinf->use_various_tweaks;
-
-+ if ( use_various_tweaks )
-+ ystrength = FT_PIX_FLOOR ( ystrength );
-+#endif
-
- if ( !outline )
- return FT_THROW( Invalid_Outline );
-diff --git a/src/base/ftsynth.c b/src/base/ftsynth.c
-index cd68533..aa68c88 100644
---- a/src/base/ftsynth.c
-+++ b/src/base/ftsynth.c
-@@ -22,7 +22,9 @@
- #include FT_INTERNAL_OBJECTS_H
- #include FT_OUTLINE_H
- #include FT_BITMAP_H
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include "ftinf.h"
-+#endif
-
- /*************************************************************************/
- /* */
-@@ -93,7 +95,10 @@
- FT_Face face;
- FT_Error error;
- FT_Pos xstr, ystr;
--
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Bool use_various_tweaks = FALSE;
-+ if( ftinf ) use_various_tweaks=ftinf->use_various_tweaks;
-+#endif
-
- if ( !slot )
- return;
-@@ -111,8 +116,16 @@
- ystr = xstr;
-
- if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-+ {
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( use_various_tweaks )
-+ (void)FT_Outline_EmboldenXY( &slot->outline,
-+ xstr,
-+ FT_PIX_FLOOR( ystr ) );
-+ else
-+#endif
- FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
--
-+ }
- else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
- {
- /* round to full pixels */
-@@ -150,6 +163,9 @@
-
- slot->metrics.width += xstr;
- slot->metrics.height += ystr;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( !use_various_tweaks )
-+#endif
- slot->metrics.horiAdvance += xstr;
- slot->metrics.vertAdvance += ystr;
- slot->metrics.horiBearingY += ystr;
-diff --git a/src/base/rules.mk b/src/base/rules.mk
-index 1852e08..f7ae0e6 100644
---- a/src/base/rules.mk
-+++ b/src/base/rules.mk
-@@ -41,6 +41,7 @@ BASE_SRC := $(BASE_DIR)/basepic.c \
- $(BASE_DIR)/ftcalc.c \
- $(BASE_DIR)/ftdbgmem.c \
- $(BASE_DIR)/ftgloadr.c \
-+ $(BASE_DIR)/ftinf.c \
- $(BASE_DIR)/ftobjs.c \
- $(BASE_DIR)/ftoutln.c \
- $(BASE_DIR)/ftpic.c \
-diff --git a/src/smooth/ftsmooth.c b/src/smooth/ftsmooth.c
-index 3620550..b5b3056 100644
---- a/src/smooth/ftsmooth.c
-+++ b/src/smooth/ftsmooth.c
-@@ -26,6 +26,18 @@
-
- #include "ftsmerrs.h"
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+#include <math.h>
-+#include FT_BITMAP_H
-+#include <string.h>
-+#include <strings.h>
-+#include FT_OUTLINE_H
-+#include "../base/ftinf.h"
-+
-+#define verbose FALSE
-+#define STVALUES if (verbose) \
-+ printf ( "scale:%f translate:%ld ", *scale_value, *translate_value );
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
-
- /* initialize renderer -- init its raster */
- static FT_Error
-@@ -34,65 +46,2278 @@
- FT_Library library = FT_MODULE_LIBRARY( render );
-
-
-- render->clazz->raster_class->raster_reset( render->raster,
-- library->raster_pool,
-- library->raster_pool_size );
-+ render->clazz->raster_class->raster_reset( render->raster,
-+ library->raster_pool,
-+ library->raster_pool_size );
-+
-+ return 0;
-+ }
-+
-+
-+ /* sets render-specific mode */
-+ static FT_Error
-+ ft_smooth_set_mode( FT_Renderer render,
-+ FT_ULong mode_tag,
-+ FT_Pointer data )
-+ {
-+ /* we simply pass it to the raster */
-+ return render->clazz->raster_class->raster_set_mode( render->raster,
-+ mode_tag,
-+ data );
-+ }
-+
-+ /* transform a given glyph image */
-+ static FT_Error
-+ ft_smooth_transform( FT_Renderer render,
-+ FT_GlyphSlot slot,
-+ const FT_Matrix* matrix,
-+ const FT_Vector* delta )
-+ {
-+ FT_Error error = FT_Err_Ok;
-+
-+
-+ if ( slot->format != render->glyph_format )
-+ {
-+ error = FT_THROW( Invalid_Argument );
-+ goto Exit;
-+ }
-+
-+ if ( matrix )
-+ FT_Outline_Transform( &slot->outline, matrix );
-+
-+ if ( delta )
-+ FT_Outline_Translate( &slot->outline, delta->x, delta->y );
-+
-+ Exit:
-+ return error;
-+ }
-+
-+
-+ /* return the glyph's control box */
-+ static void
-+ ft_smooth_get_cbox( FT_Renderer render,
-+ FT_GlyphSlot slot,
-+ FT_BBox* cbox )
-+ {
-+ FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
-+
-+ if ( slot->format == render->glyph_format )
-+ FT_Outline_Get_CBox( &slot->outline, cbox );
-+ }
-+
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ static FT_Fixed FT_FixedFromFloat(float f)
-+ {
-+ short value = f;
-+ unsigned short fract = (f - value) * 0xFFFF;
-+
-+
-+ return (FT_Fixed)((long)value << 16 | (unsigned long)fract );
-+ }
-+
-+
-+ /* ChromeOS sharpening algorithm */
-+ /* soften the sub-pixel anti-aliasing and sharpen */
-+ static void
-+ _ft_lcd_chromeos_sharpen( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_Byte cutoff,
-+ double gamma_value )
-+ {
-+ static FT_Bool initialized_gamma = FALSE;
-+ static unsigned short gamma_ramp[256];
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ int ii;
-+
-+ if ( !initialized_gamma )
-+ {
-+ initialized_gamma = TRUE;
-+ /* linear to voltage */
-+ for ( ii = 0; ii < 256; ii++ )
-+ {
-+ gamma_ramp[ii] = (unsigned char)
-+ ( pow( (double)ii / 255.0, gamma_value ) * 255.0f );
-+ if ( gamma_ramp[ii] < cutoff )
-+ gamma_ramp[ii] = 0;
-+ }
-+ }
-+
-+ /* horizontal in-place sub-pixel sharpening filter */
-+ if ( mode == FT_RENDER_MODE_LCD )
-+ {
-+ FT_Byte* line = bitmap->buffer;
-+
-+
-+ for ( ; height > 0; height--, line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+
-+
-+ for ( xx = 0; xx < width; xx++ )
-+ line[xx] = gamma_ramp[line[xx]];
-+ }
-+ }
-+ }
-+
-+ /* simple linear scale to handle various sliding values */
-+ float
-+ sliding_scale ( int min_value,
-+ int max_value,
-+ float min_amount,
-+ float max_amount,
-+ int cur_value )
-+ {
-+
-+ float m = ( min_amount - max_amount ) / (float)( min_value - max_value );
-+ float result = ( ( (float)cur_value * m) + ( max_amount - max_value * m ) ) ;
-+
-+ if ( min_amount < max_amount )
-+ {
-+ if ( result < min_amount )
-+ return min_amount;
-+ if ( result > max_amount )
-+ return max_amount;
-+ }
-+ else
-+ {
-+ if ( result < max_amount )
-+ return max_amount;
-+ if ( result > min_amount )
-+ return min_amount;
-+ }
-+
-+ return result;
-+ }
-+
-+
-+ /* brightness and contrast adjustment on the bitmap */
-+ static FT_Bool
-+ _ft_bitmap_bc ( FT_Bitmap* bitmap,
-+ float brightness,
-+ float contrast )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_UInt xx;
-+
-+
-+ if ( brightness == 0 && contrast == 0 )
-+ return FALSE;
-+
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch )
-+ {
-+ for ( xx = 0; xx < width - 1; xx += 1 )
-+ {
-+ if ( line[xx] > 0)
-+ {
-+ float value = (float)( 255 - line[xx] ) / 256.0;
-+ FT_Int result = 0;
-+
-+ if ( brightness < 0.0 )
-+ value = value * ( 1.0 + brightness );
-+ else
-+ value = value + ( ( 1.0 - value ) * brightness );
-+
-+ value = ( value - 0.5 ) *
-+ ( tan ( ( contrast + 1.0 ) * 3.141592/4.0 ) ) + 0.5;
-+
-+ result = (FT_Int)( 255.0 - value * 256.0 );
-+
-+ if ( result < 0 )
-+ result = 0;
-+ if ( result > 255 )
-+ result = 255;
-+
-+ line[xx] = result;
-+ }
-+ }
-+ }
-+ return TRUE;
-+ }
-+
-+
-+ /* Filter to mimic Windows-style sharpening */
-+ /* Determined via 100% experimentation. */
-+ static void
-+ _ft_lcd_windows_sharpen( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_Bitmap new_bitmap;
-+
-+
-+ FT_Bitmap_New( &new_bitmap );
-+ FT_Bitmap_Copy( library, bitmap, &new_bitmap );
-+ new_line = (&new_bitmap)->buffer;
-+
-+ if (strength > 0)
-+ for (height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ FT_UInt xx, threshold = 128;
-+ FT_Byte* prevline = line - bitmap->pitch;
-+ FT_Byte* nextline = line + bitmap->pitch;
-+ FT_Byte* new_prevline = new_line - bitmap->pitch;
-+ FT_Byte* new_nextline = new_line + bitmap->pitch;
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ /* subpixel grid sp11 sp21 sp31 */
-+ /* where sp22 is sp12 sp22 sp32 */
-+ /* current subpixel. sp13 sp23 sp33 */
-+
-+ FT_Int prevtotal, nexttotal, lefttotal, righttotal, sidesdiff,
-+ prevdiff, nextdiff, sp11, sp21, sp31, sp12, sp22, sp32,
-+ sp13, sp23, sp33;
-+
-+ sp12 = line [xx-1];
-+ sp22 = line [xx];
-+ sp32 = line [xx+1];
-+
-+ if ( height == bitmap->rows )
-+ {
-+ prevtotal = sp11 = sp21 = sp31 = 0;
-+ prevdiff = sp22;
-+ lefttotal = sp12 + sp13;
-+ righttotal = sp32 + sp33;
-+ }
-+ else
-+ {
-+ prevtotal = prevline[xx-1] + prevline[xx] + prevline[xx+1];
-+ sp11 = prevline [xx-1];
-+ sp21 = prevline [xx];
-+ sp31 = prevline [xx+1];
-+ prevdiff = sp22 - sp21;
-+ lefttotal = sp11 + sp12 + sp13;
-+ righttotal = sp31 + sp32 + sp33;
-+ }
-+
-+ if ( height == 1 )
-+ {
-+ nexttotal = sp13 = sp23 = sp33 = 0;
-+ nextdiff = sp22;
-+ lefttotal = sp11 + sp12;
-+ righttotal = sp31 + sp32;
-+ }
-+ else
-+ {
-+ nexttotal = nextline[xx-1] + nextline[xx] + nextline[xx+1];
-+ sp13 = nextline [xx-1];
-+ sp23 = nextline [xx];
-+ sp33 = nextline [xx+1];
-+ nextdiff = sp23 - sp22;
-+ lefttotal = sp11 + sp12 + sp13;
-+ righttotal = sp31 + sp32 + sp33;
-+ }
-+
-+ sidesdiff = lefttotal - righttotal;
-+
-+ if ( sidesdiff < 0 )
-+ sidesdiff *= -1;
-+
-+ if ( prevdiff < 0 )
-+ prevdiff *= -1;
-+
-+ if ( nextdiff < 0 )
-+ nextdiff *= -1;
-+
-+ /* if the current pixel is less than threshold, and greater than 0 */
-+ if ( sp22 <= threshold && sp22 > 0 )
-+ {
-+ /* A pixel is horizontally isolated if: */
-+ /* 1: All upper adjecent pixels are >= threshold */
-+ if ( prevtotal >= nexttotal &&
-+ abs( sp11 - sp12 ) > 5 &&
-+ abs( sp21 - sp22 ) > 5 &&
-+ abs( sp31 - sp32 ) > 5 && /* not a vert stem end */
-+ sp11 >= threshold &&
-+ sp21 >= threshold &&
-+ sp31 >= threshold &&
-+ abs( sp23 - sp22 ) > 15 ) /* not on a vert stem */
-+ {
-+ /* darken upper adjacent subpixel; lighten current */
-+ if ( height != (FT_UInt)bitmap->rows )
-+ new_prevline[xx] += ( ( 255 - new_prevline[xx] )
-+ * strength ) / 100 ;
-+
-+ new_line[xx] -= ( new_line[xx] * strength ) / 100;
-+
-+ if ( height != 1 && height != (FT_UInt)bitmap->rows )
-+ if ( new_nextline[xx] > 155 + ( 100 - strength ) )
-+ new_prevline[xx] = 255;
-+
-+ }
-+ else if ( nexttotal > prevtotal &&
-+ abs( sp13 - sp12 ) > 5 &&
-+ abs( sp23 - sp22 ) > 5 &&
-+ abs( sp33 - sp32 ) > 5 &&
-+ /* 2: All lower adjecent pixels are >= threshold */
-+ sp13 >= threshold &&
-+ sp23 >= threshold &&
-+ sp33 >= threshold &&
-+ abs( sp22 - sp21 ) > 15 )
-+ {
-+ /* darken lower adjacent subpixel; lighten current */
-+ if ( height != 1 )
-+ new_nextline[xx] += ( 255 - new_nextline[xx] ) * strength / 100;
-+
-+ new_line[xx] -= ( new_line[xx] * strength ) / 100;
-+
-+ if ( height != 1 )
-+ if ( new_nextline[xx] > 155 + ( 100 - strength ) )
-+ new_nextline[xx] = 255;
-+
-+ }
-+ }
-+ else if ( sp22 > threshold && sp22 < 255 )
-+ {
-+ if ( sp11 <= threshold &&
-+ abs( sp13 - sp12 ) > 5 &&
-+ abs( sp23 - sp22 ) > 5 &&
-+ abs( sp33 - sp32 ) > 5 &&
-+ sp21 <= threshold &&
-+ sp31 <= threshold &&
-+ prevtotal <= nexttotal &&
-+ abs( sp22 - sp21 ) > 15 )
-+ {
-+ /* bring this subpixel 1/3 of the way to 255 at 100% strength */
-+ new_line[xx] += ( strength * ( 255 - new_line[xx] ) ) / 100;
-+
-+ if ( height != (FT_UInt)bitmap->rows )
-+ new_prevline[xx] -= ( new_prevline[xx] * strength ) / 300;
-+ }
-+ else if ( sp13 <= threshold &&
-+ abs( sp11 - sp12 ) > 5 &&
-+ abs( sp21 - sp22 ) > 5 &&
-+ abs( sp31 - sp32 ) > 5 &&
-+ sp23 <= threshold &&
-+ sp33 <= threshold &&
-+ nexttotal < prevtotal &&
-+ abs( sp23 - sp22 ) > 15 )
-+ {
-+ new_line[xx] += ( strength * ( 255 - new_line[xx] ) ) / 100;
-+
-+ if ( height != 1 )
-+ new_nextline[xx] -= ( new_nextline[xx] * strength ) / 300;
-+ }
-+ }
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap);
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+
-+ static void
-+ _ft_lcd_darken_x ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_Bitmap new_bitmap;
-+ int factor1, factor2;
-+ int bias = 0;
-+
-+ FT_Bitmap_New( &new_bitmap );
-+
-+ FT_Bitmap_Copy( library, bitmap, &new_bitmap );
-+ new_line = (&new_bitmap)->buffer;
-+
-+ if ( strength > 0 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+ FT_Byte* prevline = line - bitmap->pitch;
-+ FT_Byte* nextline = line + bitmap->pitch;
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ /* subpixel grid sp11 sp21 sp31 */
-+ /* where sp22 is sp12 sp22 sp32 */
-+ /* current subpixel. sp13 sp23 sp33 */
-+
-+ FT_Int sp21, sp12, sp22, sp32, sp23;
-+
-+ sp12 = line [xx-1];
-+ sp22 = line [xx];
-+ sp32 = line [xx+1];
-+
-+ if ( height == bitmap->rows )
-+ sp21 = 0;
-+ else
-+ sp21 = prevline [xx];
-+
-+ if ( height == 1 )
-+ sp23 = 0;
-+ else
-+ sp23 = nextline [xx];
-+
-+ /* darken subpixel if neighbor above and below are much less than */
-+ /* safer but less effective */
-+ factor1 = 5;
-+ factor2 = 5;
-+
-+ /* make matches in the middle of glyph slightly darker */
-+ /*if (height > 1 && height < (FT_UInt)bitmap->rows) bias = 1;*/
-+
-+ if ( sp22 > factor1 * sp21 &&
-+ sp22 > factor1 * sp23 &&
-+ sp22 > factor2 &&
-+ sp12 > 16 &&
-+ sp32 > 16 )
-+ if ( new_line[xx] < ( strength * 255 ) / 100 )
-+ new_line[xx] = (strength * 255 ) / 100
-+ + bias * ( 255 - ( strength * 255 ) / 100 ) / 3;
-+
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap );
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+
-+ static void
-+ _ft_lcd_darken_y ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_Bitmap new_bitmap;
-+
-+
-+ FT_Bitmap_New( &new_bitmap );
-+ FT_Bitmap_Copy( library, bitmap, &new_bitmap );
-+ new_line = (&new_bitmap)->buffer;
-+
-+ if ( strength > 0 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ if ( line[xx] > line[xx-1] && line[xx] > line[xx+1] )
-+ {
-+ if (new_line[xx] > 0)
-+ new_line[xx] += ( strength * ( 255 - new_line[xx] ) ) / 100;
-+ new_line[xx-1] += ( strength * ( 255 - line[xx-1] ) ) / 100;
-+ new_line[xx+1] += ( strength * ( 255 - line[xx+1] ) ) / 100;
-+ }
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap );
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+
-+ static void
-+ _ft_bitmap_cap ( FT_Bitmap* bitmap,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_UInt cur_value = 0;
-+ FT_Bitmap new_bitmap;
-+
-+
-+ FT_Bitmap_New( &new_bitmap );
-+ FT_Bitmap_Copy( library, bitmap, &new_bitmap );
-+ new_line = (&new_bitmap)->buffer;
-+
-+ if ( strength > 0 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ cur_value = ( new_line[xx-1] + new_line[xx] + new_line[xx+1] ) / 3;
-+ if ( cur_value > ( strength * 255 ) / 100 )
-+ {
-+ FT_UInt new_factor = ( strength * 255 ) / 100;
-+ new_line[xx] = ( new_line[xx] * new_factor ) / cur_value;
-+ new_line[xx+1] = ( new_line[xx+1] * new_factor ) / cur_value;
-+ new_line[xx-1] = ( new_line[xx-1] * new_factor ) / cur_value;
-+ }
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap );
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+ static int
-+ pseudo_gamma ( int val, float value )
-+ {
-+ return 256 * ( 1.0f - powf( ( 1.0f - val * (1.0f/256.0f) ), 1.0f / value ) );
-+ }
-+
-+#if(0)
-+ static void
-+ _ft_bitmap_embolden ( FT_Bitmap* bitmap,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_Bitmap new_bitmap;
-+ FT_UInt xx;
-+
-+
-+ FT_Bitmap_New(&new_bitmap);
-+ FT_Bitmap_Copy(library, bitmap, &new_bitmap);
-+ new_line = (&new_bitmap)->buffer;
-+
-+ if ( strength > 0 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ FT_Int new_value = 0;
-+
-+
-+ new_value = ( strength * line [xx-1] ) / 100
-+ + pseudo_gamma( line [xx], .75 )
-+ + (strength * line [xx+1] ) / 100;
-+ if ( new_value > 255 )
-+ new_value = 255;
-+
-+ new_line[xx] = new_value;
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap );
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+
-+
-+ static void
-+ _ft_bitmap_gamma ( FT_Bitmap* bitmap,
-+ float strength )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_UInt xx;
-+
-+
-+ if ( strength > 0 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch )
-+ {
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ if ( abs( line[xx-1] - line[xx] ) < 20 ||
-+ abs( line[xx+1] - line[xx] ) < 20 )
-+ line [xx] = pseudo_gamma( line [xx], strength ) ;
-+ }
-+ }
-+ }
-+#endif
-+
-+ /* Fringe filter */
-+ static void
-+ _ft_lcd_fringe_filter ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* new_line;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_Bitmap new_bitmap;
-+
-+
-+ FT_Bitmap_New(&new_bitmap);
-+
-+ line = bitmap->buffer;
-+ FT_Bitmap_Copy( library, bitmap, &new_bitmap );
-+ new_line = (&new_bitmap)->buffer;
-+
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch, new_line += bitmap->pitch )
-+ {
-+ /* Threshold set to 1/2 pixel intensity */
-+ FT_UInt xx, threshold = 128;
-+
-+ /* Hack to make this work when bitmap is at first or last line */
-+ FT_Int fudge = bitmap->pitch * (height == (FT_UInt)bitmap->rows);
-+
-+ FT_Byte* prevline = line - bitmap->pitch + fudge;
-+ FT_Byte* nextline = line + bitmap->pitch;
-+
-+
-+ for ( xx = 1; xx < width - 1; xx += 1 )
-+ {
-+ /* subpixel grid sp11 sp21 sp31 */
-+ /* where sp22 is sp12 sp22 sp32 */
-+ /* current subpixel. sp13 sp23 sp33 */
-+
-+ FT_Int prevtotal, nexttotal, lefttotal, righttotal, sidesdiff,
-+ leftdiff, rightdiff, prevdiff, nextdiff, sp11, sp21, sp31,
-+ sp12, sp22, sp32, sp13, sp23, sp33;
-+
-+ sp12 = line [xx-1];
-+ sp22 = line [xx];
-+ sp32 = line [xx+1];
-+
-+ /* if at max height fake out some values */
-+ if ( height == (FT_UInt)bitmap->rows )
-+ {
-+ prevtotal = sp11 = sp21 = sp31 = 0;
-+ prevdiff = sp22;
-+ lefttotal = sp12 + sp13;
-+ righttotal = sp32 + sp33;
-+ }
-+ else
-+ {
-+ prevtotal = prevline[xx-1] + prevline[xx] + prevline[xx+1];
-+ sp11 = prevline [xx-1];
-+ sp21 = prevline [xx];
-+ sp31 = prevline [xx+1];
-+ prevdiff = sp22 - sp21;
-+ lefttotal = sp11 + sp12 + sp13;
-+ righttotal = sp31 + sp32 + sp33;
-+ }
-+
-+ /* if at min height fake out some values */
-+ if ( height == 1 )
-+ {
-+ nexttotal = sp13 = sp23 = sp33 = 0;
-+ nextdiff = sp22;
-+ lefttotal = sp11 + sp12;
-+ righttotal = sp31 + sp32;
-+ }
-+ else
-+ {
-+ nexttotal = nextline[xx-1] + nextline[xx] + nextline[xx+1];
-+ sp13 = nextline [xx-1];
-+ sp23 = nextline [xx];
-+ sp33 = nextline [xx+1];
-+ nextdiff = sp23 - sp22;
-+ lefttotal = sp11 + sp12 + sp13;
-+ righttotal = sp31 + sp32 + sp33;
-+ }
-+
-+ sidesdiff = lefttotal - righttotal;
-+ leftdiff = sp22 - sp12;
-+ rightdiff = sp32 - sp22;
-+
-+ if ( sidesdiff < 0 )
-+ sidesdiff *= -1;
-+
-+ if ( prevdiff < 0 )
-+ prevdiff *= -1;
-+
-+ if ( nextdiff < 0 )
-+ nextdiff *= -1;
-+
-+ if ( leftdiff < 0 )
-+ leftdiff *= -1;
-+
-+ if ( rightdiff < 0 )
-+ rightdiff *= -1;
-+
-+ /* if the current subpixel is less than threshold, and varies only
-+ slightly to left or right, lighten it */
-+ if ( sp22 <= threshold && sp22 > 0 &&
-+ ( leftdiff < 10 || rightdiff < 10 ) )
-+ {
-+ /* A pixel is horizontally isolated if: */
-+ /* 1: All upper adjecent subpixels are >= threshold and all lower
-+ adjacent ones are essentially white */
-+ if ( prevtotal >= nexttotal &&
-+ sp11 >= threshold &&
-+ sp21 >= threshold &&
-+ sp31 >= threshold &&
-+ sp13 < 2 &&
-+ sp23 < 2 &&
-+ sp33 < 2 )
-+
-+ {
-+ new_line[xx] -= ( new_line[xx] * strength ) / 100;
-+
-+ if ( leftdiff < 10 )
-+ /* OPPORTUNITY FOR IMPROVEMENT - keep going left until 255? */
-+ new_line[xx-1] -= ( new_line[xx-1] * strength ) / 200;
-+
-+ if ( rightdiff < 10 )
-+ /* OPPORTUNITY FOR IMPROVEMENT */
-+ new_line[xx+1] -= ( new_line[xx+1] * strength ) / 200;
-+ }
-+ else if ( nexttotal > prevtotal &&
-+ /* 2: the inverse of above */
-+ sp13 >= threshold &&
-+ sp23 >= threshold &&
-+ sp33 >= threshold &&
-+ sp11 < 2 &&
-+ sp21 < 2 &&
-+ sp31 < 2 )
-+ {
-+ new_line[xx] -= ( new_line[xx] * strength ) / 100;
-+
-+ if ( leftdiff < 10 )
-+ /* OPPORTUNITY FOR IMPROVEMENT - keep going left until 255? */
-+ new_line[xx-1] -= ( new_line[xx-1] * strength ) / 200;
-+
-+ if ( rightdiff < 10 )
-+ /* OPPORTUNITY FOR IMPROVEMENT */
-+ new_line[xx+1] -= ( new_line[xx+1] * strength ) / 200;
-+ }
-+ }
-+ /* otherwise if the current subpixel is more than threshold, and varies
-+ slightly to left or right, darken it */
-+ else if ( sp22 > threshold &&
-+ sp22 < 255 &&
-+ ( leftdiff < 10 ||
-+ rightdiff < 10 ) )
-+ {
-+ if ( sp11 <= 2 &&
-+ sp21 <= 2 &&
-+ sp31 <= 2 &&
-+ sp13 >= threshold &&
-+ sp23 >= threshold &&
-+ sp33 >= threshold &&
-+ prevtotal < nexttotal )
-+ new_line[xx] += ( ( 255 - new_line[xx] ) * strength ) / 100;
-+
-+ else if ( sp13 <= 2 &&
-+ sp23 <= 2 &&
-+ sp33 <= 2 &&
-+ nexttotal < prevtotal &&
-+ sp11 >= threshold &&
-+ sp21 >= threshold &&
-+ sp31 >= threshold )
-+ new_line[xx] += ( ( 255 - new_line[xx] ) * strength ) / 100;
-+
-+ }
-+ }
-+ }
-+ FT_Bitmap_Copy( library, &new_bitmap, bitmap );
-+ FT_Bitmap_Done( library, &new_bitmap );
-+ }
-+
-+
-+ /* Grayscale filter */
-+ static void
-+ _ft_lcd_grayscale_filter ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_UInt strength,
-+ FT_Library library )
-+ {
-+
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* line = bitmap->buffer;
-+
-+
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+
-+
-+ for ( xx = 0; xx < width - 1; xx += 3 )
-+ {
-+ FT_UInt total = line [xx] + line [xx + 1] + line [xx + 2];
-+ line[xx] = ( ( 100 - strength ) * line[xx]
-+ + strength * ( total / 3 ) ) / 100;
-+ line[xx+1] = ( ( 100 - strength ) * line[xx+1]
-+ + strength * ( total / 3 ) ) / 100;
-+ line[xx+2] = ( ( 100 - strength ) * line[xx+2]
-+ + strength * ( total / 3 ) ) / 100;
-+ }
-+ }
-+ }
-+
-+/*
-+ These need to be in sync with params inside ftinf.c
-+ (not ideal but perhaps better than making these public)
-+ */
-+#define STEM_WIDTH_2_PPEM 18
-+#define MAX_PPEM 100
-+
-+ typedef struct Stem_Segment_
-+ {
-+ FT_Long x1;
-+ FT_Long x2;
-+ FT_Int y;
-+ } Stem_Segment;
-+
-+ typedef struct Stem_Center_
-+ {
-+ FT_Long x;
-+ FT_Long y;
-+ FT_Long w;
-+ FT_Long x1;
-+ FT_Long x2;
-+ } Stem_Center;
-+
-+ typedef struct Stem_
-+ {
-+ FT_Long center;
-+ FT_Long count;
-+ FT_Long rcount; /* used to count within a range in possible stems */
-+ FT_Long width;
-+ FT_Long height;
-+ FT_Short zone; /* 1 2 or 3 */
-+ FT_Bool generated;
-+ } Stem;
-+
-+ static void
-+ swap_stem ( Stem* s1, Stem* s2 )
-+ {
-+ Stem s;
-+ s.center = s1->center;
-+ s.count = s1->count;
-+ s.rcount = s1->rcount;
-+ s.width = s1->width;
-+ s.zone = s1->zone;
-+ s.generated = s1->generated;
-+
-+ s1->center = s2->center;
-+ s1->count = s2->count;
-+ s1->rcount = s2->rcount;
-+ s1->width = s2->width;
-+ s1->zone = s2->zone;
-+ s1->generated = s2->generated;
-+
-+ s2->center = s.center;
-+ s2->count = s.count;
-+ s2->rcount = s.rcount;
-+ s2->width = s.width;
-+ s2->zone = s.zone;
-+ s2->generated = s.generated;
-+ }
-+
-+ /* Stem alignment for bitmaps; A hack with very nice results */
-+ /* Ideally this could be implemented on the outline, prior to
-+ * rasterization. Possible future enhancement is to use the
-+ * warper code to achieve this */
-+ static void
-+ _lcd_stem_align ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_GlyphSlot slot,
-+ FT_Long* translate_value,
-+ float* scale_value,
-+ FT_UInt alignment_strength,
-+ FT_UInt fitting_strength,
-+ float* embolden_value
-+ )
-+ {
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+
-+ Stem_Segment* segments;
-+ Stem_Segment* leftmost_segment;
-+ Stem_Segment* rightmost_segment;
-+ Stem_Segment* leftmost_segment_not_extrema;
-+ Stem_Segment* rightmost_segment_not_extrema;
-+ Stem* stems;
-+ Stem* possible_stems;
-+ Stem* leftmost_stem;
-+ Stem* rightmost_stem;
-+ Stem_Data* known_stem_values;
-+ Stem_Center* centers;
-+ FT_Long leftmost_point = width * 256;
-+ FT_Long rightmost_point = 0;
-+ FT_Long leftmost_point_not_extrema = width * 256;
-+ FT_Long rightmost_point_not_extrema = 0;
-+ FT_Long num_segments = 0;
-+ FT_Long num_centers = 0;
-+ FT_Long *stem_centers;
-+ FT_UInt h;
-+ FT_ULong valid_stems = 0, valid_possible_stems = 0;
-+ FT_Long center, stem_matches, stem_matches_ledge;
-+ FT_Long stem_matches_redge, next_center, last_matching_center;
-+ FT_Long last_matching_ledge, last_matching_redge, this_center;
-+ FT_Int max_strength;
-+ FT_Byte* line = bitmap->buffer;
-+ FT_UInt current_value = 0;
-+ FT_UInt xx;
-+ FT_Long linearHoriAdvance = slot->linearHoriAdvance >> 10;
-+
-+ FT_Int m_horiBearingX = slot->metrics.horiBearingX;
-+ FT_Int m_horiAdvance = slot->metrics.horiAdvance;
-+ FT_Int m_width = slot->metrics.width;
-+ FT_Pos one_pixel = 768;
-+ FT_Pos one_third_pixel = 256;
-+ FT_Int columns_per_pixel = 3;
-+ /*FT_Int extra_columns = 6;*/
-+
-+ /* on / off flags for testing different features */
-+ FT_Bool strategy_translate_using_closest_stem = TRUE;
-+ FT_Bool strategy_scale_to_closest_centers = FALSE;
-+ FT_Bool strategy_scale_to_closest_centers_up_only = FALSE;
-+ FT_Bool strategy_always_use_distance_ceiling = FALSE;
-+ FT_Bool strategy_auto_change_center_offset = TRUE;
-+ FT_Bool strategy_use_m_control = FALSE;
-+ FT_Bool strategy_correct_out_of_bounds_outlines = FALSE;
-+ FT_Bool strategy_also_use_edge_detection_for_stems = FALSE;
-+ FT_Bool strategy_use_strengths = TRUE;
-+ FT_Bool strategy_synthesize_stems = FALSE;
-+ FT_Bool strategy_bearing_correction = TRUE;
-+ FT_Bool strategy_use_d_correction = TRUE;
-+ FT_Bool strategy_fit_to_width = FALSE;
-+ /*FT_Bool strategy_center_glyph = FALSE;*/
-+
-+ const FT_Int MIN_PPEM = 7;
-+ /*const FT_Int MAX_PPEM = 100;*/
-+ const FT_Int MAX_STEMS = 3;
-+ FT_Int ppem = 0;
-+
-+ Stem_Data stem_data;
-+
-+ /* reset to default */
-+ *scale_value = 1.0;
-+
-+ /* Simply return in odd cases where these don't seem to be set */
-+ /* Flash and some pdf viewers will crash otherwise */
-+ if ( !slot->face ||
-+ !slot->face->size ||
-+ !slot->face->size->metrics.x_ppem )
-+ return;
-+
-+ if ( slot->face->size->metrics.x_ppem > MAX_PPEM )
-+ return;
-+
-+ if ( slot->face->size->metrics.x_ppem < MIN_PPEM )
-+ return;
-+
-+ if ( !FT_IS_SCALABLE( slot->face ) )
-+ return;
-+
-+ ppem = slot->face->size->metrics.x_ppem;
-+
-+ if ( ppem < 9 )
-+ return;
-+ if ( ppem > 20 )
-+ strategy_use_m_control = TRUE;
-+
-+ /* only perform alignment on styles we know, that aren't bold or italic */
-+ /* perhaps detection could be added on those that are not set? */
-+ /* Require certain ppems for narrow and light fonts */
-+ if( slot->face->style_name )
-+ {
-+ if ( strcasestr( slot->face->style_name, "Italic" ) ||
-+ strcasestr( slot->face->style_name, "Oblique" ) ||
-+ strcasestr( slot->face->style_name, "Script" ) ||
-+ strcasestr( slot->face->style_name, "Handwriting" ) ||
-+ strcasestr( slot->face->style_name, "Bold" ) ||
-+ strcasestr( slot->face->style_name, "Black" ) ||
-+ ( ( strcasestr( slot->face->style_name, "Extra Thin" ) ||
-+ strcasestr( slot->face->style_name, "Extra Light" ) ) &&
-+ ppem < 10 ) ||
-+ ( strcasestr( slot->face->style_name, "Thin" )
-+ && ppem < 10 ) ||
-+ ( strcasestr( slot->face->style_name, "Light" )
-+ && ppem < 10 ) ||
-+ ( strcasestr( slot->face->style_name, "Narrow" )
-+ && ppem < 15 ) ||
-+ ( strcasestr( slot->face->style_name, "Condensed" )
-+ && ppem < 20 ) )
-+ return;
-+ }
-+
-+ if( slot->face->family_name )
-+ {
-+ if ( strcasestr( slot->face->family_name, "Italic" ) ||
-+ strcasestr( slot->face->family_name, "Oblique" ) ||
-+ strcasestr( slot->face->family_name, "Script" ) ||
-+ strcasestr( slot->face->family_name, "Handwriting" ) ||
-+ strcasestr( slot->face->family_name, "Bold" ) ||
-+ strcasestr( slot->face->family_name, "Black" ) ||
-+ ( ( strcasestr( slot->face->family_name, "Extra Thin" ) ||
-+ strcasestr( slot->face->family_name, "Extra Light" ) ) &&
-+ ppem < 10 ) ||
-+ ( strcasestr( slot->face->family_name, "Thin" )
-+ && ppem < 10 ) ||
-+ ( strcasestr( slot->face->family_name, "Light" )
-+ && ppem < 10 ) ||
-+ ( strcasestr( slot->face->family_name, "Narrow" )
-+ && ppem < 15 ) ||
-+ ( strcasestr( slot->face->family_name, "Condensed" )
-+ && ppem < 20 ) )
-+ return;
-+ }
-+ else if ( slot->face->style_flags )
-+ {
-+ if ( slot->face->style_flags & FT_STYLE_FLAG_ITALIC ||
-+ slot->face->style_flags & FT_STYLE_FLAG_BOLD ||
-+ FT_IS_TRICKY( slot->face ) )
-+ return;
-+ }
-+ else return;
-+
-+ if ( mode != FT_RENDER_MODE_LCD )
-+ {
-+ columns_per_pixel = 1;
-+ one_pixel = 256;
-+ one_third_pixel = 85;
-+ /*extra_columns = 0;*/
-+ /* until this can be figured out just return */
-+ /* There are issues with missing glyphs */
-+ return;
-+ }
-+
-+ known_stem_values=&stem_data;
-+ if ( ftinf && ftinf->use_known_settings_on_selected_fonts )
-+ {
-+ ftinf_fill_stem_values( known_stem_values, slot->face->family_name, ppem, TRUE );
-+ /* translate value may be set for < 10 */
-+ if (known_stem_values->stem_translating_only > -1024 )
-+ {
-+ *translate_value = known_stem_values->stem_translating_only;
-+ return;
-+ }
-+ if( known_stem_values->bearing_correction == FALSE )
-+ strategy_bearing_correction = FALSE;
-+ } else
-+ ftinf_fill_stem_values( known_stem_values, slot->face->family_name, ppem, FALSE );
-+
-+ if ( known_stem_values->use_100 ||
-+ known_stem_values->m >= 0 )
-+ {
-+ alignment_strength = fitting_strength = 100;
-+ strategy_use_m_control = TRUE;
-+ }
-+
-+ if ( known_stem_values->edge_detection )
-+ strategy_also_use_edge_detection_for_stems = TRUE;
-+
-+ /* Allocate */
-+ segments = NULL;
-+ leftmost_segment = (Stem_Segment*) malloc( 4*sizeof ( Stem_Segment ) );
-+ leftmost_segment_not_extrema = leftmost_segment+1;
-+ rightmost_segment = leftmost_segment+2;
-+ rightmost_segment_not_extrema = leftmost_segment+3;
-+
-+ stems = (Stem*) malloc ( (2*MAX_STEMS+2) * sizeof ( Stem ) );
-+ possible_stems = stems+MAX_STEMS;
-+ leftmost_stem = possible_stems+MAX_STEMS;
-+ rightmost_stem = leftmost_stem + 1;
-+ centers = NULL;
-+
-+ if ( verbose )
-+ printf("\n");
-+
-+ /* Initialize */
-+ stem_centers=(FT_Long*)calloc( width * 256, sizeof(stem_centers[0]) );
-+
-+ rightmost_segment->x1 = 0;
-+ rightmost_segment->x2 = 0;
-+ rightmost_segment->y = 0;
-+ leftmost_segment->x1 = 99999999;
-+ leftmost_segment->x2 = 0;
-+ leftmost_segment->y = 0;
-+
-+ rightmost_segment_not_extrema->x1 = 0;
-+ rightmost_segment_not_extrema->x2 = 0;
-+ rightmost_segment_not_extrema->y = 0;
-+ leftmost_segment_not_extrema->x1 = 99999999;
-+ leftmost_segment_not_extrema->x2 = 0;
-+ leftmost_segment_not_extrema->y = 0;
-+
-+ /* Locate stem centers for later processing */
-+ for ( h = (FT_UInt)bitmap->rows; h > 0; h--, line += bitmap->pitch )
-+ {
-+ current_value = 0;
-+ /* Calculate various sums and stem widths of glyph */
-+ for ( xx = 0; xx < width; xx += 1 )
-+ {
-+ /* Reallocate (in blocks of 64) */
-+ if( num_segments % 64 == 0 )
-+ segments = (Stem_Segment*) realloc
-+ ( segments, ( num_segments + 64 ) * sizeof ( Stem_Segment ) );
-+
-+ /* if line is white, and now has color, it's the start of a stem */
-+ if ( current_value == 0 && line[xx] > 0 )
-+ {
-+ /* start of stem */
-+ segments[num_segments].x1 = 256 * xx + ( 255 - line[xx] );
-+ segments[num_segments].y = h;
-+ }
-+
-+ /* otherwise, if it's currently black and the new value is 0,
-+ it's the end of a stem */
-+ else if ( ( current_value > 0 && line[xx] == 0 ) ||
-+ ( current_value > 0 && xx == width - 1 ) )
-+ {
-+ FT_Long stem_center_x;
-+ segments[num_segments].x2 = 256 * ( xx - 1 ) + line[xx-1];
-+
-+ if ( xx == width - 1 )
-+ segments[num_segments].x2 += line[xx];
-+
-+ /*stem center is average of start and end of stem */
-+ stem_center_x = ( segments[num_segments].x2
-+ + segments[num_segments].x1 ) / 2;
-+
-+ /* Reallocate (in blocks of 32) */
-+ if( num_centers % 32 == 0 )
-+ centers = (Stem_Center*) realloc
-+ ( centers, ( num_centers + 32 ) * sizeof ( Stem_Center ) );
-+ centers[num_centers].x = stem_center_x;
-+ centers[num_centers].y = h;
-+ centers[num_centers].x1 = segments[num_segments].x1;
-+ centers[num_centers].x2 = segments[num_segments].x2;
-+
-+ num_centers++;
-+
-+ stem_centers[stem_center_x] += 1;
-+
-+ /* Find left and rightmost points for later calculations */
-+ /* OR - Favor ones that aren't on the top or bottom if */
-+ /* possible to prevent v and w from getting caught later */
-+ if ( segments[num_segments].x1 < leftmost_segment->x1 ||
-+ ( segments[num_segments].y > 1 &&
-+ segments[num_segments].y < height &&
-+ segments[num_segments].x1 == leftmost_segment->x1 ) )
-+ {
-+ leftmost_segment->x1 = segments[num_segments].x1;
-+ leftmost_segment->x2 = segments[num_segments].x2;
-+ leftmost_segment->y = h;
-+ }
-+ if ( segments[num_segments].x2 > rightmost_segment->x2 ||
-+ ( segments[num_segments].y > 1 &&
-+ segments[num_segments].y < height &&
-+ segments[num_segments].x1 == rightmost_segment->x1 ) )
-+ {
-+ rightmost_segment->x1 = segments[num_segments].x1;
-+ rightmost_segment->x2 = segments[num_segments].x2;
-+ rightmost_segment->y = h;
-+ }
-+
-+ if ( segments[num_segments].x1
-+ < leftmost_segment_not_extrema->x1 ||
-+ ( segments[num_segments].y > 1 &&
-+ segments[num_segments].y < height &&
-+ segments[num_segments].x1
-+ == leftmost_segment_not_extrema->x1 &&
-+ h < (FT_UInt)bitmap->rows && h > 0 ) )
-+ {
-+ leftmost_segment_not_extrema->x1 = segments[num_segments].x1;
-+ leftmost_segment_not_extrema->x2 = segments[num_segments].x2;
-+ leftmost_segment_not_extrema->y = h;
-+ }
-+ if ( segments[num_segments].x2
-+ > rightmost_segment_not_extrema->x2 ||
-+ ( segments[num_segments].y > 1 &&
-+ segments[num_segments].y < height &&
-+ segments[num_segments].x1
-+ == rightmost_segment_not_extrema->x1 &&
-+ h < (FT_UInt)bitmap->rows && h > 0 ) )
-+ {
-+ rightmost_segment_not_extrema->x1 = segments[num_segments].x1;
-+ rightmost_segment_not_extrema->x2 = segments[num_segments].x2;
-+ rightmost_segment_not_extrema->y = h;
-+ }
-+
-+ if ( segments[num_segments].x1 < leftmost_point )
-+ leftmost_point = segments[num_segments].x1;
-+
-+ if ( segments[num_segments].x2 > rightmost_point )
-+ rightmost_point = segments[num_segments].x2;
-+
-+ if ( segments[num_segments].x1 < leftmost_point_not_extrema &&
-+ h < (FT_UInt)bitmap->rows && h > 0 )
-+ leftmost_point_not_extrema = segments[num_segments].x1;
-+
-+ if ( segments[num_segments].x2 > rightmost_point_not_extrema &&
-+ h < (FT_UInt)bitmap->rows && h > 0 )
-+ rightmost_point_not_extrema = segments[num_segments].x2;
-+
-+ num_segments++;
-+ }
-+ /* else - other conditions - need some error checking here */
-+ current_value = line[xx];
-+ }
-+ }
-+
-+ /* initialize */
-+ for ( xx = 0; xx < MAX_STEMS; xx +=1 )
-+ {
-+ stems[xx].center = 0;
-+ stems[xx].count = 0;
-+ stems[xx].width = 0;
-+ stems[xx].height = 0;
-+ possible_stems[xx].center = 0;
-+ possible_stems[xx].count = 0;
-+ possible_stems[xx].width = 0;
-+ possible_stems[xx].height = 0;
-+ }
-+
-+ valid_stems = 0;
-+ valid_possible_stems = 0;
-+
-+ /* Determine which centers belong to stems */
-+ center = 0;
-+
-+ while ( center < num_centers )
-+ {
-+ /* slope at within which to consider a point part of a stem */
-+ /*const FT_UInt slope = 1;
-+ const FT_UInt topslope = (256 * 3) / 10; */
-+
-+ /* 10 to 20 with 4 matches seems good, */
-+ /* but 1 or 2 with 3 stems needs to somehow get included */
-+ FT_Int deviation1 = 5;
-+ FT_Int deviation2=-1, requirement1 = 4, stem_match_requirement = 3;
-+ FT_Int center_difference_in_height;
-+ FT_Int center_difference_in_width, valid_center_average;
-+ FT_Int smallest_width_ledge, smallest_width_redge;
-+ FT_Int x1_difference_in_width, x2_difference_in_width;
-+ FT_Bool no_gap_found = FALSE;
-+ FT_Bool no_gap_found_ledge = FALSE;
-+ FT_Bool no_gap_found_redge = FALSE;
-+ FT_Bool stem_detected = FALSE;
-+ FT_Int set_width_to, set_center_to;
-+
-+ /* seems to not do damage */
-+ /* May not be effective */
-+ requirement1 = height / 4;
-+ if ( requirement1 < 5 )
-+ requirement1 = 5;
-+ deviation1 = 20;
-+ deviation2 = 20;
-+
-+ if ( columns_per_pixel == 1 )
-+ deviation1 = deviation2 = 10;
-+
-+ if ( (FT_Int)bitmap->rows <= 6 )
-+ deviation1 = 25;
-+
-+ if ( (FT_Int)bitmap->rows <= 6 )
-+ deviation2 = 25;
-+
-+ if ( columns_per_pixel == 1 &&
-+ (FT_Int)bitmap->rows <= 6 )
-+ deviation1 = deviation2 = 12;
-+
-+ valid_center_average = 0;
-+
-+ no_gap_found = no_gap_found_ledge = no_gap_found_redge = FALSE;
-+ stem_detected = FALSE;
-+
-+ if ( ppem < 11 )
-+ requirement1 = 4;
-+
-+ if ( ppem > 18 )
-+ {
-+ stem_match_requirement = height / 4;
-+ if ( stem_match_requirement < 3 )
-+ stem_match_requirement = 3;
-+ }
-+
-+ smallest_width_ledge = smallest_width_redge = width * 256;
-+ stem_matches = 0;
-+ stem_matches_ledge = 0;
-+ stem_matches_redge = 0;
-+ last_matching_center = -1;
-+ last_matching_ledge = -1;
-+ last_matching_redge = -1;
-+
-+ /* set currently looked at center to center value */
-+ this_center = center;
-+ next_center = 0;
-+
-+ /* For each center, compare with all other centers to see if others */
-+ /* match the properties of this one */
-+ while ( next_center < num_centers )
-+ {
-+
-+ /* calculate differences */
-+ center_difference_in_width = abs ( centers[this_center].x
-+ - centers[next_center].x );
-+ center_difference_in_height = abs ( centers[this_center].y
-+ - centers[next_center].y );
-+ x1_difference_in_width = abs ( centers[this_center].x1
-+ - centers[next_center].x1 );
-+ x2_difference_in_width = abs ( centers[this_center].x2
-+ - centers[next_center].x2 );
-+
-+
-+ /* property - stem center points that align */
-+ /* if the center is within range, the center is less than */
-+ /* 1/2 the height away, and at least one edge is also within range */
-+ if ( center_difference_in_width
-+ < center_difference_in_height * deviation1 &&
-+ center_difference_in_height
-+ <= (FT_Int)bitmap->rows / 2 &&
-+ /* prevents w from getting caught ---- but also kills m */
-+ ( x1_difference_in_width
-+ < center_difference_in_height * deviation2 ||
-+ x2_difference_in_width
-+ < center_difference_in_height * deviation2 ) )
-+ {
-+ stem_matches += 1;
-+ valid_center_average += centers[next_center].x;
-+
-+ /* try to find where the matching centers are far apart */
-+ if ( last_matching_center >= 0 &&
-+ abs( centers[last_matching_center].y
-+ - centers[next_center].y ) >= (FT_Int)bitmap->rows / 2 )
-+
-+ /* try to find where matching centers are next to each other */
-+ if ( last_matching_center >= 0 &&
-+ abs( centers[last_matching_center].y
-+ - centers[next_center].y ) == 1 )
-+ no_gap_found = TRUE;
-+
-+ last_matching_center = next_center;
-+ }
-+
-+ if ( strategy_also_use_edge_detection_for_stems )
-+ {
-+ /* property - stem left edge points that align */
-+ /* if the center is within range, */
-+ /* the center is less than 1/2 the height away */
-+ if ( x1_difference_in_width
-+ < center_difference_in_height * deviation1 &&
-+ center_difference_in_height <= (FT_Int)bitmap->rows / 2 )
-+ {
-+ stem_matches_ledge += 1;
-+ /* may not need for edges */
-+ /*valid_center_average += centers[next_center].x; */
-+
-+ if ( centers[next_center].x2 - centers[next_center].x1
-+ < smallest_width_ledge )
-+ smallest_width_ledge = centers[next_center].x2
-+ - centers[next_center].x1;
-+
-+ /* try to find where the matching centers are far apart */
-+ if ( last_matching_ledge >= 0 &&
-+ abs( centers[last_matching_ledge].y
-+ - centers[next_center].y)
-+ >= (FT_Int)bitmap->rows / 2 )
-+
-+ /* try to find where matching centers are next to each other */
-+ if ( last_matching_ledge >= 0 &&
-+ abs( centers[last_matching_ledge].y
-+ - centers[next_center].y ) == 1 )
-+ no_gap_found_ledge = TRUE;
-+ last_matching_ledge = next_center;
-+ }
-+ }
-+
-+ if ( strategy_also_use_edge_detection_for_stems )
-+ {
-+ /* property - stem right edge points that align */
-+ /* if the center is within range, the center is less than 1/2 */
-+ /* the height away */
-+ if ( x2_difference_in_width
-+ < center_difference_in_height * deviation1 &&
-+ center_difference_in_height
-+ <= (FT_Int)bitmap->rows / 2 )
-+ {
-+ stem_matches_redge += 1;
-+ /* may not need for edges */
-+ /*valid_center_average += centers[next_center].x; */
-+
-+ if ( centers[next_center].x2 - centers[next_center].x1
-+ < smallest_width_redge )
-+ smallest_width_redge = centers[next_center].x2
-+ - centers[next_center].x1;
-+
-+ /* try to find where the matching centers are far apart */
-+ if ( last_matching_redge >= 0 &&
-+ abs( centers[last_matching_redge].y
-+ - centers[next_center].y ) >= (FT_Int)bitmap->rows / 2 )
-+
-+ /* try to find where matching centers are next to each other */
-+ if ( last_matching_redge >= 0 &&
-+ abs( centers[last_matching_redge].y
-+ - centers[next_center].y ) == 1 )
-+ no_gap_found_redge = TRUE;
-+
-+ last_matching_redge = next_center;
-+ }
-+ }
-+
-+ next_center++;
-+ }
-+
-+ if ( stem_matches > 0 )
-+ valid_center_average /= stem_matches;
-+
-+ if ( ( stem_matches >= stem_match_requirement ||
-+ ( ( (FT_Int)bitmap->rows <= 6 || ppem < 11 ) &&
-+ stem_matches >= 2 &&
-+ abs ( valid_center_average
-+ - centers[center].x) < deviation1 /2 ) ||
-+ /* try to catch tightly aligned stuff where the matching centers */
-+ /* are next to each other only */
-+ ( stem_matches == 2 &&
-+ abs( valid_center_average
-+ - centers[center].x) <= deviation1 /2 &&
-+ no_gap_found &&
-+ ppem < 18 ) ) &&
-+ /* catches things like times 16 u but gets a lot of w's too */
-+ /* stem width is less than 1/3 of the bitmap width, */
-+ /* or bitmap_width is small */
-+ ( centers[center].x2 - centers[center].x1
-+ < (m_horiAdvance * 12) / 2 ||
-+ m_horiAdvance * 12 <= columns_per_pixel * one_pixel ) )
-+ {
-+ stem_detected = TRUE;
-+ set_width_to = centers[center].x2 - centers[center].x1;
-+ set_center_to = centers[center].x;
-+ }
-+
-+ /* see if edges found anything */
-+ if ( strategy_also_use_edge_detection_for_stems && !stem_detected )
-+ {
-+ /* Require no gap for edges */
-+ /* stem width less than 1/3 bitmap width, or bitmap_width is small */
-+ /* The stem occurs on the left side of glyph only */
-+ if ( ( stem_matches_ledge >= stem_match_requirement &&
-+ no_gap_found_ledge ) &&
-+ ( centers[center].x2 - centers[center].x1
-+ < ( m_horiAdvance * 12 ) / 2 ||
-+ m_horiAdvance * 12 <= columns_per_pixel * one_pixel ) &&
-+ centers[center].x < ( m_horiAdvance * 12 ) / 2 )
-+ {
-+ stem_detected = TRUE;
-+ set_width_to = smallest_width_ledge;
-+ set_center_to = centers[center].x1 + set_width_to / 2;
-+ stem_matches = stem_matches_ledge;
-+ }
-+ /* Require no gap for edges */
-+ /* stem width is less than 1/3 bitmap width, or bitmap_width is small */
-+ /* The stem occurs on the right side of glyph only */
-+ else if ( ( stem_matches_redge >= stem_match_requirement &&
-+ no_gap_found_redge ) &&
-+ ( centers[center].x2 - centers[center].x1
-+ < ( m_horiAdvance * 12 ) / 2 ||
-+ m_horiAdvance * 12 <= columns_per_pixel * one_pixel ) &&
-+ centers[center].x > (m_horiAdvance * 12) / 2 )
-+ {
-+ stem_detected = TRUE;
-+ set_width_to = smallest_width_redge;
-+ set_center_to = centers[center].x2 - set_width_to / 2;
-+ stem_matches = stem_matches_redge;
-+ }
-+ }
-+
-+
-+ /*store and/or replace highest occurrences with 3 or more centers */
-+ /* because this matched, it will become the top dog regardless */
-+ if ( stem_detected && (stem_matches > possible_stems[0].height) )
-+ {
-+ /* if this is the first stem just go ahead */
-+ if ( valid_possible_stems == 0 )
-+ {
-+ valid_possible_stems = 1;
-+ possible_stems[0].center = set_center_to;
-+ possible_stems[0].count = stem_matches;
-+ possible_stems[0].width = set_width_to;
-+ possible_stems[0].height = stem_matches;
-+ }
-+
-+ /* otherwise, if there is already a stem */
-+ else if ( valid_possible_stems == 1 )
-+ {
-+ /* if stem is within range of existing one, replace existing one */
-+
-+ /* if the stem isn't within the range of this one swap it with */
-+ /* next one first */
-+ if ( abs ( set_center_to - possible_stems[0].center )
-+ >= one_pixel * 2 )
-+ {
-+ swap_stem ( &possible_stems[0], &possible_stems[1] );
-+ valid_possible_stems = 2;
-+ }
-+ possible_stems[0].center = set_center_to;
-+ possible_stems[0].count = stem_matches;
-+ possible_stems[0].width = set_width_to;
-+ possible_stems[0].height = stem_matches;
-+ }
-+
-+ /* otherwise if there are already 2 stems */
-+ else if ( valid_possible_stems >= 2 )
-+ {
-+ /* if the stem is within the range of existing one, replace */
-+ /* existing one */
-+ if ( abs ( set_center_to - possible_stems[0].center )
-+ <= one_pixel * 2 )
-+ {
-+ possible_stems[0].center = set_center_to;
-+ possible_stems[0].count = stem_matches;
-+ possible_stems[0].width = set_width_to;
-+ possible_stems[0].height = stem_matches;
-+ }
-+ /* if the stem isn't within the range of this one */
-+ else
-+ {
-+ /* see if within range of next one and swap if so and proceed */
-+ /* overwriting it */
-+ if ( abs ( set_center_to - possible_stems[1].center )
-+ <= one_pixel * 2 )
-+ swap_stem ( &possible_stems[0], &possible_stems[1] );
-+
-+ /* otherwise see if in range of third one */
-+ else if ( abs ( set_center_to - possible_stems[2].center )
-+ <= one_pixel * 2 )
-+ swap_stem ( &possible_stems[0], &possible_stems[2] );
-+
-+ /* otherwise this is the new top dog, so demote everything */
-+ else
-+ {
-+ swap_stem ( &possible_stems[1], &possible_stems[2] );
-+ swap_stem ( &possible_stems[0], &possible_stems[1] );
-+ valid_possible_stems += 1;
-+ }
-+ possible_stems[0].center = set_center_to;
-+ possible_stems[0].count = stem_matches;
-+ possible_stems[0].width = set_width_to;
-+ possible_stems[0].height = stem_matches;
-+ }
-+ }
-+ }
-+
-+ else if ( stem_matches > possible_stems[1].height &&
-+ set_center_to != 0 )
-+ {
-+
-+ /* make sure it doesn't match the first stem */
-+ if ( abs ( set_center_to - possible_stems[0].center ) >= one_pixel * 2 )
-+ {
-+
-+ /* if this is the second stem */
-+ if ( valid_possible_stems == 1 )
-+ valid_possible_stems = 2;
-+
-+ /* otherwise if there is already a stem here */
-+ else if ( valid_possible_stems >= 2 )
-+ {
-+ /* if it doesn't match the second stem, proceed to swap out */
-+ /* with the third. if it does, replace it */
-+ if ( abs ( set_center_to - possible_stems[1].center )
-+ >= one_pixel * 2 )
-+ {
-+ swap_stem ( &possible_stems[1], &possible_stems[2] );
-+ valid_possible_stems +=1;
-+ }
-+ }
-+ possible_stems[1].center = set_center_to;
-+ possible_stems[1].count = stem_matches;
-+ possible_stems[1].width = set_width_to;
-+ possible_stems[1].height = stem_matches;
-+ }
-+ }
-+
-+ else if ( stem_matches > possible_stems[2].height &&
-+ set_center_to != 0 )
-+ {
-+ /* if it doesn't match the first or second one */
-+ if ( abs( set_center_to - possible_stems[0].center) >= one_pixel * 2 &&
-+ abs( set_center_to - possible_stems[1].center) >= one_pixel * 2 )
-+ {
-+ if ( valid_possible_stems == 2 )
-+ valid_possible_stems += 1;
-+
-+ possible_stems[2].center = set_center_to;
-+ possible_stems[2].count = stem_matches;
-+ possible_stems[2].width = set_width_to;
-+ possible_stems[1].height = stem_matches;
-+ }
-+ }
-+
-+ if ( valid_possible_stems > 3 )
-+ valid_possible_stems = 3;
-+
-+ center++;
-+ }
-+
-+ /* promote to stem */
-+ if ( valid_possible_stems > 0 )
-+ {
-+ stems[0].center = possible_stems[0].center;
-+ stems[0].count = possible_stems[0].count;
-+ stems[0].width = possible_stems[0].width;
-+ stems[0].height = possible_stems[0].height;
-+ stems[0].generated = FALSE;
-+ valid_stems++;
-+ }
-+
-+ if ( valid_stems == 1 &&
-+ valid_possible_stems > 1 )
-+ {
-+ stems[1].center = possible_stems[1].center;
-+ stems[1].count = possible_stems[1].count;
-+ stems[1].width = possible_stems[1].width;
-+ stems[1].height = possible_stems[1].height;
-+ stems[1].generated = FALSE;
-+ valid_stems++;
-+ }
-+
-+ if ( valid_stems == 2 &&
-+ valid_possible_stems > 2 &&
-+ possible_stems[2].center != 0 )
-+ {
-+ stems[2].center = possible_stems[2].center;
-+ stems[2].count = possible_stems[2].count;
-+ stems[2].width = possible_stems[2].width;
-+ stems[2].height = possible_stems[2].height;
-+ stems[2].generated = FALSE;
-+ valid_stems++;
-+ }
-+
-+ /* sort stems in x direction */
-+ if ( valid_stems == 3 )
-+ {
-+ if ( stems[0].center > stems[1].center )
-+ swap_stem ( &stems[0], &stems[1] );
-+
-+ if ( stems[0].center > stems[2].center )
-+ swap_stem ( &stems[1], &stems[2] );
-+
-+ if ( stems[1].center > stems[2].center )
-+ swap_stem ( &stems[1], &stems[2] );
-+
-+ if ( stems[0].center > stems[1].center )
-+ swap_stem ( &stems[0], &stems[1] );
-+
-+ /* only look at first and last stem for now */
-+ swap_stem ( &stems[1], &stems[2] );
-+ }
-+
-+ /* synthesize stems - Works, but needs work */
-+ if ( ( strategy_synthesize_stems ||
-+ known_stem_values->synth_stems ) &&
-+ valid_stems == 0 &&
-+ ppem > 10 )
-+ {
-+ /* if the leftmost segment's leftmost point is the same as the glyph's */
-+ /* leftmost point, and it is of reasonable width, and is not on the */
-+ /* top or bottom of the bitmap */
-+ if ( leftmost_segment_not_extrema->x1
-+ == leftmost_point_not_extrema &&
-+ abs ( leftmost_segment_not_extrema->x2
-+ - leftmost_segment_not_extrema->x1 )
-+ < ( rightmost_point_not_extrema
-+ - leftmost_point_not_extrema ) / 3 &&
-+ leftmost_segment_not_extrema->y < height &&
-+ leftmost_segment_not_extrema->y > 1 )
-+ {
-+ stems[valid_stems].center = ( leftmost_segment_not_extrema->x2
-+ + leftmost_segment_not_extrema->x1 ) / 2;
-+ stems[valid_stems].width = leftmost_segment_not_extrema->x2
-+ - leftmost_segment_not_extrema->x1;
-+ stems[valid_stems].generated = TRUE;
-+ valid_stems += 1;
-+ }
-+
-+
-+ if ( rightmost_segment_not_extrema->x2
-+ == rightmost_point_not_extrema &&
-+ abs ( rightmost_segment_not_extrema->x2
-+ - rightmost_segment_not_extrema->x1 )
-+ < ( rightmost_point_not_extrema
-+ - leftmost_point_not_extrema ) / 3 &&
-+ rightmost_segment_not_extrema->y < height &&
-+ rightmost_segment_not_extrema->y > 1 )
-+ {
-+ stems[valid_stems].center = ( rightmost_segment_not_extrema->x2
-+ + rightmost_segment_not_extrema->x1 ) / 2;
-+ stems[valid_stems].width = rightmost_segment_not_extrema->x2
-+ - rightmost_segment_not_extrema->x1;
-+ stems[valid_stems].generated = TRUE;
-+ valid_stems += 1;
-+ }
-+
-+ }
-+
-+ /* sort stems in x direction */
-+ if ( valid_stems > 1 && stems[0].center > stems[1].center )
-+ swap_stem ( &stems[0], &stems[1] );
-
-- return 0;
-- }
-+ if ( valid_stems == 0 && known_stem_values->stem_translating != 0 )
-+ {
-+ *translate_value += known_stem_values->stem_translating;
-
-+ if ( strategy_use_strengths )
-+ {
-+ /* consider 1/2 pixel the max when strength is at 100%,
-+ unless translate is already greater than that */
-+ FT_Int strength_cutoff = 32;
-
-- /* sets render-specific mode */
-- static FT_Error
-- ft_smooth_set_mode( FT_Renderer render,
-- FT_ULong mode_tag,
-- FT_Pointer data )
-- {
-- /* we simply pass it to the raster */
-- return render->clazz->raster_class->raster_set_mode( render->raster,
-- mode_tag,
-- data );
-- }
-
-- /* transform a given glyph image */
-- static FT_Error
-- ft_smooth_transform( FT_Renderer render,
-- FT_GlyphSlot slot,
-- const FT_Matrix* matrix,
-- const FT_Vector* delta )
-- {
-- FT_Error error = FT_Err_Ok;
-+ if ( abs ( *translate_value ) > strength_cutoff)
-+ strength_cutoff = *translate_value;
-
-+ max_strength = ( strength_cutoff * alignment_strength ) / 100;
-
-- if ( slot->format != render->glyph_format )
-+ if ( *translate_value < -max_strength )
-+ *translate_value = -max_strength;
-+ else if ( *translate_value > max_strength )
-+ *translate_value = max_strength;
-+ }
-+ }
-+ else
-+ /* Start snapping */
- {
-- error = FT_THROW( Invalid_Argument );
-+ FT_Int center_offset;
-+ FT_Int modulus;
-+ FT_Int delta, delta2;
-+ FT_Long stem_distance = 1, new_distance = 1;
-+ FT_Int distance_floor, distance_ceiling;
-+ FT_Int translate_value2 = 0;
-+ FT_Int main_stem = 0;
-+ FT_Int lbearing = m_horiBearingX * 12;
-+ FT_Int bitmap_stem_location = stems[0].center;
-+ FT_Int advance_stem_location = bitmap_stem_location
-+ + lbearing - one_pixel;
-+ FT_Int advance_width = m_horiAdvance * 12;
-+ FT_Int original_advance_width = 12 * ( slot->linearHoriAdvance >> 10 );
-+ FT_Int glyph_width = rightmost_point - leftmost_point;
-+ FT_Int stem_width = stems[0].width;
-+ FT_Int advance_leftmost_location = leftmost_point
-+ + lbearing - one_pixel;
-+ FT_Int advance_rightmost_location = rightmost_point
-+ + lbearing - one_pixel;
-+
-+#define proposed_transformed_point(point) \
-+ point * (float)(new_distance) / (float)(stem_distance) \
-+ + *translate_value * 12 - ( stems[main_stem].center * (float)(new_distance) \
-+ / (float)(stem_distance) - stems[main_stem].center)
-+
-+#define proposed_translated_point(point) point + *translate_value * 12
-+
-+ center_offset = one_pixel / 2; /* half pixel */
-+ modulus = one_pixel; /* whole pixel */
-+
-+ /* Determine center_offset via known values */
-+ if ( known_stem_values->stem_width >= 0 )
-+ {
-+ if ( known_stem_values->stem_width % 2 == 0 )
-+ center_offset = 0;
-+ else
-+ center_offset = one_pixel / 2;
-+ }
-+ /* otherwise do intelligent guessing, if set */
-+ else if ( strategy_auto_change_center_offset &&
-+ ppem >= STEM_WIDTH_2_PPEM &&
-+ stems[0].width < one_pixel * 1.45 )
-+ center_offset = one_pixel / 2;
-+ else if ( strategy_auto_change_center_offset &&
-+ ppem >= STEM_WIDTH_2_PPEM &&
-+ stems[0].width >= one_pixel * 1.45 &&
-+ stems[0].width < one_pixel * 2.6 )
-+ center_offset = 0;
-+ else if ( strategy_auto_change_center_offset &&
-+ ppem >= STEM_WIDTH_2_PPEM &&
-+ stems[0].width >= one_pixel * 2.6 &&
-+ stems[0].width < one_pixel * 3.6 )
-+ center_offset = one_pixel / 2;
-+ else if ( strategy_auto_change_center_offset &&
-+ ppem >= STEM_WIDTH_2_PPEM )
-+ center_offset =
-+ ( one_pixel
-+ * ( ( ( (int)( stems[0].width + one_pixel / 2 ) )
-+ / one_pixel ) % 2 ) ) / 2;
-+
-+ /* Snap to closest translate and scale values by default */
-+ if ( valid_stems >= 1 )
-+ {
-+ /* closest snapping point for stem 0 */
-+ delta = ( stems[0].center + center_offset ) % modulus;
-+
-+ if ( delta < modulus / 2 )
-+ /* snap left */
-+ *translate_value = -delta / ( columns_per_pixel * 4 );
-+ else
-+ /* snap right */
-+ *translate_value = ( modulus - delta ) / ( columns_per_pixel * 4 );
-+ }
-+
-+ if ( strategy_use_d_correction )
-+ {
-+ /* if the only stem is in the last 1/3 of glyph width, the advance */
-+ /* is 6 pixels, the ppem 11, and doing so doesn't violate bitmap , */
-+ /* boundaries force it to snap right */
-+ if ( valid_stems == 1 &&
-+ advance_stem_location > (advance_width * 2) / 3 &&
-+ advance_width == 6 * one_pixel &&
-+ rightmost_point + modulus - delta
-+ <= ( width - (columns_per_pixel * 2) / 3) * 256 &&
-+ ppem == 11 )
-+ *translate_value = ( modulus - delta ) / ( columns_per_pixel * 4 );
-+ }
-+
-+ if ( strategy_use_strengths )
-+ {
-+ /* consider 1/2 pixel the max when strength is at 100%,
-+ unless translate is already greater than that */
-+ FT_Int strength_cutoff = 32;
-+ if ( abs ( *translate_value ) > strength_cutoff )
-+ strength_cutoff = *translate_value;
-+
-+ max_strength = ( strength_cutoff * alignment_strength ) / 100;
-+
-+ if ( *translate_value < -max_strength )
-+ *translate_value = -max_strength;
-+ else if ( *translate_value > max_strength )
-+ *translate_value = max_strength;
-+ }
-+
-+ /* If 2 stems is detected, scale distance
-+ between in order to land on pixels */
-+ if ( valid_stems >= 2 )
-+ {
-+ stem_distance = abs ( stems[1].center - stems[0].center );
-+
-+ delta = stem_distance % modulus;
-+ new_distance = stem_distance - delta;
-+
-+ distance_floor = stem_distance - delta;
-+ distance_ceiling = stem_distance + ( modulus - delta );
-+
-+ if ( delta < modulus / 2 )
-+ new_distance = distance_floor;
-+ else
-+ new_distance = distance_ceiling;
-+
-+ if ( columns_per_pixel == 3 &&
-+ valid_stems == 3 &&
-+ strategy_use_m_control &&
-+ ( width - 2 * columns_per_pixel ) > 6 * columns_per_pixel &&
-+ ppem > 8 &&
-+ ( advance_stem_location - advance_leftmost_location )
-+ < stems[main_stem].width * 2 )
-+ {
-+ /* Possibly use 2 only when compatible widths is on? */
-+ FT_Int mod_factor = 2;
-+
-+ if ( verbose )
-+ printf ( "USING M CONTROL ");
-+
-+ distance_floor = stem_distance
-+ - stem_distance % ( modulus * mod_factor ) ;
-+ distance_ceiling = distance_floor + modulus * mod_factor;
-+
-+ new_distance = distance_ceiling;
-+
-+ /* force certain ideal situations */
-+ /* these 2 are mostly safe to do */
-+ if ( distance_ceiling
-+ + one_pixel * columns_per_pixel == advance_width &&
-+ stem_width < one_pixel * 1.25 )
-+ new_distance = distance_ceiling;
-+ /* NEED TO FIGURE OUT A WAY TO DETERMINE WHETHER
-+ THAT NUDGE IS UP OR DOWN */
-+ else if ( stem_distance + one_pixel * 2.6 >= advance_width &&
-+ stem_width < one_pixel * 1.25 )
-+ new_distance = distance_ceiling;
-+
-+ if ( proposed_transformed_point ( leftmost_point )
-+ < one_third_pixel * 2 ||
-+ proposed_transformed_point ( rightmost_point )
-+ > ( width -2 ) * one_third_pixel )
-+ new_distance = distance_floor;
-+
-+ /* NEED TO IGNORE SERIF Ms HERE */
-+ /* perhaps check bitmap boundaries instead??? */
-+ if ( strategy_bearing_correction && new_distance == distance_ceiling )
-+ {
-+ /* Correct if bearings are made substantially worse
-+ (more than 1/3 a pixel beyond advance) */
-+ if ( proposed_transformed_point( advance_rightmost_location )
-+ > advance_width + one_third_pixel &&
-+ proposed_transformed_point( advance_rightmost_location )
-+ > advance_rightmost_location &&
-+ -proposed_transformed_point( advance_leftmost_location )
-+ < advance_rightmost_location - advance_width )
-+ new_distance = distance_floor;
-+ }
-+
-+ if ( known_stem_values->m >= 0 )
-+ {
-+ if ( known_stem_values->m == 0 )
-+ new_distance = distance_floor;
-+ else
-+ new_distance = distance_ceiling;
-+ }
-+
-+ if ( ( rightmost_point - leftmost_point) -
-+ ( ( rightmost_point * *scale_value)
-+ - ( leftmost_point * *scale_value ) ) >= one_pixel * 1.5 )
-+ {
-+ *scale_value = 1.0;
-+ *translate_value = 0;
-+ goto Exit;
-+ }
-+
-+ }
-+ else if ( columns_per_pixel == 1 &&
-+ valid_stems == 3 &&
-+ strategy_use_m_control && valid_stems == 3 &&
-+ width >= 6 * columns_per_pixel &&
-+ ppem > 8 &&
-+ ( advance_stem_location - advance_leftmost_location )
-+ < stems[main_stem].width * 2 )
-+ {
-+ /* Possibly use 2 only when compatible widths is on? */
-+ FT_Int mod_factor = 2;
-+
-+ if ( verbose )
-+ printf ("USING M CONTROL ");
-+ distance_floor = stem_distance - stem_distance
-+ % ( modulus * mod_factor) ;
-+ distance_ceiling = distance_floor + modulus * mod_factor;
-+
-+ new_distance = distance_ceiling;
-+
-+ /* force certain ideal situations */
-+ /* these 2 are mostly safe to do */
-+ if ( distance_ceiling
-+ + one_pixel * columns_per_pixel == advance_width &&
-+ stem_width < one_pixel * 1.25 )
-+ new_distance = distance_ceiling;
-+ /* NEED TO FIGURE OUT A WAY TO DETERMINE WHETHER
-+ THAT NUDGE IS UP OR DOWN */
-+ else if ( stem_distance + one_pixel * 2.6 >= advance_width &&
-+ stem_width < one_pixel * 1.25 )
-+ new_distance = distance_ceiling;
-+
-+ if ( proposed_transformed_point( leftmost_point ) < 0 ||
-+ proposed_transformed_point( rightmost_point )
-+ > width * one_pixel - 2 * one_third_pixel )
-+ new_distance = distance_floor;
-+
-+ /* NEED TO IGNORE SERIF Ms HERE */
-+ /* perhaps check bitmap boundaries instead??? */
-+ if ( strategy_bearing_correction && new_distance == distance_ceiling )
-+ {
-+ /* Correct if bearings are made substantially worse
-+ (more than 1/3 a pixel beyond advance) */
-+ if ( proposed_transformed_point( advance_rightmost_location )
-+ > advance_width + one_third_pixel &&
-+ proposed_transformed_point( advance_rightmost_location )
-+ > advance_rightmost_location &&
-+ -proposed_transformed_point( advance_leftmost_location )
-+ < advance_rightmost_location - advance_width )
-+ new_distance = distance_floor;
-+ }
-+
-+ if ( known_stem_values->m >= 0 )
-+ {
-+ if ( known_stem_values->m == 0 )
-+ new_distance = distance_floor;
-+ else
-+ new_distance = distance_ceiling;
-+ }
-+
-+
-+ if ( ( rightmost_point - leftmost_point )
-+ - ( ( rightmost_point * *scale_value )
-+ - ( leftmost_point * *scale_value ) ) >= one_pixel * 1.5 )
-+ {
-+ *scale_value = 1.0;
-+ *translate_value = 0;
-+ goto Exit;
-+ }
-+
-+ }
-+ else
-+ {
-+ if ( strategy_fit_to_width )
-+ new_distance = advance_width - 3 * one_pixel;
-+ else if ( known_stem_values->stem_scaling >= 0 )
-+ {
-+ if ( known_stem_values->stem_scaling > 0 )
-+ new_distance = distance_ceiling;
-+ else
-+ new_distance = distance_floor;
-+
-+ /* enforce advance width boundaries */
-+ /* TOO RESTRICTIVE ON SERIF FONTS */
-+ if ( proposed_transformed_point( advance_rightmost_location )
-+ >= advance_width ||
-+ proposed_transformed_point( advance_leftmost_location )
-+ <= 0 )
-+ new_distance = distance_floor;
-+
-+ /* enforce literal bitmap boundaries if no translate room */
-+ if ( ( proposed_transformed_point(rightmost_point) >= width * 256
-+ || proposed_transformed_point(leftmost_point ) <= one_pixel )
-+ && new_distance + one_pixel * 3 > advance_width )
-+ new_distance = distance_floor;
-+
-+ }
-+ else if ( strategy_translate_using_closest_stem )
-+ {
-+ /* closest snapping point for stem 1 */
-+ delta2 = ( stems[1].center + center_offset ) % modulus;
-+
-+ if ( delta2 < modulus / 2 )
-+ /* snap left */
-+ translate_value2 = -delta2 / ( columns_per_pixel * 4 );
-+ else
-+ /* snap right */
-+ translate_value2 = ( modulus - delta2 )
-+ / ( columns_per_pixel * 4 );
-+
-+ if ( abs ( translate_value2 ) < abs ( *translate_value ) )
-+ {
-+ *translate_value = translate_value2;
-+ main_stem = 1;
-+ }
-+
-+ }
-+ else if ( strategy_scale_to_closest_centers )
-+ {
-+ /* closest snapping point for stem 0 */
-+ delta = ( stems[0].center + center_offset ) % modulus;
-+ delta2 = ( stems[1].center + center_offset ) % modulus;
-+
-+ if ( delta < modulus / 2 )
-+ /* stretch left */
-+ new_distance = delta + stem_distance;
-+ else
-+ /* stretch right */
-+ new_distance = delta - modulus + stem_distance;
-+
-+ if ( delta2 < modulus / 2 )
-+ new_distance -= delta2; /* stretch left */
-+ else
-+ new_distance += modulus - delta2; /* stretch right */
-+
-+ }
-+ else if ( strategy_scale_to_closest_centers_up_only )
-+ {
-+ FT_Int net_change = 0;
-+
-+ /* closest snapping point for stem 0 */
-+ delta = ( stems[0].center + center_offset ) % modulus;
-+ delta2 = ( stems[1].center + center_offset ) % modulus;
-+
-+ if ( delta < modulus / 2 )
-+ net_change = delta; /* stretch left */
-+ else
-+ net_change = -( modulus - delta ); /* stretch right */
-+
-+ if ( delta2 < modulus / 2 )
-+ net_change -= delta2; /* stretch left */
-+ else
-+ net_change += modulus - delta2; /* stretch right */
-+
-+ if ( net_change > 0 &&
-+ proposed_transformed_point( advance_rightmost_location )
-+ < advance_width &&
-+ proposed_transformed_point( advance_leftmost_location ) > 0 )
-+ new_distance = distance_ceiling;
-+ }
-+
-+ else if ( strategy_always_use_distance_ceiling )
-+ {
-+ if ( proposed_transformed_point( advance_rightmost_location )
-+ < advance_width &&
-+ proposed_transformed_point( advance_leftmost_location ) > 0 )
-+ new_distance = distance_ceiling;
-+ }
-+ }
-+
-+ if ( strategy_use_strengths )
-+ {
-+ FT_Int strength_cutoff = center_offset;
-+
-+
-+ delta2 = new_distance - stem_distance;
-+
-+ if ( abs ( delta2 ) > strength_cutoff )
-+ strength_cutoff = delta2;
-+
-+ max_strength = ( strength_cutoff * fitting_strength ) / 100;
-+
-+ if ( delta2 < -max_strength )
-+ new_distance = stem_distance - max_strength;
-+ else if ( delta2 > max_strength )
-+ new_distance = stem_distance + max_strength;
-+ }
-+
-+ *scale_value = (float)( new_distance ) / (float)( stem_distance );
-+ *translate_value = *translate_value
-+ - ( (float)( stems[main_stem].center * (float)new_distance )
-+ / (float)stem_distance - stems[main_stem].center ) / 12;
-+
-+ if ( valid_stems == 2 )
-+ *embolden_value = ( 64.0 / *scale_value - 64.0 );
-+
-+ if ( valid_stems == 3 )
-+ *embolden_value = ( 64.0 / *scale_value - 64.0 ) / 1.5;
-+ }
-+
-+ if ( verbose )
-+ printf ( "%lu stems:", valid_stems );
-+
-+ if ( valid_stems == 1 && verbose )
-+ printf ( "1 stem: bitmapwidth:%d glyphwidth:%f glyph_width:%f center:%f bearing:%f advance:%f lhadvance:%f stemwidth:%f %d %d",
-+ (width - 6) / columns_per_pixel,
-+ (float)m_width / 64.0,
-+ (float)glyph_width / (float)one_pixel,
-+ (float)( (float)advance_stem_location ) / (float)one_pixel,
-+ (float)m_horiBearingX / 64.0,
-+ (float)m_horiAdvance / 64.0,
-+ (float)linearHoriAdvance / 64.0,
-+ (float)stems[0].width / (float)one_pixel,
-+ advance_width, original_advance_width );
-+ else if ( valid_stems >= 2 && verbose )
-+ printf ( "%lu stems: bitmapwidth:%d center1:%f center2:%f difference:%f bearing:%f advance:%f advstemloc:%f ",
-+ valid_stems,
-+ (width - 6) / columns_per_pixel,
-+ ( (float)advance_stem_location ) / (float)one_pixel,
-+ ( (float)advance_stem_location
-+ + (float)abs ( stems[1].center
-+ - stems[0].center) ) / (float)one_pixel,
-+ ( (float)abs ( stems[1].center
-+ - stems[0].center ) ) / (float)one_pixel,
-+ (float)m_horiBearingX / 64.0,
-+ (float)m_horiAdvance / 64.0,
-+ (float)advance_stem_location / (float)one_pixel );
-+
-+ if ( strategy_bearing_correction )
-+ {
-+ /* Correct if negative bearings are made substantially worse */
-+ /* (more than 1/3 a pixel) */
-+ if ( proposed_transformed_point( advance_rightmost_location )
-+ > advance_width &&
-+ proposed_transformed_point( advance_rightmost_location )
-+ > advance_rightmost_location &&
-+ -proposed_transformed_point( advance_leftmost_location )
-+ < advance_rightmost_location - advance_width &&
-+ *translate_value
-+ > one_third_pixel / ( columns_per_pixel * 4 ) )
-+ {
-+ *translate_value -=64 ;
-+ if ( verbose )
-+ printf ( "TRANSLATING -64 " );
-+ }
-+ }
- goto Exit;
- }
-
-- if ( matrix )
-- FT_Outline_Transform( &slot->outline, matrix );
-+ Exit:
-
-- if ( delta )
-- FT_Outline_Translate( &slot->outline, delta->x, delta->y );
-+#define transformed_point( point ) point * *scale_value + *translate_value * 12
-
-- Exit:
-- return error;
-+ if ( strategy_correct_out_of_bounds_outlines )
-+ {
-+ /* Correct if outside bitmap */
-+ if ( transformed_point( rightmost_point )
-+ >= width * 256 - 2 * one_third_pixel &&
-+ transformed_point( leftmost_point )
-+ > one_pixel + 2 * one_third_pixel )
-+ *translate_value -=64 ;
-+ else if ( transformed_point( leftmost_point )
-+ <= one_pixel / 2 &&
-+ transformed_point( rightmost_point )
-+ <= width * 256 - ( one_pixel + one_pixel / 2 ) )
-+ *translate_value += 64;
-+ }
-+
-+ STVALUES
-+ free ( centers );
-+ free ( segments );
-+ free ( stem_centers );
-+ free ( stems );
-+ free ( leftmost_segment );
- }
-
-
-- /* return the glyph's control box */
-+ /* Gamma correction */
- static void
-- ft_smooth_get_cbox( FT_Renderer render,
-- FT_GlyphSlot slot,
-- FT_BBox* cbox )
-+ _ft_lcd_gamma_correction_correction ( FT_Bitmap* bitmap,
-+ FT_Render_Mode mode,
-+ FT_GlyphSlot slot,
-+ float gamma_correction_lt,
-+ float gamma_correction_value )
- {
-- FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
-+ if ( gamma_correction_value != 1.0 )
-+ {
-+ FT_UInt width = (FT_UInt)bitmap->width;
-+ FT_UInt height = (FT_UInt)bitmap->rows;
-+ FT_Byte* line = bitmap->buffer;
-+ float ppem = (float)slot->face->size->metrics.x_ppem;
-
-- if ( slot->format == render->glyph_format )
-- FT_Outline_Get_CBox( &slot->outline, cbox );
-+
-+ if ( !slot->face || !slot->face->size ) return;
-+
-+ if ( ppem >= 5 )
-+ for ( height = (FT_UInt)bitmap->rows;
-+ height > 0;
-+ height--, line += bitmap->pitch )
-+ {
-+ FT_UInt xx;
-+
-+
-+ for ( xx = 0; xx < width; xx += 1 )
-+ {
-+ /*normal*/
-+ /*line[xx] = pseudo_gamma ( line[xx], gamma_correction_value );*/
-+
-+ /* sloped */
-+ /*line[xx] = pseudo_gamma ( line[xx], gamma_correction_value - 5
-+ * (1-gamma_correction_value)/(gamma_correction_lt -5)
-+ + ((1-gamma_correction_value)/(gamma_correction_lt -5)) * ppem );*/
-+
-+ /* 1/3-sloped */
-+ line[xx] = pseudo_gamma ( line[xx], gamma_correction_value - 5
-+ * ( ( 1 - gamma_correction_value )
-+ / ( 3 * ( gamma_correction_lt -5 ) ) )
-+ + ( ( 1 - gamma_correction_value )
-+ / ( 3 * ( gamma_correction_lt -5) ) ) * ppem );
-+ }
-+ }
-+ }
- }
-
-+#endif
-
- /* convert a slot's glyph image into a bitmap */
- static FT_Error
-@@ -103,25 +2328,162 @@
- FT_Render_Mode required_mode )
- {
- FT_Error error;
-- FT_Outline* outline = &slot->outline;
-- FT_Bitmap* bitmap = &slot->bitmap;
-- FT_Memory memory = render->root.memory;
-+ FT_Outline* outline = NULL;
-+ FT_Outline* outline_orig = NULL;
- FT_BBox cbox;
-- FT_Pos x_shift = 0;
-- FT_Pos y_shift = 0;
-- FT_Pos x_left, y_top;
-- FT_Pos width, height, pitch;
-+ FT_Pos width, height, pitch, ppem;
- #ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
- FT_Pos height_org, width_org;
- #endif
-+ FT_Bitmap* bitmap = &slot->bitmap;
-+ FT_Memory memory = render->root.memory;
- FT_Int hmul = mode == FT_RENDER_MODE_LCD;
- FT_Int vmul = mode == FT_RENDER_MODE_LCD_V;
-+ FT_Pos x_shift = 0;
-+ FT_Pos y_shift = 0;
-+ FT_Pos x_left, y_top;
-
- FT_Raster_Params params;
-
-- FT_Bool have_outline_shifted = FALSE;
-- FT_Bool have_buffer = FALSE;
-+ FT_Bool have_translated_origin = FALSE;
-+ FT_Bool have_outline_shifted = FALSE;
-+ FT_Bool have_buffer = FALSE;
-+
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ FT_Matrix scaleMat;
-+ FT_Long translate_value = 0;
-+ float scale_value = 1.0;
-+ FT_Int align_called = 0;
-+
-+
-+ int chromeos_style_sharpening_strength = 0;
-+ int alignment_strength = 0;
-+ int fitting_strength = 0;
-+ int fringe_filter_strength = 0;
-+ int grayscale_filter_strength = 0;
-+
-+ int autohint_horizontal_stem_darken_strength = 0;
-+ int autohint_vertical_stem_darken_strength = 0;
-+
-+ int windows_style_sharpening_strength = 0;
-+ float gamma_correction_value = 1;
-+ float gamma_correction_lt = 0;
-+
-+ FT_Int brightness_value = 0.0;
-+ FT_Int contrast_value = 0.0;
-+
-+ FT_Int snapping_sliding_scale_value = 0;
-+
-+ FT_Int global_embolden_x_value = 0;
-+ FT_Int global_embolden_y_value = 0;
-+
-+ FT_Int bold_embolden_x_value = 0;
-+ FT_Int bold_embolden_y_value = 0;
-+
-+ FT_Byte chromeos_cutoff;
-+ double chromeos_gamma_value;
-+
-+ float embolden_value = 0.0;
-+ FT_Bool autohinted = FALSE;
-+ FT_Bool use_various_tweaks = FALSE;
-+ FT_Pos cur_width = infinality_cur_width;
-+
-+ const FT_Int MIN_PPEM = 1;
-+ /*const FT_Int MAX_PPEM = 100; */
-+
-+ FT_Bool use_known_settings_on_selected_fonts;
-+
-+ if ( slot->face &&
-+ slot->face->size &&
-+ slot->face->size->metrics.x_ppem )
-+ ppem = slot->face->size->metrics.x_ppem;
-+ else
-+ ppem = 0;
-+
-+ if ( cur_width )
-+ {
-+ autohinted = TRUE;
-+ }
-+ if( ftinf ){
-+ const float *f=ftinf->gamma_correction;
-+
-+ use_known_settings_on_selected_fonts=ftinf->use_known_settings_on_selected_fonts;
-+ use_various_tweaks=ftinf->use_various_tweaks;
-+ snapping_sliding_scale_value=ftinf->stem_snapping_sliding_scale;
-+
-+ alignment_strength=ftinf->stem_alignment_strength;
-+ if ( snapping_sliding_scale_value != 0 )
-+ alignment_strength = sliding_scale(10, snapping_sliding_scale_value, alignment_strength, 100, ppem);
-+
-+ fitting_strength=ftinf->stem_fitting_strength;
-+ if ( snapping_sliding_scale_value != 0 )
-+ fitting_strength = sliding_scale(10, snapping_sliding_scale_value, fitting_strength, 100, ppem);
-+
-+ chromeos_style_sharpening_strength=ftinf->chromeos_style_sharpening_strength;
-+
-+ if ( ppem > 10 )
-+ chromeos_style_sharpening_strength =
-+ ( chromeos_style_sharpening_strength * ppem ) / 10;
-+
-+ if ( chromeos_style_sharpening_strength > 100 )
-+ chromeos_style_sharpening_strength = 100;
-+
-+ brightness_value=ftinf->brightness;
-+ contrast_value=ftinf->contrast;
-
-+ windows_style_sharpening_strength=ftinf->windows_style_sharpening_strength;
-+
-+ /* Decrease effect slightly to have a more linear increase in sharpness */
-+ windows_style_sharpening_strength =
-+ ( ( windows_style_sharpening_strength
-+ * windows_style_sharpening_strength ) / 100
-+ + windows_style_sharpening_strength ) / 2;
-+
-+ gamma_correction_lt = f[0];
-+ gamma_correction_value = f[1] / 100.0f;
-+
-+ fringe_filter_strength=ftinf->fringe_filter_strength;
-+ grayscale_filter_strength=ftinf->grayscale_filter_strength;
-+
-+ autohint_horizontal_stem_darken_strength=ftinf->autohint_horizontal_stem_darken_strength;
-+ autohint_vertical_stem_darken_strength=ftinf->autohint_vertical_stem_darken_strength;
-+
-+ global_embolden_x_value=ftinf->global_embolden_x_value;
-+ global_embolden_y_value=ftinf->global_embolden_y_value;
-+
-+ bold_embolden_x_value=ftinf->bold_embolden_x_value;
-+ bold_embolden_y_value=ftinf->bold_embolden_y_value;
-+ } else {
-+ use_known_settings_on_selected_fonts=FALSE;
-+ }
-+
-+ /* set gamma value to 1 if out of range */
-+ if ( slot->face &&
-+ slot->face->size &&
-+ slot->face->size->metrics.x_ppem )
-+ {
-+ if ( slot->face->size->metrics.x_ppem >= gamma_correction_lt )
-+ gamma_correction_value = 1;
-+ }
-+ else
-+ gamma_correction_value = 1;
-+
-+ if( use_various_tweaks &&
-+ slot->face &&
-+ slot->face->style_name )
-+ {
-+ /* needs to also check for artifical italics */
-+ if ( strcasestr(slot->face->style_name, "Italic" ) ||
-+ strcasestr(slot->face->style_name, "Oblique" ) )
-+ {
-+ windows_style_sharpening_strength = 0;
-+ chromeos_style_sharpening_strength = 0;
-+ }
-+ }
-+
-+ /*if (fitting_strength == 100) scale_value = 1.1;*/
-+
-+#endif
-
- /* check glyph image format */
- if ( slot->format != render->glyph_format )
-@@ -137,26 +2499,119 @@
- goto Exit;
- }
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+RERENDER:
-+ if ( align_called == 1 )
-+ {
-+ scaleMat.xx = FT_FixedFromFloat(scale_value);
-+ scaleMat.xy = 0;
-+ scaleMat.yx = 0;
-+ scaleMat.yy = ( 1 << 16 );
-+
-+ FT_Outline_Copy(outline_orig, outline);
-+
-+ if ( scale_value != 1.0 )
-+ FT_Outline_Transform( outline, &scaleMat );
-+
-+ FT_Outline_Translate( outline, translate_value, 0 );
-+
-+ FT_Outline_EmboldenXY( outline, embolden_value, 0 );
-+ }
-+ else
-+ {
-+#endif
-+ outline = &slot->outline;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ /* Need to get this PRIOR to embolden, otherwise bad things happen */
-+ FT_Outline_Get_CBox( outline, &cbox );
-+
-+ /* Various hacks that need to be turned into a new rule set */
-+ /*if ( !autohinted
-+ && use_known_settings_on_selected_fonts
-+ && mode == FT_RENDER_MODE_LCD
-+ && slot->face->family_name
-+ && slot->face->style_name
-+ && ( strcasestr(slot->face->family_name, "Courier New" )
-+ && ( strcasestr(slot->face->style_name, "Regular" )
-+ || strcasestr(slot->face->style_name, "Italic" ) ) ) )
-+ FT_Outline_Embolden( outline, 24 );*/
-+
-+ if ( slot->face )
-+ {
-+ if ( !autohinted &&
-+ use_known_settings_on_selected_fonts &&
-+ mode == FT_RENDER_MODE_LCD &&
-+ slot->face->family_name &&
-+ slot->face->style_name &&
-+ strcasestr( slot->face->family_name, "Times New Roman" ) &&
-+ strcasestr( slot->face->style_name, "Italic" ) )
-+ FT_Outline_EmboldenXY( outline, 12, 0 );
-+
-+ if ( use_known_settings_on_selected_fonts &&
-+ autohinted &&
-+ mode == FT_RENDER_MODE_LCD &&
-+ slot->face->family_name &&
-+ slot->face->style_name &&
-+ strcasestr(slot->face->family_name, "FreeSerif" ) &&
-+ strcasestr(slot->face->style_name, "Italic" ) )
-+ FT_Outline_EmboldenXY( outline, 8, 0 );
-+
-+ if ( global_embolden_x_value != 0 || global_embolden_y_value != 0 )
-+ FT_Outline_EmboldenXY( outline,
-+ global_embolden_x_value,
-+ global_embolden_y_value );
-+
-+ if ( ( bold_embolden_x_value != 0 || bold_embolden_y_value != 0 ) &&
-+ ( slot->face->style_name &&
-+ ( strcasestr(slot->face->style_name, "Bold" ) ||
-+ strcasestr(slot->face->style_name, "Black" ) ||
-+ ( slot->face->style_flags &&
-+ slot->face->style_flags & FT_STYLE_FLAG_BOLD ) ) ) )
-+ FT_Outline_EmboldenXY( outline,
-+ bold_embolden_x_value,
-+ bold_embolden_y_value );
-+ }
-+
-+ FT_Outline_Copy( outline, outline_orig );
-+ }
-+
-+ /* translate the outline to the new origin if needed */
-+ if ( align_called == 0 )
-+ {
-+ FT_Pos enlarge_cbox = 0;
-+
-+ /* enlarge for grayscale rendering */
-+ if ( mode == FT_RENDER_MODE_NORMAL )
-+ enlarge_cbox = 64;
-+
-+ if ( origin )
-+ {
-+ FT_Outline_Translate( outline, origin->x, origin->y );
-+ have_translated_origin = TRUE;
-+ }
-+
-+ /* compute the control box, and grid fit it */
-+ /*FT_Outline_Get_CBox( outline, &cbox );*/
-+
-+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin - enlarge_cbox );
-+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
-+ cbox.xMax = FT_PIX_CEIL( cbox.xMax + enlarge_cbox );
-+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
-+#else
- if ( origin )
- {
-- x_shift = origin->x;
-- y_shift = origin->y;
-+ FT_Outline_Translate( outline, origin->x, origin->y );
-+ have_translated_origin = TRUE;
- }
-
- /* compute the control box, and grid fit it */
-- /* taking into account the origin shift */
- FT_Outline_Get_CBox( outline, &cbox );
-
-- cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift );
-- cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift );
-- cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift );
-- cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift );
--
-- x_shift -= cbox.xMin;
-- y_shift -= cbox.yMin;
--
-- x_left = cbox.xMin >> 6;
-- y_top = cbox.yMax >> 6;
-+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
-+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
-+ cbox.xMax = FT_PIX_CEIL( cbox.xMax );
-+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
-+#endif
-
- width = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6;
- height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6;
-@@ -166,16 +2621,29 @@
- height_org = height;
- #endif
-
-+ /* release old bitmap buffer */
-+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
-+ {
-+ FT_FREE( bitmap->buffer );
-+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-+ }
-+
-+ /* allocate new one */
- pitch = width;
- if ( hmul )
- {
-- width *= 3;
-- pitch = FT_PAD_CEIL( width, 4 );
-+ width = width * 3;
-+ pitch = FT_PAD_CEIL( width, 4 );
- }
-
- if ( vmul )
- height *= 3;
-
-+ x_shift = cbox.xMin;
-+ y_shift = cbox.yMin;
-+ x_left = cbox.xMin >> 6;
-+ y_top = cbox.yMax >> 6;
-+
- #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
- if ( slot->library->lcd_filter_func )
-@@ -185,33 +2653,25 @@
-
- if ( hmul )
- {
-- x_shift += 64 * ( extra >> 1 );
-- x_left -= extra >> 1;
-+ x_shift -= 64 * ( extra >> 1 );
- width += 3 * extra;
- pitch = FT_PAD_CEIL( width, 4 );
-+ x_left -= extra >> 1;
- }
-
- if ( vmul )
- {
-- y_shift += 64 * ( extra >> 1 );
-- y_top += extra >> 1;
-+ y_shift -= 64 * ( extra >> 1 );
- height += 3 * extra;
-+ y_top += extra >> 1;
- }
- }
--
- #endif
--
-- /*
-- * XXX: on 16bit system, we return an error for huge bitmap
-- * to prevent an overflow.
-- */
-- if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ||
-- x_left < FT_INT_MIN || y_top < FT_INT_MIN )
-- {
-- error = FT_THROW( Invalid_Pixel_Size );
-- goto Exit;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
- }
-
-+#endif
-+
- /* Required check is (pitch * height < FT_ULONG_MAX), */
- /* but we care realistic cases only. Always pitch <= width. */
- if ( width > 0x7FFF || height > 0x7FFF )
-@@ -222,6 +2682,22 @@
- goto Exit;
- }
-
-+ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
-+ bitmap->num_grays = 256;
-+ bitmap->width = (unsigned int)width;
-+ bitmap->rows = (unsigned int)height;
-+ bitmap->pitch = pitch;
-+
-+ /* translate outline to render it into the bitmap */
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( align_called == 0 )
-+ {
-+#endif
-+ FT_Outline_Translate( outline, -x_shift, -y_shift );
-+ have_outline_shifted = TRUE;
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ }
-+#endif
- /* release old bitmap buffer */
- if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
- {
-@@ -229,7 +2705,6 @@
- slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
- }
-
-- /* allocate new one */
- if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) )
- goto Exit;
- else
-@@ -237,23 +2712,6 @@
-
- slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
-
-- slot->format = FT_GLYPH_FORMAT_BITMAP;
-- slot->bitmap_left = (FT_Int)x_left;
-- slot->bitmap_top = (FT_Int)y_top;
--
-- bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
-- bitmap->num_grays = 256;
-- bitmap->width = (unsigned int)width;
-- bitmap->rows = (unsigned int)height;
-- bitmap->pitch = pitch;
--
-- /* translate outline to render it into the bitmap */
-- if ( x_shift || y_shift )
-- {
-- FT_Outline_Translate( outline, x_shift, y_shift );
-- have_outline_shifted = TRUE;
-- }
--
- /* set up parameters */
- params.target = bitmap;
- params.source = outline;
-@@ -299,9 +2757,153 @@
- if ( error )
- goto Exit;
-
-+#ifdef FT_CONFIG_OPTION_INFINALITY_PATCHSET
-+ if ( ppem <= MAX_PPEM && ppem >= MIN_PPEM )
-+ {
-+ if ( align_called == 0 && cur_width / ppem < 10 &&
-+ ( alignment_strength > 0 || fitting_strength > 0 ) )
-+ _lcd_stem_align ( bitmap,
-+ mode,
-+ slot,
-+ &translate_value,
-+ &scale_value,
-+ alignment_strength,
-+ fitting_strength,
-+ &embolden_value );
-+
-+ if ( align_called == 0 &&
-+ ( translate_value != 0 || scale_value != 1.0 ) )
-+ {
-+ align_called = 1;
-+ goto RERENDER;
-+ }
-+
-+ if ( mode == FT_RENDER_MODE_LCD )
-+ {
-+
-+ if ( fringe_filter_strength > 0 /*&& autohinted*/ )
-+ _ft_lcd_fringe_filter( bitmap,
-+ mode,
-+ fringe_filter_strength,
-+ slot->library );
-+
-+ /*if ( autohinted)
-+ _ft_lcd_stem_end_filter( bitmap, mode, 100, slot->library );*/
-+
-+ if ( gamma_correction_lt > 0 && gamma_correction_value != 1.0 )
-+ _ft_lcd_gamma_correction_correction( bitmap,
-+ mode,
-+ slot,
-+ gamma_correction_lt,
-+ gamma_correction_value );
-+
-+ chromeos_cutoff = (FT_Byte)( 0.5 * 255.0 )
-+ * ( chromeos_style_sharpening_strength / 100.0 );
-+ chromeos_gamma_value = 1;
-+
-+ if ( chromeos_style_sharpening_strength > 0 )
-+ _ft_lcd_chromeos_sharpen( bitmap,
-+ mode,
-+ chromeos_cutoff,
-+ chromeos_gamma_value );
-+
-+ if ( ppem > 8 )
-+ if ( windows_style_sharpening_strength > 0 )
-+ _ft_lcd_windows_sharpen( bitmap,
-+ mode,
-+ windows_style_sharpening_strength,
-+ slot->library );
-+
-+ if ( autohinted &&
-+ ( cur_width * 100 ) / 64
-+ > autohint_horizontal_stem_darken_strength &&
-+ autohint_horizontal_stem_darken_strength != 0 )
-+ autohint_horizontal_stem_darken_strength = ( cur_width * 100 ) / 64;
-+
-+ if ( autohint_horizontal_stem_darken_strength > 100)
-+ autohint_horizontal_stem_darken_strength = 100;
-+
-+ /* only do on autohinted fonts */
-+ /* Necessary to do on some non-thin fonts, which is why it is outside */
-+ /* of the below conditional */
-+ if ( autohint_horizontal_stem_darken_strength > 0 && autohinted )
-+ _ft_lcd_darken_x ( bitmap,
-+ mode,
-+ autohint_horizontal_stem_darken_strength,
-+ slot->library );
-+
-+ /* Enhance thin fonts */
-+ if ( autohinted )
-+ {
-+ /* if forcibly set use that, otherwise make a good estimate */
-+ float contrast, brightness;
-+ ftinf_get_bc( slot->face->family_name, ppem, &brightness, &contrast);
-+ if ( slot->face && !_ft_bitmap_bc ( bitmap, brightness, contrast ) )
-+ {
-+ FT_Bool is_fixed_name = FALSE;
-+
-+ if ( slot->face->family_name &&
-+ strcasestr(slot->face->family_name, "Mono" ) )
-+ is_fixed_name = TRUE;
-+
-+ /* Darken vertical stems */
-+ _ft_lcd_darken_y ( bitmap,
-+ mode,
-+ autohint_vertical_stem_darken_strength,
-+ slot->library );
-+
-+ /* Adjust brightness / contrast automatically based on stem width */
-+ if ( cur_width != 0 && cur_width < 30 )
-+ cur_width = 30;
-+
-+ if ( cur_width >= 30 && cur_width <= 60 )
-+ {
-+ float ppem_factor = sliding_scale ( 5, 11, 0.0, 1.0, ppem );
-+ float brightness_factor = sliding_scale ( 30, 52, -.3, 0.0,
-+ cur_width );
-+ float contrast_factor = sliding_scale ( 30, 52, .45, 0.0,
-+ cur_width );
-+ _ft_bitmap_bc ( bitmap,
-+ ppem_factor * brightness_factor,
-+ ppem_factor * contrast_factor );
-+
-+ /* Only cap variable width thin-stemmed fonts */
-+ if ( !FT_IS_FIXED_WIDTH( slot->face ) && !is_fixed_name )
-+ _ft_bitmap_cap ( bitmap,
-+ ( cur_width * 150 ) / 64,
-+ slot->library );
-+ }
-+ }
-+ }
-+
-+
-+ if ( slot->library->lcd_filter_func )
-+ slot->library->lcd_filter_func( bitmap, mode, slot->library );
-+
-+ if ( grayscale_filter_strength > 0 )
-+ _ft_lcd_grayscale_filter( bitmap,
-+ mode,
-+ grayscale_filter_strength,
-+ slot->library );
-+
-+ }
-+
-+ /* Global values */
-+ if ( brightness_value != 0 || contrast_value != 0 )
-+ _ft_bitmap_bc ( bitmap,
-+ (float)brightness_value / 300.0,
-+ (float)contrast_value / 300.0);
-+
-+ FT_Outline_Done( slot->library, outline_orig );
-+ }
-+ else if ( mode == FT_RENDER_MODE_LCD &&
-+ slot->library->lcd_filter_func )
-+ slot->library->lcd_filter_func( bitmap, mode, slot->library );
-+#else
- if ( slot->library->lcd_filter_func )
- slot->library->lcd_filter_func( bitmap, mode, slot->library );
-
-+#endif /* FT_CONFIG_OPTION_INFINALITY_PATCHSET */
- #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
- /* render outline into bitmap */
-@@ -359,6 +2961,20 @@
-
- #endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
-+ /*
-+ * XXX: on 16bit system, we return an error for huge bitmap
-+ * to prevent an overflow.
-+ */
-+ if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
-+ {
-+ error = FT_THROW( Invalid_Pixel_Size );
-+ goto Exit;
-+ }
-+
-+ slot->format = FT_GLYPH_FORMAT_BITMAP;
-+ slot->bitmap_left = (FT_Int)x_left;
-+ slot->bitmap_top = (FT_Int)y_top;
-+
- /* everything is fine; don't deallocate buffer */
- have_buffer = FALSE;
-
-@@ -366,7 +2982,9 @@
-
- Exit:
- if ( have_outline_shifted )
-- FT_Outline_Translate( outline, -x_shift, -y_shift );
-+ FT_Outline_Translate( outline, x_shift, y_shift );
-+ if ( have_translated_origin )
-+ FT_Outline_Translate( outline, -origin->x, -origin->y );
- if ( have_buffer )
- {
- FT_FREE( bitmap->buffer );
-diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c
-index 1c1d7de..bd37b44 100644
---- a/src/truetype/ttinterp.c
-+++ b/src/truetype/ttinterp.c
-@@ -5792,6 +5792,7 @@
-
- if ( exc->ignore_x_mode &&
- exc->GS.freeVector.x != 0 &&
-+ exc->GS.freeVector.y == 0 &&
- !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
- control_value_cutin = 0;
- }
-diff --git a/src/base/ftinf_rh.c b/src/base/ftinf_rh.c
-index 4cd6f1a..606b567 100644
---- a/src/base/ftinf_rh.c
-+++ b/src/base/ftinf_rh.c
-@@ -1,5 +1,5 @@
- /* ANSI-C code produced by gperf version 3.1 */
--/* Command-line: gperf ftinf_rh.gperf */
-+/* Command-line: gperf --output-file=ftinf_rh.c ftinf_rh.gperf */
- /* Computed positions: -k'1,$' */
-
- #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-@@ -612,13 +612,11 @@ ftinf_rules( const char *name ){
- char buf[max_wlen+1];
- int len=strlen( name );
- if( len <= max_wlen ){
-- const sa_rules_t *p;
- int i;
- for( i=0; i<len; ++i )
- buf[i]=tolower( name[i] );
- buf[len]='\0';
-- p=_rules_get( buf, len );
-- if( p ) return p;
-+ return _rules_get( buf, len );
- }
- }
- return NULL;
-diff --git a/src/base/ftinf_rh.gperf b/src/base/ftinf_rh.gperf
-index e25f9b6..9fd8aab 100644
---- a/src/base/ftinf_rh.gperf
-+++ b/src/base/ftinf_rh.gperf
-@@ -269,13 +269,11 @@ ftinf_rules( const char *name ){
- char buf[max_wlen+1];
- int len=strlen( name );
- if( len <= max_wlen ){
-- const sa_rules_t *p;
- int i;
- for( i=0; i<len; ++i )
- buf[i]=tolower( name[i] );
- buf[len]='\0';
-- p=_rules_get( buf, len );
-- if( p ) return p;
-+ return _rules_get( buf, len );
- }
- }
- return NULL;
-diff --git a/src/base/ftinf_sh.c b/src/base/ftinf_sh.c
-index 7fc2222..87d2ff8 100644
---- a/src/base/ftinf_sh.c
-+++ b/src/base/ftinf_sh.c
-@@ -1,5 +1,5 @@
- /* ANSI-C code produced by gperf version 3.1 */
--/* Command-line: gperf ftinf_sh.gperf */
-+/* Command-line: gperf --output-file=ftinf_sh.c ftinf_sh.gperf */
- /* Computed positions: -k'1,$' */
-
- #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
-@@ -449,13 +449,11 @@ ftinf_settings( const char *name ){
- char buf[max_wlen+1];
- int len=strlen( name );
- if( len <= max_wlen ){
-- const ftinf_t *p;
- int i;
- for( i=0; i<len; ++i )
- buf[i]=tolower( name[i] );
- buf[len]='\0';
-- p=_settings_get( buf, len );
-- if( p ) return p;
-+ return _settings_get( buf, len );
- }
- }
- return NULL;
-diff --git a/src/base/ftinf_sh.gperf b/src/base/ftinf_sh.gperf
-index ba5fc0a..5f6e0ae 100644
---- a/src/base/ftinf_sh.gperf
-+++ b/src/base/ftinf_sh.gperf
-@@ -250,13 +250,11 @@ ftinf_settings( const char *name ){
- char buf[max_wlen+1];
- int len=strlen( name );
- if( len <= max_wlen ){
-- const ftinf_t *p;
- int i;
- for( i=0; i<len; ++i )
- buf[i]=tolower( name[i] );
- buf[len]='\0';
-- p=_settings_get( buf, len );
-- if( p ) return p;
-+ return _settings_get( buf, len );
- }
- }
- return NULL;
diff --git a/CHANGELOG b/CHANGELOG
index 198f1f14a20..5e1aedf0a11 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,10 +6,23 @@ CHANGELOG
---------
+2016-03-30
+~~~~~~~~~~
+
+* Fixed #133 & #138 (freetype crashing with `poppler-qt`).
+
+2016-03-28
+~~~~~~~~~~
+
+* Upstream `freetype2` version upgrade 2.6.3.
+* `freetype2` code was updated with recent upstream commits up to rev.2016.03.26.
+* Updated Infinality patch set.
+* `stem-darkening.patch` was merged with the Infinality patch set.
+
2015-12-05
~~~~~~~~~~
-* `freetype2` code was updated with recent upstream commit up to rev.2015.12.05.
+* `freetype2` code was updated with recent upstream commits up to rev.2015.12.05.
* Fixed bug #124 ("WebKit browsers (Chromium, Opera) won't use freetype2 run-time settings with the new Infinality patch").
* Infinality patch set cleanup and update.
diff --git a/PKGBUILD b/PKGBUILD
index 5da792ee2ed..77c3b43a993 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,11 +1,13 @@
-# Maintainer: Jan de Groot <jgc@archlinux.org>
-# Maintainer: JIN Xiao-Yong <jinxiaoyong@gmail.com>
-# Maintainer: bohoomil <@zoho.com>
+# Maintainer : Dobroslaw Kijowski [dobo] <dobo90_at_gmail.com>
+# Contributor: Jan de Groot <jgc@archlinux.org>
+# Contributor: JIN Xiao-Yong <jinxiaoyong@gmail.com>
+# Contributor: bohoomil <@zoho.com>
pkgname=freetype2-infinality
-pkgver=2.6.2
+pkgver=2.6.3
pkgrel=1
-_patchrel=2015.12.05
+_patchrel=2016.03.26
+_commit=36b60ecefe1fd0e042cad51105b0ffb29315e577
pkgdesc="TrueType font rendering library with Infinality patches and custom settings."
arch=('armv7h' 'i686' 'x86_64')
changelog=CHANGELOG
@@ -17,19 +19,19 @@ conflicts=('freetype2' 'freetype2-infinality')
provides=("freetype2=$pkgver" 'freetype2-infinality' 'freetype2-infinality-ultimate')
install='infinality.install'
source=(http://downloads.sourceforge.net/sourceforge/freetype/freetype-${pkgver}.tar.bz2
- "01-freetype-${pkgver}-enable-valid.patch"
- "02-upstream-${_patchrel}.patch"
- "03-infinality-${pkgver}-${_patchrel}.patch"
- xft-settings.sh
- infinality-settings.sh
- infinality-settings-generic)
+ "01-freetype-2.6.3-enable-valid.patch::https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/01-freetype-2.6.2-enable-valid.patch"
+ "https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/02-upstream-2016.03.26.patch"
+ "https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/03-infinality-2.6.3-2016.03.26.patch"
+ "https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/xft-settings.sh"
+ "https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/infinality-settings.sh"
+ "infinality-settings-generic::https://raw.githubusercontent.com/bohoomil/fontconfig-ultimate/${_commit}/freetype/generic_settings/infinality-settings.sh")
-sha1sums=('29c22b85b77cb22cf95c13e7062e21f39fe6b17a'
+sha1sums=('6c98bd5d0be313207c37ca23d25faf983486aee5'
'abf7a8f726ad6359533651a8942636880febf9f6'
- '319c377ef4e3f6bc2f52acb893c9b880ef9578b4'
- 'a19a000e778a0b29b0ef0623d566b12187b7f24a'
+ 'dc527dc3b45bb5f17533e7e049d16c475007a945'
+ 'fa848046558c4ac59ef77775ab4a1a9d7200417f'
'a1859f2eacae2046a9ef705ac2bcc4bdf4fd9717'
- '5624c40049a73f8c75d01537212b4c7040f1761f'
+ '44ca94634f894011db9ed7edbb105b50ca591e52'
'4d219670cb9641b649f6ba0f2a799006f7c3c3c5')
prepare() {
diff --git a/infinality-settings-generic b/infinality-settings-generic
deleted file mode 100644
index a560c15e38d..00000000000
--- a/infinality-settings-generic
+++ /dev/null
@@ -1,1137 +0,0 @@
-##################################################################
-### INFINALITY ENVIRONMENT VARIABLES FOR EXTRA RUN-TIME OPTIONS ##
-##################################################################
-#
-# These environment variables require that their respective patches
-# from http://www.infinality.net have been applied to the Freetype
-# installation you are using. They will do abolutely
-# nothing otherwise!
-#
-#
-# This file should be copied to /etc/profile.d/ for system-wide
-# effects and/or included in ~/.bashrc or ~/.bash_profile for per-user
-# effects:
-#
-# . ~/path/to/this/file/infinality-settings.sh
-#
-# Of course, the per-user settings will override the system-wide
-# settings. Default values indicated below will be used when the
-# environment variables below are not defined.
-#
-# When I say "Default:" below, I'm referring to the default if no
-# environment variables are set. Generally this ends up being
-# whatever Freetype's default is set to.
-#
-
-
-##################################################################
-# EXAMPLES
-#
-# Please see 3/4 down in this file for examples of different settings.
-#
-
-
-
-
-
-
-#################################################################
-################## EXPLANATION OF SETTINGS ######################
-#################################################################
-
-
-
-##################################################################
-# SET_XFT_SETTINGS
-#
-# Should the below Xft settings be set globally by this script? (true/false)
-
-SET_XFT_SETTINGS=true
-
-# XFT settings are like a red-headed stepchild that should be beaten
-# severely.
-# These only affect legacy programs, and *parts* of some modern programs
-# like google-chrome. We only deal with these settings because we have to,
-# otherwise crap will slip by. I recommend using hintslight and autohint
-# as the defaults normally in /etc/fonts/. The reason hintfull and
-# autohint:0 is needed here because otherwise some programs will
-# occassionally request slight hinting for a truetype font. When a program
-# does this, Freetype automatically uses the autohinter, when you may
-# actually want it to be rendered with the TT hinter, (if specified in
-# /etc/fonts/). So setting this to hintfull guarantees that the TT font
-# will be rendered with the TT hinter (assuming it is specified in
-# /etc/fonts/ to be rendered that way.) For TT fonts that you want
-# rendered with autohint, specifiying that in the /etc/fonts/ should be
-# enough. But you might think that by setting this to hintfull
-# that it's going to use Freetype's full autohinting (which we *completely*
-# avoid) for fonts you want autohinted. This is where
-# INFINALITY_FT_AUTOFIT_FORCE_SLIGHT_HINTING comes in. It tells freetype
-# to use slight hinting on fonts set for autohinting, even if the program
-# requests full autohinting. Freetype's full hinting only looks OK under
-# certain circumstances. The goal of infinality is to make infinality
-# hinting look good all the time.
-
-XFT_SETTINGS="
-Xft.antialias: 1
-Xft.autohint: 0
-Xft.dpi: 96
-Xft.hinting: 1
-Xft.hintstyle: hintfull
-Xft.lcdfilter: lcddefault
-Xft.rgba: rgb
-"
-
-if [ "$SET_XFT_SETTINGS" = "true" ]; then
- echo "$XFT_SETTINGS" | xrdb -merge > /dev/null 2>&1
-fi
-
-
-
-##################################################################
-# INFINALITY_FT_FILTER_PARAMS
-#
-# This is a modified version of the patch here:
-# http://levelsofdetail.kendeeter.com/2008/12/dynamic_fir_filter_patch.html
-#
-# Allows you to adjust the FIR filter at runtime instead of at
-# compile time. The idea is to have values add up to 100, and be
-# symmetrical around the middle value. If the values add up to
-# more than 100, the glyphs will appear darker. If less than 100,
-# lighter. I recommend using this method to make glyphs darker
-# or lighter globally as opposed to using the gamma option (see note in
-# the gamma option).
-#
-# Here are some samples of various filter parameters:
-#
-# (this has been changed to use integers between 0 and 100 to
-# avoid problems with regional differences like comma for decimal point)
-#
-#
-# Strong Extra Smooth "15 20 30 20 15" (extra smooth, natural weight)
-# Extra Smooth "20 20 30 20 20" (extra smooth, extra weight)
-# Smooth "15 20 32 20 15" (smooth, natural weight)
-# Stronger Gibson "11 22 38 22 11" (smooth, extra weight)
-# Gibson "11 22 33 22 11" (smooth, natural weight)
-# Freetype Light "00 33 34 33 00" (sharp, natural weight) # freetype's "light" LCD filter
-# Freetype Default "06 25 44 25 06" (sharp, extra weight) # freetype's default
-# Extra Sharp "00 35 35 35 00" (extra sharp, extra weight) # freetype's "light" LCD filter on acid
-#
-#
-# Windows uses something more sharp, maybe along the lines of Freetype's
-# default
-#
-# Default if no ENV_VARS present: [Freetype's default]
-# Recommended: "11 22 38 22 11" (too dark / smooth for some)
-#
-# Example 1: export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-#
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-
-
-
-##################################################################
-# INFINALITY_FT_STEM_ALIGNMENT_STRENGTH
-#
-# This performs analysis on each glyph and determines an amount
-# to shift the glyph, left or right, so that it aligns better to
-# pixel boundaries.
-#
-# This results in subtley cleaner looking stems, at the expense of
-# proper distances between glyphs. This is only active for sizes
-# 10 px or greater and does not apply to bold or italic fonts.
-#
-# There are also exceptions on a small number of fonts that I've
-# not been able to render nicely with alignment enabled. In those
-# cases, a forced translation is applied instead.
-#
-# Possible values:
-# 0 through 100 - think of as percentage of strength
-#
-# 0 corresponds to no shifting whatsoever. In other words, OFF.
-#
-# 100 corresponds to a full move to a snap zone defined by
-# the snapping algorithm, be it left or right. This
-# is the full amount any glyph could be moved in order to make it
-# align to the pixel.
-#
-# Values inbetween act as caps. If the algorithm determines that it
-# wants to move the glyph .33 of a pixel to the left, but the value
-# is set to 50 (i.e. 50%), then the maximum move that would be allowed
-# is 50% of half a pixel, in other words .25. So instead of .33 the
-# glyph is moved .25 of a pixel.
-#
-# For a subtle effect that doesn't dramatically affect the glyph, use
-# 25 for this and 25 for INFINALITY_FT_STEM_FITTING_STRENGTH
-#
-# Default if no ENV_VARS present: 0
-# Recommended if you want to use it: 100
-
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=25
-
-
-
-##################################################################
-# INFINALITY_FT_STEM_FITTING_STRENGTH
-#
-# This performs analysis on each glyph and determines an amount
-# to horizontally scale the glyph, so that stems align better to
-# pixel boundaries. An emboldening (or anti-emboldening) is
-# performed afterward to account for stem width exaggeration.
-#
-# This results in subtley cleaner looking fonts, at the expense of
-# proper distances between glyphs and slightly misshapen glyphs.
-# This is only active for sizes 10 px or greater and does not
-# apply to bold or italic fonts.
-#
-# There are also exceptions on a small number of fonts that I've
-# not been able to render nicely with fitting enabled. In those
-# cases, a forced translation is applied instead.
-#
-#
-# Possible values:
-# 0 through 100 - think of as percentage of strength
-#
-# 0 corresponds to no stretching whatsoever. In other words, OFF.
-#
-# 100 corresponds to a full pixel stretch, be outward or inward. This
-# is the full amount any glyph could be stretched in order to make it
-# align to a pixel boundary. Which direction is chosen is part
-# of the art of what I'm trying to do in the code. ;)
-#
-#
-# Values inbetween act as caps. If the algorithm determines that it
-# wants to stretch the glyph .75 of a pixel outward, but the value
-# is set to 50 (i.e. 50%), then the maximum move that would be allowed
-# is 50% of a pixel, in other words .50. So instead of .75 the
-# glyph is stretched .50 of a pixel.
-#
-# For a subtle effect that doesn't dramatically affect the glyph, use
-# 25 for this and 25 for INFINALITY_FT_STEM_FITTING_STRENGTH
-#
-# Default if no ENV_VARS present: 0
-# Recommended if you want to use it: 100
-
-export INFINALITY_FT_STEM_FITTING_STRENGTH=25
-
-
-
-##################################################################
-# INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE
-#
-# This allows you to set a ppem at which alignment and fitting
-# will reach 100%. As glyphs become larger, more dramatic
-# snapping will not affect the glyph shape as much, so it makes
-# sense to allow this.
-#
-# For fonts that are 10 ppem, the values set above for
-# INFINALITY_FT_STEM_ALIGNMENT_STRENGTH and
-# INFINALITY_FT_STEM_FITTING_STRENGTH will be used. As the ppem
-# gradually becomes larger, so will the strength settings, and
-# they will reach 100% at the ppem you specify here.
-#
-# This is a simple linear scale.
-#
-# Possible values:
-# 0 means to not use this feature
-#
-# 11 and up will set the 100% level to that ppem value
-#
-# Anything else is officially undefined, but I still bound it internally.
-#
-# Default if no ENV_VARS present: 0
-
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=40
-
-
-
-##################################################################
-# INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS
-#
-# This applies largely to certain MS fonts, but some others as well.
-# it will apply known good settings on a font-by-font basis, regardless
-# of the other settings above or below.
-#
-# - Use known values for selected fonts & ppems that are known to look
-# ok with 100:
-#
-# INFINALITY_FT_STEM_ALIGNMENT_STRENGTH
-# INFINALITY_FT_STEM_FITTING_STRENGTH
-#
-# - Use various internal tweaks like compatible widths and other
-# font-specific hacks.
-# - Use gamma, brightness or contrast adjustments automatically
-# on certain fonts. Global settings will still apply afterwards.
-# - Enable various forced settings on selective fonts during
-# rasterization and stem_alignment.
-#
-# If set to TRUE, this will use 100 regardless of the values you have
-# specified above. It will not affect fonts that are not in this
-# small list.
-#
-# Possible values:
-# FALSE means to not use this feature
-#
-# TRUE will enable this feature
-#
-# Default if no ENV_VARS present: FALSE
-# Recommended: TRUE
-#
-
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-
-
-##################################################################
-# INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH
-#
-# This enables an algorithm found in ChromeOS for sharpening the
-# appearance of glyphs. It is based off this patch:
-#
-# http://codereview.chromium.org/3298011/diff/9001/media-libs/freetype/files/freetype-2.3.11-lcd-sharpen.patches
-#
-# It gives glyphs a more "grainy" look through some gamma
-# correction. It does tend to thin out vertical stems, which
-# may be a feature or a bug depending on your taste ;)
-#
-#
-# Possible values:
-# 0 through 100 - think of as percentage of strength
-#
-# 0 corresponds to no sharpening whatsoever. In other words, OFF.
-#
-# 25 is good for a subtle effect.
-#
-# 50 corresponds to the default ChromeOS value.
-#
-# 100 corresponds to maximum sharpening. This usually results in
-# something undesirable looking.
-#
-#
-# As you increase this amount, it is good to decrease the gamma (2nd value)
-# of INFINALITY_FT_PSEUDO_GAMMA, and possibly increase
-# INFINALITY_FT_STEM_FITTING_STRENGTH and
-# INFINALITY_FT_STEM_ALIGNMENT_STRENGTH, as it seems like the algorithm
-# lightens stems that aren't fully on-pixel.
-#
-# Default if no ENV_VARS present: 0
-# Recommended: If you're going to use this filter - 50
-
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-
-
-
-##################################################################
-# INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH
-#
-# This enables an algorithm developed with the intention to sharpen
-# fonts to look similarly to Windows.
-#
-# It gives glyphs a more "grainy" look, like the ChromeOS filter
-# except it does so more selectively. This prevents the thinning
-# of vertical stems that is noticible when a blanket gamma filter
-# like the ChromeOS filter is applied.
-#
-# I also get a "cleaner" impression from the fonts with this Windows
-# style filter. This filter was done by 100% experimentation,
-# and there things that could probably be improved.
-#
-# Some may argue that I shouldn't be trying to take the shortcomings
-# of the MS approach and bring them here. I disagree, as part
-# of freedom is having the right to make your fonts look as
-# shitty as you'd like.
-#
-# Using this filter does somewhat lessen the need to use stem
-# fitting and stem alignment, as glyphs appear sharper.
-#
-# This setting can be used at the same time as the previous chromeOS
-# sharpening, and happens after it in the code.
-#
-#
-# Possible values:
-# 0 through 100 - think of as percentage of strength
-#
-# 0 corresponds to no sharpening whatsoever. In other words, OFF.
-#
-# 10-25 is good for a subtle effect while not completely decimating glyphs.
-#
-# 50-75 corresponds to probably something in the range that Windows uses.
-#
-# 100 corresponds to maximum sharpening.
-#
-#
-# Using a high value for this variable along with enabling the
-# fringe filter (below) almost eliminates the need
-# for INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT to be set to 100,
-# and can instead be set at 0. (Setting
-# INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT to 0 prevents missing
-# stems in the middle of s. The drawback is that many fonts just look
-# way too sharp and grainy at this setting. Your call.)
-#
-# Default if no ENV_VARS present: 0
-# Recommended if you want to use this filter: 65
-
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=10
-
-
-
-##################################################################
-# INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT
-#
-# When using autohinting, horizontal stems you'd find in E, f, T, -,
-# etc. are normally not snapped to full integer pixel heights, meaning
-# that you will get a semi-dark fringe on these stems, above or
-# below the black line of pixels:
-#
-# ##########
-# ##
-# ##-------
-# #########
-# ##
-# ##--------
-# ##########
-#
-# (- represents the semi-dark pixels)
-#
-# Setting this to 100 will force integer pixel heights. Setting it to
-# zero will do what Freetype does by default. Anything inbetween will
-# act as a weighted average of the two.
-#
-# This is disabled when the standard width is found (via voodoo) to be
-# less than 1 pixel, in order to prevent the vanishing stem issues on
-# letters with diagonal stems like a and s.
-#
-# Under most circumstances, this should be set at 100. If you choose to
-# not set it to 100, you may want to set INFINALITY_FT_FRINGE_FILTER_STRENGTH
-# to a non-zero value in order to reduce fringing.
-#
-#
-# Possible values:
-# 0 - default Freetype value
-# 100 - a full pixel
-#
-#
-# Default if no ENV_VARS present: 0
-# Recommended: 100
-
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-
-
-
-##################################################################
-# INFINALITY_FT_USE_VARIOUS_TWEAKS
-#
-# - Force autohint when no TT instructions present.
-# - Artificially embolden horizontally only.
-# - When artificially emboldening, maintain the glyph width.
-# - Embolden light and thin-stemmed glyphs automatically.
-# - Don't sharpen italics.
-#
-# Some fonts look bad when stem aligned at certain ppems, no matter
-# what. I've put exceptions in to deal with these, included in
-# these tweaks. Georgia and Lucida Grande are examples.
-#
-#
-# Possible values:
-# true - enable tweaks
-# false - do not enable tweaks (do Freetype default)
-#
-#
-# Default if no ENV_VARS present: false
-# Recommended: true
-
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-
-
-
-##################################################################
-# INFINALITY_FT_GAMMA_CORRECTION
-#
-# This does a weighted gamma correction at the LCD filter phase
-# PRIOR to the LCD filter. Unfortunately it does not however
-# take into account the color on which the glyph is being rendered
-# (or for that matter the color of the glyph),
-# which would need to happen in X rendering. It is actually
-# using the gamma function in calculations though.
-#
-# The first value indicates a px value, the second indicates a
-# "gamma" value. All sizes less than the px value will be corrected
-# on a weighted scale based on the second value.
-#
-# The gamma value is commonly between 0.0 and 3.0. Due to localization
-# issues, the gamma value should be specified as it's actual value
-# multiplied by 100. So a gamma of 1.3 would be 130. In practice,
-# I'd stay between 40 and 250.
-#
-#
-# Values 1 through 100 will darken the glyph
-# Values greater than 100 will lighten the glyph
-#
-#
-# Example 1: Darken glyphs that are less than 10 px. With some fonts
-# even 5 or 6px is readable!
-# export INFINALITY_FT_GAMMA_CORRECTION="10 60"
-#
-# Example 2: Lighten all glyphs (below 100px)
-# export INFINALITY_FT_GAMMA_CORRECTION="100 150"
-#
-# Example 3: Do nothing
-# export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-#
-# Default: [No gamma correction]
-
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-
-
-
-##################################################################
-# INFINALITY_FT_BRIGHTNESS
-#
-# This filter adjusts brightness, using the standard algorithm
-# for brightness. It is applied AFTER the LCD filtering.
-#
-# For a Windows XP look, set brightness to something and contrast to 50
-# This will also tend to increase its sharpness.
-# These values are relative and don't really mean anything
-# however they are satisfactory for a range of appearances.
-# Another tip is to use a gamma setting of "1000 110" or something
-# over 100 to lighten things before processing.
-#
-# Default if no ENV_VARS present: 0
-# Dark XP Experience: -25
-# Light XP Experience: 40
-#
-# Example: export INFINALITY_FT_BRIGHTNESS="-20"
-
-export INFINALITY_FT_BRIGHTNESS="0"
-
-
-
-##################################################################
-# INFINALITY_FT_CONTRAST
-#
-# This filter adjusts contrast, using the standard algorithm
-# for contrast. It is applied AFTER the LCD filtering.
-#
-# For a Windows XP look, set brightness to -25 and contrast to 50
-# This will also tend to increase its sharpness.
-# These values are relative and don't really mean anything
-# however they are satisfactory for a range of appearances.
-# Another tip is to use a gamma setting of "1000 110" or something
-# over 100 to lighten things before processing.
-#
-# Default if no ENV_VARS present: 0
-# Dark or Light XP Experience: 50
-#
-# Example: export INFINALITY_FT_CONTRAST="50"
-
-export INFINALITY_FT_CONTRAST="0"
-
-
-
-##################################################################
-# INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH
-#
-# This filter adjusts subpixel-rendered glyphs toward grayscale.
-# Sometimes this is useful in getting a rendering more like
-# OSX.
-#
-# Range: Integers 0 through 100
-# 0 represents no filtering
-# 50 represents halfway between subpixel and grayscale
-# 100 represents completely grayscale
-#
-# Default if no ENV_VARS present: 0
-# Recommended, if you want to use it: 30
-#
-# Example: export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH="33"
-
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH="0"
-
-
-
-##################################################################
-# INFINALITY_FT_FRINGE_FILTER_STRENGTH
-#
-# This filter tries to remove the horizontal fringing that is found on
-# default autohinted glyphs (similar to OSX-rendered glyphs).
-# For example, an E may be rendered so that the middle horizontal
-# stem is 100% black, but also has a horizonal row of pixels above
-# it that is at 50% intensity. This makes the glyph look dirty,
-# however it is technically accurate.
-#
-# This would be useful in cases where you have
-# INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT set to something less than 100
-# but also can affect glyphs at 100, to some degree.
-#
-# Unless fonts are showing fringes in a way that annoys you, I recommend
-# keeping it disabled, as it can slightly interfere with smooth appearance
-# sometimes.
-#
-#
-# Range: Integers 0 through 100
-# 0 represents no filtering
-# 50 represents a 50% reduction of detected fringes
-# 100 represents completely removing detected fringes
-#
-#
-# Default if no ENV_VARS present: 0
-# Recommended, if you want to use it: 100
-#
-# Example: export INFINALITY_FT_FRINGE_FILTER_STRENGTH="100"
-
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH="0"
-
-
-
-##################################################################
-# INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH
-#
-# This post-filter darkens horizontal stems that autohint renders as semi-dark.
-# Freetype will by default not force stems to render to pixel boundaries
-# because it results in "vanishing stems". This happens on things like
-# s S a and other glyphs with center diagonal stems.
-#
-# If you have INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT set to 100,
-# you're telling it to force pixel boundaries, which can result in the
-# vanishing stems. To get around this problem, I internally override the
-# INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT setting if the stem width
-# is less than a full pixel, regardless. This causes semi-dark stems, but
-# at least there are stems there.
-#
-# This filter is intended to darken those semi-dark stems. I highly
-# recommend using this, but setting to a low value like 10, because
-# it is particularly sensitive right now, and can make thin fonts
-# look weird otherwise.
-#
-#
-# Range: Integers 0 through 100
-# 0 represents no darkening
-# 50 represents a 50% increase toward 1 pixel in height
-# 100 represents a full pixel of height
-#
-#
-# Default if no ENV_VARS present: 0
-# Recommended, if you want to use it: 10
-#
-# Example: export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH="10"
-
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH="10"
-
-
-
-##################################################################
-# INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH
-#
-# This post-filter darkens vertical stems less than 1 pixel that autohint
-# renders as semi-dark. This applies mostly to thin fonts like
-# Courier New, Raleway, and fonts with the word "Light" in the title or
-# style. Although what autohint is doing is technically correct, it
-# results in a bad looking rendering because it's too light, at small
-# ppems. This filter tries to correct that.
-#
-# There is an aspect of this that is automatic, so it's safer to use
-# larger values for this than the above horizontal ENV_VAR. However
-# setting this higher has more impact on thinner fonts. So, I still
-# recommend lower values.
-#
-#
-# Range: Integers 0 through 100
-# 0 represents no darkening
-# 50 represents a 50% increase (from current strength) toward 1 pixel
-# 100 represents a full pixel of width
-#
-#
-# Default if no ENV_VARS present: 0
-# Recommended, if you want to use it: 25
-#
-# Example: export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH="25"
-
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH="25"
-
-
-
-##################################################################
-# INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS
-#
-# This will slightly stretch some glyphs vertically between 9px
-# and 14px (inclusive). Some people may find this more
-# aesthetically pleasing. This only applies to fonts that are
-# using autohint. I used to recommend this to be set true, but
-# it does mess with some (less popular) glyphs in a nasty way.
-#
-# The goal here is to increase the height of some fonts by 1 px
-# but leave the x-height where it is. Arial is a good example
-# of this working properly. Compare the heights of Arial, Times
-# and Freesans with this on, vs. TT hinted versions of Arial and
-# Times.
-#
-#
-# Possible values:
-# true - enable height adjustment
-# false - do not enable height adjustment
-#
-#
-# Default: false
-
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-
-
-# Experimental emboldening values for OSX mode
-export INFINALITY_FT_GLOBAL_EMBOLDEN_X_VALUE=0
-export INFINALITY_FT_GLOBAL_EMBOLDEN_Y_VALUE=0
-export INFINALITY_FT_BOLD_EMBOLDEN_X_VALUE=0 # This one seems to crash at anything other than 0
-export INFINALITY_FT_BOLD_EMBOLDEN_Y_VALUE=0
-
-#################################################################
-########################### EXAMPLES ############################
-#################################################################
-#
-# Set the USE_STYLE variable below to try each example.
-# Make sure to set your style in /etc/fonts/infinality.conf too.
-#
-# Possible options:
-#
-# DEFAULT - Use above settings. A compromise that should please most people.
-# OSX - Simulate OSX rendering
-# IPAD - Simulate iPad rendering
-# UBUNTU - Simulate Ubuntu rendering
-# LINUX - Generic "Linux" style - no snapping or certain other tweaks
-# WINDOWS - Simulate Windows rendering
-# WINDOWS7 - Simulate Windows rendering with normal glyphs
-# WINDOWS7LIGHT - Simulate Windows 7 rendering with lighter glyphs
-# WINDOWS - Simulate Windows rendering
-# VANILLA - Just subpixel hinting
-# CUSTOM - Your own choice. See below
-# ----- Infinality styles -----
-# CLASSIC - Infinality rendering circa 2010. No snapping.
-# NUDGE - CLASSIC with lightly stem snapping and tweaks
-# PUSH - CLASSIC with medium stem snapping and tweaks
-# SHOVE - Full stem snapping and tweaks without sharpening
-# SHARPENED - Full stem snapping, tweaks, and Windows-style sharpening
-# INFINALITY - Settings I use
-# DISABLED - Act as though running without the extra infinality enhancements (just subpixel hinting).
-
-USE_STYLE="DEFAULT"
-
-
-
-### WARNING - NEEDS WORK - ALSO LIABLE TO CRASH APPLICATIONS ###
-################# OSX STYLE #################
-if [ "$USE_STYLE" = "OSX" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="03 32 38 32 03"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=25
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="1000 80"
-export INFINALITY_FT_BRIGHTNESS="10"
-export INFINALITY_FT_CONTRAST="20"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=false
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=0
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-export INFINALITY_FT_GLOBAL_EMBOLDEN_X_VALUE=0
-export INFINALITY_FT_GLOBAL_EMBOLDEN_Y_VALUE=8
-export INFINALITY_FT_BOLD_EMBOLDEN_X_VALUE=0
-export INFINALITY_FT_BOLD_EMBOLDEN_Y_VALUE=0
-
-fi
-
-
-
-################# IPAD STYLE #################
-if [ "$USE_STYLE" = "IPAD" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="00 00 100 00 00"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=100
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="1000 80"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=false
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=0
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-export INFINALITY_FT_GLOBAL_EMBOLDEN_X_VALUE=0
-export INFINALITY_FT_GLOBAL_EMBOLDEN_Y_VALUE=0
-export INFINALITY_FT_BOLD_EMBOLDEN_X_VALUE=0
-export INFINALITY_FT_BOLD_EMBOLDEN_Y_VALUE=0
-
-fi
-
-
-
-################# UBUNTU STYLE #################
-if [ "$USE_STYLE" = "UBUNTU" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="1000 80"
-export INFINALITY_FT_BRIGHTNESS="-10"
-export INFINALITY_FT_CONTRAST="15"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=0
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-
-################# LINUX STYLE #################
-if [ "$USE_STYLE" = "LINUX" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="06 25 44 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-################# WINDOWS XP STYLE LIGHT #################
-if [ "$USE_STYLE" = "WINDOWSXPLIGHT" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="06 25 44 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=100
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=65
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=15
-export INFINALITY_FT_STEM_FITTING_STRENGTH=15
-export INFINALITY_FT_GAMMA_CORRECTION="1000 120"
-export INFINALITY_FT_BRIGHTNESS="20"
-export INFINALITY_FT_CONTRAST="30"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=30
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# WINDOWS 7 STYLE LIGHT #################
-if [ "$USE_STYLE" = "WINDOWS7LIGHT" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="20 25 38 25 05"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=100
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=100
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="1000 160"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="20"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=30
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# WINDOWS XP STYLE #################
-if [ "$USE_STYLE" = "WINDOWSXP" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="06 25 44 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=100
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=65
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=15
-export INFINALITY_FT_STEM_FITTING_STRENGTH=15
-export INFINALITY_FT_GAMMA_CORRECTION="1000 120"
-export INFINALITY_FT_BRIGHTNESS="10"
-export INFINALITY_FT_CONTRAST="20"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=30
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# WINDOWS 7 STYLE #################
-if [ "$USE_STYLE" = "WINDOWS7" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="20 25 42 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=100
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=65
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="1000 120"
-export INFINALITY_FT_BRIGHTNESS="10"
-export INFINALITY_FT_CONTRAST="20"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-############### VANILLA STYLE ##############
-if [ "$USE_STYLE" = "VANILLA" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="06 25 38 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=false
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=0
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-############### CLASSIC INFINALITY STYLE ##############
-if [ "$USE_STYLE" = "CLASSIC" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="06 25 38 25 06"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=0
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
-export INFINALITY_FT_STEM_FITTING_STRENGTH=0
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-################# NUDGE STYLE #################
-if [ "$USE_STYLE" = "NUDGE" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=25
-export INFINALITY_FT_STEM_FITTING_STRENGTH=15
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=30
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-################# PUSH STYLE #################
-if [ "$USE_STYLE" = "PUSH" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=75
-export INFINALITY_FT_STEM_FITTING_STRENGTH=50
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=30
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# INFINALITY STYLE #################
-if [ "$USE_STYLE" = "INFINALITY" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=5
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=25
-export INFINALITY_FT_STEM_FITTING_STRENGTH=25
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=40
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# SHOVE STYLE #################
-if [ "$USE_STYLE" = "SHOVE" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=100
-export INFINALITY_FT_STEM_FITTING_STRENGTH=100
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# SHARPENED INFINALITY STYLE #################
-if [ "$USE_STYLE" = "SHARPENED" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=65
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=25
-export INFINALITY_FT_STEM_FITTING_STRENGTH=25
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=40
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
-
-################# DISABLED STYLE #################
-if [ "$USE_STYLE" = "DISABLED" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS=
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=
-export INFINALITY_FT_STEM_FITTING_STRENGTH=
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=false
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=false
-
-fi
-
-
-################# CUSTOM STYLE #################
-if [ "$USE_STYLE" = "CUSTOM" ]; then
-
-export INFINALITY_FT_FILTER_PARAMS="11 22 38 22 11"
-export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH=0
-export INFINALITY_FT_FRINGE_FILTER_STRENGTH=0
-export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=10
-export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH=25
-export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH=0
-export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=100
-export INFINALITY_FT_STEM_FITTING_STRENGTH=100
-export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-export INFINALITY_FT_BRIGHTNESS="0"
-export INFINALITY_FT_CONTRAST="0"
-export INFINALITY_FT_USE_VARIOUS_TWEAKS=true
-export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=true
-export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=100
-export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
-export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS=true
-
-fi
-
diff --git a/infinality-settings.sh b/infinality-settings.sh
deleted file mode 100755
index 3651817fe2c..00000000000
--- a/infinality-settings.sh
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-
-### freetype2-infinality-ultimate settings ###
-### rev. 0.4.9.0, for freetype2 v.2.6.2 ###
-### ###
-### Copyright (c) 2015 bohoomil ###
-### The MIT License (MIT) http://opensource.org/licenses/MIT ###
-### part of infinality-bundle http://bohoomil.com ###
-
-
-### As of version 2.6.2-1, freetype2-infinality-ultimate comes with
-### the "ultimate3" rendering style enabled internally by default.
-### It is still possible to use the optional "infinality-settings.sh"
-### script to switch between additional built-in rendering schemes and
-### create custom ones if necessary. Once modified, "infinality-settings.sh"
-### needs to be copied to "/etc/X11/xinit/xinitrc.d/".
-###
-### There are three basic levels of customization available to a user:
-###
-### 1. A set of 7 preconfigured styles selectable by name.
-
-### Available styles:
-### ultimate1 <> extra sharp
-### ultimate2 <> sharper & lighter ultimate
-### ultimate3 <> ultimate: well balanced (default)
-### ultimate4 <> darker & smoother
-### ultimate5 <> darkest & heaviest ("MacIsh")
-### osx <> Apple OS X
-### windowsxp <> MS Windows XP
-### custom <> user defined
-
-### If you want to use a style from the list, uncomment the variable below
-### and set its name as the value.
-
-
-#INFINALITY_FT="ultimate3"
-
-
-### 2. Additionally, the chosen style can be adjusted by setting custom
-### filter parameters. If you want to use this functionality, uncomment
-### the variable below and enter custom values.
-
-
-#export INFINALITY_FT_FILTER_PARAMS="08 24 36 24 08"
-
-
-### 3. Setting the rendering style to "custom" lets you create custom styles
-### from scratch. Uncomment the variables below and enter the values
-### of your choice.
-
-
-#export INFINALITY_FT_FILTER_PARAMS="08 24 36 24 08"
-#export INFINALITY_FT_GRAYSCALE_FILTER_STRENGTH="0"
-#export INFINALITY_FT_FRINGE_FILTER_STRENGTH="25"
-#export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH="0"
-#export INFINALITY_FT_AUTOHINT_VERTICAL_STEM_DARKEN_STRENGTH="25"
-#export INFINALITY_FT_WINDOWS_STYLE_SHARPENING_STRENGTH="25"
-#export INFINALITY_FT_CHROMEOS_STYLE_SHARPENING_STRENGTH="0"
-#export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH="15"
-#export INFINALITY_FT_STEM_FITTING_STRENGTH="15"
-#export INFINALITY_FT_GAMMA_CORRECTION="0 100"
-#export INFINALITY_FT_BRIGHTNESS="0"
-#export INFINALITY_FT_CONTRAST="0"
-#export INFINALITY_FT_USE_VARIOUS_TWEAKS="true"
-#export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS="false"
-#export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT="0"
-#export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE="0"
-#export INFINALITY_FT_USE_KNOWN_SETTINGS_ON_SELECTED_FONTS="false"
-
-
-### Please refer to "infinality-settings-generic" file for detailed explanation
-### of customization options and provided examples.
-
-# vim:ft=sh:
diff --git a/xft-settings.sh b/xft-settings.sh
deleted file mode 100755
index 3caf1a7ab35..00000000000
--- a/xft-settings.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-XFT_SETTINGS="
-Xft.antialias: 1
-Xft.autohint: 0
-Xft.dpi: 96
-Xft.hinting: 1
-Xft.hintstyle: hintfull
-Xft.lcdfilter: lcddefault
-Xft.rgba: rgb
-"
-
-echo "$XFT_SETTINGS" | xrdb -merge > /dev/null 2>&1
-
-# vim:ft=sh: