On 04/09/2013 07:45 PM, Daniel P. Berrange wrote:
The other usages of the preferences has the application context
attached to the data structure, which isn't the case here. Should we
do the same here ?

You shouldn't!  The entangle-camera-manager code should use the
preference to set a property on the entangle-image-histogram
class to toggle drawing modes.  See also how we deal with
preferences for image display aspect ratio / masks. This keeps
the widget nicely separated from the preferences code.


Ah, much better - thanks Daniel !

Rebased, but not squashed such that you can see the delta in 0002.

I added a keyboard shortcut 'h' as a toggle.

Best regards,
 Jesper


>From 325558e3c651c7c0db2bfb34c400846d1b17a67f Mon Sep 17 00:00:00 2001
From: Jesper Pedersen <[email protected]>
Date: Tue, 9 Apr 2013 16:48:19 -0400
Subject: [PATCH 1/2] Support for linear histogram

---
 src/backend/entangle-preferences.c          | 50 +++++++++++++++++++++++++++++
 src/backend/entangle-preferences.h          |  2 ++
 src/frontend/entangle-image-histogram.c     | 13 +++++---
 src/frontend/entangle-preferences-display.c | 25 +++++++++++++++
 src/frontend/entangle-preferences.xml       | 16 +++++++++
 src/org.entangle-photo.manager.gschema.xml  |  7 +++-
 6 files changed, 107 insertions(+), 6 deletions(-)

diff --git a/src/backend/entangle-preferences.c b/src/backend/entangle-preferences.c
index 94e2c9f..ad8ae6e 100644
--- a/src/backend/entangle-preferences.c
+++ b/src/backend/entangle-preferences.c
@@ -51,6 +51,7 @@ G_DEFINE_TYPE(EntanglePreferences, entangle_preferences, G_TYPE_OBJECT);
 #define SETTING_INTERFACE_AUTO_CONNECT     "auto-connect"
 #define SETTING_INTERFACE_SCREEN_BLANK     "screen-blank"
 #define SETTING_INTERFACE_PLUGINS          "plugins"
+#define SETTING_INTERFACE_HISTOGRAM_LINEAR "histogram-linear"
 
 #define SETTING_CAPTURE_FILENAME_PATTERN   "filename-pattern"
 #define SETTING_CAPTURE_LAST_SESSION       "last-session"
@@ -72,8 +73,10 @@ G_DEFINE_TYPE(EntanglePreferences, entangle_preferences, G_TYPE_OBJECT);
 #define SETTING_IMG_ONION_SKIN             "onion-skin"
 #define SETTING_IMG_ONION_LAYERS           "onion-layers"
 
+
 #define PROP_NAME_INTERFACE_AUTO_CONNECT     SETTING_INTERFACE "-" SETTING_INTERFACE_AUTO_CONNECT
 #define PROP_NAME_INTERFACE_SCREEN_BLANK     SETTING_INTERFACE "-" SETTING_INTERFACE_SCREEN_BLANK
+#define PROP_NAME_INTERFACE_HISTOGRAM_LINEAR SETTING_INTERFACE "-" SETTING_INTERFACE_HISTOGRAM_LINEAR
 
 #define PROP_NAME_CAPTURE_FILENAME_PATTERN   SETTING_CAPTURE "-" SETTING_CAPTURE_FILENAME_PATTERN
 #define PROP_NAME_CAPTURE_LAST_SESSION       SETTING_CAPTURE "-" SETTING_CAPTURE_LAST_SESSION
@@ -100,6 +103,7 @@ enum {
 
     PROP_INTERFACE_AUTO_CONNECT,
     PROP_INTERFACE_SCREEN_BLANK,
+    PROP_INTERFACE_HISTOGRAM_LINEAR,
 
     PROP_CAPTURE_FILENAME_PATTERN,
     PROP_CAPTURE_LAST_SESSION,
@@ -172,6 +176,12 @@ static void entangle_preferences_get_property(GObject *object,
                                                        SETTING_INTERFACE_SCREEN_BLANK));
             break;
 
+        case PROP_INTERFACE_HISTOGRAM_LINEAR:
+            g_value_set_boolean(value,
+                                g_settings_get_boolean(priv->interfaceSettings,
+                                                       SETTING_INTERFACE_HISTOGRAM_LINEAR));
+            break;
+
         case PROP_CAPTURE_LAST_SESSION:
             dir = g_settings_get_string(priv->captureSettings,
                                         SETTING_CAPTURE_LAST_SESSION);
