More Histogram fixes:

Sequencer histogram was calculating still badly, now it uses a per-color
component counter to calculate the levels (instead of counter for all)
This commit is contained in:
Ton Roosendaal 2013-04-02 17:12:21 +00:00
parent dc685bc1c3
commit 726dedafbc
3 changed files with 31 additions and 26 deletions

@ -1092,10 +1092,7 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, const ColorManagedViewSettings *
if (is_float)
rf = ibuf->rect_float;
else {
if (view_settings)
rc = (unsigned char *)IMB_display_buffer_acquire(ibuf, view_settings, display_settings, &cache_handle);
else
rc = (unsigned char *)ibuf->rect;
rc = (unsigned char *)IMB_display_buffer_acquire(ibuf, view_settings, display_settings, &cache_handle);
}
if (ibuf->rect_float)
@ -1178,11 +1175,12 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, const ColorManagedViewSettings *
if (bin_b[x] > nb) nb = bin_b[x];
if (bin_a[x] > na) na = bin_a[x];
}
divl = 1.0 / (double)nl;
diva = 1.0 / (double)na;
divr = 1.0 / (double)nr;
divg = 1.0 / (double)ng;
divb = 1.0 / (double)nb;
divl = nl ? 1.0 / (double)nl : 1.0;
diva = na ? 1.0 / (double)na : 1.0;
divr = nr ? 1.0 / (double)nr : 1.0;
divg = ng ? 1.0 / (double)ng : 1.0;
divb = nb ? 1.0 / (double)nb : 1.0;
for (x = 0; x < 256; x++) {
scopes->hist.data_luma[x] = bin_lum[x] * divl;
scopes->hist.data_r[x] = bin_r[x] * divr;

@ -896,7 +896,7 @@ static ImBuf *sequencer_make_scope(Scene *scene, ImBuf *ibuf, ImBuf *(*make_scop
{
ImBuf *display_ibuf = IMB_dupImBuf(ibuf);
ImBuf *scope;
IMB_colormanagement_imbuf_make_display_space(display_ibuf, &scene->view_settings,
&scene->display_settings);

@ -531,7 +531,7 @@ BLI_INLINE int get_bin_float(float f)
static ImBuf *make_histogram_view_from_ibuf_float(ImBuf *ibuf)
{
ImBuf *rval = IMB_allocImBuf(515, 128, 32, IB_rect);
int n, c, x, y;
int nr, ng, nb, x, y;
float *src = ibuf->rect_float;
unsigned int bins[3][HIS_STEPS];
@ -563,23 +563,30 @@ static ImBuf *make_histogram_view_from_ibuf_float(ImBuf *ibuf)
}
}
nr = nb = ng = 0;
for (x = 0; x < HIS_STEPS; x++) {
if (bins[0][x] > nr)
nr = bins[0][x];
if (bins[1][x] > ng)
ng = bins[1][x];
if (bins[2][x] > nb)
nb = bins[2][x];
}
for (x = 0; x < HIS_STEPS; x++) {
if (nr) {
draw_histogram_bar(rval, x + 1, ((float) bins[0][x]) / nr, 0);
}
if (ng) {
draw_histogram_bar(rval, x + 1, ((float) bins[1][x]) / ng, 1);
}
if (nb) {
draw_histogram_bar(rval, x + 1, ((float) bins[2][x]) / nb, 2);
}
}
draw_histogram_marker(rval, get_bin_float(0.0));
draw_histogram_marker(rval, get_bin_float(1.0));
n = 0;
for (c = 0; c < 3; c++) {
for (x = 0; x < HIS_STEPS; x++) {
if (bins[c][x] > n) {
n = bins[c][x];
}
}
}
for (c = 0; c < 3; c++) {
for (x = 0; x < HIS_STEPS; x++) {
draw_histogram_bar(rval, x + 1, (float) bins[c][x] / n, c);
}
}
wform_put_border((unsigned char *) rval->rect, rval->x, rval->y);
return rval;