summaryrefslogtreecommitdiff
path: root/clutter
diff options
context:
space:
mode:
authorMatthew Allum <mallum@openedhand.com>2007-01-04 19:56:01 +0000
committerMatthew Allum <mallum@openedhand.com>2007-01-04 19:56:01 +0000
commit83700e97c7d24ff4dc29acc6a7c8c0e834584593 (patch)
treef140a32fcb07ec1a18b51127a7ef8fbdfdaa47b9 /clutter
parent02753452715651df4fa6c370bf98df2504665d04 (diff)
downloadclutter-83700e97c7d24ff4dc29acc6a7c8c0e834584593.tar.gz
2007-01-04 Matthew Allum <mallum@openedhand.com>
* clutter/clutter-actor.c: * clutter/clutter-actor.h: Add new set_width/height API calls. Tweak scaling by reseting matrix. Make set_opactiy() take parent opacity into account. Fix clipping. * clutter/clutter-alpha.c: Add more sine functionality. * clutter/clutter-behaviour-opacity.c: Dont make a copy of all applied actors but use a foreach() * clutter/clutter-behaviour-scale.c: Give correct limits to propertys. Tweak gravity a little more. Update docs. : * clutter/clutter-behaviour.c: (clutter_behaviour_remove): Minor warning text change. * clutter/clutter-feature.c: (clutter_feature_wait_for_vblank): Minor dri ioctl tweak. * clutter/clutter-label.c: * clutter/clutter-label.h: Add new label_full api call.
Diffstat (limited to 'clutter')
-rw-r--r--clutter/clutter-actor.c58
-rw-r--r--clutter/clutter-actor.h8
-rw-r--r--clutter/clutter-alpha.c59
-rw-r--r--clutter/clutter-behaviour-opacity.c24
-rw-r--r--clutter/clutter-behaviour-scale.c13
-rw-r--r--clutter/clutter-behaviour.c6
-rw-r--r--clutter/clutter-feature.c1
-rw-r--r--clutter/clutter-label.c25
-rw-r--r--clutter/clutter-label.h5
-rw-r--r--clutter/clutter-main.c1
10 files changed, 156 insertions, 44 deletions
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index f086bcc9c..dd991b961 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -361,18 +361,20 @@ clutter_actor_paint (ClutterActor *self)
{
ClutterGeometry *clip = &(self->priv->clip);
- glClearStencil (0.0f);
glEnable (GL_STENCIL_TEST);
+ glClearStencil (0.0f);
+ glClear(GL_STENCIL_BUFFER_BIT);
+
glStencilFunc (GL_NEVER, 0x1, 0x1);
glStencilOp (GL_INCR, GL_INCR, GL_INCR);
+
glColor3f(1.0f, 1.0f, 1.0f);
- /* render clip geomerty */
- glRecti (self->priv->coords.x1 + clip->x,
- self->priv->coords.y1 + clip->y,
- self->priv->coords.x1 + clip->x + clip->width,
- self->priv->coords.y1 + clip->y + clip->height);
+ glRecti (clip->x,
+ clip->y,
+ clip->x + clip->width,
+ clip->y + clip->height);
glStencilFunc (GL_EQUAL, 0x1, 0x1);
glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
@@ -386,6 +388,11 @@ clutter_actor_paint (ClutterActor *self)
glDisable (GL_STENCIL_TEST);
}
+ if (self->priv->scale_x != CFX_ONE || self->priv->scale_y != CFX_ONE)
+ {
+ glScaled (1.0, 1.0, 1.0);
+ }
+
glPopMatrix();
}
@@ -1226,6 +1233,41 @@ clutter_actor_get_height (ClutterActor *self)
}
/**
+ * clutter_actor_set_width
+ * @self: A #ClutterActor
+ * @width: Requested new width for actor
+ *
+ * Requests a new width for actor
+ *
+ * since: 2.0
+ **/
+void
+clutter_actor_set_width (ClutterActor *self, guint width)
+{
+ clutter_actor_set_size (self,
+ width,
+ clutter_actor_get_height (self));
+}
+
+/**
+ * clutter_actor_set_height
+ * @self: A #ClutterActor
+ * @height: Requested new height for actor
+ *
+ * Requests a new height for actor
+ *
+ * since: 2.0
+ **/
+void
+clutter_actor_set_height (ClutterActor *self, guint height)
+{
+ clutter_actor_set_size (self,
+ clutter_actor_get_width (self),
+ height);
+}
+
+
+/**
* clutter_actor_get_x
* @self: A #ClutterActor
*
@@ -1390,9 +1432,9 @@ clutter_actor_get_opacity (ClutterActor *self)
parent = self->priv->parent_actor;
- /* FIXME: need to factor in the actual actors opacity with parents */
+ /* Factor in the actual actors opacity with parents */
if (parent && clutter_actor_get_opacity (parent) != 0xff)
- return clutter_actor_get_opacity(parent);
+ return (clutter_actor_get_opacity(parent) * self->priv->opacity) / 0xff;
return self->priv->opacity;
}
diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h
index 20ca4f70b..5c338cbfa 100644
--- a/clutter/clutter-actor.h
+++ b/clutter/clutter-actor.h
@@ -172,6 +172,14 @@ void clutter_actor_get_abs_position (ClutterActor *sel
gint *y);
guint clutter_actor_get_width (ClutterActor *self);
guint clutter_actor_get_height (ClutterActor *self);
+
+void clutter_actor_set_width (ClutterActor *self,
+ guint width);
+
+void clutter_actor_set_height (ClutterActor *self,
+ guint height);
+
+
gint clutter_actor_get_x (ClutterActor *self);
gint clutter_actor_get_y (ClutterActor *self);
void clutter_actor_rotate_x (ClutterActor *self,
diff --git a/clutter/clutter-alpha.c b/clutter/clutter-alpha.c
index 16275b0a9..68248f4f8 100644
--- a/clutter/clutter-alpha.c
+++ b/clutter/clutter-alpha.c
@@ -491,6 +491,30 @@ clutter_ramp_func (ClutterAlpha *alpha,
}
}
+static guint32
+sinc_func (ClutterAlpha *alpha,
+ float angle,
+ float offset)
+{
+ ClutterTimeline *timeline;
+ gint current_frame_num, n_frames;
+ gdouble x, sine;
+
+ timeline = clutter_alpha_get_timeline (alpha);
+
+ current_frame_num = clutter_timeline_get_current_frame (timeline);
+ n_frames = clutter_timeline_get_n_frames (timeline);
+
+ /* FIXME: fixed point, and fixed point sine() */
+
+ x = (gdouble) (current_frame_num * angle * M_PI) / n_frames ;
+ sine = (sin (x - (M_PI / angle)) + offset) * 0.5f;
+
+ CLUTTER_NOTE (ALPHA, "sine: %2f\n", sine);
+
+ return (guint32) (sine * (gdouble) CLUTTER_ALPHA_MAX_ALPHA);
+}
+
/**
* clutter_sine_func:
* @alpha: a #ClutterAlpha
@@ -507,21 +531,24 @@ guint32
clutter_sine_func (ClutterAlpha *alpha,
gpointer dummy)
{
- ClutterTimeline *timeline;
- gint current_frame_num, n_frames;
- gdouble x, sine;
-
- timeline = clutter_alpha_get_timeline (alpha);
-
- current_frame_num = clutter_timeline_get_current_frame (timeline);
- n_frames = clutter_timeline_get_n_frames (timeline);
-
- /* FIXME: fixed point, and fixed point sine() */
-
- x = (gdouble) (current_frame_num * 2.0f * M_PI) / n_frames ;
- sine = (sin (x - (M_PI / 2.0f)) + 1.0f) * 0.5f;
-
- CLUTTER_NOTE (ALPHA, "sine: %2f\n", sine);
+ return sinc_func (alpha, 2.0, 1.0);
+}
- return (guint32) (sine * (gdouble) CLUTTER_ALPHA_MAX_ALPHA);
+/**
+ * clutter_sine_inc_func:
+ * @alpha: a #ClutterAlpha
+ * @dummy: unused argument
+ *
+ * Convenience alpha function for a sine wave. You can use this
+ * function as the alpha function for clutter_alpha_set_func().
+ *
+ * Return value: an alpha value.
+ *
+ * Since: 0.2
+ */
+guint32
+clutter_sine_inc_func (ClutterAlpha *alpha,
+ gpointer dummy)
+{
+ return sinc_func (alpha, 0.5, 1.0);
}
diff --git a/clutter/clutter-behaviour-opacity.c b/clutter/clutter-behaviour-opacity.c
index 3f257447a..3a0c5fba9 100644
--- a/clutter/clutter-behaviour-opacity.c
+++ b/clutter/clutter-behaviour-opacity.c
@@ -78,20 +78,23 @@ enum
PROP_OPACITY_END
};
+static void
+alpha_notify_foreach (ClutterBehaviour *behaviour,
+ ClutterActor *actor,
+ gpointer data)
+{
+ clutter_actor_set_opacity (actor, GPOINTER_TO_INT(data));
+}
+
static void
clutter_behaviour_alpha_notify (ClutterBehaviour *behave,
guint32 alpha_value)
{
- GSList *actors, *l;
guint8 opacity;
ClutterBehaviourOpacityPrivate *priv;
priv = CLUTTER_BEHAVIOUR_OPACITY (behave)->priv;
- actors = clutter_behaviour_get_actors (behave);
- if (!actors)
- return;
-
opacity = alpha_value
* (priv->opacity_end - priv->opacity_start)
/ CLUTTER_ALPHA_MAX_ALPHA;
@@ -100,14 +103,9 @@ clutter_behaviour_alpha_notify (ClutterBehaviour *behave,
alpha_value,
opacity);
- for (l = actors; l; l = l->next)
- {
- ClutterActor *actor = l->data;
-
- clutter_actor_set_opacity (actor, opacity);
- }
-
- g_slist_free (actors);
+ clutter_behaviour_actors_foreach (behave,
+ alpha_notify_foreach,
+ GINT_TO_POINTER((gint)opacity));
}
static void
diff --git a/clutter/clutter-behaviour-scale.c b/clutter/clutter-behaviour-scale.c
index 1530987f0..07a26e065 100644
--- a/clutter/clutter-behaviour-scale.c
+++ b/clutter/clutter-behaviour-scale.c
@@ -118,7 +118,10 @@ scale_frame_foreach (ClutterBehaviour *behaviour,
break;
case CLUTTER_GRAVITY_CENTER:
CLUTTER_NOTE (MISC, "gravity %i vs %i\n", sw, w);
- clutter_actor_move_by (actor, sw - w, sh - h);
+ /*
+ * FIXME: This is actually broken for anything other than 0,0
+ */
+ clutter_actor_set_position (actor, (w - sw)/2, (h - sh)/2);
default:
break;
}
@@ -223,7 +226,7 @@ clutter_behaviour_scale_class_init (ClutterBehaviourScaleClass *klass)
g_param_spec_double ("scale-begin",
"Scale Begin",
"Initial scale",
- 1.0, G_MAXDOUBLE,
+ 0.0, G_MAXDOUBLE,
1.0,
CLUTTER_PARAM_READWRITE));
/**
@@ -238,7 +241,7 @@ clutter_behaviour_scale_class_init (ClutterBehaviourScaleClass *klass)
g_param_spec_double ("scale-end",
"Scale End",
"Final scale",
- 1.0, G_MAXDOUBLE,
+ 0.0, G_MAXDOUBLE,
1.0,
CLUTTER_PARAM_READWRITE));
/**
@@ -276,7 +279,7 @@ clutter_behaviour_scale_init (ClutterBehaviourScale *self)
* @alpha: a #ClutterAlpha
* @scale_begin: initial scale factor
* @scale_end: final scale factor
- * @gravity: FIXME
+ * @gravity: FIXME: Not currently implemented
*
* Creates a new #ClutterBehaviourScale instance.
*
@@ -301,7 +304,7 @@ clutter_behaviour_scale_new (ClutterAlpha *alpha,
* @alpha: a #ClutterAlpha
* @scale_begin: initial scale factor
* @scale_end: final scale factor
- * @gravity: FIXME
+ * @gravity: FIXME: Not currently implemented
*
* A fixed point implementation of clutter_behaviour_scale_new()
*
diff --git a/clutter/clutter-behaviour.c b/clutter/clutter-behaviour.c
index 88ef626b2..535aec941 100644
--- a/clutter/clutter-behaviour.c
+++ b/clutter/clutter-behaviour.c
@@ -233,7 +233,7 @@ clutter_behaviour_remove (ClutterBehaviour *behave,
if (!g_slist_find (behave->priv->actors, actor))
{
- g_warning ("The behaviour of type %s does not apply "
+ g_warning ("The behaviour of type %s is not applied "
"to the actor of type %s",
g_type_name (G_OBJECT_TYPE (behave)),
g_type_name (G_OBJECT_TYPE (actor)));
@@ -378,7 +378,9 @@ clutter_behaviour_set_alpha (ClutterBehaviour *behave,
* clutter_behaviour_get_actors:
* @behave: a #ClutterBehaviour
*
- * Retrieves all the actors to which @behave applies.
+ * Retrieves all the actors to which @behave applies. It is not recommended
+ * derived classes use this in there alpha notify method but use
+ * #clutter_behaviour_actors_foreach as it avoids alot of needless allocations.
*
* Return value: a list of actors. You should free the returned list
* with g_slist_free() when finished using it.
diff --git a/clutter/clutter-feature.c b/clutter/clutter-feature.c
index f7f083bb2..f11cc83cb 100644
--- a/clutter/clutter-feature.c
+++ b/clutter/clutter-feature.c
@@ -381,6 +381,7 @@ clutter_feature_wait_for_vblank (void)
drm_wait_vblank_t blank;
blank.request.type = DRM_VBLANK_RELATIVE;
blank.request.sequence = 1;
+ blank.request.signal = 0;
drm_wait_vblank (__features->dri_fd, &blank);
}
break;
diff --git a/clutter/clutter-label.c b/clutter/clutter-label.c
index b3e502feb..492514c41 100644
--- a/clutter/clutter-label.c
+++ b/clutter/clutter-label.c
@@ -485,6 +485,31 @@ clutter_label_new_with_text (const gchar *font_name,
}
/**
+ * clutter_label_new_full:
+ * @font_name: the name (and size) of the font to be used
+ * @text: the text to be displayed
+ * @color: #ClutterColor for text
+ *
+ * Creates a new #ClutterLabel displaying @text with color @color
+ * using @font_name.
+ *
+ * Return value: a #ClutterLabel
+ */
+ClutterActor*
+clutter_label_new_full (const gchar *font_name,
+ const gchar *text,
+ ClutterColor *color)
+{
+ /* FIXME: really new_with_text should take color argument... */
+ ClutterActor *label;
+
+ label = clutter_label_new_with_text (font_name, text);
+ clutter_label_set_color (CLUTTER_LABEL(label), color);
+
+ return label;
+}
+
+/**
* clutter_label_new:
*
* Creates a new, empty #ClutterLabel.
diff --git a/clutter/clutter-label.h b/clutter/clutter-label.h
index d2c5dbd46..6712f9b0c 100644
--- a/clutter/clutter-label.h
+++ b/clutter/clutter-label.h
@@ -81,6 +81,11 @@ struct _ClutterLabelClass
GType clutter_label_get_type (void) G_GNUC_CONST;
ClutterActor * clutter_label_new (void);
+
+ClutterActor* clutter_label_new_full (const gchar *font_name,
+ const gchar *text,
+ ClutterColor *color);
+
ClutterActor * clutter_label_new_with_text (const gchar *font_name,
const gchar *text);
void clutter_label_set_text (ClutterLabel *label,
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index e0d65d7e8..df26b152b 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -307,6 +307,7 @@ clutter_redraw (void)
((float) stage_color.blue / 0xff * 1.0),
0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);