static void deflicker_prepare_histogram(dt_iop_module_t *self, uint32_t **histogram, dt_dev_histogram_stats_t *histogram_stats) { dt_mipmap_buffer_t buf; dt_mipmap_cache_read_get(darktable.mipmap_cache, &buf, self->dev->image_storage.id, DT_MIPMAP_FULL, DT_MIPMAP_BLOCKING); const dt_image_t *img = dt_image_cache_read_get(darktable.image_cache, self->dev->image_storage.id); dt_image_t image = *img; dt_image_cache_read_release(darktable.image_cache, img); if(buf.size != DT_MIPMAP_FULL) { dt_control_log(_("failed to get raw buffer from image `%s'"), image.filename); dt_mipmap_cache_read_release(darktable.mipmap_cache, &buf); return; } dt_dev_histogram_collection_params_t histogram_params; memcpy(&histogram_params, &self->histogram_params, sizeof(dt_dev_histogram_collection_params_t)); dt_iop_roi_t roi = {0, 0, image.width, image.height, 1.0f}; histogram_params.roi = &roi; dt_histogram_worker(&histogram_params, histogram_stats, buf.buf, histogram, dt_histogram_helper_cs_RAW_uint16); histogram_stats->ch = 1u; dt_mipmap_cache_read_release(darktable.mipmap_cache, &buf); }
void dt_histogram_helper(const dt_dev_histogram_collection_params_t *const histogram_params, dt_dev_histogram_stats_t *histogram_stats, dt_iop_colorspace_type_t cst, const void *pixel, uint32_t **histogram) { switch(cst) { case iop_cs_RAW: dt_histogram_worker(histogram_params, histogram_stats, pixel, histogram, histogram_helper_cs_RAW); histogram_stats->ch = 1u; break; case iop_cs_rgb: dt_histogram_worker(histogram_params, histogram_stats, pixel, histogram, histogram_helper_cs_rgb); histogram_stats->ch = 3u; break; case iop_cs_Lab: default: dt_histogram_worker(histogram_params, histogram_stats, pixel, histogram, histogram_helper_cs_Lab); histogram_stats->ch = 3u; break; } }
static void deflicker_prepare_histogram(dt_iop_module_t *self, uint32_t **histogram, dt_dev_histogram_stats_t *histogram_stats) { dt_mipmap_buffer_t buf; dt_mipmap_cache_get(darktable.mipmap_cache, &buf, self->dev->image_storage.id, DT_MIPMAP_FULL, DT_MIPMAP_BLOCKING, 'r'); const dt_image_t *img = dt_image_cache_get(darktable.image_cache, self->dev->image_storage.id, 'r'); dt_image_t image = *img; dt_image_cache_read_release(darktable.image_cache, img); if(!buf.buf) { dt_control_log(_("failed to get raw buffer from image `%s'"), image.filename); dt_mipmap_cache_release(darktable.mipmap_cache, &buf); return; } dt_dev_histogram_collection_params_t histogram_params = { 0 }; dt_histogram_roi_t histogram_roi = {.width = image.width, .height = image.height, // FIXME: get those from rawprepare IOP somehow !!! .crop_x = image.crop_x, .crop_y = image.crop_y, .crop_width = image.crop_width, .crop_height = image.crop_height }; histogram_params.roi = &histogram_roi; histogram_params.bins_count = 16384; dt_histogram_worker(&histogram_params, histogram_stats, buf.buf, histogram, dt_histogram_helper_cs_RAW_uint16); histogram_stats->ch = 1u; dt_mipmap_cache_release(darktable.mipmap_cache, &buf); } /* input: 0 - 16384 (valid range: from black level to white level) */ /* output: -14 ... 0 */ static float raw_to_ev(uint32_t raw, uint32_t black_level, uint32_t white_level) { uint32_t raw_max = white_level - black_level; float raw_ev = -log2f(raw_max) + log2f(CLAMP(raw, 0.0f, 16384.0f)); return raw_ev; }