@@ -316,6 +326,12 @@ static void entangle_preferences_set_property(GObject *object,
                                    g_value_get_boolean(value));
             break;
 
+        case PROP_INTERFACE_HISTOGRAM_LINEAR:
+            g_settings_set_boolean(priv->interfaceSettings,
+                                   SETTING_INTERFACE_HISTOGRAM_LINEAR,
+                                   g_value_get_boolean(value));
+            break;
+
         case PROP_CAPTURE_LAST_SESSION:
             g_settings_set_string(priv->captureSettings,
                                   SETTING_CAPTURE_LAST_SESSION,
@@ -484,6 +500,17 @@ static void entangle_preferences_class_init(EntanglePreferencesClass *klass)
                                                          G_PARAM_STATIC_BLURB));
 
     g_object_class_install_property(object_class,
+                                    PROP_INTERFACE_HISTOGRAM_LINEAR,
+                                    g_param_spec_boolean(PROP_NAME_INTERFACE_HISTOGRAM_LINEAR,
+                                                         "Linear histogram",
+                                                         "Use linear histogram",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE |
+                                                         G_PARAM_STATIC_NAME |
+                                                         G_PARAM_STATIC_NICK |
+                                                         G_PARAM_STATIC_BLURB));
+
+    g_object_class_install_property(object_class,
                                     PROP_CAPTURE_LAST_SESSION,
                                     g_param_spec_string(PROP_NAME_CAPTURE_LAST_SESSION,
                                                         "Pictures directory",
@@ -771,6 +798,29 @@ void entangle_preferences_interface_set_screen_blank(EntanglePreferences *prefs,
 }
 
 
+gboolean entangle_preferences_interface_get_histogram_linear(EntanglePreferences *prefs)
+{
+    g_return_val_if_fail(ENTANGLE_IS_PREFERENCES(prefs), FALSE);
+
+    EntanglePreferencesPrivate *priv = prefs->priv;
+
+    return g_settings_get_boolean(priv->interfaceSettings,
+                                  SETTING_INTERFACE_HISTOGRAM_LINEAR);
+}
+
+
+void entangle_preferences_interface_set_histogram_linear(EntanglePreferences *prefs, gboolean enabled)
+{
+    g_return_if_fail(ENTANGLE_IS_PREFERENCES(prefs));
+
+    EntanglePreferencesPrivate *priv = prefs->priv;
+
+    g_settings_set_boolean(priv->interfaceSettings,
+                           SETTING_INTERFACE_HISTOGRAM_LINEAR, enabled);
+    g_object_notify(G_OBJECT(prefs), PROP_NAME_INTERFACE_HISTOGRAM_LINEAR);
+}
+
+
 gchar **entangle_preferences_interface_get_plugins(EntanglePreferences *prefs)
 {
     g_return_val_if_fail(ENTANGLE_IS_PREFERENCES(prefs), NULL);
diff --git a/src/backend/entangle-preferences.h b/src/backend/entangle-preferences.h
index 4911a0c..a7697a8 100644
--- a/src/backend/entangle-preferences.h
+++ b/src/backend/entangle-preferences.h
@@ -64,6 +64,8 @@ void entangle_preferences_interface_set_screen_blank(EntanglePreferences *prefs,
 gchar **entangle_preferences_interface_get_plugins(EntanglePreferences *prefs);
 void entangle_preferences_interface_add_plugin(EntanglePreferences *prefs, const char *name);
 void entangle_preferences_interface_remove_plugin(EntanglePreferences *prefs, const char *name);
+gboolean entangle_preferences_interface_get_histogram_linear(EntanglePreferences *prefs);
+void entangle_preferences_interface_set_histogram_linear(EntanglePreferences *prefs, gboolean enabled);
 
 char *entangle_preferences_capture_get_last_session(EntanglePreferences *prefs);
 void entangle_preferences_capture_set_last_session(EntanglePreferences *prefs, const gchar *dir);
diff --git a/src/frontend/entangle-image-histogram.c b/src/frontend/entangle-image-histogram.c
index a44b6aa..340f845 100644
--- a/src/frontend/entangle-image-histogram.c
+++ b/src/frontend/entangle-image-histogram.c
@@ -58,6 +58,7 @@ static void do_entangle_pixmap_setup(EntangleImageHistogram *histogram)
 
     if (priv->image)
         pixbuf = entangle_image_get_pixbuf(priv->image);
+
     memset(priv->freq_red, 0, sizeof(priv->freq_red));
     memset(priv->freq_green, 0, sizeof(priv->freq_green));
     memset(priv->freq_blue, 0, sizeof(priv->freq_blue));
@@ -71,9 +72,9 @@ static void do_entangle_pixmap_setup(EntangleImageHistogram *histogram)
     guint w = gdk_pixbuf_get_width(pixbuf);
     guint h = gdk_pixbuf_get_height(pixbuf);
     guint stride = gdk_pixbuf_get_rowstride(pixbuf);
+    gboolean use_linear = FALSE;
     int x, y;
 
-
     for (y = 0 ; y < h ; y++) {
         guchar *pixel = pixels;
         for (x = 0 ; x < w ; x++) {
@@ -91,10 +92,12 @@ static void do_entangle_pixmap_setup(EntangleImageHistogram *histogram)
         pixels += stride;
     }
 
-    for (x = 0 ; x < 255 ; x++) {
-        priv->freq_red[x] = DOUBLE_EQUAL(priv->freq_red[x], 0.0) ? 0.0 : log(priv->freq_red[x]);
-        priv->freq_green[x] = DOUBLE_EQUAL(priv->freq_green[x], 0.0) ? 0.0 : log(priv->freq_green[x]);
-        priv->freq_blue[x] = DOUBLE_EQUAL(priv->freq_blue[x], 0.0) ? 0.0 : log(priv->freq_blue[x]);
+    if (!use_linear) {
+        for (x = 0 ; x < 255 ; x++) {
+            priv->freq_red[x] = DOUBLE_EQUAL(priv->freq_red[x], 0.0) ? 0.0 : log(priv->freq_red[x]);
+            priv->freq_green[x] = DOUBLE_EQUAL(priv->freq_green[x], 0.0) ? 0.0 : log(priv->freq_green[x]);
+            priv->freq_blue[x] = DOUBLE_EQUAL(priv->freq_blue[x], 0.0) ? 0.0 : log(priv->freq_blue[x]);
+        }
     }
 
     priv->hasFreq = TRUE;
diff --git a/src/frontend/entangle-preferences-display.c b/src/frontend/entangle-preferences-display.c
index 43f609c..dde1d7f 100644
--- a/src/frontend/entangle-preferences-display.c
+++ b/src/frontend/entangle-preferences-display.c
@@ -69,6 +69,7 @@ void do_cms_rendering_intent_changed(GtkComboBox *src, EntanglePreferencesDispla
 
 void do_interface_auto_connect_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *display);
 void do_interface_screen_blank_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *display);
+void do_interface_histogram_linear_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *display);
 
 void do_capture_filename_pattern_changed(GtkEntry *src, EntanglePreferencesDisplay *display);
 void do_capture_continuous_preview_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *display);
@@ -194,6 +195,15 @@ static void entangle_preferences_display_notify(GObject *object,
 
         if (newvalue != oldvalue)
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp), newvalue);
+    } else if (strcmp(spec->name, "interface-histogram-linear") == 0) {
+        gboolean newvalue;
+        gboolean oldvalue;
+
+        g_object_get(object, spec->name, &newvalue, NULL);
+        oldvalue = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tmp));
+
+        if (newvalue != oldvalue)
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp), newvalue);
     } else if (strcmp(spec->name, "capture-filename-pattern") == 0) {
         gchar *newvalue;
         const gchar *oldvalue;
@@ -402,6 +412,9 @@ static void entangle_preferences_display_refresh(EntanglePreferencesDisplay *pre
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp), entangle_preferences_interface_get_auto_connect(prefs));
     tmp = GTK_WIDGET(gtk_builder_get_object(priv->builder, "interface-screen-blank"));
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp), entangle_preferences_interface_get_screen_blank(prefs));
+    tmp = GTK_WIDGET(gtk_builder_get_object(priv->builder, "interface-histogram-linear"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp),
+                                 entangle_preferences_interface_get_histogram_linear(prefs));
 
     tmp = GTK_WIDGET(gtk_builder_get_object(priv->builder, "capture-filename-pattern"));
     gtk_entry_set_text(GTK_ENTRY(tmp), entangle_preferences_capture_get_filename_pattern(prefs));
