window-actor: Move all buffer management and damage correction here
We want ShapedTexture to be a dumb actor that knows how to pick/paint fairly easily, without any "platform knowledge", so to say...
This commit is contained in:
parent
f64cea3fc3
commit
d3c2607e53
@ -65,6 +65,7 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/meta-shadow-factory.c \
|
compositor/meta-shadow-factory.c \
|
||||||
compositor/meta-shadow-factory-private.h \
|
compositor/meta-shadow-factory-private.h \
|
||||||
compositor/meta-shaped-texture.c \
|
compositor/meta-shaped-texture.c \
|
||||||
|
compositor/meta-shaped-texture-private.h \
|
||||||
compositor/meta-texture-rectangle.c \
|
compositor/meta-texture-rectangle.c \
|
||||||
compositor/meta-texture-rectangle.h \
|
compositor/meta-texture-rectangle.h \
|
||||||
compositor/meta-texture-tower.c \
|
compositor/meta-texture-tower.c \
|
||||||
|
36
src/compositor/meta-shaped-texture-private.h
Normal file
36
src/compositor/meta-shaped-texture-private.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* shaped texture
|
||||||
|
*
|
||||||
|
* An actor to draw a texture clipped to a list of rectangles
|
||||||
|
*
|
||||||
|
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Intel Corporation
|
||||||
|
* 2013 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __META_SHAPED_TEXTURE_PRIVATE_H__
|
||||||
|
#define __META_SHAPED_TEXTURE_PRIVATE_H__
|
||||||
|
|
||||||
|
#include <meta/meta-shaped-texture.h>
|
||||||
|
|
||||||
|
ClutterActor *meta_shaped_texture_new (void);
|
||||||
|
void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
||||||
|
CoglTexture *texture);
|
||||||
|
|
||||||
|
#endif
|
@ -31,9 +31,10 @@
|
|||||||
#include "clutter-utils.h"
|
#include "clutter-utils.h"
|
||||||
#include "meta-texture-tower.h"
|
#include "meta-texture-tower.h"
|
||||||
|
|
||||||
|
#include "meta-shaped-texture-private.h"
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
|
||||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||||
#include "meta-cullable.h"
|
#include "meta-cullable.h"
|
||||||
|
|
||||||
@ -67,8 +68,8 @@ G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_AC
|
|||||||
struct _MetaShapedTexturePrivate
|
struct _MetaShapedTexturePrivate
|
||||||
{
|
{
|
||||||
MetaTextureTower *paint_tower;
|
MetaTextureTower *paint_tower;
|
||||||
Pixmap pixmap;
|
|
||||||
CoglTexturePixmapX11 *texture;
|
CoglTexture *texture;
|
||||||
CoglTexture *mask_texture;
|
CoglTexture *mask_texture;
|
||||||
|
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *clip_region;
|
||||||
@ -105,6 +106,7 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
|||||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||||
|
|
||||||
priv->paint_tower = meta_texture_tower_new ();
|
priv->paint_tower = meta_texture_tower_new ();
|
||||||
|
|
||||||
priv->texture = NULL;
|
priv->texture = NULL;
|
||||||
priv->mask_texture = NULL;
|
priv->mask_texture = NULL;
|
||||||
priv->create_mipmaps = TRUE;
|
priv->create_mipmaps = TRUE;
|
||||||
@ -206,10 +208,8 @@ paint_clipped_rectangle (CoglFramebuffer *fb,
|
|||||||
cogl_framebuffer_draw_multitextured_rectangle (fb, pipeline,
|
cogl_framebuffer_draw_multitextured_rectangle (fb, pipeline,
|
||||||
x1, y1, x2, y2,
|
x1, y1, x2, y2,
|
||||||
&coords[0], 8);
|
&coords[0], 8);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_shaped_texture_paint (ClutterActor *actor)
|
meta_shaped_texture_paint (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
@ -581,9 +581,6 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
|||||||
if (priv->texture == NULL)
|
if (priv->texture == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
cogl_texture_pixmap_x11_update_area (priv->texture,
|
|
||||||
x, y, width, height);
|
|
||||||
|
|
||||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||||
|
|
||||||
if (unobscured_region)
|
if (unobscured_region)
|
||||||
@ -617,7 +614,7 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
set_cogl_texture (MetaShapedTexture *stex,
|
set_cogl_texture (MetaShapedTexture *stex,
|
||||||
CoglTexturePixmapX11 *cogl_tex)
|
CoglTexture *cogl_tex)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv;
|
||||||
guint width, height;
|
guint width, height;
|
||||||
@ -657,37 +654,17 @@ set_cogl_texture (MetaShapedTexture *stex,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_shaped_texture_set_pixmap:
|
* meta_shaped_texture_set_texture:
|
||||||
* @stex: The #MetaShapedTexture
|
* @stex: The #MetaShapedTexture
|
||||||
* @pixmap: The pixmap you want the stex to assume
|
* @pixmap: The #CoglTexture to display
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
||||||
Pixmap pixmap)
|
CoglTexture *texture)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||||
|
|
||||||
priv = stex->priv;
|
set_cogl_texture (stex, texture);
|
||||||
|
|
||||||
if (priv->pixmap == pixmap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->pixmap = pixmap;
|
|
||||||
|
|
||||||
if (pixmap != None)
|
|
||||||
{
|
|
||||||
CoglContext *ctx =
|
|
||||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
set_cogl_texture (stex, NULL);
|
|
||||||
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
|
||||||
COGL_TEXTURE (priv->texture));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "xprops.h"
|
#include "xprops.h"
|
||||||
|
|
||||||
#include "compositor-private.h"
|
#include "compositor-private.h"
|
||||||
|
#include "meta-shaped-texture-private.h"
|
||||||
#include "meta-shadow-factory-private.h"
|
#include "meta-shadow-factory-private.h"
|
||||||
#include "meta-window-actor-private.h"
|
#include "meta-window-actor-private.h"
|
||||||
#include "meta-texture-rectangle.h"
|
#include "meta-texture-rectangle.h"
|
||||||
@ -872,6 +873,19 @@ queue_send_frame_messages_timeout (MetaWindowActor *self)
|
|||||||
priv->send_frame_messages_timer = g_timeout_add_full (META_PRIORITY_REDRAW, offset, send_frame_messages_timeout, self, NULL);
|
priv->send_frame_messages_timer = g_timeout_add_full (META_PRIORITY_REDRAW, offset, send_frame_messages_timeout, self, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_area (MetaWindowActor *self,
|
||||||
|
int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
|
CoglTexture *texture;
|
||||||
|
|
||||||
|
texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
|
||||||
|
|
||||||
|
cogl_texture_pixmap_x11_update_area (COGL_TEXTURE_PIXMAP_X11 (texture),
|
||||||
|
x, y, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_actor_damage_all (MetaWindowActor *self)
|
meta_window_actor_damage_all (MetaWindowActor *self)
|
||||||
{
|
{
|
||||||
@ -887,6 +901,7 @@ meta_window_actor_damage_all (MetaWindowActor *self)
|
|||||||
if (!priv->mapped || priv->needs_pixmap)
|
if (!priv->mapped || priv->needs_pixmap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
update_area (self, 0, 0, cogl_texture_get_width (texture), cogl_texture_get_height (texture));
|
||||||
redraw_queued = meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
redraw_queued = meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
||||||
0, 0,
|
0, 0,
|
||||||
cogl_texture_get_width (texture),
|
cogl_texture_get_width (texture),
|
||||||
@ -1200,8 +1215,7 @@ meta_window_actor_detach (MetaWindowActor *self)
|
|||||||
* you are supposed to be able to free a GLXPixmap after freeing the underlying
|
* you are supposed to be able to free a GLXPixmap after freeing the underlying
|
||||||
* pixmap, but it certainly doesn't work with current DRI/Mesa
|
* pixmap, but it certainly doesn't work with current DRI/Mesa
|
||||||
*/
|
*/
|
||||||
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
meta_shaped_texture_set_texture (META_SHAPED_TEXTURE (priv->actor), NULL);
|
||||||
None);
|
|
||||||
cogl_flush();
|
cogl_flush();
|
||||||
|
|
||||||
XFreePixmap (xdisplay, priv->back_pixmap);
|
XFreePixmap (xdisplay, priv->back_pixmap);
|
||||||
@ -1750,6 +1764,7 @@ check_needs_pixmap (MetaWindowActor *self)
|
|||||||
|
|
||||||
if (priv->back_pixmap == None)
|
if (priv->back_pixmap == None)
|
||||||
{
|
{
|
||||||
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
@ -1778,19 +1793,12 @@ check_needs_pixmap (MetaWindowActor *self)
|
|||||||
meta_shaped_texture_set_create_mipmaps (META_SHAPED_TEXTURE (priv->actor),
|
meta_shaped_texture_set_create_mipmaps (META_SHAPED_TEXTURE (priv->actor),
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->back_pixmap, FALSE, NULL));
|
||||||
priv->back_pixmap);
|
|
||||||
|
|
||||||
texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This only works *after* actually setting the pixmap, so we have to
|
|
||||||
* do it here.
|
|
||||||
* See: http://bugzilla.clutter-project.org/show_bug.cgi?id=2236
|
|
||||||
*/
|
|
||||||
if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture))))
|
if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture))))
|
||||||
g_warning ("NOTE: Not using GLX TFP!\n");
|
g_warning ("NOTE: Not using GLX TFP!\n");
|
||||||
|
|
||||||
|
meta_shaped_texture_set_texture (META_SHAPED_TEXTURE (priv->actor), texture);
|
||||||
|
|
||||||
/* ::size-changed is supposed to refer to meta_window_get_frame_rect().
|
/* ::size-changed is supposed to refer to meta_window_get_frame_rect().
|
||||||
* Emitting it here works pretty much OK because a new value of the
|
* Emitting it here works pretty much OK because a new value of the
|
||||||
* *input* rect (which is the outer rect with the addition of invisible
|
* *input* rect (which is the outer rect with the addition of invisible
|
||||||
@ -1928,6 +1936,7 @@ meta_window_actor_process_damage (MetaWindowActor *self,
|
|||||||
if (!priv->mapped || priv->needs_pixmap)
|
if (!priv->mapped || priv->needs_pixmap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
update_area (self, event->area.x, event->area.y, event->area.width, event->area.height);
|
||||||
redraw_queued = meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
redraw_queued = meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
||||||
event->area.x,
|
event->area.x,
|
||||||
event->area.y,
|
event->area.y,
|
||||||
|
@ -62,8 +62,6 @@ struct _MetaShapedTexture
|
|||||||
|
|
||||||
GType meta_shaped_texture_get_type (void) G_GNUC_CONST;
|
GType meta_shaped_texture_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
ClutterActor *meta_shaped_texture_new (void);
|
|
||||||
|
|
||||||
void meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
void meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||||
gboolean create_mipmaps);
|
gboolean create_mipmaps);
|
||||||
|
|
||||||
@ -74,9 +72,6 @@ gboolean meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
|||||||
int height,
|
int height,
|
||||||
cairo_region_t *unobscured_region);
|
cairo_region_t *unobscured_region);
|
||||||
|
|
||||||
void meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
|
||||||
Pixmap pixmap);
|
|
||||||
|
|
||||||
CoglTexture * meta_shaped_texture_get_texture (MetaShapedTexture *stex);
|
CoglTexture * meta_shaped_texture_get_texture (MetaShapedTexture *stex);
|
||||||
|
|
||||||
void meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
void meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||||
|
Loading…
Reference in New Issue
Block a user