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.
This commit is contained in:
Øyvind Kolås 2007-10-11 12:18:01 +00:00
parent 52065e88bc
commit 914c930cee
4 changed files with 77 additions and 31 deletions

View File

@ -1,3 +1,17 @@
2007-10-11 Øyvind Kolås <pippin@o-hand.com>
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 <ebassi@openedhand.com> 2007-10-10 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/glx/clutter-backend-glx.c: Fix documentation of the * clutter/glx/clutter-backend-glx.c: Fix documentation of the

View File

@ -196,6 +196,13 @@ pango_clutter_font_map_default_substitute (PangoFcFontMap *fcfontmap,
if (FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch) if (FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch)
FcPatternAddDouble (pattern, FC_DPI, fontmap->dpi_y); FcPatternAddDouble (pattern, FC_DPI, fontmap->dpi_y);
#endif #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); FcDefaultSubstitute (pattern);
} }

View File

@ -118,7 +118,11 @@ tc_get (tc_area *area, int width, int height)
cogl_texture_bind (CGL_TEXTURE_2D, match->name); 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, cogl_texture_image_2d (CGL_TEXTURE_2D,
CGL_ALPHA, CGL_ALPHA,

View File

@ -1,52 +1,73 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
void #define STAGE_WIDTH 640
frame_cb (ClutterTimeline *timeline, #define STAGE_HEIGHT 480
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 COLS 18
#define ROWS 20
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
ClutterTimeline *timeline; ClutterActor *stage;
ClutterActor *label;
ClutterActor *stage;
gchar *text; gchar *text;
gsize size; gsize size;
ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff }; 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); clutter_init (&argc, &argv);
stage = clutter_stage_get_default (); stage = clutter_stage_get_default ();
clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT);
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_stage_set_color (CLUTTER_STAGE (stage), &stage_color); 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<ROWS; row++)
for (col=0; col<COLS; col++)
{
ClutterActor *label;
gchar font_name[64];
gchar text[64];
gint font_size = row+10;
gdouble scale = 0.17 + (1.5*col/COLS);
sprintf (font_name, "Sans %ipx", font_size);
sprintf (text, "OH");
if (row==0)
{
sprintf (font_name, "Sans 10px");
sprintf (text, "%1.2f", scale);
font_size = 10;
scale = 1.0;
}
if (col==0)
{
sprintf (font_name, "Sans 10px");
sprintf (text, "%ipx", font_size);
if (row==0)
sprintf (text, "");
font_size = 10;
scale = 1.0;
}
label = clutter_label_new_with_text (font_name, text);
clutter_label_set_color (CLUTTER_LABEL (label), &label_color);
clutter_actor_set_position (label, (1.0*STAGE_WIDTH/COLS)*col,
(1.0*STAGE_HEIGHT/ROWS)*row);
/*clutter_actor_set_clip (label, 0,0, (1.0*STAGE_WIDTH/COLS),
(1.0*STAGE_HEIGHT/ROWS));*/
clutter_actor_set_scale (label, scale, scale);
clutter_label_set_line_wrap (CLUTTER_LABEL (label), FALSE);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), label);
}
}
clutter_actor_show_all (stage); clutter_actor_show_all (stage);
timeline = clutter_timeline_new (400, 60); /* num frames, fps */
g_object_set(timeline, "loop", TRUE, NULL); /* have it loop */
g_signal_connect(timeline, "new-frame", G_CALLBACK (frame_cb), label);
/* and start it */
clutter_timeline_start (timeline);
g_signal_connect (stage, "key-press-event", g_signal_connect (stage, "key-press-event",
G_CALLBACK (clutter_main_quit), NULL); G_CALLBACK (clutter_main_quit), NULL);