108
object_class->get_property = gimp_histogram_view_get_property;
109
object_class->set_property = gimp_histogram_view_set_property;
112
object_class->finalize = gimp_histogram_view_finalize;
113
object_class->get_property = gimp_histogram_view_get_property;
114
object_class->set_property = gimp_histogram_view_set_property;
111
116
widget_class->size_request = gimp_histogram_view_size_request;
112
117
widget_class->expose_event = gimp_histogram_view_expose;
114
119
widget_class->button_release_event = gimp_histogram_view_button_release;
115
120
widget_class->motion_notify_event = gimp_histogram_view_motion_notify;
117
klass->range_changed = NULL;
122
klass->range_changed = NULL;
119
124
g_object_class_install_property (object_class, PROP_CHANNEL,
120
125
g_param_spec_enum ("histogram-channel",
150
155
gimp_histogram_view_init (GimpHistogramView *view)
152
view->histogram = NULL;
157
view->histogram = NULL;
158
view->bg_histogram = NULL;
164
gimp_histogram_view_finalize (GObject *object)
166
GimpHistogramView *view = GIMP_HISTOGRAM_VIEW (object);
170
gimp_histogram_unref (view->histogram);
171
view->histogram = NULL;
174
if (view->bg_histogram)
176
gimp_histogram_unref (view->bg_histogram);
177
view->bg_histogram = NULL;
180
G_OBJECT_CLASS (parent_class)->finalize (object);
228
256
gimp_histogram_view_get_maximum (GimpHistogramView *view,
257
GimpHistogram *histogram,
229
258
GimpHistogramChannel channel)
231
gdouble max = gimp_histogram_get_maximum (view->histogram, channel);
260
gdouble max = gimp_histogram_get_maximum (histogram, channel);
233
262
switch (view->scale)
250
279
gimp_histogram_view_expose (GtkWidget *widget,
251
280
GdkEventExpose *event)
253
GimpHistogramView *view = GIMP_HISTOGRAM_VIEW (widget);
282
GimpHistogramView *view = GIMP_HISTOGRAM_VIEW (widget);
283
GtkStyle *style = gtk_widget_get_style (widget);
257
287
gint width, height;
289
gdouble bg_max = 0.0;
262
295
GdkGC *rgb_gc[3] = { NULL, NULL, NULL };
264
if (! view->histogram)
297
if (! view->histogram && ! view->bg_histogram)
267
300
border = view->border_width;
272
305
x2 = CLAMP (MAX (view->start, view->end), 0, 255);
274
307
gdk_draw_rectangle (widget->window,
275
widget->style->base_gc[GTK_STATE_NORMAL], TRUE,
308
style->base_gc[GTK_STATE_NORMAL], TRUE,
277
310
widget->allocation.width,
278
311
widget->allocation.height);
280
313
/* Draw the outer border */
281
314
gdk_draw_rectangle (widget->window,
282
widget->style->dark_gc[GTK_STATE_NORMAL], FALSE,
315
style->dark_gc[GTK_STATE_NORMAL], FALSE,
284
317
width - 1, height - 1);
286
max = gimp_histogram_view_get_maximum (view, view->channel);
288
gc_in = (view->light_histogram ?
289
widget->style->mid_gc[GTK_STATE_SELECTED] :
290
widget->style->text_gc[GTK_STATE_SELECTED]);
292
gc_out = (view->light_histogram ?
293
widget->style->mid_gc[GTK_STATE_NORMAL] :
294
widget->style->text_gc[GTK_STATE_NORMAL]);
320
max = gimp_histogram_view_get_maximum (view, view->histogram,
323
if (view->bg_histogram)
324
bg_max = gimp_histogram_view_get_maximum (view, view->bg_histogram,
327
gc_in = style->text_gc[GTK_STATE_SELECTED];
328
gc_out = style->text_gc[GTK_STATE_NORMAL];
330
bg_gc_in = style->mid_gc[GTK_STATE_SELECTED];
331
bg_gc_out = style->mid_gc[GTK_STATE_NORMAL];
296
333
if (view->channel == GIMP_HISTOGRAM_RGB)
333
370
if (view->subdivisions > 1 && x >= (xstop * width / view->subdivisions))
335
372
gdk_draw_line (widget->window,
336
widget->style->dark_gc[GTK_STATE_NORMAL],
373
style->dark_gc[GTK_STATE_NORMAL],
337
374
x + border, border,
338
375
x + border, border + height - 1);
341
378
else if (in_selection)
343
380
gdk_draw_line (widget->window,
344
widget->style->base_gc[GTK_STATE_SELECTED],
381
style->base_gc[GTK_STATE_SELECTED],
345
382
x + border, border,
346
383
x + border, border + height - 1);
353
390
for (c = 0; c < 3; c++)
354
391
gimp_histogram_view_draw_spike (view, GIMP_HISTOGRAM_RED + c,
355
widget->style->black_gc,
356
x, i, j, max, height, border);
394
x, i, j, max, bg_max, height, border);
358
396
for (c = 0; c < 3; c++)
359
397
gimp_histogram_view_draw_spike (view, GIMP_HISTOGRAM_RED + c,
361
x, i, j, max, height, border);
400
x, i, j, max, bg_max, height, border);
364
gimp_histogram_view_draw_spike (view, view->channel,
365
in_selection ? gc_in : gc_out,
366
x, i, j, max, height, border);
402
gimp_histogram_view_draw_spike (view, view->channel,
403
in_selection ? gc_in : gc_out,
405
x, i, j, max, bg_max, height, border);
409
gimp_histogram_view_draw_spike (view, view->channel,
410
in_selection ? gc_in : gc_out,
411
in_selection ? bg_gc_in : bg_gc_out,
412
x, i, j, max, bg_max, height, border);
369
416
if (view->channel == GIMP_HISTOGRAM_RGB)
379
426
gimp_histogram_view_draw_spike (GimpHistogramView *view,
380
427
GimpHistogramChannel channel,
439
gdouble bg_value = 0.0;
394
gdouble v = gimp_histogram_get_value (view->histogram, channel, i++);
447
gdouble v = gimp_histogram_get_value (view->histogram, channel, i++);
455
if (bg_gc && view->bg_histogram)
459
gdouble v = gimp_histogram_get_value (view->bg_histogram, channel, i++);
467
if (value <= 0.0 && bg_value <= 0.0)
404
470
switch (view->scale)
406
472
case GIMP_HISTOGRAM_SCALE_LINEAR:
407
y = (gint) (((height - 2) * value) / max);
473
y = (gint) (((height - 2) * value) / max);
474
bg_y = (gint) (((height - 2) * bg_value) / bg_max);
410
477
case GIMP_HISTOGRAM_SCALE_LOGARITHMIC:
411
y = (gint) (((height - 2) * log (value)) / max);
478
y = (gint) (((height - 2) * log (value)) / max);
479
bg_y = (gint) (((height - 2) * log (bg_value)) / bg_max);
489
gdk_draw_line (GTK_WIDGET (view)->window, bg_gc,
490
x + border, height + border - 1,
491
x + border, height + border - bg_y - 1);
419
493
gdk_draw_line (GTK_WIDGET (view)->window, gc,
420
494
x + border, height + border - 1,
421
495
x + border, height + border - y - 1);
509
583
GimpHistogram *histogram)
511
585
g_return_if_fail (GIMP_IS_HISTOGRAM_VIEW (view));
587
g_return_if_fail (histogram == NULL ||
588
view->bg_histogram == NULL ||
589
gimp_histogram_n_channels (view->bg_histogram) ==
590
gimp_histogram_n_channels (histogram));
513
593
if (view->histogram != histogram)
596
gimp_histogram_unref (view->histogram);
515
598
view->histogram = histogram;
517
if (histogram && view->channel >= gimp_histogram_n_channels (histogram))
518
gimp_histogram_view_set_channel (view, GIMP_HISTOGRAM_VALUE);
602
gimp_histogram_ref (histogram);
604
if (view->channel >= gimp_histogram_n_channels (histogram))
605
gimp_histogram_view_set_channel (view, GIMP_HISTOGRAM_VALUE);
521
609
gtk_widget_queue_draw (GTK_WIDGET (view));
621
gimp_histogram_view_set_background (GimpHistogramView *view,
622
GimpHistogram *histogram)
624
g_return_if_fail (GIMP_IS_HISTOGRAM_VIEW (view));
626
g_return_if_fail (histogram == NULL ||
627
view->histogram == NULL ||
628
gimp_histogram_n_channels (view->histogram) ==
629
gimp_histogram_n_channels (histogram));
632
if (view->bg_histogram != histogram)
634
if (view->bg_histogram)
635
gimp_histogram_unref (view->bg_histogram);
637
view->bg_histogram = histogram;
641
gimp_histogram_ref (histogram);
643
if (view->channel >= gimp_histogram_n_channels (histogram))
644
gimp_histogram_view_set_channel (view, GIMP_HISTOGRAM_VALUE);
648
gtk_widget_queue_draw (GTK_WIDGET (view));
652
gimp_histogram_view_get_background (GimpHistogramView *view)
654
g_return_val_if_fail (GIMP_IS_HISTOGRAM_VIEW (view), NULL);
656
return view->bg_histogram;
533
660
gimp_histogram_view_set_channel (GimpHistogramView *view,
534
661
GimpHistogramChannel channel)
536
663
g_return_if_fail (GIMP_IS_HISTOGRAM_VIEW (view));
538
g_object_set (view, "histogram-channel", channel, NULL);
665
if (channel != view->channel)
666
g_object_set (view, "histogram-channel", channel, NULL);
541
669
GimpHistogramChannel
553
681
g_return_if_fail (GIMP_IS_HISTOGRAM_VIEW (view));
555
g_object_set (view, "histogram-scale", scale, NULL);
683
if (scale != view->scale)
684
g_object_set (view, "histogram-scale", scale, NULL);
558
687
GimpHistogramScale
571
700
g_return_if_fail (GIMP_IS_HISTOGRAM_VIEW (view));
573
view->start = MIN (start, end);
574
view->end = MAX (start, end);
576
gtk_widget_queue_draw (GTK_WIDGET (view));
578
g_signal_emit (view, histogram_view_signals[RANGE_CHANGED], 0,
579
view->start, view->end);
702
if (view->start != MIN (start, end) ||
703
view->end != MAX (start, end))
705
view->start = MIN (start, end);
706
view->end = MAX (start, end);
708
gtk_widget_queue_draw (GTK_WIDGET (view));
710
g_signal_emit (view, histogram_view_signals[RANGE_CHANGED], 0,
711
view->start, view->end);