diff options
Diffstat (limited to 'testing/freetype-infinality/freetype-entire-infinality-patchset-20101114-1.patch')
-rw-r--r-- | testing/freetype-infinality/freetype-entire-infinality-patchset-20101114-1.patch | 1602 |
1 files changed, 0 insertions, 1602 deletions
diff --git a/testing/freetype-infinality/freetype-entire-infinality-patchset-20101114-1.patch b/testing/freetype-infinality/freetype-entire-infinality-patchset-20101114-1.patch deleted file mode 100644 index aae5fadde..000000000 --- a/testing/freetype-infinality/freetype-entire-infinality-patchset-20101114-1.patch +++ /dev/null @@ -1,1602 +0,0 @@ -freetype-entire-infinality-patchset (excludes the TT subpixel patches) -------------------------------------------------------------------- - -This patch contains all the patches I used to distribute separately. -It made more sense to lump these all together into a single file -now that there are runtime options. It's also easier for me to maintain. ;) - -I recommend that if you are using this patch that you use - - /etc/fonts/local.conf - -that I provide at: http://www.infinality.net/files/local.conf -You will also need: http://www.infinality.net/files/infinality-settings - -The second one will need to be included in your profile with something like: - - . ~/path/to/the/file/infinality-settings - -It should be adjusted to your personal tastes as an end-user. - - -DISCLAIMERS: - -This patch will almost certainly result in a performance hit when -freetype is rendering the glyphs. The good news is that fontconfig -caches the glyphs so it's only the first time they are displayed that there -could be a performance issue. - -I expect that if you compile freetype with this patch along with my -TT subpixel hinting patch, you will have a complete build that works the -way I expect it to. However, I have not tested all compile configurations -for errors. I intend to at some point. This patch may make your system crash, -have memory leaks, not compile, or render fonts in a way that you don't like. -Either way, when you use this patch, you should recognize that it -is ALPHA / BETA quality. That said, I intend to run these patches on my -personal system, so they had better be pretty stable! - - -Changelog - -2010-11-14 - - All patches can now be enabled at runtime with ENVIRONMENT_VARIABLES. - See the file infinality-settings (and below) for how to enable these. - Effects that used to work now **REQUIRE** these in order to be turned on - at runtime. This lets end users have full control over what they want - without requiring different compiles. - - - Added option to auto-embolden thin/light fonts. - - - Further refinement of the stem calculations for enhanced autohint. - - - Adjustable FIR filter at runtime. - - - Stem alignment ability to align glyph bitmaps to pixel boundaries. - - - Adjustable gamma correction prior to the FIR filter for LCD rendering. - This can be used to make small ppem text more readable, or for whatever - else you want to use it for. - - - A height tweak on the enhanced autohint that makes Arial, Segoe, Times - and others render more similarly to Windows. - - - Separated out the option to maintain the original width of glyphs - when doing fake emboldening. - - - -################################################################## -# The environment variables below should be copied to a file in -# /etc/profile.d/ for system-wide effects and/or included in -# ~/.bashrc or ~/.bash_profile for per-user effects: -# -# . ~/path/to/the/file/infinality-settings -# -# Of course, the per-user settings will override the system-wide -# settings. - - - -################################################################## -# 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 one, and be -# symmetrical around the middle value. Here are some samples -# of various filter parameters: -# -# Strong Extra Smooth "0.15 0.2 0.3 0.2 0.15" (extra smooth, natural weight) -# Extra Smooth "0.20 0.20 0.30 0.20 0.20" (extra smooth, extra weight) -# Smooth "0.15 0.20 0.32 0.20 0.15" (smooth, natural weight) -# Stronger Gibson "0.11 0.22 0.38 0.22 0.11" (smooth, extra weight) -# Gibson "0.11 0.22 0.33 0.22 0.11" (smooth, natural weight) -# Freetype Light "0.00 0.33 0.34 0.33 0.00" (sharp, natural weight) -# Freetype Default "0.06 0.25 0.44 0.25 0.06" (sharp, extra weight) *default -# Extra Sharp "0.00 0.35 0.35 0.35 0.00" (extra sharp, extra weight) -# -# Default: [Freetype's default] -# Recommended: "0.11 0.22 0.38 0.22 0.11" -# -# Example 1: export INFINALITY_FT_FILTER_PARAMS="0.11 0.22 0.38 0.22 0.11" -# - -export INFINALITY_FT_FILTER_PARAMS="0.11 0.22 0.38 0.22 0.11" - - - - -################################################################## -# INFINALITY_FT_STEM_ALIGNMENT_TYPE -# -# This performs analysis on each glyph and determines the best -# subpixel orientation for the glyph. The glyph is not scaled in -# any way, just moved left or right by a subpixel amount. This -# results in subtley cleaner looking fonts, 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. -# -# Possible values: -# full - Allows a glyph to be moved to the LEFT or RIGHT by 1 subpixel -# Best alignment, Worst positioning -# medium,medium1 - Only allows a glyph to be moved to the LEFT by 1 subpixel -# Good alignment, Good positioning -# medium2 - Only allows a glyph to be moved to the RIGHT by 1 subpixel -# Good alignment, Good positioning -# slight,slight1 - A stricter version of medium -# Minor alignment, Best positioning -# slight2 - A stricter version of medium2 -# Minor alignment, Best positioning -# infinality - medium1 when stem < 5 subpixels, full when >= 5 subpixels -# none - Don't do any alignment -# -# Default: none -# Recommended: medium - -export INFINALITY_FT_STEM_ALIGNMENT_TYPE=medium - - - - - -################################################################## -# INFINALITY_FT_AUTOFIT_STEM_SNAP_LIGHT -# -# Cause the height of horizontal stems to snap to integer pixels -# when using light auto-hinting. (This happens automatically -# when using full auto-hinting) -# -# This produces an effect similar to the way Windows renders fonts -# without requiring the font to contain bytecode instructions. -# -# Possible values: -# true - enable stem snapping -# false - do not enable stem snapping -# -# Default: false -# Recommended: true - -export INFINALITY_FT_AUTOFIT_STEM_SNAP_LIGHT=true - - - - -################################################################## -# INFINALITY_FT_AUTOFIT_EMBOLDEN_LIGHT -# -# Embolden particularly light or thin fonts, like DejaVu Sans Light, -# Inconsolata, Freemono, Courier New, etc. up until stem width is -# 1 pixel wide. This makes these fonts easier to read at lower -# ppems. Only applies when the autohinter is being used. -# -# Possible values: -# true - enable emboldening of light fonts -# false - do not enable emboldening of light fonts -# -# Default: false -# Recommended: true - -export INFINALITY_FT_AUTOFIT_EMBOLDEN_LIGHT=true - - - - -################################################################## -# INFINALITY_FT_PSEUDO_GAMMA -# -# This does a weighted gamma correction at the LCD filter phase -# prior to the LCD filter. -# -# The first value indicates a px value, the second indicates a -# "gamma" value. All sizes < the px value will be corrected -# on a weighted scale based on the second value. -# -# Values .1 < 1.0 will darken the glyph -# Values > 1.0 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_PSEUDO_GAMMA="10 .6" -# -# Example 2: Lighten all glyphs (below 100px) -# export INFINALITY_FT_PSEUDO_GAMMA="100 1.5" -# -# Default: [No gamma correction] -# Recommended: "9 .7" - -export INFINALITY_FT_PSEUDO_GAMMA="9 .7" - - - - -################################################################## -# INFINALITY_FT_AUTOFIT_ADJUST_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. -# -# Possible values: -# true - enable height adjustment -# false - do not enable height adjustment -# -# Default: false - -export INFINALITY_FT_AUTOFIT_ADJUST_HEIGHTS=true - - - - -################################################################## -# INFINALITY_FT_ENHANCED_EMBOLDEN -# -# When doing artificial emboldening, only embolden in the X -# direction, skipping the Y direction. Most people will find this -# more aesthetically pleasing than the default behavior. -# -# Possible values: -# true - enable enhanced emboldening -# false - no not enable enhanced emboldening -# -# Default: false -# Recommended: true - -export INFINALITY_FT_ENHANCED_EMBOLDEN=true - - - - -################################################################## -# INFINALITY_FT_EMBOLDEN_MAINTAIN_WIDTH -# -# When doing artificial emboldening, don't change the glyph width. -# -# Possible values: -# true - maintain width -# false - do not maintain width -# -# Default: false -# Recommended: true - -export INFINALITY_FT_EMBOLDEN_MAINTAIN_WIDTH=true - - - - -################################################################## -# INFINALITY_FT_AUTO_AUTOHINT -# -# Automatically use autohint when rendering a font that contains -# no truetype instructions, regardless of what the calling -# program asks for. The truetype hinter will not do a good job -# on these. -# -# Possible values: -# true - automatically use autohint -# false - do not automatically use autohint -# -# Default: false -# Recommended: true - -export INFINALITY_FT_AUTO_AUTOHINT=true - - - - - - -INFINALITY_FT_AUTOFIT_STEM_SNAP_LIGHT details ---------------------------------------------- - -This patch is intended to make freetype's autohinter round down widths of -horizontal stems to whole pixel values. This dramatically reduces the -graininess of the rendering at small sizes, at the expense of being true to the -glyph. - -Put simply, it makes freetype's autohinter render fonts similarly -to well-hinted TrueType fonts, even on fonts that contain no instructions. -So, as far as I can tell, this makes it 100% patent-free. - -The most dramatic results are on sans-serif fonts like Lucida Grande, -Arial, Helvetica Neue, Inconsolata, Droid Sans, Trebuchet MS, etc. - - -It is recommended to use this with antialiasing on, and fonts set to -slight hinting: - - <match target="font" > - <edit mode="assign" name="rgba" > - <const>rgb</const> - </edit> - <edit mode="assign" name="hinting" > - <bool>true</bool> - </edit> - <edit mode="assign" name="autohint" > - <bool>true</bool> - </edit> - <edit mode="assign" name="antialias" > - <bool>true</bool> - </edit> - <edit mode="assign" name="hintstyle" > - <const>hintslight</const> - </edit> - <edit name="lcdfilter" mode="assign"> - <const>lcddefault</const> - </edit> - </match> - - - - -diff -Nur freetype-2.4.3.orig/configure freetype-2.4.3.new/configure ---- freetype-2.4.3.orig/configure 2010-10-03 13:05:26.000000000 -0500 -+++ freetype-2.4.3.new/configure 2010-11-14 18:17:36.593491866 -0600 -@@ -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 - - if test "x$GNUMAKE" = x; then -diff -Nur freetype-2.4.3.orig/include/freetype/internal/ftobjs.h freetype-2.4.3.new/include/freetype/internal/ftobjs.h ---- freetype-2.4.3.orig/include/freetype/internal/ftobjs.h 2010-07-18 11:07:31.000000000 -0500 -+++ freetype-2.4.3.new/include/freetype/internal/ftobjs.h 2010-11-07 11:18:19.681501081 -0600 -@@ -762,6 +770,10 @@ - FT_Library library ); - - -+ typedef void (*FT_Bitmap_LcdStemAlignFunc)( FT_Bitmap* bitmap, -+ FT_Render_Mode render_mode, -+ FT_GlyphSlot slot ); -+ - /*************************************************************************/ - /* */ - /* <Struct> */ -@@ -862,6 +874,7 @@ - FT_Int lcd_extra; /* number of extra pixels */ - FT_Byte lcd_weights[7]; /* filter weights, if any */ - FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ -+ FT_Bitmap_LcdStemAlignFunc lcd_stem_align_func; - #endif - - #ifdef FT_CONFIG_OPTION_PIC -diff -Nur freetype-2.4.3.orig/src/autofit/aflatin.c freetype-2.4.3.new/src/autofit/aflatin.c ---- freetype-2.4.3.orig/src/autofit/aflatin.c 2010-09-11 01:23:02.000000000 -0500 -+++ freetype-2.4.3.new/src/autofit/aflatin.c 2010-11-14 18:55:57.678647844 -0600 -@@ -21,6 +21,7 @@ - - #include "aflatin.h" - #include "aferrors.h" -+#include "strings.h" - - - #ifdef AF_USE_WARPER -@@ -495,6 +496,29 @@ - AF_LatinAxis axis; - FT_UInt nn; - -+ int checked_adjust_heights_env = 0; -+ FT_Bool adjust_heights = FALSE; -+ -+ if ( checked_adjust_heights_env == 0 ) -+ { -+ char *adjust_heights_env = getenv( "INFINALITY_FT_AUTOFIT_ADJUST_HEIGHTS" ); -+ if ( adjust_heights_env != NULL ) -+ { -+ if ( strcasecmp(adjust_heights_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(adjust_heights_env, "true") == 0) -+ adjust_heights = TRUE; -+ else if ( strcasecmp(adjust_heights_env, "1") == 0) -+ adjust_heights = TRUE; -+ else if ( strcasecmp(adjust_heights_env, "on") == 0) -+ adjust_heights = TRUE; -+ else if ( strcasecmp(adjust_heights_env, "yes") == 0) -+ adjust_heights = TRUE; -+ } -+ } -+ checked_adjust_heights_env = 1; -+ } -+ - - if ( dim == AF_DIMENSION_HORZ ) - { -@@ -522,21 +546,46 @@ - { - AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; - AF_LatinBlue blue = NULL; -- -+ int threshold = 40; - - for ( nn = 0; nn < Axis->blue_count; nn++ ) - { -- if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) -+ if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT -+ || ( adjust_heights && Axis->blues[nn].flags & AF_LATIN_BLUE_TOP ) -+ ) - { - blue = &Axis->blues[nn]; - break; - } - } - -+ if ( adjust_heights -+ && metrics->root.scaler.face->size->metrics.x_ppem < 15 -+ && metrics->root.scaler.face->size->metrics.x_ppem > 8 ) -+ threshold = 52; -+ -+ /* NEED TO FIND A WAY TO ADJUST CAPS AND LOWER SEPARATELY */ -+ /* The below does not work */ -+ /* if (Axis->blues[nn].flags & AF_LATIN_BLUE_SMALL_TOP ) -+ { -+ if (metrics->root.scaler.face->size->metrics.x_ppem < 15) -+ threshold = 22; -+ else threshold = 40; -+ break; -+ } -+ if ( Axis->blues[nn].flags & AF_LATIN_BLUE_CAPITAL_TOP ) -+ { -+ if (metrics->root.scaler.face->size->metrics.x_ppem < 15) -+ threshold = 40; -+ else threshold = 40; -+ break; -+ } -+ */ -+ - if ( blue ) - { - FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); -- FT_Pos fitted = ( scaled + 40 ) & ~63; -+ FT_Pos fitted = ( scaled + threshold ) & ~63; - - - if ( scaled != fitted ) -@@ -1340,7 +1389,8 @@ - if ( dist < 0 ) - dist = -dist; - -- dist = FT_MulFix( dist, scale ); -+ /* round down to pixels */ -+ dist = FT_MulFix( dist, scale ) & ~63; - if ( dist < best_dist ) - { - best_dist = dist; -@@ -1500,9 +1550,33 @@ - FT_Int vertical = ( dim == AF_DIMENSION_VERT ); - - -- if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || -- axis->extra_light ) -- return width; -+ int checked_stem_snap_env = 0; -+ FT_Bool stem_snap_light = FALSE; -+ -+ if ( checked_stem_snap_env == 0 ) -+ { -+ char *stem_snap_env = getenv( "INFINALITY_FT_AUTOFIT_STEM_SNAP_LIGHT" ); -+ if ( stem_snap_env != NULL ) -+ { -+ if ( strcasecmp(stem_snap_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(stem_snap_env, "true") == 0) -+ stem_snap_light = TRUE; -+ else if ( strcasecmp(stem_snap_env, "1") == 0) -+ stem_snap_light = TRUE; -+ else if ( strcasecmp(stem_snap_env, "on") == 0) -+ stem_snap_light = TRUE; -+ else if ( strcasecmp(stem_snap_env, "yes") == 0) -+ stem_snap_light = TRUE; -+ } -+ } -+ checked_stem_snap_env = 1; -+ } -+ -+ if ( !stem_snap_light ) -+ if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || -+ axis->extra_light ) -+ return width; - - if ( dist < 0 ) - { -@@ -1510,8 +1584,67 @@ - sign = 1; - } - -- if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || -- ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) -+ if ( stem_snap_light -+ && ( -+ ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) -+ || ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) ) -+ { -+ 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 - 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 ) dist = 64 ; -+ else if (axis->widths[0].cur < 88) dist = 64; -+ else if (axis->widths[0].cur < 160) dist = 128; -+ else if (axis->widths[0].cur < 240) dist = 190; -+ else dist = ( dist ) & ~63; -+ } -+ else -+ { -+ /* bold gets a different threshold */ -+ if ( axis->widths[0].cur < 64 ) dist = 64 ; -+ else if (axis->widths[0].cur < 108) dist = 64; -+ else if (axis->widths[0].cur < 160) dist = 128; -+ else if (axis->widths[0].cur < 222) dist = 190; -+ else if (axis->widths[0].cur < 288) dist = 254; -+ else dist = ( dist + 16 ) & ~63; -+ } -+ -+ /* fix any unusually low values */ -+ if (dist < ( axis->widths[0].cur & ~63 ) ) -+ dist = (axis->widths[0].cur & ~63); -+ -+ /* fix any unusually high values */ -+ if (dist > ( ( axis->widths[0].cur + 64 ) & ~63 ) ) -+ dist = ( ( axis->widths[0].cur + 64 ) & ~63 ); -+ -+ if (dist < 64 ) dist = 64 ; -+ -+ } -+ if (dist < 52) -+ { -+ if (metrics->root.scaler.face->size->metrics.x_ppem < 9 ) -+ { -+ /*dist = 64 - (64 - dist) / 2 ;*/ -+ if (dist < 31) dist = 31; -+ } -+ else -+ dist = 52; -+ } -+ -+ } -+ else if ( !stem_snap_light && (( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || -+ ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) ) - { - /* smooth hinting process: very lightly quantize the stem width */ - -@@ -1569,7 +1702,7 @@ - dist = ( dist + 32 ) & ~63; - } - } -- else -+ else if (!stem_snap_light) - { - /* strong hinting process: snap the stem width to integer pixels */ - FT_Pos org_dist = dist; -@@ -1577,6 +1710,8 @@ - - dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); - -+ if ( stem_snap_light ) goto Done_Width; -+ - if ( vertical ) - { - /* in the case of vertical hinting, always round */ -@@ -2100,7 +2235,30 @@ - { - FT_Error error; - int dim; -+ int e_strength = 0; -+ -+ int checked_embolden_light_env = 0; -+ FT_Bool embolden_light = FALSE; - -+ if ( checked_embolden_light_env == 0 ) -+ { -+ char *embolden_light_env = getenv( "INFINALITY_FT_AUTOFIT_EMBOLDEN_LIGHT" ); -+ if ( embolden_light_env != NULL ) -+ { -+ if ( strcasecmp(embolden_light_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(embolden_light_env, "true") == 0) -+ embolden_light = TRUE; -+ else if ( strcasecmp(embolden_light_env, "1") == 0) -+ embolden_light = TRUE; -+ else if ( strcasecmp(embolden_light_env, "on") == 0) -+ embolden_light = TRUE; -+ else if ( strcasecmp(embolden_light_env, "yes") == 0) -+ embolden_light = TRUE; -+ } -+ } -+ checked_embolden_light_env = 1; -+ } - - error = af_glyph_hints_reload( hints, outline ); - if ( error ) -@@ -2146,8 +2304,15 @@ - } - #endif - -- if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || -- ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) -+ if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ) -+ { -+ af_latin_hint_edges( hints, (AF_Dimension)dim ); -+ af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); -+ af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); -+ af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); -+ } -+ -+ if ( ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) - { - af_latin_hint_edges( hints, (AF_Dimension)dim ); - af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); -@@ -2157,6 +2322,34 @@ - } - af_glyph_hints_save( hints, outline ); - -+ /* if the font is particularly thin, embolden it, up to 1 px */ -+ if ( embolden_light -+ && metrics->axis->widths[0].cur <= 80 -+ && !( dim == AF_DIMENSION_VERT ) -+ && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) -+ { -+ if ( metrics->axis->widths[0].cur -+ / metrics->root.scaler.face->size->metrics.x_ppem < 5 ) -+ { -+ /* weakest at width 80, stronger at lower widths */ -+ e_strength = 40 * ( 80 - metrics->axis->widths[0].cur)/80 ; -+ /* Don't do low ppems as much */ -+ if ( metrics->root.scaler.face->size->metrics.x_ppem < 9 ) -+ e_strength -= -+ ( 9 - metrics->root.scaler.face->size->metrics.x_ppem ) * 10; -+ } -+ -+ /* Embolden small fonts on a sliding scale. Better readability. */ -+ if ( e_strength > 0 -+ && ( strstr(metrics->root.scaler.face->style_name, "Regular") -+ || strstr(metrics->root.scaler.face->style_name, "Book") -+ || strstr(metrics->root.scaler.face->style_name, "Light") -+ || 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 ) ) -+ FT_Outline_Embolden(outline,e_strength); -+ } -+ - Exit: - return error; - } -diff -Nur freetype-2.4.3.orig/src/autofit/afloader.c freetype-2.4.3.new/src/autofit/afloader.c ---- freetype-2.4.3.orig/src/autofit/afloader.c 2009-07-03 08:28:24.000000000 -0500 -+++ freetype-2.4.3.new/src/autofit/afloader.c 2010-10-22 22:22:04.073099288 -0500 -@@ -180,8 +180,8 @@ - AF_Edge edge2 = edge1 + - axis->num_edges - 1; /* rightmost edge */ - -- -- if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) -+/* dont hint metrics - temporary until different hinting can be done */ -+ if ( FALSE && axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) - { - old_rsb = loader->pp2.x - edge2->opos; - old_lsb = edge1->opos; -@@ -214,7 +214,8 @@ - slot->lsb_delta = loader->pp1.x - pp1x_uh; - slot->rsb_delta = loader->pp2.x - pp2x_uh; - } -- else -+/* dont hint metrics - temporary until different hinting can be done */ -+ else if (FALSE) - { - FT_Pos pp1x = loader->pp1.x; - FT_Pos pp2x = loader->pp2.x; -diff -Nur freetype-2.4.3.orig/src/base/ftlcdfil.c freetype-2.4.3.new/src/base/ftlcdfil.c ---- freetype-2.4.3.orig/src/base/ftlcdfil.c 2010-04-01 03:18:57.000000000 -0500 -+++ freetype-2.4.3.new/src/base/ftlcdfil.c 2010-11-14 18:33:58.300770778 -0600 -@@ -21,9 +21,659 @@ - #include FT_IMAGE_H - #include FT_INTERNAL_OBJECTS_H - -+#include <math.h> -+#include <string.h> -+#include <strings.h> - - #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - -+/* -+int sinc( int val ) { -+ if (val == 0.0) -+ return(1.0); -+ return 256.0 * (sin(3.14*(double) (val/256.0))/(3.14*(double) (val/256.0))); -+} -+ -+int sigmoidal( int val ) { -+ int val2; -+ val2 = 256.0 /(1.0+exp(-(10.0*(val/256.0-.5)))); -+ return window(val2); -+} -+ -+int window ( int val ) -+{ -+ if (val < 0 ) return 0; -+ if (val > 255) return 255; -+ else return val; -+} -+*/ -+int gamma2 ( int val, float value ) { -+ return 256 * (1.0 - pow((1.0 - (float)val/ 256.0) , 1.0/value)); -+} -+/* -+int gamma3 ( int val, float value ) { -+ 1- (x-1)^10 -+} -+*/ -+/* -+int gamma ( int val ) { -+ return 256 * (1.0 - pow((1.0 - (float)val/ 256.0) , 1.5)); -+} -+ -+int brick (int val) { -+ if (val > 50) return val; -+ else return 0; -+} -+ -+int brick2 (int val) { -+ if (val > 100) return val; -+ if (val > 50) return 100; -+ else return 0; -+} -+ -+int none (int val) { -+ return val; -+} -+ -+float pixmoid (int val1, int val2, int val3, int testval) -+{ -+ int avg; -+ int result; -+ -+ avg = (val1 + val2 + val3)/3; -+ -+ if ( avg < 128 ) -+ { -+ if (testval > 128) result = avg; -+ else result = testval; -+ } -+ else -+ { -+ if (testval < 128) result = avg; -+ else result = testval; -+ } -+ -+ return none(result); -+} -+ -+float pixmoid2 (int val1, int val2, int val3, int testval) -+{ -+ int avg; -+ int result; -+ -+ avg = (val1 + val2 + val3)/3; -+ -+ if ( avg > 160 ) return 255; -+ else if ( avg < 100 ) return 0; -+ else return testval; -+ -+ return none(result); -+ -+} -+*/ -+/* -+bool Resample(FT_Byte* line, int newWidth, int newHeight) -+{ -+ -+ unsigned char* newData = new unsigned char [newWidth * newHeight * 3]; -+ -+ double scaleWidth = (double)newWidth / (double)_width; -+ double scaleHeight = (double)newHeight / (double)_height; -+ -+ for(int cy = 0; cy < newHeight; cy++) -+ { -+ for(int cx = 0; cx < newWidth; cx++) -+ { -+ int pixel = (cy * (newWidth *3)) + (cx*3); -+ int nearestMatch = (((int)(cy / scaleHeight) -+ * (_width *3)) + ((int)(cx / scaleWidth) *3) ); -+ -+ newData[pixel ] = _data[nearestMatch ]; -+ newData[pixel + 1] = _data[nearestMatch + 1]; -+ newData[pixel + 2] = _data[nearestMatch + 2]; -+ } -+ } -+ -+ delete[] _data; -+ _data = newData; -+ _width = newWidth; -+ _height = newHeight; -+ -+ return true; -+}*/ -+ -+ -+ /* Stem alignment for bitmaps; A hack with very nice results */ -+ /* Ideally this could be implemented on the outline, prior to -+ * rasterization */ -+ static void -+ _lcd_stem_align ( FT_Bitmap* bitmap, -+ FT_Render_Mode mode, -+ FT_GlyphSlot slot ) -+ { -+ /*FT_Byte* weights = library->lcd_weights;*/ -+ FT_UInt width = (FT_UInt)bitmap->width; -+ FT_UInt height = (FT_UInt)bitmap->rows; -+ -+ FT_UInt h; -+ -+ FT_UInt alignment_type = 0; -+ FT_UInt checked_alignment_type = 0; -+ float pseudo_gamma_value = 1; -+ float pseudo_gamma_lt = 0; -+ FT_UInt checked_pseudo_gamma_value = 0; -+ -+ if ( checked_alignment_type == 0) -+ { -+ char *alignment_type_env = getenv( "INFINALITY_FT_STEM_ALIGNMENT_TYPE" ); -+ if ( alignment_type_env != NULL ) -+ { -+ /*sscanf ( alignment_type_env, "%d", &alignment_type );*/ -+ if (strcasecmp(alignment_type_env, "full") == 0) alignment_type = 1; -+ else if (strcasecmp(alignment_type_env, "medium") == 0) alignment_type = 2; -+ else if (strcasecmp(alignment_type_env, "medium1") == 0) alignment_type = 2; -+ else if (strcasecmp(alignment_type_env, "slight") == 0) alignment_type = 3; -+ else if (strcasecmp(alignment_type_env, "slight1") == 0) alignment_type = 3; -+ else if (strcasecmp(alignment_type_env, "medium2") == 0) alignment_type = 4; -+ else if (strcasecmp(alignment_type_env, "slight2") == 0) alignment_type = 5; -+ else if (strcasecmp(alignment_type_env, "infinality") == 0) alignment_type = 6; -+ else if (strcasecmp(alignment_type_env, "infinality1") == 0) alignment_type = 6; -+ else alignment_type = 0; -+ -+ if ( /*strstr(slot.metrics->root.scaler.face->style_name, "Regular") -+ || strstr(slot.metrics->root.scaler.face->style_name, "Book") -+ || strstr(slot.metrics->root.scaler.face->style_name, "Medium") -+ ||*/ strcasestr(slot->face->style_name, "Italic") -+ || strcasestr(slot->face->style_name, "Oblique") ) -+ alignment_type = 0; -+ if ( strcasestr(slot->face->style_name, "Bold") ) -+ alignment_type = 0; -+ } -+ checked_alignment_type = 1; -+ } -+ -+ if ( checked_pseudo_gamma_value == 0 ) -+ { -+ char *pseudo_gamma_value_env = getenv( "INFINALITY_FT_PSEUDO_GAMMA" ); -+ if ( pseudo_gamma_value_env != NULL ) -+ { -+ float f1, f2; -+ -+ if ( strcasecmp(pseudo_gamma_value_env, "default" ) != 0) -+ { -+ sscanf ( pseudo_gamma_value_env, "%f %f", &f1, &f2 ); -+ pseudo_gamma_lt = f1; -+ pseudo_gamma_value = f2; -+ } -+ if ( pseudo_gamma_value < .1 ) pseudo_gamma_value = 1; -+ if ( pseudo_gamma_lt < 0 ) pseudo_gamma_lt = 1; -+ } -+ checked_pseudo_gamma_value = 1; -+ } -+ -+ /*printf("%s,%s ", slot->face->family_name, slot->face->style_name);*/ -+ /*printf("%d ", slot->face->size->metrics.x_ppem);*/ -+ -+ /* set gamma value to 1 if out of range */ -+ if ( slot->face->size->metrics.x_ppem >= pseudo_gamma_lt ) -+ { -+ pseudo_gamma_value = 1; -+ } -+ -+ /* don't do alignment for < 10 */ -+ if ( slot->face->size->metrics.x_ppem < 10 ) -+ { -+ alignment_type = 0; -+ } -+ -+ if ( mode == FT_RENDER_MODE_LCD ) -+ { -+ if (width >= 4 && alignment_type != 0 ) -+ { -+ FT_Byte* line = bitmap->buffer; -+ FT_Byte* lineabove = bitmap->buffer; -+ FT_Byte* linebelow = bitmap->buffer; -+ -+ FT_UInt vsums[width], vtotals[width], offsetruns[width / 2][width/2]; -+ FT_UInt offsetrank[width/2], offsetchosen, stemwidths[width], stemwidthsmax; -+ FT_UInt stemwidth, vstems = 0; -+ -+ FT_UInt shift = 0; -+ FT_UInt xx; -+ -+ FT_ULong rtotal = 0, vweight = 0, wtotal = 0; -+ FT_UInt lreached = 0, rreached = 0, rr = 0, ll = 0, testwidth; -+ FT_UInt lwidth = 0, loffset = 0, offset = 0, htotal = 0, windowstart; -+ FT_UInt windowelement; -+ -+ line = bitmap->buffer; -+ rreached = 0; lreached = width, ll = width; -+ -+ lwidth = 0; -+ loffset = 0; -+ -+ -+ /* initialize variables - can this be done inline??? */ -+ for ( testwidth = 3; testwidth < 4; testwidth += 1 ) -+ { -+ for ( offset = 0; offset < 3; offset +=1 ) -+ { -+ offsetruns[offset][testwidth] = 0; -+ offsetrank[offset] = 0; -+ } -+ } -+ for ( xx = 0; xx < width; xx += 1 ) -+ { -+ stemwidths[xx] = 0; -+ } -+ -+ -+ for ( h = (FT_UInt)bitmap->rows; h > 0; h--, line += bitmap->pitch ) -+ { -+ -+ if (rr > rreached) rreached = rr; -+ if (ll < lreached) lreached = ll; -+ -+ rr = width; -+ ll = 0; -+ rtotal = 0; -+ htotal = 0; -+ -+ /*stemwidthsmax = 0;*/ -+ stemwidth = 0; -+ -+ -+ /* Calculate various sums and stem widths of glyph */ -+ for ( xx = 0; xx < width; xx += 1 ) -+ { -+ if (line[xx] >= 128) -+ { -+ stemwidth += 1; -+ /*if (stemwidth > stemwidthsmax) stemwidthsmax = stemwidth;*/ /* necessary ? */ -+ } -+ else -+ { -+ if (xx > 0 && line[xx - 1] >= 128) stemwidths[stemwidth] += 1; -+ stemwidth = 0; -+ } -+ -+ if (h == (FT_UInt)bitmap->rows) vsums[xx] = 0; -+ if ( h == (FT_UInt)bitmap->rows ) vtotals[xx] = 0; -+ -+ if (line[xx] == 0) vsums[xx] -= 255; -+ else vsums[xx] += line[xx]; -+ if (vsums[xx] < 0) vsums[xx] = 0; -+ -+ if (ll == 0 && line[xx] != 0) ll = (xx); -+ -+ if (line[xx] != 0) rr = (xx); -+ -+ if (xx < width / 2) vweight -= line[xx]; -+ else vweight += line[xx]; -+ -+ htotal += line [xx]; -+ vtotals[xx] += line[xx]; -+ } -+ -+ if ( h < (FT_UInt)bitmap->rows ) lineabove = line - bitmap->pitch; -+ if ( h > 1 ) linebelow = line + bitmap->pitch; -+ -+ -+ /* Determine the offset at which the most weight of the glyph exists */ -+ /* This is currently hard-coded at 3, but the code is here to adjust */ -+ for ( testwidth = 3; testwidth < 4; testwidth += 1 ) -+ { -+ /* test the widths at each of these offsets */ -+ for ( offset = 0; offset < 3; offset +=1 ) -+ { -+ /* test window of size testwidth, starting at offset */ -+ rtotal = 0; -+ for ( windowstart = offset; windowstart < width; -+ windowstart += testwidth ) -+ { -+ /* calculate total for this window */ -+ wtotal = 0; -+ for ( windowelement = windowstart; -+ windowelement < windowstart + testwidth; windowelement += 1 ) -+ if ( windowelement < width) -+ { -+ wtotal += line[windowelement]; -+ -+ /* Assign extra value to this subpixel under certain conditions */ -+ if ( line[windowelement] == 255 ) -+ { -+ /* favor if full pixels above and below */ -+ if ( h < (FT_UInt)bitmap->rows -+ && lineabove[windowelement] == 255 ) -+ wtotal += 10; -+ if ( h > 1 && linebelow[windowelement] == 255 ) -+ wtotal += 10; -+ -+ /* favor if full pixels next to them */ -+ if ( windowelement > 0 && line[windowelement-1] == 255 ) -+ { -+ wtotal += 10; -+ if ( windowelement > 1 && line[windowelement-2] == 255 ) -+ { -+ wtotal += 10; -+ if ( windowelement > 2 && line[windowelement-3] == 255 ) -+ wtotal += 10; -+ } -+ } -+ if ( windowelement < width - 1 && line[windowelement+1] == 255 ) -+ { -+ wtotal += 10; -+ if ( windowelement < width - 2 && line[windowelement+2] == 255 ) -+ { -+ wtotal += 10; -+ if ( windowelement < width - 3 && line[windowelement+3] == 255 ) -+ wtotal += 10; -+ } -+ } -+ } -+ } -+ /* divide window total by number of subpixel samples */ -+ /* add to total for this run */ -+ rtotal += (wtotal * wtotal) / testwidth; -+ } -+ /* dont count horizontal stems */ -+ /*if (rtotal < ( 255 * testwidth ) * (255 * testwidth) * (width / testwidth) / (testwidth * 2) )*/ -+ if ( rtotal < ( 255 * 255 * width / 2 ) ) -+ offsetruns[offset][testwidth] += rtotal; -+ } -+ -+ /* determine the best offset for this width and increment its counter */ -+ offsetchosen = 0; -+ for ( offset = 0; offset < 2; offset +=1 ) -+ { -+ if ( offsetruns[offset][testwidth] < offsetruns[offset + 1][testwidth] ){ -+ offsetrank[offset + 1] += 1; -+ offsetchosen = offset; -+ } -+ } -+ if (offsetchosen == 0) offsetrank[0] += 1; -+ } -+ } -+ -+ /* Use the best offset */ -+ loffset = 0; -+ for ( offset = 0; offset < 2; offset +=1 ) -+ { -+ if ( offsetrank[offset] < offsetrank[offset + 1] ){ -+ loffset = offset + 1; -+ } -+ } -+ -+ /* Use the best width */ -+ lwidth = 0; -+ stemwidthsmax = 0; -+ -+ for ( xx = 0; xx < width - 1; xx +=1 ) -+ { -+ if ( stemwidthsmax < stemwidths[xx + 1] ){ -+ lwidth = xx + 1; -+ stemwidthsmax = stemwidths[xx + 1]; -+ } -+ } -+ -+ /* currently unused */ -+ rreached = width - rreached; -+ -+ /* Set the number of vertical stem components */ -+ for ( xx = 0; xx < width; xx += 1 ) -+ { -+ if ( height > 0 && vsums[xx] / height > 110 ) -+ vstems++; -+ } -+ -+ -+ /******************** CALCULATE GLYPH ALIGNMENT *********************/ -+ /*printf(" %d,%d,%d,%d,%d,%d,%d\n", width, height, lreached, -+ rreached, lwidth,vstems,alignment_type );*/ -+ -+ shift = 0; -+ -+ /* infinality1 alignment - combination of below */ -+ if ( alignment_type == 6 ) -+ { -+ if ( lwidth < 5 ) alignment_type = 2; -+ else alignment_type = 1; -+ } -+ -+ /* strong alignment - shift glyph left or right one subpixel */ -+ if ( alignment_type == 1 /*&& vstems > 0*/ ) -+ { -+ if ( lwidth < 5) -+ { -+ /* lower widths should use this */ -+ if (loffset % 3 == 0) shift = -1; -+ if (loffset % 3 == 1) shift = 1; -+ if (loffset % 3 == 2) shift = 0; -+ } -+ else if ( lwidth < 6 ) -+ { -+ /* medium widths should use this */ -+ if (loffset % 3 == 0) shift = 1; -+ if (loffset % 3 == 1) shift = 0; -+ if (loffset % 3 == 2) shift = -1; -+ } -+ else if ( lwidth < 20 ) -+ { -+ /* higher widths should use this */ -+ if (loffset % 3 == 0) shift = 1; -+ if (loffset % 3 == 1) shift = -1; -+ if (loffset % 3 == 2) shift = 0; -+ } -+ } -+ -+ /* medium alignment - shift glyph ONLY LEFT one subpixel -+ * - a compromise to prevent spacing issues */ -+ else if ( alignment_type == 2 /*&& vstems > 0*/ ){ -+ -+ if ( lwidth < 5 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 1 && offsetrank[0] > offsetrank[2] ) loffset = 0; -+ -+ if ( loffset % 3 == 0 ) shift = -1; -+ /*if (loffset % 3 == 1 ) shift = 1;*/ -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ else if (lwidth < 6 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 0 && offsetrank[2] > offsetrank[1] ) loffset = 2; -+ /*if (loffset % 3 == 0 ) shift = 1;*/ -+ if ( loffset % 3 == 1 ) shift = 0; -+ if ( loffset % 3 == 2 ) shift = -1; -+ } -+ else if ( lwidth < 20 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 0 && offsetrank[1] > offsetrank[2] ) loffset = 1; -+ /*if (loffset % 3 == 0 ) shift = 1;*/ -+ if ( loffset % 3 == 1 ) shift = -1; -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ } -+ -+ /* medium alignment 2 - shift glyph ONLY RIGHT one subpixel -+ * - a compromise to prevent spacing issues */ -+ else if ( alignment_type == 4 ){ -+ if ( lwidth < 5 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 0 && offsetrank[1] > offsetrank[2] ) loffset = 1; -+ -+ /*if ( loffset % 3 == 0 ) shift = -1;*/ -+ if ( loffset % 3 == 1 ) shift = 1; -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ else if ( lwidth < 6 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 2 && offsetrank[0] > offsetrank[1] ) loffset = 0; -+ if ( loffset % 3 == 0 ) shift = 1; -+ if ( loffset % 3 == 1 ) shift = 0; -+ /*if ( loffset % 3 == 2 ) shift = -1;*/ -+ } -+ else if ( lwidth < 20 ) -+ { -+ /* medium alignment - use next highest value instead */ -+ if ( loffset == 1 && offsetrank[0] > offsetrank[2] ) loffset = 0; -+ if ( loffset % 3 == 0 ) shift = 1; -+ /*if (loffset % 3 == 1 ) shift = -1;*/ -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ } -+ -+ /* light alignment - shift glyph ONLY LEFT one subpixel -+ * - a compromise to prevent spacing issues */ -+ else if ( alignment_type == 3 ){ -+ if ( lwidth < 5 ) -+ { -+ if ( loffset % 3 == 0 ) shift = -1; -+ /*if ( loffset % 3 == 1 ) shift = 1;*/ -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ else if ( lwidth < 6 ) -+ { -+ /*if ( loffset % 3 == 0 ) shift = 1;*/ -+ if ( loffset % 3 == 1 ) shift = 0; -+ if ( loffset % 3 == 2 ) shift = -1; -+ } -+ else if ( lwidth < 20 ) -+ { -+ /*if ( loffset % 3 == 0 ) shift = 1;*/ -+ if ( loffset % 3 == 1 ) shift = -1; -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ } -+ -+ /* light alignment 2 - shift glyph ONLY RIGHT one subpixel -+ * - a compromise to prevent spacing issues */ -+ else if ( alignment_type == 5 ){ -+ if ( lwidth < 5 ) -+ { -+ /*if ( loffset % 3 == 0 ) shift = -1;*/ -+ if ( loffset % 3 == 1 ) shift = 1; -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ else if ( lwidth < 6 ) -+ { -+ if ( loffset % 3 == 0 ) shift = 1; -+ if ( loffset % 3 == 1 ) shift = 0; -+ /*if ( loffset % 3 == 2 ) shift = -1;*/ -+ } -+ else if ( lwidth < 20 ) -+ { -+ if ( loffset % 3 == 0 ) shift = 1; -+ /*if ( loffset % 3 == 1 ) shift = -1;*/ -+ if ( loffset % 3 == 2 ) shift = 0; -+ } -+ } -+ -+ /******************** ALIGN GLYPHS *********************/ -+ if (shift == -1) -+ { -+ 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 += 1 ) -+ { -+ line[xx] = line[xx+1]; -+ } -+ line[width - 1] = 1; -+ } -+ } -+ -+ else if (shift == -2) -+ { -+ line = bitmap->buffer; -+ for ( height = (FT_UInt)bitmap->rows; height > 0; height--, -+ line += bitmap->pitch ) -+ { -+ FT_UInt xx; -+ -+ for ( xx = 0; xx < width - 2; xx += 1 ) -+ { -+ line[xx] = line[xx+2]; -+ } -+ line[width - 2] = 1; -+ line[width - 1] = 1; -+ } -+ } -+ else if (shift == 1) -+ { -+ line = bitmap->buffer; -+ for ( height = (FT_UInt)bitmap->rows; height > 0; height--, -+ line += bitmap->pitch ) -+ { -+ FT_UInt xx; -+ -+ for ( xx = width - 1; xx > 0; xx -= 1 ) -+ { -+ line[xx] = line[xx-1]; -+ } -+ line[0] = 1; -+ } -+ } -+ else if (shift == 2) -+ { -+ line = bitmap->buffer; -+ for ( height = (FT_UInt)bitmap->rows; height > 0; height--, -+ line += bitmap->pitch ) -+ { -+ FT_UInt xx; -+ -+ for ( xx = width; xx > 1; xx -= 1 ) -+ { -+ line[xx] = line[xx-2]; -+ } -+ line[0] = 1; -+ line[1] = 1; -+ } -+ } -+ } -+ -+ if ( pseudo_gamma_value != 1 ) -+ { -+ FT_Byte* line = bitmap->buffer; -+ float ppem = (float)slot->face->size->metrics.x_ppem; -+ -+ 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] = gamma2 ( line[xx], pseudo_gamma_value );*/ -+ -+ /* sloped */ -+ /*line[xx] = gamma2 ( line[xx], pseudo_gamma_value - 5 -+ * (1-pseudo_gamma_value)/(pseudo_gamma_lt -5) -+ + ((1-pseudo_gamma_value)/(pseudo_gamma_lt -5)) * ppem );*/ -+ -+ /* 1/3-sloped */ -+ line[xx] = gamma2 ( line[xx], pseudo_gamma_value - 5 -+ * ((1-pseudo_gamma_value)/(3*(pseudo_gamma_lt -5))) -+ * + ((1-pseudo_gamma_value)/(3*(pseudo_gamma_lt -5))) * ppem ); -+ } -+ } -+ } -+ } -+ } -+ -+ -+ -+ -+ -+ - /* define USE_LEGACY to implement the legacy filter */ - #define USE_LEGACY - -@@ -287,9 +1017,31 @@ - { 0x00, 0x55, 0x56, 0x55, 0x00 }; - /* the values here sum up to a value larger than 256, */ - /* providing a cheap gamma correction */ -- static const FT_Byte default_filter[5] = -+ static FT_Byte default_filter[5] = - { 0x10, 0x40, 0x70, 0x40, 0x10 }; - -+ int checked_filter_params_env = 0; -+ -+ if ( checked_filter_params_env == 0 ) -+ { -+ char *filter_params = getenv( "INFINALITY_FT_FILTER_PARAMS" ); -+ if ( filter_params != NULL ) -+ { -+ float f1, f2, f3, f4, f5; -+ -+ if ( strcasecmp(filter_params, "default" ) != 0) -+ { -+ sscanf ( filter_params, "%f %f %f %f %f", &f1, &f2, &f3, &f4, &f5 ); -+ -+ default_filter[0] = (FT_Byte) (f1 * 255.0f + 0.5f); -+ default_filter[1] = (FT_Byte) (f2 * 255.0f + 0.5f); -+ default_filter[2] = (FT_Byte) (f3 * 255.0f + 0.5f); -+ default_filter[3] = (FT_Byte) (f4 * 255.0f + 0.5f); -+ default_filter[4] = (FT_Byte) (f5 * 255.0f + 0.5f); -+ } -+ } -+ checked_filter_params_env = 1; -+ } - - if ( !library ) - return FT_Err_Invalid_Argument; -@@ -304,17 +1056,20 @@ - case FT_LCD_FILTER_DEFAULT: - #if defined( FT_FORCE_LEGACY_LCD_FILTER ) - -+ library->lcd_stem_align_func = _lcd_stem_align; - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - - #elif defined( FT_FORCE_LIGHT_LCD_FILTER ) - -+ library->lcd_stem_align_func = _lcd_stem_align; - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - - #else - -+ library->lcd_stem_align_func = _lcd_stem_align; - ft_memcpy( library->lcd_weights, default_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; -@@ -325,6 +1080,7 @@ - - case FT_LCD_FILTER_LIGHT: - ft_memcpy( library->lcd_weights, light_filter, 5 ); -+ library->lcd_stem_align_func = _lcd_stem_align; - library->lcd_filter_func = _ft_lcd_filter_fir; - library->lcd_extra = 2; - break; -@@ -332,6 +1088,7 @@ - #ifdef USE_LEGACY - - case FT_LCD_FILTER_LEGACY: -+ library->lcd_stem_align_func = _lcd_stem_align; - library->lcd_filter_func = _ft_lcd_filter_legacy; - library->lcd_extra = 0; - break; -diff -Nur freetype-2.4.3.orig/src/base/ftobjs.c freetype-2.4.3.new/src/base/ftobjs.c ---- freetype-2.4.3.orig/src/base/ftobjs.c 2010-08-06 13:02:15.000000000 -0500 -+++ freetype-2.4.3.new/src/base/ftobjs.c 2010-11-14 15:43:02.906303324 -0600 -@@ -562,6 +562,45 @@ - FT_Bool autohint = FALSE; - FT_Module hinter; - -+ TT_Face face2=(TT_Face)face; -+ int checked_auto_autohint_env; -+ FT_Bool auto_autohint = FALSE; -+ -+ if ( !checked_auto_autohint_env ) -+ { -+ char *auto_autohint_env = getenv( "INFINALITY_FT_AUTO_AUTOHINT" ); -+ if ( auto_autohint_env != NULL ) -+ { -+ if ( strcasecmp(auto_autohint_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(auto_autohint_env, "true") == 0) auto_autohint = TRUE; -+ else if ( strcasecmp(auto_autohint_env, "1") == 0) auto_autohint = TRUE; -+ else if ( strcasecmp(auto_autohint_env, "on") == 0) auto_autohint = TRUE; -+ else if ( strcasecmp(auto_autohint_env, "yes") == 0) auto_autohint = TRUE; -+ } -+ } -+ checked_auto_autohint_env = 1; -+ } -+/*printf("%d,%d ", load_flags, FT_LOAD_TARGET_NORMAL); -+10000001000101000 -+0#define FT_LOAD_DEFAULT 0x0 -+0#define FT_LOAD_NO_SCALE 0x1 -+0#define FT_LOAD_NO_HINTING 0x2 -+1#define FT_LOAD_RENDER 0x4 -+0#define FT_LOAD_NO_BITMAP 0x8 -+1#define FT_LOAD_VERTICAL_LAYOUT 0x10 -+0#define FT_LOAD_FORCE_AUTOHINT 0x20 -+0#define FT_LOAD_CROP_BITMAP 0x40 -+0#define FT_LOAD_PEDANTIC 0x80 -+1#define FT_LOAD_ADVANCE_ONLY 0x100 -+0#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 -+0#define FT_LOAD_NO_RECURSE 0x400 -+0#define FT_LOAD_IGNORE_TRANSFORM 0x800 -+0#define FT_LOAD_MONOCHROME 0x1000 -+0#define FT_LOAD_LINEAR_DESIGN 0x2000 -+0#define FT_LOAD_SBITS_ONLY 0x4000 -+1#define FT_LOAD_NO_AUTOHINT 0x8000U -+*/ - - if ( !face || !face->size || !face->glyph ) - return FT_Err_Invalid_Face_Handle; -@@ -627,8 +666,11 @@ - - - if ( mode == FT_RENDER_MODE_LIGHT || -- face->internal->ignore_unpatented_hinter ) -+ face->internal->ignore_unpatented_hinter || -+ ( auto_autohint && face2->max_profile.maxSizeOfInstructions == 0 ) ) -+ { - autohint = TRUE; -+ } - } - } - -diff -Nur freetype-2.4.3.orig/src/base/ftoutln.c freetype-2.4.3.new/src/base/ftoutln.c ---- freetype-2.4.3.orig/src/base/ftoutln.c 2010-06-27 08:03:58.000000000 -0500 -+++ freetype-2.4.3.new/src/base/ftoutln.c 2010-11-14 09:06:38.779916717 -0600 -@@ -888,6 +888,28 @@ - FT_Int c, n, first; - FT_Int orientation; - -+ int checked_enhanced_embolden_env = 0; -+ FT_Bool enhanced_embolden = FALSE; -+ -+ if ( checked_enhanced_embolden_env == 0 ) -+ { -+ char *enhanced_embolden_env = getenv( "INFINALITY_FT_ENHANCED_EMBOLDEN" ); -+ if ( enhanced_embolden_env != NULL ) -+ { -+ if ( strcasecmp(enhanced_embolden_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(enhanced_embolden_env, "true") == 0) -+ enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "1") == 0) -+ enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "on") == 0) -+ enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "yes") == 0) -+ enhanced_embolden = TRUE; -+ } -+ } -+ checked_enhanced_embolden_env = 1; -+ } - - if ( !outline ) - return FT_Err_Invalid_Argument; -@@ -957,7 +979,8 @@ - } - - outline->points[n].x = v_cur.x + strength + in.x; -- outline->points[n].y = v_cur.y + strength + in.y; -+ if ( !enhanced_embolden ) -+ outline->points[n].y = v_cur.y + strength + in.y; - - v_prev = v_cur; - v_cur = v_next; -diff -Nur freetype-2.4.3.orig/src/base/ftsynth.c freetype-2.4.3.new/src/base/ftsynth.c ---- freetype-2.4.3.orig/src/base/ftsynth.c 2010-09-11 01:28:32.000000000 -0500 -+++ freetype-2.4.3.new/src/base/ftsynth.c 2010-11-14 09:19:16.860168106 -0600 -@@ -88,9 +88,28 @@ - FT_Error error; - FT_Pos xstr, ystr; - -+ int checked_enhanced_embolden_env = 0; -+ FT_Bool enhanced_embolden = FALSE; -+ -+ if ( checked_enhanced_embolden_env == 0 ) -+ { -+ char *enhanced_embolden_env = getenv( "INFINALITY_FT_EMBOLDEN_MAINTAIN_WIDTH" ); -+ if ( enhanced_embolden_env != NULL ) -+ { -+ if ( strcasecmp(enhanced_embolden_env, "default" ) != 0 ) -+ { -+ if ( strcasecmp(enhanced_embolden_env, "true") == 0) enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "1") == 0) enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "on") == 0) enhanced_embolden = TRUE; -+ else if ( strcasecmp(enhanced_embolden_env, "yes") == 0) enhanced_embolden = TRUE; -+ } -+ } -+ checked_enhanced_embolden_env = 1; -+ } -+ - - if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && -- slot->format != FT_GLYPH_FORMAT_BITMAP ) -+ slot->format != FT_GLYPH_FORMAT_BITMAP ) - return; - - /* some reasonable strength */ -@@ -108,7 +127,7 @@ - xstr = xstr * 2; - ystr = xstr; - } -- else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ -+ else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) - { - /* round to full pixels */ - xstr &= ~63; -@@ -146,7 +165,8 @@ - slot->metrics.width += xstr; - slot->metrics.height += ystr; - slot->metrics.horiBearingY += ystr; -- slot->metrics.horiAdvance += xstr; -+ /* Don't add any horiAdvance - Personal preference */ -+ if ( !enhanced_embolden ) slot->metrics.horiAdvance += xstr; - slot->metrics.vertBearingX -= xstr / 2; - slot->metrics.vertBearingY += ystr; - slot->metrics.vertAdvance += ystr; -diff -Nur freetype-2.4.3.orig/src/smooth/ftsmooth.c freetype-2.4.3.new/src/smooth/ftsmooth.c ---- freetype-2.4.3.orig/src/smooth/ftsmooth.c 2010-08-09 19:47:47.000000000 -0500 -+++ freetype-2.4.3.new/src/smooth/ftsmooth.c 2010-11-07 11:17:08.693652341 -0600 -@@ -283,6 +283,9 @@ - vec->y /= 3; - } - -+ if ( slot->library->lcd_stem_align_func ) -+ slot->library->lcd_stem_align_func ( bitmap, mode, slot ); -+ - if ( slot->library->lcd_filter_func ) - slot->library->lcd_filter_func( bitmap, mode, slot->library ); |