mirror of
https://github.com/brl/mutter.git
synced 2024-11-23 08:30:42 -05:00
Don't unpremultiply Cairo data
Instead of unpremultiplying the Cairo data, pass it directly to Cogl in premultiplied form; we now *prefer* premultiplied data. http://bugzilla.openedhand.com/show_bug.cgi?id=1406 Signed-off-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
parent
c3448314d5
commit
1e5b5d10c5
@ -292,14 +292,13 @@ clutter_cairo_texture_surface_resize_internal (ClutterCairoTexture *cairo)
|
|||||||
cairo,
|
cairo,
|
||||||
clutter_cairo_texture_surface_destroy);
|
clutter_cairo_texture_surface_destroy);
|
||||||
|
|
||||||
/* The texture data will be all zeroes so we can use it to create a
|
/* Create a blank Cogl texture
|
||||||
* blank Cogl texture even though its in a different format
|
|
||||||
*/
|
*/
|
||||||
clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (cairo),
|
clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (cairo),
|
||||||
priv->cr_surface_data,
|
priv->cr_surface_data,
|
||||||
TRUE, priv->width, priv->height,
|
TRUE, priv->width, priv->height,
|
||||||
priv->rowstride,
|
priv->rowstride,
|
||||||
4, 0, NULL);
|
4, CLUTTER_TEXTURE_RGB_FLAG_PREMULT, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -451,9 +450,7 @@ clutter_cairo_texture_context_destroy (void *data)
|
|||||||
|
|
||||||
gint cairo_width, cairo_height, cairo_rowstride;
|
gint cairo_width, cairo_height, cairo_rowstride;
|
||||||
gint surface_width, surface_height;
|
gint surface_width, surface_height;
|
||||||
guchar *pixbuf_data, *dst, *cairo_data;
|
guchar *cairo_data;
|
||||||
guint *src, pixbuf_rowstride;
|
|
||||||
gint x, y;
|
|
||||||
|
|
||||||
priv = CLUTTER_CAIRO_TEXTURE_GET_PRIVATE (cairo);
|
priv = CLUTTER_CAIRO_TEXTURE_GET_PRIVATE (cairo);
|
||||||
|
|
||||||
@ -473,56 +470,19 @@ clutter_cairo_texture_context_destroy (void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cairo_rowstride = priv->rowstride;
|
cairo_rowstride = priv->rowstride;
|
||||||
cairo_data = priv->cr_surface_data;
|
cairo_data = (priv->cr_surface_data
|
||||||
pixbuf_data = g_malloc (cairo_width * cairo_height * 4);
|
+ ctxt->rect.y * cairo_rowstride
|
||||||
pixbuf_rowstride = cairo_width * 4;
|
+ ctxt->rect.x * 4);
|
||||||
|
|
||||||
/* BAH BAH BAH ! un-pre-multiply alpha...
|
|
||||||
*
|
|
||||||
* FIXME: Need to figure out if GL has a premult texture
|
|
||||||
* format, or we need to change the order of the
|
|
||||||
* paint sequence in Clutter. or go back to battling
|
|
||||||
* glitz (ugh).
|
|
||||||
*
|
|
||||||
* in theory, this could be moved to a shader, but apparently
|
|
||||||
* the performance gain is not really worth it.
|
|
||||||
*/
|
|
||||||
for (y = 0; y < cairo_height; y++)
|
|
||||||
{
|
|
||||||
src = (unsigned int *) (cairo_data
|
|
||||||
+ ((y + ctxt->rect.y) * cairo_rowstride)
|
|
||||||
+ (ctxt->rect.x * 4));
|
|
||||||
dst = pixbuf_data + y * pixbuf_rowstride;
|
|
||||||
|
|
||||||
for (x = 0; x < cairo_width; x++)
|
|
||||||
{
|
|
||||||
guchar alpha = (*src >> 24) & 0xff;
|
|
||||||
|
|
||||||
if (alpha == 0)
|
|
||||||
dst[0] = dst[1] = dst[2] = dst[3] = alpha;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst[0] = (((*src >> 16) & 0xff) * 255 ) / alpha;
|
|
||||||
dst[1] = (((*src >> 8) & 0xff) * 255 ) / alpha;
|
|
||||||
dst[2] = (((*src >> 0) & 0xff) * 255 ) / alpha;
|
|
||||||
dst[3] = alpha;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst += 4;
|
|
||||||
src++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_texture_set_area_from_rgb_data (CLUTTER_TEXTURE (cairo),
|
clutter_texture_set_area_from_rgb_data (CLUTTER_TEXTURE (cairo),
|
||||||
pixbuf_data,
|
cairo_data,
|
||||||
TRUE,
|
TRUE,
|
||||||
ctxt->rect.x,
|
ctxt->rect.x,
|
||||||
ctxt->rect.y,
|
ctxt->rect.y,
|
||||||
cairo_width, cairo_height,
|
cairo_width, cairo_height,
|
||||||
pixbuf_rowstride,
|
cairo_rowstride,
|
||||||
4, 0, NULL);
|
4, CLUTTER_TEXTURE_RGB_FLAG_PREMULT, NULL);
|
||||||
|
|
||||||
g_free (pixbuf_data);
|
|
||||||
g_free (ctxt);
|
g_free (ctxt);
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_IS_VISIBLE (cairo))
|
if (CLUTTER_ACTOR_IS_VISIBLE (cairo))
|
||||||
|
Loading…
Reference in New Issue
Block a user