mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 16:10:41 -05:00
[mutter-shaped-texture] Create a rectangle texture if needed
If the window texture was created using the GL_TEXTURE_RECTANGLE_ARB extension then also create a rectangle texture for the shape texture.
This commit is contained in:
parent
f826fb1d9a
commit
1ba3b3dd7d
@ -138,6 +138,15 @@ mutter_shaped_texture_dirty_mask (MutterShapedTexture *stex)
|
|||||||
|
|
||||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
|
GLuint mask_gl_tex;
|
||||||
|
GLenum mask_gl_target;
|
||||||
|
|
||||||
|
cogl_texture_get_gl_texture (priv->mask_texture,
|
||||||
|
&mask_gl_tex, &mask_gl_target);
|
||||||
|
|
||||||
|
if (mask_gl_target == CGL_TEXTURE_RECTANGLE_ARB)
|
||||||
|
glDeleteTextures (1, &mask_gl_tex);
|
||||||
|
|
||||||
cogl_texture_unref (priv->mask_texture);
|
cogl_texture_unref (priv->mask_texture);
|
||||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
@ -254,6 +263,7 @@ mutter_shaped_texture_ensure_mask (MutterShapedTexture *stex)
|
|||||||
{
|
{
|
||||||
guchar *mask_data;
|
guchar *mask_data;
|
||||||
const XRectangle *rect;
|
const XRectangle *rect;
|
||||||
|
GLenum paint_gl_target;
|
||||||
|
|
||||||
/* Create data for an empty image */
|
/* Create data for an empty image */
|
||||||
mask_data = g_malloc0 (tex_width * tex_height);
|
mask_data = g_malloc0 (tex_width * tex_height);
|
||||||
@ -280,12 +290,36 @@ mutter_shaped_texture_ensure_mask (MutterShapedTexture *stex)
|
|||||||
memset (p, 255, x2 - x1);
|
memset (p, 255, x2 - x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
|
||||||
-1, FALSE,
|
|
||||||
COGL_PIXEL_FORMAT_A_8,
|
if (paint_gl_target == CGL_TEXTURE_RECTANGLE_ARB)
|
||||||
COGL_PIXEL_FORMAT_ANY,
|
{
|
||||||
tex_width,
|
GLuint tex;
|
||||||
mask_data);
|
|
||||||
|
glGenTextures (1, &tex);
|
||||||
|
glBindTexture (CGL_TEXTURE_RECTANGLE_ARB, tex);
|
||||||
|
glPixelStorei (GL_UNPACK_ROW_LENGTH, tex_width);
|
||||||
|
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
|
||||||
|
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
|
||||||
|
glTexImage2D (CGL_TEXTURE_RECTANGLE_ARB, 0,
|
||||||
|
GL_ALPHA, tex_width, tex_height,
|
||||||
|
0, GL_ALPHA, GL_UNSIGNED_BYTE, mask_data);
|
||||||
|
|
||||||
|
priv->mask_texture
|
||||||
|
= cogl_texture_new_from_foreign (tex,
|
||||||
|
CGL_TEXTURE_RECTANGLE_ARB,
|
||||||
|
tex_width, tex_height,
|
||||||
|
0, 0,
|
||||||
|
COGL_PIXEL_FORMAT_A_8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
||||||
|
-1, FALSE,
|
||||||
|
COGL_PIXEL_FORMAT_A_8,
|
||||||
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
|
tex_width,
|
||||||
|
mask_data);
|
||||||
|
|
||||||
g_free (mask_data);
|
g_free (mask_data);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user