2006-06-20 Matthew Allum <mallum@openedhand.com>
authorMatthew Allum <mallum@openedhand.com>
Tue, 20 Jun 2006 20:29:45 +0000 (20:29 +0000)
committerMatthew Allum <mallum@openedhand.com>
Tue, 20 Jun 2006 20:29:45 +0000 (20:29 +0000)
        * TODO:
        Update.
        * clutter/clutter-group.c:
        Attempt better group sizing code.
        * clutter/clutter-label.c:
        Minor tweaks.
        * clutter/clutter-texture.c:
        More debug info, make sure texture is realised for base_size()
        * clutter/clutter-video-texture.c:
        Seeking fixes
        * examples/test.c: (main):
        Populate with more randomness.

ChangeLog
TODO
clutter/clutter-group.c
clutter/clutter-label.c
clutter/clutter-main.c
clutter/clutter-texture.c
clutter/clutter-video-texture.c
examples/test.c

index b91c6a5..d1ab06c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2006-06-20  Matthew Allum  <mallum@openedhand.com>
+
+       * TODO:
+       Update.
+       * clutter/clutter-group.c:
+       Attempt better group sizing code. 
+       * clutter/clutter-label.c:
+       Minor tweaks. 
+       * clutter/clutter-texture.c:
+       More debug info, make sure texture is realised for base_size()
+       * clutter/clutter-video-texture.c: 
+       Seeking fixes
+       * examples/test.c: (main):
+       Populate with more randomness.
+
 2006-06-15  Matthew Allum  <mallum@openedhand.com>
 
        * clutter/clutter-stage.c:
diff --git a/TODO b/TODO
index ca57f21..a81533c 100644 (file)
--- a/TODO
+++ b/TODO
@@ -5,6 +5,7 @@ Posiible New Features
 ==
 
  - Gradients
+ - better pangi integration.
  - Audio only object implementing ClutterMedia Interface.
  - Some kind of glitz/cairo integration - a GlitzDrawable Actor ?
  - Improve clutter label usage as to expose more pango functionality.
@@ -16,6 +17,7 @@ Optimisations
 
  - Display lists.
  - labels being more conservative on texture creation.
+   o blitting to textures less
  - Custom source rather than idle handler for paints ?
  
 Other
index 8230cf7..5e32fa9 100644 (file)
@@ -55,9 +55,7 @@ static void
 clutter_group_paint (ClutterActor *actor)
 {
   ClutterGroup *self = CLUTTER_GROUP(actor);
-  GList      *child_item;
-
-  child_item = self->priv->children;
+  GList        *child_item;
 
   glPushMatrix();
 
@@ -74,7 +72,6 @@ clutter_group_paint (ClutterActor *actor)
 
     }
 
-#if 0
   for (child_item = self->priv->children;
        child_item != NULL;
        child_item = child_item->next)
@@ -86,21 +83,6 @@ clutter_group_paint (ClutterActor *actor)
       if (CLUTTER_ACTOR_IS_MAPPED (child))
        clutter_actor_paint (child);
     }
-#endif
-  
-  if (child_item)
-    {
-      do 
-       {
-         ClutterActor *child = CLUTTER_ACTOR(child_item->data);
-             
-         if (CLUTTER_ACTOR_IS_MAPPED (child))
-           {
-             clutter_actor_paint(child);
-           }
-       }
-      while ((child_item = g_list_next(child_item)) != NULL);
-    }
 
   glPopMatrix();
 }
