Author: post
Date: 2012-01-05 22:21:02 +0100 (Thu, 05 Jan 2012)
New Revision: 4090

Modified:
   trunk/librawstudio/rs-settings.c
   trunk/librawstudio/rs-settings.h
Log:
Add function to get update time when applying settings.

Modified: trunk/librawstudio/rs-settings.c
===================================================================
--- trunk/librawstudio/rs-settings.c    2012-01-05 19:57:29 UTC (rev 4089)
+++ trunk/librawstudio/rs-settings.c    2012-01-05 21:21:02 UTC (rev 4090)
@@ -35,6 +35,7 @@
 
 static void get_property (GObject *object, guint property_id, GValue *value, 
GParamSpec *pspec);
 static void set_property (GObject *object, guint property_id, const GValue 
*value, GParamSpec *pspec);
+static void rs_settings_update_settings(RSSettings *settings, const 
RSSettingsMask changed_mask);
 
 static void
 rs_settings_finalize (GObject *object)
@@ -343,11 +344,70 @@
                if (settings->commit > 0)
                        settings->commit_todo |= changed_mask;
                else
-                       g_signal_emit(settings, signals[SETTINGS_CHANGED], 0, 
changed_mask);
+                       rs_settings_update_settings(settings, changed_mask);
        }
 }
 
+static gfloat timespent[16];
+static gint timed_count = 0;
+static gint next_timing = 0;
+
 /**
+ * Sends updates of an RSSettings, and times the operation
+ * @param settings An RSSettings
+ * @param mask A mask for indicating the changed values 
+ */
+static void
+rs_settings_update_settings(RSSettings *settings, const RSSettingsMask 
changed_mask)
+{
+       GTimer *gt = g_timer_new();
+       g_signal_emit(settings, signals[SETTINGS_CHANGED], 0, changed_mask);
+       gfloat time = g_timer_elapsed(gt, NULL);
+
+       if (time > 0.001)
+       {
+               timespent[next_timing] = time;
+               next_timing = (next_timing + 1) & 15;
+               if (timed_count < 16)
+                       timed_count++;
+               g_debug("Time: %d", (int)(time*1000.0));
+       }
+       g_timer_destroy(gt);
+}
+
+static int
+compare_floats(gconstpointer a, gconstpointer b)
+{
+       if (*(gfloat*)a < *(gfloat*)b)
+               return -1;
+       if (*(gfloat*)a > *(gfloat*)b)
+               return 1;
+       return 0;
+}
+
+/**
+ * Returns the 50% median time used for updating the last 16 settings.
+ * Returns -1 if there hasn't been 16 updates yet.
+ */
+gint
+rs_get_median_update_time()
+{
+       int i;
+
+       if (timed_count < 16)
+               return -1;
+
+       GList *sorted = NULL;
+       for (i = 0; i < 16; i++)
+       {
+               sorted = g_list_insert_sorted(sorted, &timespent[(i + 
next_timing) & 15], compare_floats);
+       }
+       gfloat median = *(gfloat*)g_list_nth_data(sorted, 7);
+       g_list_free(sorted);
+       return (int)(median * 1000.0);
+}
+
+/**
  * Reset a RSSettings
  * @param settings A RSSettings
  * @param mask A mask for only resetting some values 
@@ -458,7 +518,7 @@
        /* If this is the last nested commit, do the todo */
        if ((settings->commit == 1) && (settings->commit_todo != 0))
        {
-               g_signal_emit(settings, signals[SETTINGS_CHANGED], 0, 
settings->commit_todo);
+               rs_settings_update_settings(settings, settings->commit_todo);
        }
 
        /* Make sure we never go below 0 */
@@ -543,7 +603,7 @@
 
        /* Emit seignal if needed */
        if (changed_mask > 0)
-               g_signal_emit(target, signals[SETTINGS_CHANGED], 0, 
changed_mask);
+               rs_settings_update_settings(target, changed_mask);
 
        return changed_mask;
 }
@@ -566,7 +626,7 @@
        settings->curve_knots = g_memdup(knots, sizeof(gfloat)*2*nknots);
        settings->curve_nknots = nknots;
 
-       g_signal_emit(settings, signals[SETTINGS_CHANGED], 0, MASK_CURVE);
+       rs_settings_update_settings(settings, MASK_CURVE);
 }
 
 /**

Modified: trunk/librawstudio/rs-settings.h
===================================================================
--- trunk/librawstudio/rs-settings.h    2012-01-05 19:57:29 UTC (rev 4089)
+++ trunk/librawstudio/rs-settings.h    2012-01-05 21:21:02 UTC (rev 4090)
@@ -175,6 +175,12 @@
  */
 extern void rs_settings_unlink(RSSettings *source, RSSettings *target);
 
+/**
+ * Returns the 50% median time used for updating the last 16 settings.
+ * Returns -1 if there hasn't been 16 updates yet.
+ */
+extern gint rs_get_median_update_time();
+
 G_END_DECLS
 
 #endif /* RS_SETTINGS_H */


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to