mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
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:
parent
52065e88bc
commit
914c930cee
14
ChangeLog
14
ChangeLog
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user