[timeline] Create markers hash tables on demand
authorEmmanuele Bassi <ebassi@linux.intel.com>
Fri, 23 Jan 2009 17:17:36 +0000 (17:17 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Tue, 27 Jan 2009 09:51:45 +0000 (09:51 +0000)
Since not every timeline will have markers it's unfair to make
all of them crete two empty hash tables (with a preallocated
fixed size).

This commit moves the responsibility of creating the hash tables
to the marker API itself, and adds the relative checks.

clutter/clutter-timeline.c

index e1cf2c1..637b794 100644 (file)
@@ -318,8 +318,11 @@ clutter_timeline_finalize (GObject *object)
 {
   ClutterTimelinePrivate *priv = CLUTTER_TIMELINE (object)->priv;
 
-  g_hash_table_destroy (priv->markers_by_frame);
-  g_hash_table_destroy (priv->markers_by_name);
+  if (priv->markers_by_frame)
+    g_hash_table_destroy (priv->markers_by_frame);
+
+  if (priv->markers_by_name)
+    g_hash_table_destroy (priv->markers_by_name);
 
   G_OBJECT_CLASS (clutter_timeline_parent_class)->finalize (object);
 }
@@ -565,18 +568,13 @@ clutter_timeline_init (ClutterTimeline *self)
 {
   ClutterTimelinePrivate *priv;
 
-  self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
-                                                   CLUTTER_TYPE_TIMELINE,
-                                                   ClutterTimelinePrivate);
+  self->priv = priv =
+    G_TYPE_INSTANCE_GET_PRIVATE (self, CLUTTER_TYPE_TIMELINE,
+                                 ClutterTimelinePrivate);
 
   priv->fps = clutter_get_default_frame_rate ();
   priv->n_frames = 0;
   priv->msecs_delta = 0;
-
-  priv->markers_by_frame = g_hash_table_new (NULL, NULL);
-  priv->markers_by_name = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                 NULL,
-                                                 timeline_marker_free);
 }
 
 static void
@@ -588,12 +586,17 @@ emit_frame_signal (ClutterTimeline *timeline)
   g_signal_emit (timeline, timeline_signals[NEW_FRAME], 0,
                  priv->current_frame_num);
 
+  if (priv->markers_by_name == NULL ||
+      priv->markers_by_frame == NULL)
+    return;
+
   for (i = priv->skipped_frames; i >= 0; i--)
     {
-      gint frame_num = priv->current_frame_num
-        + (priv->direction == CLUTTER_TIMELINE_FORWARD ? -i : i);
+      gint frame_num;
       GSList *markers, *l;
 
+      frame_num = priv->current_frame_num
+                + (priv->direction == CLUTTER_TIMELINE_FORWARD ? -i : i);
       markers = g_hash_table_lookup (priv->markers_by_frame,
                                      GUINT_TO_POINTER (frame_num));
       for (l = markers; l; l = l->next)
@@ -1485,6 +1488,15 @@ clutter_timeline_add_marker_internal (ClutterTimeline *timeline,
   TimelineMarker *marker;
   GSList *markers;
 
+  if (G_UNLIKELY (priv->markers_by_name == NULL ||
+                  priv->markers_by_frame == NULL))
+    {
+      priv->markers_by_name = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                                     NULL,
+                                                     timeline_marker_free);
+      priv->markers_by_frame = g_hash_table_new (NULL, NULL);
+    }
+
   marker = g_hash_table_lookup (priv->markers_by_name, marker_name);
   if (G_UNLIKELY (marker))
     {
@@ -1600,6 +1612,12 @@ clutter_timeline_list_markers (ClutterTimeline *timeline,
 
   priv = timeline->priv;
 
+  if (G_UNLIKELY (priv->markers_by_name == NULL ||
+                  priv->markers_by_frame == NULL))
+    {
+      return NULL;
+    }
+
   if (frame_num < 0)
     {
       GList *markers, *l;
@@ -1651,6 +1669,13 @@ clutter_timeline_advance_to_marker (ClutterTimeline *timeline,
 
   priv = timeline->priv;
 
+  if (G_UNLIKELY (priv->markers_by_name == NULL ||
+                  priv->markers_by_frame == NULL))
+    {
+      g_warning ("No marker named `%s' found.", marker_name);
+      return;
+    }
+
   marker = g_hash_table_lookup (priv->markers_by_name, marker_name);
   if (!marker)
     {
@@ -1683,6 +1708,13 @@ clutter_timeline_remove_marker (ClutterTimeline *timeline,
 
   priv = timeline->priv;
 
+  if (G_UNLIKELY (priv->markers_by_name == NULL ||
+                  priv->markers_by_frame == NULL))
+    {
+      g_warning ("No marker named `%s' found.", marker_name);
+      return;
+    }
+
   marker = g_hash_table_lookup (priv->markers_by_name, marker_name);
   if (!marker)
     {
@@ -1737,6 +1769,10 @@ clutter_timeline_has_marker (ClutterTimeline *timeline,
   g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), FALSE);
   g_return_val_if_fail (marker_name != NULL, FALSE);
 
+  if (G_UNLIKELY (timeline->priv->markers_by_name == NULL ||
+                  timeline->priv->markers_by_frame == NULL))
+    return FALSE;
+
   return NULL != g_hash_table_lookup (timeline->priv->markers_by_name,
                                       marker_name);
 }