@@ -109,10 +91,60 @@ static void
 clutter_group_request_coords (ClutterActor    *self,
                              ClutterActorBox *box)
 {
-  /* FIXME: what to do here ?
-   *        o clip if smaller ?
-   *        o scale each actor ? 
-  */
+  ClutterGroup   *group = CLUTTER_GROUP(self);
+  guint           cwidth, cheight, width ,height;
+  ClutterActorBox cbox;
+
+  clutter_actor_allocate_coords (self, &cbox);
+
+  cwidth  = cbox.x2 - cbox.x1;
+  cheight = cbox.y2 - cbox.y1;
+
+  /* g_print("cbox x2: %i x1 %i\n", cbox.x2, cbox.x1); */
+
+  width  = box->x2 - box->x1;
+  height = box->y2 - box->y1;
+
+  /* FIXME: below needs work */
+  if (cwidth != width || cheight != height)
+    {
+      GList          *child_item;
+
+      for (child_item = group->priv->children;
+          child_item != NULL;
+          child_item = child_item->next)
+       {
+         ClutterActor   *child = child_item->data;
+         ClutterActorBox tbox;
+         gint            nx, ny;
+         gint            twidth, theight, nwidth, nheight; 
+
+         g_assert (child != NULL);
+
+         clutter_actor_allocate_coords (child, &tbox);
+
+         twidth  = tbox.x2 - tbox.x1;
+         theight = tbox.y2 - tbox.y1;
+         
+         /* g_print("getting ps %ix%i\n", tbox.x1, tbox.y1); */
+
+         nwidth = ( width * twidth ) / cwidth;
+         nheight = ( height * theight ) / cheight;
+
+         nx = ( nwidth  * tbox.x1 ) / twidth ;
+
+         /* g_print("n: %i t %i  x1: %i\n", nwidth, twidth, tbox.x1); */
+
+         ny = ( nheight  * tbox.y1 ) / theight;
+
+         /* g_print("n: %i t %i  x1: %i\n", nheight, theight, tbox.y1); */
+
+         clutter_actor_set_position (child, nx, ny);
+         clutter_actor_set_size (child, nwidth, height);
+
+         /* g_print("size to +%i+%x %ix%i\n", nx, ny, nwidth, nheight); */
+       }
+    }
 }
 
 static void
@@ -132,7 +164,7 @@ clutter_group_allocate_coords (ClutterActor    *self,
        {
          ClutterActor *child = CLUTTER_ACTOR(child_item->data);
              
-         if (CLUTTER_ACTOR_IS_VISIBLE (child))
+         /* if (CLUTTER_ACTOR_IS_VISIBLE (child)) */
            {
              ClutterActorBox cbox;
 
index 9818c69..2159431 100644 (file)
@@ -99,7 +99,10 @@ clutter_label_make_pixbuf (ClutterLabel *label)
                               &h);
 
   if (w == 0 || h == 0)
-    return;
+    {
+      CLUTTER_DBG("aborting w:%i , h:%i", w, h);
+      return;
+    }
 
   ft_bitmap.rows         = h;
   ft_bitmap.width        = w;
@@ -135,8 +138,14 @@ clutter_label_make_pixbuf (ClutterLabel *label)
 
   g_free (ft_bitmap.buffer);
 
-  CLUTTER_DBG("Calling set_pixbuf with text : '%s' , pixb %ix%i", 
-             priv->text, w, h);
+  CLUTTER_DBG("Calling set_pixbuf with text : '%s' , pixb %ix%i"
+             " rendered with color %i,%i,%i,%i", 
+             priv->text, w, h, 
+             priv->fgcol.red,
+             priv->fgcol.green,
+             priv->fgcol.blue,
+             priv->fgcol.alpha);
+
   clutter_texture_set_pixbuf (CLUTTER_TEXTURE (label), pixbuf);
   
   /* Texture has the ref now */
@@ -144,16 +153,6 @@ clutter_label_make_pixbuf (ClutterLabel *label)
 }
 
 static void
-clutter_label_allocate_coords (ClutterActor        *actor,
-                              ClutterActorBox     *box)
-{
-  
-
-
-}
-
-
-static void
 clutter_label_set_property (GObject      *object, 
                            guint         prop_id,
                            const GValue *value, 
@@ -308,9 +307,9 @@ clutter_label_init (ClutterLabel *self)
 
   self->priv = priv = CLUTTER_LABEL_GET_PRIVATE (self);
 
-  priv->fgcol.red = 255;
-  priv->fgcol.green = 255;
-  priv->fgcol.blue = 255;
+  priv->fgcol.red   = 0;
+  priv->fgcol.green = 0;
+  priv->fgcol.blue  = 0;
   priv->fgcol.alpha = 255;
 
   priv->text = NULL;
@@ -339,16 +338,28 @@ clutter_label_init (ClutterLabel *self)
  *
  * Return value: a #ClutterLabel
  */
-ClutterActor *
+ClutterActor*
 clutter_label_new_with_text (const gchar *font_name,
                             const gchar *text)
 {
+  ClutterActor *label;
+
   CLUTTER_MARK();
 
-  return g_object_new (CLUTTER_TYPE_LABEL, 
-                      "font-name", font_name,
-                      "text", text,
-                      NULL);
+  label = clutter_label_new ();
+  clutter_label_set_font_name (CLUTTER_LABEL(label), font_name);
+  clutter_label_set_text (CLUTTER_LABEL(label), text);
+
+  /*  FIXME: Why does calling like;
+   *  return g_object_new (CLUTTER_TYPE_LABEL, 
+   *                  "font-name", font_name,
+   *                  "text", text,
+   *                  NULL);
+   *  mean text does not get rendered without color being set
+   *  ( seems to need extra clutter_label_make_pixbuf() call )
+  */
+
+  return label;
 }
 
 /**
@@ -549,7 +560,7 @@ clutter_label_set_color (ClutterLabel       *label,
   priv->fgcol.alpha = color->alpha;
 
   clutter_label_make_pixbuf (label);
-  
+
   actor = CLUTTER_ACTOR (label);
   clutter_actor_set_opacity (actor, priv->fgcol.alpha);
 
@@ -557,6 +568,7 @@ clutter_label_set_color (ClutterLabel       *label,
     clutter_actor_queue_redraw (actor);
 
   g_object_notify (G_OBJECT (label), "color");
+
 }
 
 /**
index 7fa6dbf..1ea0d2f 100644 (file)
@@ -300,7 +300,6 @@ clutter_redraw (void)
     }
 
 
-
   if (clutter_want_fps ())
     {
       timer_n_frames++;
index 0fa2e72..1a11ef5 100644 (file)
@@ -348,6 +348,7 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
 
   g_return_if_fail (priv->pixbuf != NULL);
 
+
   CLUTTER_MARK();
 
   if (!priv->tiled)
@@ -415,6 +416,8 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
   CLUTTER_DBG("syncing for multiple tiles for %ix%i pixbuf",
              priv->width, priv->height);
 
+  g_return_if_fail (priv->x_tiles != NULL && priv->y_tiles != NULL);
+
   if (priv->tiles == NULL)
     {
       priv->tiles = g_new (GLuint, priv->n_x_tiles * priv->n_y_tiles);
@@ -466,6 +469,7 @@ clutter_texture_sync_pixbuf (ClutterTexture *texture)
                             pixtmp,
                             0,0);
 
+
 #ifdef CLUTTER_DUMP_TILES
        {
          gchar  *filename;
@@ -576,6 +580,7 @@ clutter_texture_paint (ClutterActor *self)
 {
   ClutterTexture *texture = CLUTTER_TEXTURE(self);
   gint            x1, y1, x2, y2;
+  guint8          opacity;
 
   CLUTTER_DBG("@@@ for '%s' @@@", 
              clutter_actor_get_name(self) ? 
@@ -586,7 +591,10 @@ clutter_texture_paint (ClutterActor *self)
   glEnable(GL_TEXTURE_2D);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-  glColor4ub(255, 255, 255, clutter_actor_get_opacity(self));
+  opacity = clutter_actor_get_opacity(self);
+
+  CLUTTER_DBG("setting opacity to %i\n", opacity);
+  glColor4ub(255, 255, 255, opacity);
 
   clutter_actor_get_coords (self, &x1, &y1, &x2, &y2);
   texture_render_to_gl_quad (texture, x1, y1, x2, y2);
@@ -1050,6 +1058,13 @@ clutter_texture_get_base_size (ClutterTexture *texture,
                               gint           *width,
                               gint           *height)
 {
+  /* Attempt to realize, mainly for subclasses ( such as labels )
+   * which maynot create pixbuf data and thus base size until
+   * realization happens.
+  */
+  if (!CLUTTER_ACTOR_IS_REALIZED(CLUTTER_ACTOR(texture)))
+    clutter_actor_realize (CLUTTER_ACTOR(texture));
+
   if (width)
     *width = texture->priv->width;
 
index 09388c3..cbab84e 100644 (file)
@@ -232,6 +232,7 @@ set_position (ClutterMedia *media,
 {
   ClutterVideoTexture        *video_texture = CLUTTER_VIDEO_TEXTURE(media);
   ClutterVideoTexturePrivate *priv; 
+  GstState                    state, pending;
 
   g_return_if_fail (CLUTTER_IS_VIDEO_TEXTURE (video_texture));
 
@@ -240,6 +241,13 @@ set_position (ClutterMedia *media,
   if (!priv->playbin)
     return;
 
+  gst_element_get_state (priv->playbin, &state, &pending, 0);
+
+  if (pending)
+    state = pending;
+
+  gst_element_set_state (priv->playbin, GST_STATE_PAUSED);
+
   gst_element_seek (priv->playbin,
                    1.0,
                    GST_FORMAT_TIME,
@@ -247,6 +255,8 @@ set_position (ClutterMedia *media,
                    GST_SEEK_TYPE_SET,
                    position * GST_SECOND,
                    0, 0);
+
+  gst_element_set_state (priv->playbin, state);
 }
 
 static int
index c77cacb..60d5a45 100644 (file)
@@ -1,54 +1,40 @@
 #include <clutter/clutter.h>
 
-guint8 opacity = 255;
+#define PARA_TEXT "This is a paragraph of text to check both" \
+                  "word wrapping and basic clipping."
 
-gboolean 
-timeout_cb (gpointer data)
+void
+rect_cb (ClutterTimeline *timeline, 
+        gint             frame_num, 
+        gpointer         data)
 {
-  ClutterActor *actor;
+  ClutterActor *rect = CLUTTER_ACTOR(data);
+  gint          x, y;
+  static gint   direction = 1;
 
-  actor = CLUTTER_ACTOR(data);
+  x = clutter_actor_get_x (rect);
+  y = clutter_actor_get_y (rect);
 
-  if (opacity > 0)
-    {
-      clutter_actor_set_opacity (actor, opacity);
-      opacity -= 2;
-    }
-  else opacity = 0xff;
+  if (x > (CLUTTER_STAGE_WIDTH() - 200))
+    direction = -1;
+      
+  if (x < 100)
+    direction = 1;
 
-  return TRUE;
-}
+  x += direction;
 
-gboolean 
-timeout_text_cb (gpointer data)
-{
-  ClutterLabel *label;
-  gchar buf[32];
-
-  label = CLUTTER_LABEL(data);
-
-  g_snprintf(buf, 32, "--> %i <--", opacity);
-
-  if (opacity > 0)
-    {
-      clutter_label_set_text(label, buf);
-      clutter_actor_set_opacity (CLUTTER_ACTOR(label), opacity);
-      opacity -= 2;
-    }
-  else opacity = 0xff;
-
-
-
-  return TRUE;
+  clutter_actor_set_position (rect, x, y);
 }
 
+
 void
-frame_cb (ClutterTimeline *timeline, 
-         gint             frame_num, 
-         gpointer         data)
+text_cb (ClutterTimeline *timeline, 
+        gint             frame_num, 
+        gpointer         data)
 {
   ClutterLabel *label;
   gchar buf[32];
+  gint  opacity;
 
   label = CLUTTER_LABEL(data);
 
@@ -57,7 +43,7 @@ frame_cb (ClutterTimeline *timeline,
   g_snprintf(buf, 32, "--> %i <--", frame_num);
 
   clutter_label_set_text (label, buf);
-  clutter_actor_set_opacity (CLUTTER_ACTOR(label), opacity); 
+  // clutter_actor_set_opacity (CLUTTER_ACTOR(label), opacity); 
 
   clutter_actor_rotate_z (CLUTTER_ACTOR(label),
                            frame_num,
@@ -65,12 +51,22 @@ frame_cb (ClutterTimeline *timeline,
                            clutter_actor_get_height (CLUTTER_ACTOR(label))/2);
 }
 
+void
+para_cb (ClutterTimeline *timeline, 
+        gint             frame_num, 
+        gpointer         data)
+{
+  
+
+}
+
 int
 main (int argc, char *argv[])
 {
-  ClutterActor  *texture, *label;
-  ClutterActor  *stage;
+  ClutterActor    *texture, *label, *rect, *para;
+  ClutterActor    *stage;
   ClutterTimeline *timeline;
+  ClutterColor     rect_col = { 0xff, 0x0, 0x0, 0xff };
   GdkPixbuf       *pixbuf;
 
   clutter_init (&argc, &argv);
@@ -84,17 +80,22 @@ main (int argc, char *argv[])
 
   texture = clutter_texture_new_from_pixbuf (pixbuf);
 
-  printf("***********foo***********\n");
+  label = clutter_label_new_with_text("Sans Bold 32", "hello");
 
-  label = clutter_label_new_with_text("Sans Bold 72", "Clutter\nOpened\nHand");
+  clutter_actor_set_opacity (CLUTTER_ACTOR(label), 0x99);
+  clutter_actor_set_position (CLUTTER_ACTOR(label), 550, 100);
 
-  printf("***********foo***********\n");
+  rect = clutter_rectangle_new_with_color(&rect_col);
+  clutter_actor_set_size(rect, 100, 100);
+  clutter_actor_set_position(rect, 100, 100);
 
-  clutter_actor_set_opacity (CLUTTER_ACTOR(label), 0x99);
-  clutter_actor_set_position (CLUTTER_ACTOR(label), 100, 200);
+  para = clutter_label_new_with_text ("Sans 24", PARA_TEXT);
+  clutter_actor_set_position(para, 10, 10);
 
   clutter_group_add (CLUTTER_GROUP (stage), texture);
   clutter_group_add (CLUTTER_GROUP (stage), label);
+  clutter_group_add (CLUTTER_GROUP (stage), rect);
+  clutter_group_add (CLUTTER_GROUP (stage), para);
 
   clutter_actor_set_size (CLUTTER_ACTOR (stage), 800, 600);
 
@@ -102,7 +103,17 @@ main (int argc, char *argv[])
 
   timeline = clutter_timeline_new (360, 200);
   g_object_set (timeline, "loop", TRUE, 0);
-  g_signal_connect (timeline, "new-frame", G_CALLBACK (frame_cb), label);
+  g_signal_connect (timeline, "new-frame", G_CALLBACK (text_cb), label);
+  clutter_timeline_start (timeline);
+
+  timeline = clutter_timeline_new (1, 30);
+  g_object_set (timeline, "loop", TRUE, 0);
+  g_signal_connect (timeline, "new-frame", G_CALLBACK (rect_cb), rect);
+  clutter_timeline_start (timeline);
+
+  timeline = clutter_timeline_new (1, 10);
+  g_object_set (timeline, "loop", TRUE, 0);
+  g_signal_connect (timeline, "new-frame", G_CALLBACK (para_cb), rect);
   clutter_timeline_start (timeline);
 
   clutter_main();