diff src/histogram.c @ 290:4bbde8a38ad4

improved histogram drawing
author nadvornik
date Wed, 09 Apr 2008 20:49:32 +0000
parents fd5c62403498
children 4b2d7f9af171
line wrap: on
line diff
--- a/src/histogram.c	Wed Apr 09 16:37:54 2008 +0000
+++ b/src/histogram.c	Wed Apr 09 20:49:32 2008 +0000
@@ -22,6 +22,14 @@
  *----------------------------------------------------------------------------
  */
 
+#define HISTOGRAM_SIZE 256
+ 
+struct _Histogram {
+	gulong histmap[HISTOGRAM_SIZE*4];
+	gint histogram_chan;
+	gint histogram_logmode;
+};
+
 
 Histogram *histogram_new()
 {
@@ -105,25 +113,25 @@
 	s_pix = gdk_pixbuf_get_pixels(imgpixbuf);
 	has_alpha = gdk_pixbuf_get_has_alpha(imgpixbuf);
 
-	for (i = 0; i < 256*4; i++) histogram->histmap[i] = 0;
+	for (i = 0; i < HISTOGRAM_SIZE*4; i++) histogram->histmap[i] = 0;
 
 	for (i = 0; i < h; i++)
 		{
 		guchar *sp = s_pix + (i * srs); /* 8bit */
 		for (j = 0; j < w; j++)
 			{
-			histogram->histmap[sp[0]+0]++;
-			histogram->histmap[sp[1]+256]++;
-			histogram->histmap[sp[2]+512]++;
+			histogram->histmap[sp[0] + 0 * HISTOGRAM_SIZE]++;
+			histogram->histmap[sp[1] + 1 * HISTOGRAM_SIZE]++;
+			histogram->histmap[sp[2] + 2 * HISTOGRAM_SIZE]++;
 			if (histogram->histogram_chan == HCHAN_MAX)
 				{
 				guchar t = sp[0];
 				if (sp[1]>t) t = sp[1];
 				if (sp[2]>t) t = sp[2];
-  				histogram->histmap[t+768]++;
+  				histogram->histmap[t + 3 * HISTOGRAM_SIZE]++;
 				}
 			else
-  				histogram->histmap[768+(sp[0]+sp[1]+sp[2])/3]++;
+  				histogram->histmap[3 * HISTOGRAM_SIZE + (sp[0]+sp[1]+sp[2])/3]++;
 			sp += 3;
 			if (has_alpha) sp++;
 			}
@@ -158,18 +166,23 @@
 	}
 
 	logmax = log(max);
-	for (i=0; i<256; i++)
+	for (i=0; i<width; i++)
 		{
 		gint j;
-		glong v[4];
+		glong v[4] = {0, 0, 0, 0};
 		gint rplus = 0;
 		gint gplus = 0;
 		gint bplus = 0;
+		gint ii = i * HISTOGRAM_SIZE / width;
+		gint combine  = (HISTOGRAM_SIZE - 1) / width + 1;
 
-		v[0] = histogram->histmap[i+0*256]; // r
-		v[1] = histogram->histmap[i+1*256]; // g
-		v[2] = histogram->histmap[i+2*256]; // b
-		v[3] = histogram->histmap[i+3*256]; // value, max
+		for (j = 0; j < combine; j++)
+			{
+			v[0] += histogram->histmap[ii + j + 0*HISTOGRAM_SIZE]; // r
+			v[1] += histogram->histmap[ii + j + 1*HISTOGRAM_SIZE]; // g
+			v[2] += histogram->histmap[ii + j + 2*HISTOGRAM_SIZE]; // b
+			v[3] += histogram->histmap[ii + j + 3*HISTOGRAM_SIZE]; // value, max
+			}
 		
 		for (j=0; j<4; j++)
 			{
@@ -209,14 +222,14 @@
 			if (v[max2] == 0)
 				pt = 0;
 			else if (histogram->histogram_logmode)
-				pt = ((float)log(v[max2]))/logmax*255;
+				pt = ((float)log(v[max2])) / logmax * (height - 1);
 			else
-				pt = ((float)v[max2])/max*255;
+				pt = ((float)v[max2])/ max * (height - 1);
 			if (histogram->histogram_chan >= HCHAN_RGB 
 			    || max2 == histogram->histogram_chan)
 				pixbuf_draw_line(pixbuf, 
-					0+5, height-255, 256, 256,
-					i+5, height, i+5, height-pt, 
+					x, y, width, height,
+					x + i, y + height, x + i, y + height-pt, 
 					r, g, b, 255);
 			v[max2] = -1;
 			}