Mercurial > geeqie
annotate src/histogram.c @ 1672:994169573393
Complete commit @1747 (intltool usage)
With using intltool the localisation will fail cause of missing
desktop.in file. Also the old desktop files are obsoleted by this
commit.
Also it is not necessary any more to have a './' in front of the files
in POTFILES.in.
author | mow |
---|---|
date | Sat, 27 Jun 2009 22:57:56 +0000 |
parents | 9a081164e6e3 |
children | 067f08c0a9f8 |
rev | line source |
---|---|
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
1 /* |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
2 * Geeqie |
1284 | 3 * Copyright (C) 2008 - 2009 The Geeqie Team |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
4 * |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
5 * Author: Vladimir Nadvornik |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
6 * based on a patch by Uwe Ohse |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
7 * |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
8 * This software is released under the GNU General Public License (GNU GPL). |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
9 * Please read the included file COPYING for more information. |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
10 * This software comes with no warranty of any kind, use at your own risk! |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
11 */ |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
12 |
281 | 13 #include "main.h" |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
14 #include "histogram.h" |
284 | 15 |
16 #include "pixbuf_util.h" | |
1439 | 17 #include "filedata.h" |
284 | 18 |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
19 #include <math.h> |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
20 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
21 /* |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
22 *---------------------------------------------------------------------------- |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
23 * image histogram |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
24 *---------------------------------------------------------------------------- |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
25 */ |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
26 |
1294 | 27 #define HISTMAP_SIZE 256 |
28 | |
29 struct _HistMap { | |
1308 | 30 gulong r[HISTMAP_SIZE]; |
31 gulong g[HISTMAP_SIZE]; | |
32 gulong b[HISTMAP_SIZE]; | |
33 gulong max[HISTMAP_SIZE]; | |
1439 | 34 |
1523 | 35 guint idle_id; /* event source id */ |
1439 | 36 GdkPixbuf *pixbuf; |
37 gint y; | |
1294 | 38 }; |
442 | 39 |
290 | 40 |
609
b690cecbf5b8
Use function(void) instead of function() for declaring functions which
zas_
parents:
475
diff
changeset
|
41 Histogram *histogram_new(void) |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
42 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
43 Histogram *histogram; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
44 |
442 | 45 histogram = g_new0(Histogram, 1); |
1665 | 46 histogram->histogram_channel = HCHAN_DEFAULT; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
47 histogram->histogram_mode = 0; |
1304 | 48 |
49 /* grid */ | |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
50 histogram->vgrid = 5; |
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
51 histogram->hgrid = 3; |
1304 | 52 histogram->grid_color.R = 160; |
53 histogram->grid_color.G = 160; | |
54 histogram->grid_color.B = 160; | |
55 histogram->grid_color.A = 250; | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
56 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
57 return histogram; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
58 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
59 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
60 void histogram_free(Histogram *histogram) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
61 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
62 g_free(histogram); |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
63 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
64 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
65 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
66 gint histogram_set_channel(Histogram *histogram, gint chan) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
67 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
68 if (!histogram) return 0; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
69 histogram->histogram_channel = chan; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
70 return chan; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
71 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
72 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
73 gint histogram_get_channel(Histogram *histogram) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
74 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
75 if (!histogram) return 0; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
76 return histogram->histogram_channel; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
77 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
78 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
79 gint histogram_set_mode(Histogram *histogram, gint mode) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
80 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
81 if (!histogram) return 0; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
82 histogram->histogram_mode = mode; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
83 return mode; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
84 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
85 |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
86 gint histogram_get_mode(Histogram *histogram) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
87 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
88 if (!histogram) return 0; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
89 return histogram->histogram_mode; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
90 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
91 |
1312
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
92 gint histogram_toggle_channel(Histogram *histogram) |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
93 { |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
94 if (!histogram) return 0; |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
95 return histogram_set_channel(histogram, (histogram_get_channel(histogram)+1)%HCHAN_COUNT); |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
96 } |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
97 |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
98 gint histogram_toggle_mode(Histogram *histogram) |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
99 { |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
100 if (!histogram) return 0; |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
101 return histogram_set_mode(histogram, !histogram_get_mode(histogram)); |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
102 } |
fcf0e7a6143e
Introduce helpers histogram_toggle_channel() and histogram_toggle_mode().
zas_
parents:
1310
diff
changeset
|
103 |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
104 const gchar *histogram_label(Histogram *histogram) |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
105 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
106 const gchar *t1 = ""; |
999 | 107 |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
108 if (!histogram) return NULL; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
109 |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
110 if (histogram->histogram_mode) |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
111 switch (histogram->histogram_channel) |
442 | 112 { |
1344 | 113 case HCHAN_R: t1 = _("Log Histogram on Red"); break; |
114 case HCHAN_G: t1 = _("Log Histogram on Green"); break; | |
115 case HCHAN_B: t1 = _("Log Histogram on Blue"); break; | |
116 case HCHAN_RGB: t1 = _("Log Histogram on RGB"); break; | |
1349 | 117 case HCHAN_MAX: t1 = _("Log Histogram on value"); break; |
442 | 118 } |
999 | 119 else |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
120 switch (histogram->histogram_channel) |
442 | 121 { |
1344 | 122 case HCHAN_R: t1 = _("Linear Histogram on Red"); break; |
123 case HCHAN_G: t1 = _("Linear Histogram on Green"); break; | |
124 case HCHAN_B: t1 = _("Linear Histogram on Blue"); break; | |
125 case HCHAN_RGB: t1 = _("Linear Histogram on RGB"); break; | |
1349 | 126 case HCHAN_MAX: t1 = _("Linear Histogram on value"); break; |
442 | 127 } |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
128 return t1; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
129 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
130 |
1439 | 131 static HistMap *histmap_new(void) |
132 { | |
133 HistMap *histmap = g_new0(HistMap, 1); | |
134 return histmap; | |
135 } | |
136 | |
137 void histmap_free(HistMap *histmap) | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
138 { |
1439 | 139 if (!histmap) return; |
1523 | 140 if (histmap->idle_id) g_source_remove(histmap->idle_id); |
1439 | 141 if (histmap->pixbuf) g_object_unref(histmap->pixbuf); |
142 g_free(histmap); | |
143 } | |
144 | |
145 static gboolean histmap_read(HistMap *histmap, gboolean whole) | |
146 { | |
147 gint w, h, i, j, srs, has_alpha, step, end_line; | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
148 guchar *s_pix; |
1439 | 149 GdkPixbuf *imgpixbuf = histmap->pixbuf; |
1294 | 150 |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
151 w = gdk_pixbuf_get_width(imgpixbuf); |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
152 h = gdk_pixbuf_get_height(imgpixbuf); |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
153 srs = gdk_pixbuf_get_rowstride(imgpixbuf); |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
154 s_pix = gdk_pixbuf_get_pixels(imgpixbuf); |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
155 has_alpha = gdk_pixbuf_get_has_alpha(imgpixbuf); |
1439 | 156 |
157 if (whole) | |
158 { | |
159 end_line = h; | |
160 } | |
161 else | |
162 { | |
163 gint lines = 1 + 16384 / w; | |
164 end_line = histmap->y + lines; | |
165 if (end_line > h) end_line = h; | |
166 } | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
167 |
462 | 168 step = 3 + !!(has_alpha); |
1439 | 169 for (i = histmap->y; i < end_line; i++) |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
170 { |
1294 | 171 guchar *sp = s_pix + (i * srs); /* 8bit */ |
172 for (j = 0; j < w; j++) | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
173 { |
1294 | 174 guint max = sp[0]; |
175 if (sp[1] > max) max = sp[1]; | |
176 if (sp[2] > max) max = sp[2]; | |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
177 |
1308 | 178 histmap->r[sp[0]]++; |
179 histmap->g[sp[1]]++; | |
180 histmap->b[sp[2]]++; | |
181 histmap->max[max]++; | |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
182 |
1294 | 183 sp += step; |
462 | 184 } |
185 } | |
1439 | 186 histmap->y = end_line; |
187 return end_line >= h; | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
188 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
189 |
1298 | 190 const HistMap *histmap_get(FileData *fd) |
1294 | 191 { |
1523 | 192 if (fd->histmap && !fd->histmap->idle_id) return fd->histmap; /* histmap exists and is finished */ |
1294 | 193 |
194 return NULL; | |
195 } | |
196 | |
1439 | 197 static gboolean histmap_idle_cb(gpointer data) |
198 { | |
199 FileData *fd = data; | |
200 if (histmap_read(fd->histmap, FALSE)) | |
201 { | |
202 /* finished */ | |
203 g_object_unref(fd->histmap->pixbuf); /*pixbuf is no longer needed */ | |
204 fd->histmap->pixbuf = NULL; | |
1523 | 205 fd->histmap->idle_id = 0; |
1439 | 206 file_data_send_notification(fd, NOTIFY_HISTMAP); |
207 return FALSE; | |
208 } | |
209 return TRUE; | |
210 } | |
211 | |
212 gboolean histmap_start_idle(FileData *fd) | |
213 { | |
214 if (fd->histmap || !fd->pixbuf) return FALSE; | |
215 | |
216 fd->histmap = histmap_new(); | |
217 fd->histmap->pixbuf = fd->pixbuf; | |
218 g_object_ref(fd->histmap->pixbuf); | |
219 | |
220 fd->histmap->idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, histmap_idle_cb, fd, NULL); | |
221 return TRUE; | |
222 } | |
223 | |
224 | |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
225 static void histogram_vgrid(Histogram *histogram, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
226 { |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
227 guint i; |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
228 float add; |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
229 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
230 if (histogram->vgrid == 0) return; |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
231 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
232 add = width / (float)histogram->vgrid; |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
233 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
234 for (i = 1; i < histogram->vgrid; i++) |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
235 { |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
236 gint xpos = x + (int)(i * add + 0.5); |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
237 |
1304 | 238 pixbuf_draw_line(pixbuf, x, y, width, height, xpos, y, xpos, y + height, |
239 histogram->grid_color.R, | |
240 histogram->grid_color.G, | |
241 histogram->grid_color.B, | |
242 histogram->grid_color.A); | |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
243 } |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
244 } |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
245 |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
246 static void histogram_hgrid(Histogram *histogram, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
247 { |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
248 guint i; |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
249 float add; |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
250 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
251 if (histogram->hgrid == 0) return; |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
252 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
253 add = height / (float)histogram->hgrid; |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
254 |
1303
9669104eb58a
Remove histogram_ prefix from struct _Histogram fields names and rename them more properly.
zas_
parents:
1302
diff
changeset
|
255 for (i = 1; i < histogram->hgrid; i++) |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
256 { |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
257 gint ypos = y + (int)(i * add + 0.5); |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
258 |
1304 | 259 pixbuf_draw_line(pixbuf, x, y, width, height, x, ypos, x + width, ypos, |
260 histogram->grid_color.R, | |
261 histogram->grid_color.G, | |
262 histogram->grid_color.B, | |
263 histogram->grid_color.A); | |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
264 } |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
265 } |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
266 |
1431 | 267 gboolean histogram_draw(Histogram *histogram, const HistMap *histmap, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
268 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
269 /* FIXME: use the coordinates correctly */ |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
270 gint i; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
271 gulong max = 0; |
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
999
diff
changeset
|
272 gdouble logmax; |
1308 | 273 gint combine = (HISTMAP_SIZE - 1) / width + 1; |
274 gint ypos = y + height; | |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
275 |
1431 | 276 if (!histogram || !histmap) return FALSE; |
1302
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
277 |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
278 /* Draw the grid */ |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
279 histogram_vgrid(histogram, pixbuf, x, y, width, height); |
8d1f9739c06a
Add grid to bar histogram, simplify the code and draw horizontal lines too.
zas_
parents:
1298
diff
changeset
|
280 histogram_hgrid(histogram, pixbuf, x, y, width, height); |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
281 |
1477 | 282 /* exclude overexposed and underexposed */ |
283 for (i = 1; i < HISTMAP_SIZE - 1; i++) | |
1308 | 284 { |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
285 if (histmap->r[i] > max) max = histmap->r[i]; |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
286 if (histmap->g[i] > max) max = histmap->g[i]; |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
287 if (histmap->b[i] > max) max = histmap->b[i]; |
1477 | 288 if (histmap->max[i] > max) max = histmap->max[i]; |
1308 | 289 } |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
290 |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
291 if (max > 0) |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
292 logmax = log(max); |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
293 else |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
294 logmax = 1.0; |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
295 |
463 | 296 for (i = 0; i < width; i++) |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
297 { |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
298 gint j; |
290 | 299 glong v[4] = {0, 0, 0, 0}; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
300 gint rplus = 0; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
301 gint gplus = 0; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
302 gint bplus = 0; |
1294 | 303 gint ii = i * HISTMAP_SIZE / width; |
1308 | 304 gint xpos = x + i; |
1477 | 305 gint num_chan; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
306 |
290 | 307 for (j = 0; j < combine; j++) |
308 { | |
1308 | 309 guint p = ii + j; |
310 v[0] += histmap->r[p]; | |
311 v[1] += histmap->g[p]; | |
312 v[2] += histmap->b[p]; | |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
313 v[3] += histmap->max[p]; |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
314 } |
1310
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
315 |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
316 for (j = 0; combine > 1 && j < 4; j++) |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
317 v[j] /= combine; |
ef05743535e3
Fix and simplify histogram code, drop histogram based on mean value.
zas_
parents:
1308
diff
changeset
|
318 |
1477 | 319 num_chan = (histogram->histogram_channel == HCHAN_RGB) ? 3 : 1; |
320 for (j = 0; j < num_chan; j++) | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
321 { |
1477 | 322 gint chanmax; |
323 if (histogram->histogram_channel == HCHAN_RGB) | |
324 { | |
325 chanmax = HCHAN_R; | |
326 if (v[HCHAN_G] > v[HCHAN_R]) chanmax = HCHAN_G; | |
327 if (v[HCHAN_B] > v[chanmax]) chanmax = HCHAN_B; | |
328 } | |
329 else | |
330 { | |
331 chanmax = histogram->histogram_channel; | |
332 } | |
333 | |
463 | 334 { |
335 gulong pt; | |
336 gint r = rplus; | |
337 gint g = gplus; | |
338 gint b = bplus; | |
339 | |
1308 | 340 switch (chanmax) |
463 | 341 { |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
342 case HCHAN_R: rplus = r = 255; break; |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
343 case HCHAN_G: gplus = g = 255; break; |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
344 case HCHAN_B: bplus = b = 255; break; |
463 | 345 } |
346 | |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
347 switch (histogram->histogram_channel) |
463 | 348 { |
349 case HCHAN_RGB: | |
350 if (r == 255 && g == 255 && b == 255) | |
351 { | |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
352 r = 0; b = 0; g = 0; |
463 | 353 } |
354 break; | |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
355 case HCHAN_R: b = 0; g = 0; break; |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
356 case HCHAN_G: r = 0; b = 0; break; |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
357 case HCHAN_B: r = 0; g = 0; break; |
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
358 case HCHAN_MAX: r = 0; b = 0; g = 0; break; |
463 | 359 } |
360 | |
1308 | 361 if (v[chanmax] == 0) |
463 | 362 pt = 0; |
1329
1fc356f629fe
Clean up histogram stuff: options saving/restoring, osd histogram separation, tidy up.
zas_
parents:
1312
diff
changeset
|
363 else if (histogram->histogram_mode) |
1308 | 364 pt = ((gdouble)log(v[chanmax])) / logmax * (height - 1); |
463 | 365 else |
1308 | 366 pt = ((gdouble)v[chanmax]) / max * (height - 1); |
463 | 367 |
442 | 368 pixbuf_draw_line(pixbuf, |
290 | 369 x, y, width, height, |
1308 | 370 xpos, ypos, xpos, ypos - pt, |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
371 r, g, b, 255); |
463 | 372 } |
1308 | 373 |
374 v[chanmax] = -1; | |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
375 } |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
376 } |
463 | 377 |
273
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
378 return TRUE; |
e0e2c2b72c5a
reworked the histogram patch by Uwe Ohse, most of the code is in
nadvornik
parents:
diff
changeset
|
379 } |
1294 | 380 |
381 void histogram_notify_cb(FileData *fd, NotifyType type, gpointer data) | |
382 { | |
1488 | 383 if ((type & (NOTIFY_CHANGE | NOTIFY_REREAD)) && fd->histmap) |
1294 | 384 { |
1498 | 385 DEBUG_1("Notify histogram: %s %04x", fd->path, type); |
1439 | 386 histmap_free(fd->histmap); |
1294 | 387 fd->histmap = NULL; |
388 } | |
389 } | |
390 | |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1000
diff
changeset
|
391 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |