# HG changeset patch # User zas_ # Date 1235212153 0 # Node ID 8d1f9739c06a8246f6b127f8e5a0fe11f88c73ae # Parent 8c47a4f521adbf2dbf7b530c668989259b77ab7f Add grid to bar histogram, simplify the code and draw horizontal lines too. diff -r 8c47a4f521ad -r 8d1f9739c06a src/histogram.c --- a/src/histogram.c Thu Feb 19 17:36:38 2009 +0000 +++ b/src/histogram.c Sat Feb 21 10:29:13 2009 +0000 @@ -41,9 +41,11 @@ struct _Histogram { gint histogram_chan; gint histogram_logmode; + guint histogram_vgrid; /* number of vertical divisions, 0 for none */ + guint histogram_hgrid; /* number of horizontal divisions, 0 for none */ + }; - Histogram *histogram_new(void) { Histogram *histogram; @@ -51,6 +53,8 @@ histogram = g_new0(Histogram, 1); histogram->histogram_chan = options->histogram.last_channel_mode; histogram->histogram_logmode = options->histogram.last_log_mode; + histogram->histogram_vgrid = 5; + histogram->histogram_hgrid = 3; return histogram; } @@ -166,6 +170,44 @@ return NULL; } +static void histogram_vgrid(Histogram *histogram, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) +{ + static gint c = 160; + static gint alpha = 250; + guint i; + float add; + + if (histogram->histogram_vgrid == 0) return; + + add = width / (float)histogram->histogram_vgrid; + + for (i = 1; i < histogram->histogram_vgrid; i++) + { + gint xpos = x + (int)(i * add + 0.5); + + pixbuf_draw_line(pixbuf, x, y, width, height, xpos, y, xpos, y + height, c, c, c, alpha); + } +} + +static void histogram_hgrid(Histogram *histogram, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) +{ + static gint c = 160; + static gint alpha = 250; + guint i; + float add; + + if (histogram->histogram_hgrid == 0) return; + + add = height / (float)histogram->histogram_hgrid; + + for (i = 1; i < histogram->histogram_hgrid; i++) + { + gint ypos = y + (int)(i * add + 0.5); + + pixbuf_draw_line(pixbuf, x, y, width, height, x, ypos, x + width, ypos, c, c, c, alpha); + } +} + gint histogram_draw(Histogram *histogram, const HistMap *histmap, GdkPixbuf *pixbuf, gint x, gint y, gint width, gint height) { /* FIXME: use the coordinates correctly */ @@ -174,6 +216,10 @@ gdouble logmax; if (!histogram || !histmap) return 0; + + /* Draw the grid */ + histogram_vgrid(histogram, pixbuf, x, y, width, height); + histogram_hgrid(histogram, pixbuf, x, y, width, height); for (i = 0; i < 1024; i++) { #if 0 diff -r 8c47a4f521ad -r 8d1f9739c06a src/image-overlay.c --- a/src/image-overlay.c Thu Feb 19 17:36:38 2009 +0000 +++ b/src/image-overlay.c Sat Feb 21 10:29:13 2009 +0000 @@ -640,21 +640,8 @@ gint x = 5; gint y = height - HISTOGRAM_HEIGHT - 5; gint w = width - 10; - float xoffset = 0; - gint subdiv = 5; - gint c = 160; - gint alpha = 250; - gint i; - float add = w / (float)subdiv; - for (i = 0; i < subdiv; i++) - { - gint d = (i > 0 ? 0 : 1); - - pixbuf_set_rect(pixbuf, x + xoffset + 0.5, y, add + d + 0.5, HISTOGRAM_HEIGHT, c, c, c, alpha, d, 1, 1, 1); - xoffset += add+d; - } - + pixbuf_set_rect_fill(pixbuf, x, y, w, HISTOGRAM_HEIGHT, 220, 220, 220, 210); histogram_draw(osd->histogram, histmap, pixbuf, x, y, w, HISTOGRAM_HEIGHT); } pixbuf_draw_layout(pixbuf, layout, imd->pr, 5, 5, 0, 0, 0, 255);