mirror of
https://github.com/brl/mutter.git
synced 2025-02-17 05:44:08 +00:00
2007-12-05 Matthew Allum <mallum@openedhand.com>
* clutter/pango/pangoclutter-render.c: Prefer rendering with npots textures over pots textures if available (essentially makes applying shaders easier) Also convert some float to fixed.
This commit is contained in:
parent
4ff25a291c
commit
8e44f0613f
@ -1,3 +1,12 @@
|
|||||||
|
2007-12-05 Matthew Allum <mallum@openedhand.com>
|
||||||
|
|
||||||
|
reviewed by: <delete if not using a buddy>
|
||||||
|
|
||||||
|
* clutter/pango/pangoclutter-render.c: (tc_get), (free_glyph_info),
|
||||||
|
(draw_glyph), (draw_trapezoid), (pango_clutter_render_layout),
|
||||||
|
(pango_clutter_render_layout_line),
|
||||||
|
(pango_clutter_render_clear_caches), (prepare_run), (draw_begin):
|
||||||
|
|
||||||
2007-12-05 Emmanuele Bassi <ebassi@openedhand.com>
|
2007-12-05 Emmanuele Bassi <ebassi@openedhand.com>
|
||||||
|
|
||||||
* clutter/clutter-score.h: Rearrange declarations.
|
* clutter/clutter-score.h: Rearrange declarations.
|
||||||
|
@ -115,9 +115,17 @@ tc_get (tc_area *area, int width, int height)
|
|||||||
/* create a new texture if necessary */
|
/* create a new texture if necessary */
|
||||||
if (!match)
|
if (!match)
|
||||||
{
|
{
|
||||||
|
COGLenum texture_target_type = CGL_TEXTURE_2D;
|
||||||
|
|
||||||
CLUTTER_NOTE (PANGO, "creating new texture %i x %i",
|
CLUTTER_NOTE (PANGO, "creating new texture %i x %i",
|
||||||
TC_WIDTH, TC_HEIGHT);
|
TC_WIDTH, TC_HEIGHT);
|
||||||
|
|
||||||
|
/* Use NPOTS if available as it simply makes shaders easier to
|
||||||
|
* work with on text.
|
||||||
|
*/
|
||||||
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE))
|
||||||
|
texture_target_type = CGL_TEXTURE_RECTANGLE_ARB;
|
||||||
|
|
||||||
match = g_slice_new (tc_texture);
|
match = g_slice_new (tc_texture);
|
||||||
match->next = first_texture;
|
match->next = first_texture;
|
||||||
first_texture = match;
|
first_texture = match;
|
||||||
@ -125,15 +133,16 @@ tc_get (tc_area *area, int width, int height)
|
|||||||
|
|
||||||
cogl_textures_create (1, &match->name);
|
cogl_textures_create (1, &match->name);
|
||||||
|
|
||||||
cogl_texture_bind (CGL_TEXTURE_2D, match->name);
|
cogl_texture_bind (texture_target_type, match->name);
|
||||||
|
|
||||||
/* We might even want to use mipmapping instead of CGL_LINEAR here
|
/* We might even want to use mipmapping instead of CGL_LINEAR here
|
||||||
* that should allow rerendering of glyphs to look nice even at scales
|
* that should allow rerendering of glyphs to look nice even at scales
|
||||||
* far below 50%.
|
* far below 50%.
|
||||||
*/
|
*/
|
||||||
cogl_texture_set_filters (CGL_TEXTURE_2D, CGL_LINEAR, CGL_NEAREST);
|
cogl_texture_set_filters (texture_target_type,
|
||||||
|
CGL_LINEAR, CGL_NEAREST);
|
||||||
|
|
||||||
cogl_texture_image_2d (CGL_TEXTURE_2D,
|
cogl_texture_image_2d (texture_target_type,
|
||||||
CGL_ALPHA,
|
CGL_ALPHA,
|
||||||
TC_WIDTH,
|
TC_WIDTH,
|
||||||
TC_HEIGHT,
|
TC_HEIGHT,
|
||||||
@ -188,6 +197,7 @@ struct _PangoClutterRenderer
|
|||||||
ClutterColor color;
|
ClutterColor color;
|
||||||
int flags;
|
int flags;
|
||||||
guint curtex; /* current texture */
|
guint curtex; /* current texture */
|
||||||
|
COGLenum texture_target_type; /* 2D or Rect */
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (PangoClutterRenderer, \
|
G_DEFINE_TYPE (PangoClutterRenderer, \
|
||||||
@ -319,11 +329,12 @@ static void
|
|||||||
draw_glyph (PangoRenderer *renderer_,
|
draw_glyph (PangoRenderer *renderer_,
|
||||||
PangoFont *font,
|
PangoFont *font,
|
||||||
PangoGlyph glyph,
|
PangoGlyph glyph,
|
||||||
double x,
|
double xd,
|
||||||
double y)
|
double yd)
|
||||||
{
|
{
|
||||||
PangoClutterRenderer *renderer = PANGO_CLUTTER_RENDERER (renderer_);
|
PangoClutterRenderer *renderer = PANGO_CLUTTER_RENDERER (renderer_);
|
||||||
glyph_info *g;
|
glyph_info *g;
|
||||||
|
gint x = (gint)xd, y = (gint)yd;
|
||||||
struct { float x1, y1, x2, y2; } box;
|
struct { float x1, y1, x2, y2; } box;
|
||||||
|
|
||||||
if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
|
if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
|
||||||
@ -359,12 +370,12 @@ draw_glyph (PangoRenderer *renderer_,
|
|||||||
|
|
||||||
CLUTTER_NOTE (PANGO, "cache fail; subimage2d %i", glyph);
|
CLUTTER_NOTE (PANGO, "cache fail; subimage2d %i", glyph);
|
||||||
|
|
||||||
|
cogl_texture_bind (renderer->texture_target_type, g->tex.name);
|
||||||
|
|
||||||
cogl_texture_bind (CGL_TEXTURE_2D, g->tex.name);
|
cogl_texture_set_alignment (renderer->texture_target_type,
|
||||||
|
1, bm.stride);
|
||||||
|
|
||||||
cogl_texture_set_alignment (CGL_TEXTURE_2D, 1, bm.stride);
|
cogl_texture_sub_image_2d (renderer->texture_target_type,
|
||||||
|
|
||||||
cogl_texture_sub_image_2d (CGL_TEXTURE_2D,
|
|
||||||
g->tex.x,
|
g->tex.x,
|
||||||
g->tex.y,
|
g->tex.y,
|
||||||
bm.width,
|
bm.width,
|
||||||
@ -373,7 +384,8 @@ draw_glyph (PangoRenderer *renderer_,
|
|||||||
CGL_UNSIGNED_BYTE,
|
CGL_UNSIGNED_BYTE,
|
||||||
bm.bitmap);
|
bm.bitmap);
|
||||||
|
|
||||||
glTexParameteri (CGL_TEXTURE_2D, GL_GENERATE_MIPMAP, FALSE);
|
glTexParameteri (renderer->texture_target_type,
|
||||||
|
GL_GENERATE_MIPMAP, FALSE);
|
||||||
|
|
||||||
renderer->curtex = g->tex.name;
|
renderer->curtex = g->tex.name;
|
||||||
}
|
}
|
||||||
@ -382,25 +394,39 @@ draw_glyph (PangoRenderer *renderer_,
|
|||||||
x += g->left;
|
x += g->left;
|
||||||
y -= g->top;
|
y -= g->top;
|
||||||
|
|
||||||
box.x1 = g->tex.x * (1. / TC_WIDTH );
|
|
||||||
box.y1 = g->tex.y * (1. / TC_HEIGHT);
|
|
||||||
box.x2 = g->tex.w * (1. / TC_WIDTH ) + box.x1;
|
|
||||||
box.y2 = g->tex.h * (1. / TC_HEIGHT) + box.y1;
|
|
||||||
|
|
||||||
if (g->tex.name != renderer->curtex)
|
if (g->tex.name != renderer->curtex)
|
||||||
{
|
{
|
||||||
cogl_texture_bind (CGL_TEXTURE_2D, g->tex.name);
|
cogl_texture_bind (renderer->texture_target_type, g->tex.name);
|
||||||
renderer->curtex = g->tex.name;
|
renderer->curtex = g->tex.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_texture_quad (x,
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE))
|
||||||
x + g->tex.w,
|
{
|
||||||
y,
|
cogl_texture_quad (x,
|
||||||
y + g->tex.h,
|
x + g->tex.w,
|
||||||
CLUTTER_FLOAT_TO_FIXED (box.x1),
|
y,
|
||||||
CLUTTER_FLOAT_TO_FIXED (box.y1),
|
y + g->tex.h,
|
||||||
CLUTTER_FLOAT_TO_FIXED (box.x2),
|
CLUTTER_INT_TO_FIXED (g->tex.x),
|
||||||
CLUTTER_FLOAT_TO_FIXED (box.y2));
|
CLUTTER_INT_TO_FIXED (g->tex.y),
|
||||||
|
CLUTTER_INT_TO_FIXED (g->tex.w + g->tex.x),
|
||||||
|
CLUTTER_INT_TO_FIXED (g->tex.h + g->tex.y));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClutterFixed fx, fy;
|
||||||
|
|
||||||
|
fx = CLUTTER_INT_TO_FIXED (g->tex.x) / TC_WIDTH;
|
||||||
|
fy = CLUTTER_INT_TO_FIXED (g->tex.y) / TC_HEIGHT;
|
||||||
|
|
||||||
|
cogl_texture_quad (x,
|
||||||
|
x + g->tex.w,
|
||||||
|
y,
|
||||||
|
y + g->tex.h,
|
||||||
|
fx,
|
||||||
|
fy,
|
||||||
|
CLUTTER_INT_TO_FIXED (g->tex.w) / TC_WIDTH + fx,
|
||||||
|
CLUTTER_INT_TO_FIXED (g->tex.h) / TC_HEIGHT + fy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -432,9 +458,13 @@ draw_trapezoid (PangoRenderer *renderer_,
|
|||||||
(gint) x22);
|
(gint) x22);
|
||||||
|
|
||||||
/* Turn it back on again */
|
/* Turn it back on again */
|
||||||
cogl_enable (CGL_ENABLE_TEXTURE_2D|CGL_ENABLE_BLEND);
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE))
|
||||||
|
cogl_enable (CGL_ENABLE_TEXTURE_RECT|CGL_ENABLE_BLEND);
|
||||||
|
else
|
||||||
|
cogl_enable (CGL_ENABLE_TEXTURE_2D|CGL_ENABLE_BLEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
pango_clutter_render_layout_subpixel (PangoLayout *layout,
|
pango_clutter_render_layout_subpixel (PangoLayout *layout,
|
||||||
int x,
|
int x,
|
||||||
@ -501,6 +531,11 @@ pango_clutter_render_clear_caches (void)
|
|||||||
static void
|
static void
|
||||||
pango_clutter_renderer_init (PangoClutterRenderer *renderer)
|
pango_clutter_renderer_init (PangoClutterRenderer *renderer)
|
||||||
{
|
{
|
||||||
|
renderer->texture_target_type = CGL_TEXTURE_2D;
|
||||||
|
|
||||||
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE))
|
||||||
|
renderer->texture_target_type = CGL_TEXTURE_RECTANGLE_ARB;
|
||||||
|
|
||||||
memset (&renderer->color, 0xff, sizeof(ClutterColor));
|
memset (&renderer->color, 0xff, sizeof(ClutterColor));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -569,17 +604,10 @@ draw_begin (PangoRenderer *renderer_)
|
|||||||
|
|
||||||
renderer->curtex = 0;
|
renderer->curtex = 0;
|
||||||
|
|
||||||
cogl_enable (CGL_ENABLE_TEXTURE_2D
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE))
|
||||||
|CGL_ENABLE_BLEND);
|
cogl_enable (CGL_ENABLE_TEXTURE_RECT|CGL_ENABLE_BLEND);
|
||||||
|
else
|
||||||
#if 0
|
cogl_enable (CGL_ENABLE_TEXTURE_2D|CGL_ENABLE_BLEND);
|
||||||
gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
|
|
||||||
GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glEnable (GL_ALPHA_TEST);
|
|
||||||
glAlphaFunc (GL_GREATER, 0.01f);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user