blur-effect: Use macros for subclassing boilerplate

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
This commit is contained in:
Bilal Elmoussaoui 2023-11-11 09:26:06 +01:00
parent 9bd12d7e88
commit 764c3ef602
3 changed files with 33 additions and 36 deletions

View File

@ -31,7 +31,6 @@
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBlurEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBoxLayout, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBoxLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBrightnessContrastEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBrightnessContrastEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref)

View File

@ -30,11 +30,6 @@
* #ClutterBlurEffect is a sub-class of #ClutterEffect that allows blurring a * #ClutterBlurEffect is a sub-class of #ClutterEffect that allows blurring a
* actor and its contents. * actor and its contents.
*/ */
#define CLUTTER_BLUR_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BLUR_EFFECT, ClutterBlurEffectClass))
#define CLUTTER_IS_BLUR_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BLUR_EFFECT))
#define CLUTTER_BLUR_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BLUR_EFFECT, ClutterBlurEffectClass))
#include "config.h" #include "config.h"
#include "clutter/clutter-blur-effect.h" #include "clutter/clutter-blur-effect.h"
@ -42,7 +37,6 @@
#include "cogl/cogl.h" #include "cogl/cogl.h"
#include "clutter/clutter-debug.h" #include "clutter/clutter-debug.h"
#include "clutter/clutter-offscreen-effect.h"
#include "clutter/clutter-private.h" #include "clutter/clutter-private.h"
#define BLUR_PADDING 2 #define BLUR_PADDING 2
@ -68,26 +62,18 @@ static const gchar *box_blur_glsl_shader =
" cogl_texel /= 9.0;\n"; " cogl_texel /= 9.0;\n";
#undef SAMPLE #undef SAMPLE
struct _ClutterBlurEffect typedef struct _ClutterBlurEffectPrivate
{ {
ClutterOffscreenEffect parent_instance;
/* a back pointer to our actor, so that we can query it */ /* a back pointer to our actor, so that we can query it */
ClutterActor *actor; ClutterActor *actor;
gint pixel_step_uniform; gint pixel_step_uniform;
CoglPipeline *pipeline; CoglPipeline *pipeline;
}; } ClutterBlurEffectPrivate;
struct _ClutterBlurEffectClass
{
ClutterOffscreenEffectClass parent_class;
CoglPipeline *base_pipeline; G_DEFINE_TYPE_WITH_PRIVATE (ClutterBlurEffect,
};
G_DEFINE_TYPE (ClutterBlurEffect,
clutter_blur_effect, clutter_blur_effect,
CLUTTER_TYPE_OFFSCREEN_EFFECT); CLUTTER_TYPE_OFFSCREEN_EFFECT);
@ -96,8 +82,10 @@ clutter_blur_effect_create_pipeline (ClutterOffscreenEffect *effect,
CoglTexture *texture) CoglTexture *texture)
{ {
ClutterBlurEffect *blur_effect = CLUTTER_BLUR_EFFECT (effect); ClutterBlurEffect *blur_effect = CLUTTER_BLUR_EFFECT (effect);
ClutterBlurEffectPrivate *priv =
clutter_blur_effect_get_instance_private (blur_effect);
if (blur_effect->pixel_step_uniform > -1) if (priv->pixel_step_uniform > -1)
{ {
float pixel_step[2]; float pixel_step[2];
int tex_width, tex_height; int tex_width, tex_height;
@ -108,16 +96,16 @@ clutter_blur_effect_create_pipeline (ClutterOffscreenEffect *effect,
pixel_step[0] = 1.0f / tex_width; pixel_step[0] = 1.0f / tex_width;
pixel_step[1] = 1.0f / tex_height; pixel_step[1] = 1.0f / tex_height;
cogl_pipeline_set_uniform_float (blur_effect->pipeline, cogl_pipeline_set_uniform_float (priv->pipeline,
blur_effect->pixel_step_uniform, priv->pixel_step_uniform,
2, /* n_components */ 2, /* n_components */
1, /* count */ 1, /* count */
pixel_step); pixel_step);
} }
cogl_pipeline_set_layer_texture (blur_effect->pipeline, 0, texture); cogl_pipeline_set_layer_texture (priv->pipeline, 0, texture);
return g_object_ref (blur_effect->pipeline); return g_object_ref (priv->pipeline);
} }
static gboolean static gboolean
@ -146,8 +134,10 @@ static void
clutter_blur_effect_dispose (GObject *gobject) clutter_blur_effect_dispose (GObject *gobject)
{ {
ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (gobject); ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (gobject);
ClutterBlurEffectPrivate *priv =
clutter_blur_effect_get_instance_private (self);
g_clear_object (&self->pipeline); g_clear_object (&priv->pipeline);
G_OBJECT_CLASS (clutter_blur_effect_parent_class)->dispose (gobject); G_OBJECT_CLASS (clutter_blur_effect_parent_class)->dispose (gobject);
} }
@ -171,6 +161,8 @@ static void
clutter_blur_effect_init (ClutterBlurEffect *self) clutter_blur_effect_init (ClutterBlurEffect *self)
{ {
ClutterBlurEffectClass *klass = CLUTTER_BLUR_EFFECT_GET_CLASS (self); ClutterBlurEffectClass *klass = CLUTTER_BLUR_EFFECT_GET_CLASS (self);
ClutterBlurEffectPrivate *priv =
clutter_blur_effect_get_instance_private (self);
if (G_UNLIKELY (klass->base_pipeline == NULL)) if (G_UNLIKELY (klass->base_pipeline == NULL))
{ {
@ -190,10 +182,10 @@ clutter_blur_effect_init (ClutterBlurEffect *self)
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0);
} }
self->pipeline = cogl_pipeline_copy (klass->base_pipeline); priv->pipeline = cogl_pipeline_copy (klass->base_pipeline);
self->pixel_step_uniform = priv->pixel_step_uniform =
cogl_pipeline_get_uniform_location (self->pipeline, "pixel_step"); cogl_pipeline_get_uniform_location (priv->pipeline, "pixel_step");
} }
/** /**

View File

@ -29,18 +29,24 @@
#endif #endif
#include "clutter/clutter-effect.h" #include "clutter/clutter-effect.h"
#include "clutter/clutter-offscreen-effect.h"
G_BEGIN_DECLS G_BEGIN_DECLS
#define CLUTTER_TYPE_BLUR_EFFECT (clutter_blur_effect_get_type ()) #define CLUTTER_TYPE_BLUR_EFFECT (clutter_blur_effect_get_type ())
#define CLUTTER_BLUR_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BLUR_EFFECT, ClutterBlurEffect))
#define CLUTTER_IS_BLUR_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BLUR_EFFECT))
typedef struct _ClutterBlurEffect ClutterBlurEffect;
typedef struct _ClutterBlurEffectClass ClutterBlurEffectClass;
CLUTTER_EXPORT CLUTTER_EXPORT
GType clutter_blur_effect_get_type (void) G_GNUC_CONST; G_DECLARE_DERIVABLE_TYPE (ClutterBlurEffect,
clutter_blur_effect,
CLUTTER, BLUR_EFFECT,
ClutterOffscreenEffect)
struct _ClutterBlurEffectClass
{
ClutterOffscreenEffectClass parent_class;
CoglPipeline *base_pipeline;
};
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterEffect *clutter_blur_effect_new (void); ClutterEffect *clutter_blur_effect_new (void);