blur-effect: Add padding to account for the blur

The blur effect will sample pixels on the edges of the offscreen buffer,
so we want to add a padding to avoid clamping the blur.

We do this by creating a larger target texture, and updating the paint
volume of the actor during paint to take that padding into account.
This commit is contained in:
Emmanuele Bassi 2010-08-19 14:06:52 +01:00 committed by Robert Bragg
parent 5d97ca5f87
commit a6e5ecebe3

View File

@ -49,6 +49,8 @@
#include "clutter-offscreen-effect.h"
#include "clutter-private.h"
#define BLUR_PADDING 2
typedef struct _ClutterBlurEffectClass ClutterBlurEffectClass;
/* FIXME - lame shader; we should really have a decoupled
@ -211,6 +213,17 @@ clutter_blur_effect_pre_paint (ClutterEffect *effect)
return parent_class->pre_paint (effect);
}
static CoglHandle
clutter_blur_effect_create_texture (ClutterOffscreenEffect *effect,
gfloat min_width,
gfloat min_height)
{
return cogl_texture_new_with_size (min_width + (2 * BLUR_PADDING),
min_height + (2 * BLUR_PADDING),
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_RGBA_8888_PRE);
}
static void
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect)
{
@ -242,6 +255,26 @@ out:
parent->paint_target (effect);
}
static void
clutter_blur_effect_get_paint_volume (ClutterEffect *effect,
ClutterPaintVolume *volume)
{
gfloat cur_width, cur_height;
ClutterVertex origin;
clutter_paint_volume_get_origin (volume, &origin);
cur_width = clutter_paint_volume_get_width (volume);
cur_height = clutter_paint_volume_get_height (volume);
origin.x -= BLUR_PADDING;
origin.y -= BLUR_PADDING;
cur_width += BLUR_PADDING;
cur_height += BLUR_PADDING;
clutter_paint_volume_set_origin (volume, &origin);
clutter_paint_volume_set_width (volume, cur_width);
clutter_paint_volume_set_height (volume, cur_height);
}
static void
clutter_blur_effect_dispose (GObject *gobject)
{
@ -268,8 +301,10 @@ clutter_blur_effect_class_init (ClutterBlurEffectClass *klass)
gobject_class->dispose = clutter_blur_effect_dispose;
effect_class->pre_paint = clutter_blur_effect_pre_paint;
effect_class->get_paint_volume = clutter_blur_effect_get_paint_volume;
offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
offscreen_class->create_texture = clutter_blur_effect_create_texture;
offscreen_class->paint_target = clutter_blur_effect_paint_target;
}