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