diff --git a/ChangeLog b/ChangeLog index 056676663..82a109cfb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-10-11 Øyvind Kolås + + Improve the quality of text when the scale it is shown at screen is + smaller than the original, seems to work well down to about a scale + of 50%. + + * clutter/pango/pangoclutter-fontmap.c: + (pango_clutter_font_map_default_substitute): turn off hinting. + * clutter/pango/pangoclutter-render.c: request linear filtering + instead of nearest neighbour when scaling down. + * tests/test-text.c: replaced test with a a test that renders a sample + grid with various pixel sizes and scales for visual inspection of + text rendering quality. + 2007-10-10 Emmanuele Bassi * clutter/glx/clutter-backend-glx.c: Fix documentation of the diff --git a/clutter/pango/pangoclutter-fontmap.c b/clutter/pango/pangoclutter-fontmap.c index 75f55bf65..4623efa46 100644 --- a/clutter/pango/pangoclutter-fontmap.c +++ b/clutter/pango/pangoclutter-fontmap.c @@ -196,6 +196,13 @@ pango_clutter_font_map_default_substitute (PangoFcFontMap *fcfontmap, if (FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch) FcPatternAddDouble (pattern, FC_DPI, fontmap->dpi_y); #endif + + /* Turn off hinting, since we most of the time are not using the glyphs + * from our cache at their nativly rendered resolution + */ + FcPatternDel (pattern, FC_HINTING); + FcPatternAddBool (pattern, FC_HINTING, FALSE); + FcDefaultSubstitute (pattern); } diff --git a/clutter/pango/pangoclutter-render.c b/clutter/pango/pangoclutter-render.c index 5528ab0e7..019675cc8 100644 --- a/clutter/pango/pangoclutter-render.c +++ b/clutter/pango/pangoclutter-render.c @@ -118,7 +118,11 @@ tc_get (tc_area *area, int width, int height) cogl_texture_bind (CGL_TEXTURE_2D, match->name); - cogl_texture_set_filters (CGL_TEXTURE_2D, CGL_NEAREST, CGL_NEAREST); + /* We might even want to use mipmapping instead of CGL_LINEAR here + * that should allow rerendering of glyphs to look nice even at scales + * far below 50%. + */ + cogl_texture_set_filters (CGL_TEXTURE_2D, CGL_LINEAR, CGL_NEAREST); cogl_texture_image_2d (CGL_TEXTURE_2D, CGL_ALPHA, diff --git a/tests/test-text.c b/tests/test-text.c index 964667fed..588b43746 100644 --- a/tests/test-text.c +++ b/tests/test-text.c @@ -1,52 +1,73 @@ #include -void -frame_cb (ClutterTimeline *timeline, - gint frame_num, - gpointer data) -{ - ClutterActor *label = (ClutterActor*)data; - - clutter_actor_set_depth(label, -400 + (frame_num * 40)); - clutter_actor_set_opacity (label, 255 - frame_num ); -} +#define STAGE_WIDTH 640 +#define STAGE_HEIGHT 480 +#define COLS 18 +#define ROWS 20 int main (int argc, char *argv[]) { - ClutterTimeline *timeline; - ClutterActor *label; - ClutterActor *stage; + ClutterActor *stage; gchar *text; gsize size; ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff }; - ClutterColor label_color = { 0x11, 0xdd, 0x11, 0xaa }; + ClutterColor label_color = { 0xff, 0xff, 0xff, 0xff }; clutter_init (&argc, &argv); stage = clutter_stage_get_default (); - - if (!g_file_get_contents ("test-text.c", &text, &size, NULL)) - g_error("g_file_get_contents() of test-text.c failed"); - - clutter_actor_set_size (stage, 800, 600); + clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); - label = clutter_label_new_with_text ("Mono 8", text); - clutter_label_set_color (CLUTTER_LABEL (label), &label_color); + { + gint font_size; + gdouble scale; + gint row, col; - clutter_container_add_actor (CLUTTER_CONTAINER (stage), label); + for (row=0; row