surface-actor: Implement is_argb32 generically for both X11 and Wayland

cogl_texture_get_components can be used on both X11 and Wayland
backends. Technically, the detection is different: we actually
check the actual RENDER format in the old code, while Cogl simply
assumes that any pixmap with a depth >= 32 is ARGB32. Since Cogl
already seems to be working with its internal checks, it makes
more sense to  use Cogl's check rather than keeping our own.
This commit is contained in:
Jasper St. Pierre 2014-03-25 17:02:50 -04:00
parent e30ed6892c
commit cc0488f1e2
4 changed files with 21 additions and 56 deletions

View File

@ -80,31 +80,6 @@ meta_surface_actor_wayland_pre_paint (MetaSurfaceActor *actor)
{ {
} }
static gboolean
meta_surface_actor_wayland_is_argb32 (MetaSurfaceActor *actor)
{
MetaShapedTexture *stex = meta_surface_actor_get_texture (actor);
CoglTexture *texture = meta_shaped_texture_get_texture (stex);
/* If we don't have a texture, like during initialization, assume
* that we're ARGB32. */
if (!texture)
return TRUE;
switch (cogl_texture_get_components (texture))
{
case COGL_TEXTURE_COMPONENTS_A:
case COGL_TEXTURE_COMPONENTS_RGBA:
return TRUE;
case COGL_TEXTURE_COMPONENTS_RG:
case COGL_TEXTURE_COMPONENTS_RGB:
case COGL_TEXTURE_COMPONENTS_DEPTH:
return FALSE;
default:
g_assert_not_reached ();
}
}
static gboolean static gboolean
meta_surface_actor_wayland_is_visible (MetaSurfaceActor *actor) meta_surface_actor_wayland_is_visible (MetaSurfaceActor *actor)
{ {
@ -159,7 +134,6 @@ meta_surface_actor_wayland_class_init (MetaSurfaceActorWaylandClass *klass)
surface_actor_class->process_damage = meta_surface_actor_wayland_process_damage; surface_actor_class->process_damage = meta_surface_actor_wayland_process_damage;
surface_actor_class->pre_paint = meta_surface_actor_wayland_pre_paint; surface_actor_class->pre_paint = meta_surface_actor_wayland_pre_paint;
surface_actor_class->is_argb32 = meta_surface_actor_wayland_is_argb32;
surface_actor_class->is_visible = meta_surface_actor_wayland_is_visible; surface_actor_class->is_visible = meta_surface_actor_wayland_is_visible;
surface_actor_class->should_unredirect = meta_surface_actor_wayland_should_unredirect; surface_actor_class->should_unredirect = meta_surface_actor_wayland_should_unredirect;

View File

@ -28,7 +28,6 @@
#include "meta-surface-actor-x11.h" #include "meta-surface-actor-x11.h"
#include <X11/extensions/Xcomposite.h> #include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xrender.h>
#include <cogl/cogl-texture-pixmap-x11.h> #include <cogl/cogl-texture-pixmap-x11.h>
#include <meta/errors.h> #include <meta/errors.h>
@ -54,7 +53,6 @@ struct _MetaSurfaceActorX11Private
guint does_full_damage : 1; guint does_full_damage : 1;
/* Other state... */ /* Other state... */
guint argb32 : 1;
guint received_damage : 1; guint received_damage : 1;
guint size_changed : 1; guint size_changed : 1;
@ -266,28 +264,6 @@ meta_surface_actor_x11_pre_paint (MetaSurfaceActor *actor)
update_pixmap (self); update_pixmap (self);
} }
static void
update_is_argb32 (MetaSurfaceActorX11 *self)
{
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
MetaDisplay *display = priv->display;
Display *xdisplay = meta_display_get_xdisplay (display);
XRenderPictFormat *format;
format = XRenderFindVisualFormat (xdisplay, priv->window->xvisual);
priv->argb32 = (format && format->type == PictTypeDirect && format->direct.alphaMask);
}
static gboolean
meta_surface_actor_x11_is_argb32 (MetaSurfaceActor *actor)
{
MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
return priv->argb32;
}
static gboolean static gboolean
meta_surface_actor_x11_is_visible (MetaSurfaceActor *actor) meta_surface_actor_x11_is_visible (MetaSurfaceActor *actor)
{ {
@ -312,7 +288,7 @@ meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor)
if (window->shape_region != NULL) if (window->shape_region != NULL)
return FALSE; return FALSE;
if (priv->argb32 && !meta_window_requested_bypass_compositor (window)) if (meta_surface_actor_is_argb32 (actor) && !meta_window_requested_bypass_compositor (window))
return FALSE; return FALSE;
if (!meta_window_is_monitor_sized (window)) if (!meta_window_is_monitor_sized (window))
@ -405,7 +381,6 @@ meta_surface_actor_x11_class_init (MetaSurfaceActorX11Class *klass)
surface_actor_class->process_damage = meta_surface_actor_x11_process_damage; surface_actor_class->process_damage = meta_surface_actor_x11_process_damage;
surface_actor_class->pre_paint = meta_surface_actor_x11_pre_paint; surface_actor_class->pre_paint = meta_surface_actor_x11_pre_paint;
surface_actor_class->is_argb32 = meta_surface_actor_x11_is_argb32;
surface_actor_class->is_visible = meta_surface_actor_x11_is_visible; surface_actor_class->is_visible = meta_surface_actor_x11_is_visible;
surface_actor_class->should_unredirect = meta_surface_actor_x11_should_unredirect; surface_actor_class->should_unredirect = meta_surface_actor_x11_should_unredirect;
@ -461,8 +436,6 @@ meta_surface_actor_x11_new (MetaWindow *window)
g_signal_connect_object (priv->window, "notify::decorated", g_signal_connect_object (priv->window, "notify::decorated",
G_CALLBACK (window_decorated_notify), self, 0); G_CALLBACK (window_decorated_notify), self, 0);
update_is_argb32 (self);
priv->unredirected = FALSE; priv->unredirected = FALSE;
sync_unredirected (self); sync_unredirected (self);

View File

@ -263,7 +263,26 @@ meta_surface_actor_pre_paint (MetaSurfaceActor *self)
gboolean gboolean
meta_surface_actor_is_argb32 (MetaSurfaceActor *self) meta_surface_actor_is_argb32 (MetaSurfaceActor *self)
{ {
return META_SURFACE_ACTOR_GET_CLASS (self)->is_argb32 (self); MetaShapedTexture *stex = meta_surface_actor_get_texture (self);
CoglTexture *texture = meta_shaped_texture_get_texture (stex);
/* If we don't have a texture, like during initialization, assume
* that we're ARGB32. */
if (!texture)
return TRUE;
switch (cogl_texture_get_components (texture))
{
case COGL_TEXTURE_COMPONENTS_A:
case COGL_TEXTURE_COMPONENTS_RGBA:
return TRUE;
case COGL_TEXTURE_COMPONENTS_RG:
case COGL_TEXTURE_COMPONENTS_RGB:
case COGL_TEXTURE_COMPONENTS_DEPTH:
return FALSE;
default:
g_assert_not_reached ();
}
} }
gboolean gboolean

View File

@ -29,7 +29,6 @@ struct _MetaSurfaceActorClass
void (* process_damage) (MetaSurfaceActor *actor, void (* process_damage) (MetaSurfaceActor *actor,
int x, int y, int width, int height); int x, int y, int width, int height);
void (* pre_paint) (MetaSurfaceActor *actor); void (* pre_paint) (MetaSurfaceActor *actor);
gboolean (* is_argb32) (MetaSurfaceActor *actor);
gboolean (* is_visible) (MetaSurfaceActor *actor); gboolean (* is_visible) (MetaSurfaceActor *actor);
gboolean (* should_unredirect) (MetaSurfaceActor *actor); gboolean (* should_unredirect) (MetaSurfaceActor *actor);