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:
parent
5d97ca5f87
commit
a6e5ecebe3
@ -49,6 +49,8 @@
|
|||||||
#include "clutter-offscreen-effect.h"
|
#include "clutter-offscreen-effect.h"
|
||||||
#include "clutter-private.h"
|
#include "clutter-private.h"
|
||||||
|
|
||||||
|
#define BLUR_PADDING 2
|
||||||
|
|
||||||
typedef struct _ClutterBlurEffectClass ClutterBlurEffectClass;
|
typedef struct _ClutterBlurEffectClass ClutterBlurEffectClass;
|
||||||
|
|
||||||
/* FIXME - lame shader; we should really have a decoupled
|
/* 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);
|
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
|
static void
|
||||||
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect)
|
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect)
|
||||||
{
|
{
|
||||||
@ -242,6 +255,26 @@ out:
|
|||||||
parent->paint_target (effect);
|
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
|
static void
|
||||||
clutter_blur_effect_dispose (GObject *gobject)
|
clutter_blur_effect_dispose (GObject *gobject)
|
||||||
{
|
{
|
||||||
@ -268,8 +301,10 @@ clutter_blur_effect_class_init (ClutterBlurEffectClass *klass)
|
|||||||
gobject_class->dispose = clutter_blur_effect_dispose;
|
gobject_class->dispose = clutter_blur_effect_dispose;
|
||||||
|
|
||||||
effect_class->pre_paint = clutter_blur_effect_pre_paint;
|
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 = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
|
||||||
|
offscreen_class->create_texture = clutter_blur_effect_create_texture;
|
||||||
offscreen_class->paint_target = clutter_blur_effect_paint_target;
|
offscreen_class->paint_target = clutter_blur_effect_paint_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user