static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf) { struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect); int x,y; float* src = ibuf->rect_float; unsigned char* tgt = (unsigned char*) rval->rect; int w = ibuf->x + 3; int h = 515; float waveform_gamma = 0.2; unsigned char wtable[256]; wform_put_grid(tgt, w, h); for (x = 0; x < 256; x++) { wtable[x] = (unsigned char) (pow(((float) x + 1)/256, waveform_gamma)*255); } for (y = 0; y < ibuf->y; y++) { unsigned char * last_p = NULL; for (x = 0; x < ibuf->x; x++) { float * rgb = src + 4 * (ibuf->x * y + x); float v = 1.0f * ( 0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2]); unsigned char * p = tgt; CLAMP(v, 0.0f, 1.0f); p += 4 * (w * ((int) (v * (h - 3)) + 1) + x + 1); scope_put_pixel(wtable, p); p += 4 * w; scope_put_pixel(wtable, p); if (last_p != NULL) { wform_put_line(w, last_p, p); } last_p = p; } } wform_put_border(tgt, w, h); return rval; }
static ImBuf *make_waveform_view_from_ibuf_byte(ImBuf *ibuf) { ImBuf *rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect); int x, y; unsigned char *src = (unsigned char *) ibuf->rect; unsigned char *tgt = (unsigned char *) rval->rect; int w = ibuf->x + 3; int h = 515; float waveform_gamma = 0.2; unsigned char wtable[256]; wform_put_grid(tgt, w, h); for (x = 0; x < 256; x++) { wtable[x] = (unsigned char) (pow(((float) x + 1) / 256, waveform_gamma) * 255); } for (y = 0; y < ibuf->y; y++) { unsigned char *last_p = NULL; for (x = 0; x < ibuf->x; x++) { unsigned char *rgb = src + 4 * (ibuf->x * y + x); float v = (float)rgb_to_luma_byte(rgb) / 255.0f; unsigned char *p = tgt; p += 4 * (w * ((int) (v * (h - 3)) + 1) + x + 1); scope_put_pixel(wtable, p); p += 4 * w; scope_put_pixel(wtable, p); if (last_p != NULL) { wform_put_line(w, last_p, p); } last_p = p; } } wform_put_border(tgt, w, h); return rval; }
static struct ImBuf *make_vectorscope_view_from_ibuf_float(struct ImBuf * ibuf) { struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect); int x,y; float* src = ibuf->rect_float; char* tgt = (char*) rval->rect; float rgb[3], yuv[3]; int w = 515; int h = 515; float scope_gamma = 0.2; unsigned char wtable[256]; for (x = 0; x < 256; x++) { wtable[x] = (unsigned char) (pow(((float) x + 1)/256, scope_gamma)*255); } for (x = 0; x <= 255; x++) { vectorscope_put_cross(255 , 0,255 - x, tgt, w, h, 1); vectorscope_put_cross(255 , x, 0, tgt, w, h, 1); vectorscope_put_cross(255- x, 255, 0, tgt, w, h, 1); vectorscope_put_cross(0, 255, x, tgt, w, h, 1); vectorscope_put_cross(0, 255 - x, 255, tgt, w, h, 1); vectorscope_put_cross(x, 0, 255, tgt, w, h, 1); } for (y = 0; y < ibuf->y; y++) { for (x = 0; x < ibuf->x; x++) { float * src1 = src + 4 * (ibuf->x * y + x); char * p; memcpy(rgb, src1, 3 * sizeof(float)); CLAMP(rgb[0], 0.0f, 1.0f); CLAMP(rgb[1], 0.0f, 1.0f); CLAMP(rgb[2], 0.0f, 1.0f); rgb_to_yuv(rgb, yuv); p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1)) + (int) ((yuv[1] * (w - 3) + 1))); scope_put_pixel(wtable, (unsigned char*)p); } } vectorscope_put_cross(0, 0, 0, tgt, w, h, 3); return rval; }
static ImBuf *make_vectorscope_view_from_ibuf_byte(ImBuf *ibuf) { ImBuf *rval = IMB_allocImBuf(515, 515, 32, IB_rect); int x, y; char *src = (char *) ibuf->rect; char *tgt = (char *) rval->rect; float rgb[3], yuv[3]; int w = 515; int h = 515; float scope_gamma = 0.2; unsigned char wtable[256]; for (x = 0; x < 256; x++) { wtable[x] = (unsigned char) (pow(((float) x + 1) / 256, scope_gamma) * 255); } for (x = 0; x <= 255; x++) { vectorscope_put_cross(255, 0, 255 - x, tgt, w, h, 1); vectorscope_put_cross(255, x, 0, tgt, w, h, 1); vectorscope_put_cross(255 - x, 255, 0, tgt, w, h, 1); vectorscope_put_cross(0, 255, x, tgt, w, h, 1); vectorscope_put_cross(0, 255 - x, 255, tgt, w, h, 1); vectorscope_put_cross(x, 0, 255, tgt, w, h, 1); } for (y = 0; y < ibuf->y; y++) { for (x = 0; x < ibuf->x; x++) { char *src1 = src + 4 * (ibuf->x * y + x); char *p; rgb[0] = (float)src1[0] / 255.0f; rgb[1] = (float)src1[1] / 255.0f; rgb[2] = (float)src1[2] / 255.0f; rgb_to_yuv_normalized(rgb, yuv); p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1)) + (int) ((yuv[1] * (w - 3) + 1))); scope_put_pixel(wtable, (unsigned char *)p); } } vectorscope_put_cross(0, 0, 0, tgt, w, h, 3); return rval; }