Eric Rannaud
2011-Nov-21 08:28 UTC
[Fontconfig] [PATCH 1/1] Add lcdfiltercustom option: controls the filter individual weights
From: Eric Rannaud <e at nanocritical.com> When lcdfilter is set to "lcdcustom", use lcdfiltercustom to retrieve a string containing a space-separated list of double values between 0.0 and 1.0 and configure the renderer LCD filter (e.g. for freetype2, this is done with FT_Library_SetLcdFilterWeights()). If lcdfiltercustom is empty or is malformed, fontconfig users should fallback to lcddefault. With freetype2 as renderer, when fontconfig''s FC_LCD_DEFAULT is mapped to freetype2''s FT_LCD_FILTER_DEFAULT, the configuration <match target="font"> <edit mode="assign" name="lcdfilter"> <const>lcddefault</const> </edit> </match> corresponds to setting <match target="font"> <edit mode="assign" name="lcdfilter"> <const>lcdcustom</const> </edit> </match> <match target="font"> <edit mode="assign" name="lcdfiltercustom"> <string>.0625 .25 .4375 .25 .0625</string> </edit> </match> --- Hi, Freetype2 has FT_Library_SetLcdFilterWeights() to control the configuration of the filter used for LCD antialiasing. This gives more control than FT_LCD_FILTER_DEFAULT, _LIGHT, _LEGACY, ... For instance, with: static const FT_Byte heavy_filter[5] = { 0x40, 0x80, 0x90, 0x80, 0x40 }; fonts are rendered bolder (see http://goo.gl/YHpNs, on the right is lcddefault). Some users with poor eyesight will want to tweak this setting to make fonts more readable, especially on low-res screens (e.g. a 24" 1920x1200 screen). Fontconfig has an option to control the LCD AA filter, but only via a few predefined values: lcdfilter can be set to lcdnone, lcddefault, lcdlight, or lcdlegacy. However, other configurations for this filter are reasonable (e.g. the one above, or those listed in http://www.infinality.net/files/infinality-settings). This patch adds a fontconfig option to control the LCD filter directly. For reference, see the freetype-devel discussion at http://lists.nongnu.org/archive/html/freetype-devel/2011-11/msg00023.html A few questions: - Is a string the best way to set a list of values with fontconfig? - Should we prefer values between 0 and 1000 instead of Double between 0 and 1? Note that in freetype2, the filter is actually using 5 uint8_t values between 0 and 255 so rounding errors will affect the actual values used. - Would you prefer a unique "lcdheavy" value for lcdfilter, corresponding to a new FT_LCD_FILTER_HEAVY in freetype2 for some fixed, and somewhat arbitrary, LCD filter configuration? The freetype2 developers are open to the idea, but I think we would all prefer complete control over the filter values. I will have patches for Cairo and Xft to have them honor the new config option, parse the list of filter values, and call FT_Library_SetLcdFilterWeights(). Any other major users of fontconfig I should write patches for and submit upstream? Thanks, Eric. --- doc/fontconfig-user.sgml | 5 +++++ fontconfig/fontconfig.h | 2 ++ src/fcname.c | 4 +++- 3 files changed, 10 insertions(+), 1 deletions(-) diff --git a/doc/fontconfig-user.sgml b/doc/fontconfig-user.sgml index 217feb9..d0944ba 100644 --- a/doc/fontconfig-user.sgml +++ b/doc/fontconfig-user.sgml @@ -122,6 +122,10 @@ convenience for the applications'' rendering mechanism. rgba Int unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry lcdfilter Int Type of LCD filter + lcdfiltercustom String Weights for the custom LCD filter, enabled by setting + lcdfilter to lcdcustom. Example: with freetype2 as + renderer, ".0625 .25 .4375 .25 .0625" corresponds to + setting the option lcdfilter to lcddefault. minspace Bool Eliminate leading from line spacing charset CharSet Unicode chars encoded by the font lang String List of RFC-3066-style languages this @@ -494,6 +498,7 @@ symbolic names for common font values: lcddefault lcdfilter 1 lcdlight lcdfilter 2 lcdlegacy lcdfilter 3 + lcdcustom lcdfilter 4 hintnone hintstyle 0 hintslight hintstyle 1 hintmedium hintstyle 2 diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index db26b97..f05f570 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -111,6 +111,7 @@ typedef int FcBool; #define FC_EMBEDDED_BITMAP "embeddedbitmap" /* Bool - true to enable embedded bitmaps */ #define FC_DECORATIVE "decorative" /* Bool - true if style is a decorative variant */ #define FC_LCD_FILTER "lcdfilter" /* Int */ +#define FC_LCD_FILTER_CUSTOM "lcdfiltercustom" /* String. Space separated list of double */ #define FC_CACHE_SUFFIX ".cache-"FC_CACHE_VERSION #define FC_DIR_CACHE_FILE "fonts.cache-"FC_CACHE_VERSION @@ -177,6 +178,7 @@ typedef int FcBool; #define FC_LCD_DEFAULT 1 #define FC_LCD_LIGHT 2 #define FC_LCD_LEGACY 3 +#define FC_LCD_CUSTOM 4 typedef enum _FcType { FcTypeVoid, diff --git a/src/fcname.c b/src/fcname.c index d77eff6..0697d10 100644 --- a/src/fcname.c +++ b/src/fcname.c @@ -75,7 +75,8 @@ static const FcObjectType _FcBaseObjectTypes[] = { { FC_EMBOLDEN, FcTypeBool }, { FC_EMBEDDED_BITMAP, FcTypeBool }, { FC_DECORATIVE, FcTypeBool }, - { FC_LCD_FILTER, FcTypeInteger }, /* 41 */ + { FC_LCD_FILTER, FcTypeInteger }, + { FC_LCD_FILTER_CUSTOM, FcTypeString }, /* 42 */ }; #define NUM_OBJECT_TYPES (sizeof _FcBaseObjectTypes / sizeof _FcBaseObjectTypes[0]) @@ -454,6 +455,7 @@ static const FcConstant _FcBaseConstants[] = { { (FcChar8 *) "lcddefault", "lcdfilter", FC_LCD_DEFAULT }, { (FcChar8 *) "lcdlight", "lcdfilter", FC_LCD_LIGHT }, { (FcChar8 *) "lcdlegacy", "lcdfilter", FC_LCD_LEGACY }, + { (FcChar8 *) "lcdcustom", "lcdfilter", FC_LCD_CUSTOM }, }; #define NUM_FC_CONSTANTS (sizeof _FcBaseConstants/sizeof _FcBaseConstants[0]) -- 1.7.6.4
James Cloos
2011-Nov-21 13:15 UTC
[Fontconfig] [PATCH 1/1] Add lcdfiltercustom option: controls the filter individual weights
I suspect a list of <double/> or <int/> elements would be better than a <string/>. Your example would then be either: <match target="font"> <edit mode="assign" name="lcdfilter"> <const>lcdcustom</const> </edit> </match> <match target="font"> <edit mode="assign" name="lcdfiltercustom"> <double>.0625</double> <double>.25</double> <double>.4375</double> <double>.25</double> <double>.0625</double> </edit> </match> or someting like: <match target="font"> <edit mode="assign" name="lcdfilter"> <const>lcdcustom</const> </edit> </match> <match target="font"> <edit mode="assign" name="lcdfiltercustom"> <int>16</int> <int>64</int> <int>112</int> <int>64</int> <int>16</int> </edit> </match> if the range is u8. The dtd needs to be updated to mention this. An lcdheavy conf.avail file also should be part of the changeset. Otherwise, I, at least, am very much in favour of this. -JimC -- James Cloos <cloos at jhcloos.com> OpenPGP: 1024D/ED7DAEA6
Akira TAGOH
2011-Nov-22 01:56 UTC
[Fontconfig] [PATCH 1/1] Add lcdfiltercustom option: controls the filter individual weights
I tend to agree with giving the parameter as the integer or the float, because, though FT_Library_SetLcdFilterWeights() expects the bytes of the array, fontconfig needs to parse the human-readable string to it. that makes no sense because of using the xml format as the configuration. However I guess the code needs to be updated more since FC_LCD_FILTER accepts the integer only. fontconfig will picks up only the beginning of something looking like an array of the integer or the float (but fontconfig definitely won''t deal with it like so). On Mon, Nov 21, 2011 at 10:15 PM, James Cloos <cloos at jhcloos.com> wrote:> I suspect a list of <double/> or <int/> elements would be better than a <string/>. > > Your example would then be either: > > ?<match target="font"> > ? ?<edit mode="assign" name="lcdfilter"> > ? ? ?<const>lcdcustom</const> > ? ?</edit> > ?</match> > ?<match target="font"> > ? ?<edit mode="assign" name="lcdfiltercustom"> > ? ? ?<double>.0625</double> > ? ? ?<double>.25</double> > ? ? ?<double>.4375</double> > ? ? ?<double>.25</double> > ? ? ?<double>.0625</double> > ? ?</edit> > ?</match> > > or someting like: > > ?<match target="font"> > ? ?<edit mode="assign" name="lcdfilter"> > ? ? ?<const>lcdcustom</const> > ? ?</edit> > ?</match> > ?<match target="font"> > ? ?<edit mode="assign" name="lcdfiltercustom"> > ? ? ?<int>16</int> > ? ? ?<int>64</int> > ? ? ?<int>112</int> > ? ? ?<int>64</int> > ? ? ?<int>16</int> > ? ?</edit> > ?</match> > > if the range is u8. > > The dtd needs to be updated to mention this. > > An lcdheavy conf.avail file also should be part of the changeset. > > Otherwise, I, at least, am very much in favour of this. > > -JimC > -- > James Cloos <cloos at jhcloos.com> ? ? ? ? OpenPGP: 1024D/ED7DAEA6 > _______________________________________________ > Fontconfig mailing list > Fontconfig at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/fontconfig >-- Akira TAGOH