void process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, void *ivoid, void *ovoid, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out) { dt_iop_global_tonemap_data_t *data = (dt_iop_global_tonemap_data_t *)piece->data; switch(data->operator) { case OPERATOR_REINHARD: process_reinhard(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; case OPERATOR_DRAGO: process_drago(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; case OPERATOR_FILMIC: process_filmic(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; } if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height); }
void process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, void *ivoid, void *ovoid, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out) { dt_iop_global_tonemap_data_t *data = (dt_iop_global_tonemap_data_t *)piece->data; const float scale = piece->iscale/roi_in->scale; const float sigma_r = 8.0f; // does not depend on scale const float iw = piece->buf_in.width /scale; const float ih = piece->buf_in.height/scale; const float sigma_s = fminf(iw, ih)*0.03f; dt_bilateral_t *b = NULL; if(data->detail != 0.0f) { b = dt_bilateral_init(roi_in->width, roi_in->height, sigma_s, sigma_r); // get detail from unchanged input buffer dt_bilateral_splat(b, (float *)ivoid); } switch(data->operator) { case OPERATOR_REINHARD: process_reinhard(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; case OPERATOR_DRAGO: process_drago(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; case OPERATOR_FILMIC: process_filmic(self, piece, ivoid, ovoid, roi_in, roi_out, data); break; } if(data->detail != 0.0f) { dt_bilateral_blur(b); // and apply it to output buffer after logscale dt_bilateral_slice_to_output(b, (float *)ivoid, (float *)ovoid, data->detail); dt_bilateral_free(b); } if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height); }