@@ -688,6 +701,18 @@ void do_interface_screen_blank_toggled(GtkToggleButton *src, EntanglePreferences
 }
 
 
+void do_interface_histogram_linear_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *preferences)
+{
+    g_return_if_fail(ENTANGLE_IS_PREFERENCES_DISPLAY(preferences));
+
+    EntanglePreferencesDisplayPrivate *priv = preferences->priv;
+    EntanglePreferences *prefs = entangle_application_get_preferences(priv->application);
+    gboolean enabled = gtk_toggle_button_get_active(src);
+
+    entangle_preferences_interface_set_histogram_linear(prefs, enabled);
+}
+
+
 void do_capture_delete_file_toggled(GtkToggleButton *src, EntanglePreferencesDisplay *preferences)
 {
     g_return_if_fail(ENTANGLE_IS_PREFERENCES_DISPLAY(preferences));
diff --git a/src/frontend/entangle-preferences.xml b/src/frontend/entangle-preferences.xml
index 6533dfe..4b47186 100644
--- a/src/frontend/entangle-preferences.xml
+++ b/src/frontend/entangle-preferences.xml
@@ -636,6 +636,22 @@
                                 <property name="bottom_attach">2</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkCheckButton" id="interface-histogram-linear">
+                                <property name="label" translatable="yes">Show linear histogram</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                                <signal name="toggled" handler="do_interface_histogram_linear_toggled" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="expand">True</property>
diff --git a/src/org.entangle-photo.manager.gschema.xml b/src/org.entangle-photo.manager.gschema.xml
index 436173b..2183112 100644
--- a/src/org.entangle-photo.manager.gschema.xml
+++ b/src/org.entangle-photo.manager.gschema.xml
@@ -37,6 +37,12 @@
       <description>Blank screen while capturing images</description>
     </key>
 
+    <key type="b" name="histogram-linear">
+      <default>false</default>
+      <summary>Show linear histogram</summary>
+      <description>Show linear histogram instead of logarithmic</description>
+    </key>
+
     <key type="as" name="plugins">
       <default>[]</default>
       <summary>Plugins</summary>
@@ -150,6 +156,5 @@
       <summary>Onion skin</summary>
       <description>Enable image overlay display</description>
     </key>
-
   </schema>
 </schemalist>
-- 
1.8.1.4

>From fbbcf62210551acfca89923a493306fafd8f5f27 Mon Sep 17 00:00:00 2001
From: Jesper Pedersen <[email protected]>
Date: Sat, 13 Apr 2013 09:35:14 -0400
Subject: [PATCH 2/2] Finish support for linear histogram

---
 README                                  |  1 +
 src/frontend/entangle-camera-manager.c  | 23 ++++++++++-
 src/frontend/entangle-image-histogram.c | 68 ++++++++++++++++++++++++---------
 src/frontend/entangle-image-histogram.h |  4 ++
 4 files changed, 77 insertions(+), 19 deletions(-)

diff --git a/README b/README
index f851a9d..a7f96a5 100644
--- a/README
+++ b/README
@@ -79,6 +79,7 @@ There are a number of shortcuts available for common operations
  - 'p' - Toggle 'live view' preview mode
  - 'esc' - Cancel the current operation
  - 'm' - Toggle aspect ratio image mask
+ - 'h' - Toggle linear / logarithmic histogram
  - 'a' - Drive autofocus during preview
  - ',' or '.' - Drive manual focus during preview
 
diff --git a/src/frontend/entangle-camera-manager.c b/src/frontend/entangle-camera-manager.c
index 8ccee7a..74a00fc 100644
--- a/src/frontend/entangle-camera-manager.c
+++ b/src/frontend/entangle-camera-manager.c
@@ -344,6 +344,18 @@ static void entangle_camera_manager_update_mask_enabled(EntangleCameraManager *m
 }
 
 
+static void entangle_camera_manager_update_histogram_linear(EntangleCameraManager *manager)
+{
+    g_return_if_fail(ENTANGLE_IS_CAMERA_MANAGER(manager));
+
+    EntangleCameraManagerPrivate *priv = manager->priv;
+    EntanglePreferences *prefs = entangle_application_get_preferences(priv->application);
+    gboolean histogram_linear = entangle_preferences_interface_get_histogram_linear(prefs);
+
+    entangle_image_histogram_set_histogram_linear(priv->imageHistogram, histogram_linear);
+}
+
+
 static void do_presentation_monitor_toggled(GtkCheckMenuItem *menu, gpointer data)
 {
     g_return_if_fail(ENTANGLE_IS_CAMERA_MANAGER(data));
@@ -440,7 +452,9 @@ static void entangle_camera_manager_prefs_changed(GObject *object G_GNUC_UNUSED,
 
     EntangleCameraManager *manager = ENTANGLE_CAMERA_MANAGER(data);
 
-    if (g_str_equal(spec->name, "cms-enabled") ||
+    if (g_str_equal(spec->name, "interface-histogram-linear")) {
+        entangle_camera_manager_update_histogram_linear(manager);
+    } else if (g_str_equal(spec->name, "cms-enabled") ||
         g_str_equal(spec->name, "cms-rgb-profile") ||
         g_str_equal(spec->name, "cms-monitor-profile") ||
         g_str_equal(spec->name, "cms-detect-system-profile") ||
@@ -1541,6 +1555,7 @@ static void entangle_camera_manager_set_property(GObject *object,
             directory = entangle_preferences_capture_get_last_session(prefs);
             pattern = entangle_preferences_capture_get_filename_pattern(prefs);
 
+            entangle_camera_manager_update_histogram_linear(manager);
             entangle_camera_manager_update_colour_transform(manager);
             entangle_camera_manager_update_aspect_ratio(manager);
             entangle_camera_manager_update_mask_opacity(manager);
@@ -2154,6 +2169,12 @@ gboolean do_manager_key_release(GtkWidget *widget G_GNUC_UNUSED,
         entangle_preferences_img_set_mask_enabled(prefs, !enabled);
     }   break;
 
+    case GDK_KEY_h: {
+        EntanglePreferences *prefs = entangle_application_get_preferences(priv->application);
+        gboolean linear = entangle_preferences_interface_get_histogram_linear(prefs);
+        entangle_preferences_interface_set_histogram_linear(prefs, !linear);
+    }   break;
+
     case GDK_KEY_a: {
         if (priv->taskPreview) {
             entangle_camera_autofocus_async(priv->camera,
diff --git a/src/frontend/entangle-image-histogram.c b/src/frontend/entangle-image-histogram.c
index 340f845..c62cab6 100644
--- a/src/frontend/entangle-image-histogram.c
+++ b/src/frontend/entangle-image-histogram.c
@@ -35,6 +35,7 @@ struct _EntangleImageHistogramPrivate {
     double freq_green[255];
     double freq_blue[255];
     gboolean hasFreq;
+    gboolean linear;
     gulong imageNotifyID;
     EntangleImage *image;
 };
@@ -72,7 +73,6 @@ static void do_entangle_pixmap_setup(EntangleImageHistogram *histogram)
     guint w = gdk_pixbuf_get_width(pixbuf);
     guint h = gdk_pixbuf_get_height(pixbuf);
     guint stride = gdk_pixbuf_get_rowstride(pixbuf);
-    gboolean use_linear = FALSE;
     int x, y;
 
     for (y = 0 ; y < h ; y++) {
@@ -92,14 +92,6 @@ static void do_entangle_pixmap_setup(EntangleImageHistogram *histogram)
         pixels += stride;
     }
 
-    if (!use_linear) {
-        for (x = 0 ; x < 255 ; x++) {
-            priv->freq_red[x] = DOUBLE_EQUAL(priv->freq_red[x], 0.0) ? 0.0 : log(priv->freq_red[x]);
-            priv->freq_green[x] = DOUBLE_EQUAL(priv->freq_green[x], 0.0) ? 0.0 : log(priv->freq_green[x]);
-            priv->freq_blue[x] = DOUBLE_EQUAL(priv->freq_blue[x], 0.0) ? 0.0 : log(priv->freq_blue[x]);
-        }
-    }
-
     priv->hasFreq = TRUE;
 }
 
@@ -176,6 +168,17 @@ static void entangle_image_histogram_draw_grid(cairo_t *cr, const float width, c
     }
 }
 
+
+static double entangle_image_histogram_calculate_value(double d, gboolean l)
+{
+    if (!l) {
+        return DOUBLE_EQUAL(d, 0.0) ? 0.0 : log(d);
+    }
+
+    return d;
+}
+
+
 static gboolean entangle_image_histogram_draw(GtkWidget *widget, cairo_t *cr)
 {
     g_return_val_if_fail(ENTANGLE_IS_IMAGE_HISTOGRAM(widget), FALSE);
@@ -205,12 +208,16 @@ static gboolean entangle_image_histogram_draw(GtkWidget *widget, cairo_t *cr)
 
     if (priv->hasFreq) {
         for (idx = 0 ; idx < 255 ; idx++) {
-            if (priv->freq_red[idx] > peak)
-                peak = priv->freq_red[idx];
-            if (priv->freq_green[idx] > peak)
-                peak = priv->freq_green[idx];
-            if (priv->freq_blue[idx] > peak)
-                peak = priv->freq_blue[idx];
+            double rv = entangle_image_histogram_calculate_value(priv->freq_red[idx], priv->linear);
+            double gv = entangle_image_histogram_calculate_value(priv->freq_green[idx], priv->linear);
+            double bv = entangle_image_histogram_calculate_value(priv->freq_blue[idx], priv->linear);
+
+            if (rv > peak)
+                peak = rv;
+            if (gv > peak)
+                peak = gv;
+            if (bv > peak)
+                peak = bv;
         }
         cairo_set_line_width(cr, 3);
         cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
@@ -223,8 +230,9 @@ static gboolean entangle_image_histogram_draw(GtkWidget *widget, cairo_t *cr)
         cairo_move_to(cr, 0, wh);
 
         for (idx = 0 ; idx < 255 ; idx++) {
+            double rv = entangle_image_histogram_calculate_value(priv->freq_red[idx], priv->linear);
             double x = (double)ww * (double)idx / 255.0;
-            double y = (double)(wh - 2) * (double)priv->freq_red[idx] / peak;
+            double y = (double)(wh - 2) * (double)rv / peak;
 
             cairo_line_to(cr, x, wh - y);
         }
@@ -239,8 +247,9 @@ static gboolean entangle_image_histogram_draw(GtkWidget *widget, cairo_t *cr)
         cairo_move_to(cr, 0, wh);
 
         for (idx = 0 ; idx < 255 ; idx++) {
+            double gv = entangle_image_histogram_calculate_value(priv->freq_green[idx], priv->linear);
             double x = (double)ww * (double)idx / 255.0;
-            double y = (double)(wh - 2) * (double)priv->freq_green[idx] / peak;
+            double y = (double)(wh - 2) * (double)gv / peak;
 
             cairo_line_to(cr, x, wh - y);
         }
@@ -255,8 +264,9 @@ static gboolean entangle_image_histogram_draw(GtkWidget *widget, cairo_t *cr)
         cairo_move_to(cr, 0, wh);
 
         for (idx = 0 ; idx < 255 ; idx++) {
+            double bv = entangle_image_histogram_calculate_value(priv->freq_blue[idx], priv->linear);
             double x = (double)ww * (double)idx / 255.0;
-            double y = (double)(wh - 2) * (double)priv->freq_blue[idx] / peak;
+            double y = (double)(wh - 2) * (double)bv / peak;
 
             cairo_line_to(cr, x, wh - y);
         }
@@ -389,6 +399,28 @@ EntangleImage *entangle_image_histogram_get_image(EntangleImageHistogram *histog
     return priv->image;
 }
 
+
+void entangle_image_histogram_set_histogram_linear(EntangleImageHistogram *histogram, gboolean linear)
+{
+    g_return_if_fail(ENTANGLE_IS_IMAGE_HISTOGRAM(histogram));
+
+    EntangleImageHistogramPrivate *priv = histogram->priv;
+
+    priv->linear = linear;
+
+    gtk_widget_queue_draw(GTK_WIDGET(histogram));
+}
+
+
+gboolean entangle_image_histogram_get_histogram_linear(EntangleImageHistogram *histogram)
+{
+    g_return_val_if_fail(ENTANGLE_IS_IMAGE_HISTOGRAM(histogram), FALSE);
+
+    EntangleImageHistogramPrivate *priv = histogram->priv;
+
+    return priv->linear;
+}
+
 /*
  * Local variables:
  *  c-indent-level: 4
diff --git a/src/frontend/entangle-image-histogram.h b/src/frontend/entangle-image-histogram.h
index c2e7a67..f6eaaf2 100644
--- a/src/frontend/entangle-image-histogram.h
+++ b/src/frontend/entangle-image-histogram.h
@@ -60,6 +60,10 @@ void entangle_image_histogram_set_image(EntangleImageHistogram *histogram,
                                         EntangleImage *image);
 EntangleImage *entangle_image_histogram_get_image(EntangleImageHistogram *histogram);
 
+void entangle_image_histogram_set_histogram_linear(EntangleImageHistogram *histogram,
+                                                   gboolean linear);
+gboolean entangle_image_histogram_get_histogram_linear(EntangleImageHistogram *histogram);
+
 G_END_DECLS
 
 #endif /* __ENTANGLE_IMAGE_HISTOGRAM_H__ */
-- 
1.8.1.4

_______________________________________________
Entangle-devel mailing list
[email protected]
https://mail.gna.org/listinfo/entangle-devel

Reply via email to