From 7a023a62f7517ad0d54f4d59c99909fadcc05e82 Mon Sep 17 00:00:00 2001 From: Nicolaus L Helper Date: Thu, 17 Jun 2010 08:56:30 +0100 Subject: ft,fc,xlib: LCD filtering patch. This adds internal API to retrieve the LCD filtering parameters from fontconfig, or as set on the Screen, and feed them to FreeType when rendering the glyph. References: Bug 10301 - LCD filtering patch https://bugs.freedesktop.org/show_bug.cgi?id=10301 Tested-by: Brandon Wright Forward-ported-by: Robert Hooker ickle: The API is clearly not ready for public consumption, the enum are poorly named, however this stands by itself as enabling system wide properties. --- src/cairo-xlib-screen.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/cairo-xlib-screen.c') diff --git a/src/cairo-xlib-screen.c b/src/cairo-xlib-screen.c index b094eaf4c..db01a8433 100644 --- a/src/cairo-xlib-screen.c +++ b/src/cairo-xlib-screen.c @@ -152,13 +152,22 @@ _cairo_xlib_init_screen_font_options (Display *dpy, cairo_bool_t xft_antialias; int xft_hintstyle; int xft_rgba; + int xft_lcdfilter; cairo_antialias_t antialias; cairo_subpixel_order_t subpixel_order; + cairo_lcd_filter_t lcd_filter; cairo_hint_style_t hint_style; if (!get_boolean_default (dpy, "antialias", &xft_antialias)) xft_antialias = TRUE; + if (!get_integer_default (dpy, "lcdfilter", &xft_lcdfilter)) { + /* -1 is an non-existant Fontconfig constant used to differentiate + * the case when no lcdfilter property is available. + */ + xft_lcdfilter = -1; + } + if (!get_boolean_default (dpy, "hinting", &xft_hinting)) xft_hinting = TRUE; @@ -241,6 +250,24 @@ _cairo_xlib_init_screen_font_options (Display *dpy, subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; } + switch (xft_lcdfilter) { + case FC_LCD_NONE: + lcd_filter = CAIRO_LCD_FILTER_NONE; + break; + case FC_LCD_DEFAULT: + lcd_filter = CAIRO_LCD_FILTER_FIR5; + break; + case FC_LCD_LIGHT: + lcd_filter = CAIRO_LCD_FILTER_FIR3; + break; + case FC_LCD_LEGACY: + lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL; + break; + default: + lcd_filter = CAIRO_LCD_FILTER_DEFAULT; + break; + } + if (xft_antialias) { if (subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) antialias = CAIRO_ANTIALIAS_GRAY; @@ -253,6 +280,7 @@ _cairo_xlib_init_screen_font_options (Display *dpy, cairo_font_options_set_hint_style (&info->font_options, hint_style); cairo_font_options_set_antialias (&info->font_options, antialias); cairo_font_options_set_subpixel_order (&info->font_options, subpixel_order); + _cairo_font_options_set_lcd_filter (&info->font_options, lcd_filter); cairo_font_options_set_hint_metrics (&info->font_options, CAIRO_HINT_METRICS_ON); } -- cgit v1.2.3