From 4f5d3e00dba57f048ac212915a34cabe40890e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 4 Sep 2013 17:53:41 +0200 Subject: [PATCH] st: Add StScrollViewFade:fade-edges Add a new property which controls whether edge areas are excluded from the effect (the default and current behavior), or not. https://bugzilla.gnome.org/show_bug.cgi?id=707409 --- src/st/st-scroll-view-fade.c | 38 ++++++++++++++++++++++++++++++++- src/st/st-scroll-view-fade.glsl | 13 +++++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/st/st-scroll-view-fade.c b/src/st/st-scroll-view-fade.c index 202897dc4..71ad3ce8f 100644 --- a/src/st/st-scroll-view-fade.c +++ b/src/st/st-scroll-view-fade.c @@ -49,6 +49,8 @@ struct _StScrollViewFade StAdjustment *vadjustment; StAdjustment *hadjustment; + guint fade_edges : 1; + float vfade_offset; float hfade_offset; }; @@ -66,7 +68,8 @@ enum { PROP_0, PROP_VFADE_OFFSET, - PROP_HFADE_OFFSET + PROP_HFADE_OFFSET, + PROP_FADE_EDGES }; static CoglHandle @@ -151,6 +154,7 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect) clutter_shader_effect_set_uniform (shader, "tex", G_TYPE_INT, 1, 0); clutter_shader_effect_set_uniform (shader, "height", G_TYPE_FLOAT, 1, clutter_actor_get_height (self->actor)); clutter_shader_effect_set_uniform (shader, "width", G_TYPE_FLOAT, 1, clutter_actor_get_width (self->actor)); + clutter_shader_effect_set_uniform (shader, "fade_edges", G_TYPE_INT, 1, self->fade_edges); clutter_shader_effect_set_uniform (shader, "fade_area_topleft", CLUTTER_TYPE_SHADER_FLOAT, 2, fade_area_topleft); clutter_shader_effect_set_uniform (shader, "fade_area_bottomright", CLUTTER_TYPE_SHADER_FLOAT, 2, fade_area_bottomright); @@ -292,6 +296,24 @@ st_scroll_view_hfade_set_offset (StScrollViewFade *self, g_object_thaw_notify (G_OBJECT (self)); } +static void +st_scroll_view_fade_set_fade_edges (StScrollViewFade *self, + gboolean fade_edges) +{ + if (self->fade_edges == fade_edges) + return; + + g_object_freeze_notify (G_OBJECT (self)); + + self->fade_edges = fade_edges; + + if (self->actor != NULL) + clutter_actor_queue_redraw (self->actor); + + g_object_notify (G_OBJECT (self), "fade-edges"); + g_object_thaw_notify (G_OBJECT (self)); +} + static void st_scroll_view_fade_set_property (GObject *object, guint prop_id, @@ -308,6 +330,9 @@ st_scroll_view_fade_set_property (GObject *object, case PROP_HFADE_OFFSET: st_scroll_view_hfade_set_offset (self, g_value_get_float (value)); break; + case PROP_FADE_EDGES: + st_scroll_view_fade_set_fade_edges (self, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -330,6 +355,9 @@ st_scroll_view_fade_get_property (GObject *object, case PROP_VFADE_OFFSET: g_value_set_float (value, self->vfade_offset); break; + case PROP_FADE_EDGES: + g_value_set_boolean (value, self->fade_edges); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -371,6 +399,14 @@ st_scroll_view_fade_class_init (StScrollViewFadeClass *klass) "The width of the area which is faded at the edge", 0.f, G_MAXFLOAT, DEFAULT_FADE_OFFSET, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_FADE_EDGES, + g_param_spec_boolean ("fade-edges", + "Fade Edges", + "Whether the faded area should extend to the edges", + FALSE, + G_PARAM_READWRITE)); + } diff --git a/src/st/st-scroll-view-fade.glsl b/src/st/st-scroll-view-fade.glsl index 810adcdc1..629c0143d 100644 --- a/src/st/st-scroll-view-fade.glsl +++ b/src/st/st-scroll-view-fade.glsl @@ -24,6 +24,7 @@ uniform float vfade_offset; uniform float hfade_offset; uniform float vvalue; uniform float hvalue; +uniform bool fade_edges; uniform vec2 fade_area_topleft; uniform vec2 fade_area_bottomright; @@ -44,10 +45,14 @@ void main () float ratio = 1.0; float fade_bottom_start = fade_area_bottomright[1] - vfade_offset; float fade_right_start = fade_area_bottomright[0] - hfade_offset; - bool fade_top = y < vfade_offset && vvalue > 0.0; - bool fade_bottom = y > fade_bottom_start && vvalue < 1.0; - bool fade_left = x < hfade_offset && hvalue > 0.0; - bool fade_right = x > fade_right_start && hvalue < 1.0; + bool fade_top = y < vfade_offset && (fade_edges ? vvalue >= 0.0 + : vvalue > 0.0); + bool fade_bottom = y > fade_bottom_start && (fade_edges ? vvalue <= 1.0 + : vvalue < 1.0); + bool fade_left = x < hfade_offset && (fade_edges ? hvalue >= 0.0 + : hvalue > 0.0); + bool fade_right = x > fade_right_start && (fade_edges ? hvalue <= 1.0 + : hvalue < 1.0); float vfade_scale = height / vfade_offset; if (fade_top) {