static void gimp_histogram_editor_info_update (GimpHistogramEditor *editor) { GimpHistogramView *view = GIMP_HISTOGRAM_BOX (editor->box)->view; GimpHistogram *hist = editor->histogram; if (hist) { gint n_bins; gdouble pixels; gdouble count; gchar text[12]; n_bins = gimp_histogram_n_bins (hist); pixels = gimp_histogram_get_count (hist, view->channel, 0, n_bins - 1); count = gimp_histogram_get_count (hist, view->channel, view->start, view->end); g_snprintf (text, sizeof (text), "%.3f", gimp_histogram_get_mean (hist, view->channel, view->start, view->end)); gtk_label_set_text (GTK_LABEL (editor->labels[0]), text); g_snprintf (text, sizeof (text), "%.3f", gimp_histogram_get_std_dev (hist, view->channel, view->start, view->end)); gtk_label_set_text (GTK_LABEL (editor->labels[1]), text); g_snprintf (text, sizeof (text), "%.3f", gimp_histogram_get_median (hist, view->channel, view->start, view->end)); gtk_label_set_text (GTK_LABEL (editor->labels[2]), text); g_snprintf (text, sizeof (text), "%d", (gint) pixels); gtk_label_set_text (GTK_LABEL (editor->labels[3]), text); g_snprintf (text, sizeof (text), "%d", (gint) count); gtk_label_set_text (GTK_LABEL (editor->labels[4]), text); g_snprintf (text, sizeof (text), "%.1f", (pixels > 0 ? (100.0 * count / pixels) : 0.0)); gtk_label_set_text (GTK_LABEL (editor->labels[5]), text); } else { gint i; for (i = 0; i < 6; i++) gtk_label_set_text (GTK_LABEL (editor->labels[i]), NULL); } }
gdouble gimp_histogram_get_std_dev (GimpHistogram *histogram, GimpHistogramChannel channel, gint start, gint end) { gint i; gdouble dev = 0.0; gdouble count; gdouble mean; g_return_val_if_fail (histogram != NULL, 0.0); /* the gray alpha channel is in slot 1 */ if (histogram->n_channels == 3 && channel == GIMP_HISTOGRAM_ALPHA) channel = 1; if (! histogram->values || start > end || (channel == GIMP_HISTOGRAM_RGB && histogram->n_channels < 4) || (channel != GIMP_HISTOGRAM_RGB && channel >= histogram->n_channels)) return 0.0; mean = gimp_histogram_get_mean (histogram, channel, start, end); count = gimp_histogram_get_count (histogram, channel, start, end); if (count == 0.0) count = 1.0; for (i = start; i <= end; i++) { gdouble value; if (channel == GIMP_HISTOGRAM_RGB) { value = (HISTOGRAM_VALUE (GIMP_HISTOGRAM_RED, i) + HISTOGRAM_VALUE (GIMP_HISTOGRAM_GREEN, i) + HISTOGRAM_VALUE (GIMP_HISTOGRAM_BLUE, i)); } else { value = gimp_histogram_get_value (histogram, channel, i); } dev += value * SQR (i - mean); } return sqrt (dev / count); }