[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:
Neil Roberts 2008-11-17 16:15:00 +00:00
parent f826fb1d9a
commit 1ba3b3dd7d

View File

@ -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);