Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
pixelpipe_rawdetail.c
Go to the documentation of this file.
1
16
18 float *const rgb, const dt_iop_roi_t *const roi_in, const int mode)
19{
20 dt_dev_pixelpipe_t *const mutable_pipe = (dt_dev_pixelpipe_t *)pipe;
22 {
23 if(pipe->rawdetail_mask_data)
24 dt_dev_clear_rawdetail_mask(mutable_pipe);
25 return FALSE;
26 }
27 if((pipe->want_detail_mask & ~DT_DEV_DETAIL_MASK_REQUIRED) != mode) return FALSE;
28
29 dt_dev_clear_rawdetail_mask(mutable_pipe);
30
31 const int width = roi_in->width;
32 const int height = roi_in->height;
35 if((mask == NULL) || (tmp == NULL)) goto error;
36
37 mutable_pipe->rawdetail_mask_data = mask;
38 memcpy(&mutable_pipe->rawdetail_mask_roi, roi_in, sizeof(dt_iop_roi_t));
39
40 dt_aligned_pixel_t wb = { piece->dsc_in.temperature.coeffs[0],
41 piece->dsc_in.temperature.coeffs[1],
42 piece->dsc_in.temperature.coeffs[2] };
44 wb[0] = wb[1] = wb[2] = 1.0f;
45
48 dt_print(DT_DEBUG_MASKS, "[dt_dev_write_rawdetail_mask] %i (%ix%i)\n", mode, roi_in->width, roi_in->height);
49 return FALSE;
50
51error:
52 fprintf(stderr, "[dt_dev_write_rawdetail_mask] couldn't write detail mask\n");
55 return TRUE;
56}
57
58#ifdef HAVE_OPENCL
59gboolean dt_dev_write_rawdetail_mask_cl(const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, cl_mem in,
60 const dt_iop_roi_t *const roi_in, const int mode)
61{
62 dt_dev_pixelpipe_t *const mutable_pipe = (dt_dev_pixelpipe_t *)pipe;
64 {
65 if(pipe->rawdetail_mask_data)
66 dt_dev_clear_rawdetail_mask(mutable_pipe);
67 return FALSE;
68 }
69
70 if((pipe->want_detail_mask & ~DT_DEV_DETAIL_MASK_REQUIRED) != mode) return FALSE;
71
72 dt_dev_clear_rawdetail_mask(mutable_pipe);
73
74 const int width = roi_in->width;
75 const int height = roi_in->height;
76
77 cl_mem out = NULL;
78 cl_mem tmp = NULL;
79 float *mask = NULL;
80 const int devid = pipe->devid;
81
82 cl_int err = CL_SUCCESS;
84 if(mask == NULL) goto error;
85 out = dt_opencl_alloc_device(devid, width, height, sizeof(float));
86 if(out == NULL) goto error;
87 tmp = dt_opencl_alloc_device_buffer(devid, sizeof(float) * width * height);
88 if(tmp == NULL) goto error;
89
90 {
91 const int kernel = darktable.opencl->blendop->kernel_calc_Y0_mask;
92 dt_aligned_pixel_t wb = { piece->dsc_in.temperature.coeffs[0],
93 piece->dsc_in.temperature.coeffs[1],
94 piece->dsc_in.temperature.coeffs[2] };
96 wb[0] = wb[1] = wb[2] = 1.0f;
97
98 size_t sizes[3] = { ROUNDUPDWD(width, devid), ROUNDUPDHT(height, devid), 1 };
99 dt_opencl_set_kernel_arg(devid, kernel, 0, sizeof(cl_mem), &tmp);
100 dt_opencl_set_kernel_arg(devid, kernel, 1, sizeof(cl_mem), &in);
101 dt_opencl_set_kernel_arg(devid, kernel, 2, sizeof(int), &width);
102 dt_opencl_set_kernel_arg(devid, kernel, 3, sizeof(int), &height);
103 dt_opencl_set_kernel_arg(devid, kernel, 4, sizeof(float), &wb[0]);
104 dt_opencl_set_kernel_arg(devid, kernel, 5, sizeof(float), &wb[1]);
105 dt_opencl_set_kernel_arg(devid, kernel, 6, sizeof(float), &wb[2]);
106 err = dt_opencl_enqueue_kernel_2d(devid, kernel, sizes);
107 if(err != CL_SUCCESS) goto error;
108 }
109 {
110 size_t sizes[3] = { ROUNDUPDWD(width, devid), ROUNDUPDHT(height, devid), 1 };
111 const int kernel = darktable.opencl->blendop->kernel_write_scharr_mask;
112 dt_opencl_set_kernel_arg(devid, kernel, 0, sizeof(cl_mem), &tmp);
113 dt_opencl_set_kernel_arg(devid, kernel, 1, sizeof(cl_mem), &out);
114 dt_opencl_set_kernel_arg(devid, kernel, 2, sizeof(int), &width);
115 dt_opencl_set_kernel_arg(devid, kernel, 3, sizeof(int), &height);
116 err = dt_opencl_enqueue_kernel_2d(devid, kernel, sizes);
117 if(err != CL_SUCCESS) goto error;
118 }
119 {
120 err = dt_opencl_read_host_from_device(devid, mask, out, width, height, sizeof(float));
121 if(err != CL_SUCCESS) goto error;
122 }
123
124 mutable_pipe->rawdetail_mask_data = mask;
125 memcpy(&mutable_pipe->rawdetail_mask_roi, roi_in, sizeof(dt_iop_roi_t));
126
129 dt_print(DT_DEBUG_MASKS, "[dt_dev_write_rawdetail_mask_cl] mode %i (%ix%i)", mode, roi_in->width, roi_in->height);
130 return FALSE;
131
132error:
133 fprintf(stderr, "[dt_dev_write_rawdetail_mask_cl] couldn't write detail mask: %i\n", err);
134 dt_dev_clear_rawdetail_mask(mutable_pipe);
138 return TRUE;
139}
140#endif
141
142float *dt_dev_distort_detail_mask(const dt_dev_pixelpipe_t *pipe, float *src,
143 const dt_iop_module_t *target_module)
144{
145 if(!pipe->rawdetail_mask_data) return NULL;
146 gboolean valid = FALSE;
147 const int check = pipe->want_detail_mask & ~DT_DEV_DETAIL_MASK_REQUIRED;
148
149 GList *source_iter;
150 for(source_iter = pipe->nodes; source_iter; source_iter = g_list_next(source_iter))
151 {
152 const dt_dev_pixelpipe_iop_t *candidate = (dt_dev_pixelpipe_iop_t *)source_iter->data;
153 if((!strcmp(candidate->module->op, "demosaic")) && candidate->enabled && (check == DT_DEV_DETAIL_MASK_DEMOSAIC))
154 {
155 valid = TRUE;
156 break;
157 }
158 if((!strcmp(candidate->module->op, "rawprepare")) && candidate->enabled && (check == DT_DEV_DETAIL_MASK_RAWPREPARE))
159 {
160 valid = TRUE;
161 break;
162 }
163 }
164
165 if(!valid) return NULL;
166 dt_vprint(DT_DEBUG_MASKS, "[dt_dev_distort_detail_mask] (%ix%i) for module %s\n",
167 pipe->rawdetail_mask_roi.width, pipe->rawdetail_mask_roi.height, target_module->op);
168
169 float *resmask = src;
170 float *inmask = src;
171 if(source_iter)
172 {
173 for(GList *iter = source_iter; iter; iter = g_list_next(iter))
174 {
175 dt_dev_pixelpipe_iop_t *module = (dt_dev_pixelpipe_iop_t *)iter->data;
176 if(module->enabled
177 && !dt_dev_pixelpipe_activemodule_disables_currentmodule(module->module->dev, module->module))
178 {
179 if(module->module->distort_mask
180 && !(!strcmp(module->module->op, "finalscale")
181 && module->roi_in.width == 0
182 && module->roi_in.height == 0))
183 {
185 (size_t)module->roi_out.width * module->roi_out.height, 0);
186 dt_vprint(DT_DEBUG_MASKS, " %s %ix%i -> %ix%i\n", module->module->op,
187 module->roi_in.width, module->roi_in.height,
188 module->roi_out.width, module->roi_out.height);
189 module->module->distort_mask(module->module, (dt_dev_pixelpipe_t *)pipe, module, inmask, tmp,
190 &module->roi_in, &module->roi_out);
191 resmask = tmp;
192 if(inmask != src) dt_pixelpipe_cache_free_align(inmask);
193 inmask = tmp;
194 }
195 else if(!module->module->distort_mask
196 && (module->roi_in.width != module->roi_out.width
197 || module->roi_in.height != module->roi_out.height
198 || module->roi_in.x != module->roi_out.x
199 || module->roi_in.y != module->roi_out.y))
200 fprintf(stderr, "FIXME: module `%s' changed the roi from %d x %d @ %d / %d to %d x %d | %d / %d but doesn't have "
201 "distort_mask() implemented!\n", module->module->op, module->roi_in.width,
202 module->roi_in.height, module->roi_in.x, module->roi_in.y,
203 module->roi_out.width, module->roi_out.height, module->roi_out.x,
204 module->roi_out.y);
205
206 if(module->module == target_module) break;
207 }
208 }
209 }
210 return resmask;
211}
static void error(char *msg)
Definition ashift_lsd.c:202
#define TRUE
Definition ashift_lsd.c:162
#define FALSE
Definition ashift_lsd.c:158
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static float kernel(const float *x, const float *y)
Definition colorchecker.c:469
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
static dt_aligned_pixel_t rgb
Definition colorspaces_inline_conversions.h:530
void dt_vprint(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1555
darktable_t darktable
Definition darktable.c:178
void dt_print(dt_debug_thread_t thread, const char *msg,...)
Definition darktable.c:1530
@ DT_DEBUG_MASKS
Definition darktable.h:647
#define dt_pixelpipe_cache_alloc_align_float_cache(pixels, id)
Definition darktable.h:371
#define dt_pixelpipe_cache_free_align(mem)
Definition darktable.h:377
gboolean dt_dev_pixelpipe_activemodule_disables_currentmodule(struct dt_develop_t *dev, struct dt_iop_module_t *current_module)
Definition dev_pixelpipe.c:212
@ DT_DEV_DETAIL_MASK_DEMOSAIC
Definition develop.h:140
@ DT_DEV_DETAIL_MASK_REQUIRED
Definition develop.h:139
@ DT_DEV_DETAIL_MASK_RAWPREPARE
Definition develop.h:141
void dt_masks_calc_rawdetail_mask(float *const src, float *const out, float *const tmp, const int width, const int height, const dt_aligned_pixel_t wb)
mask
Definition dtstyle_to_xmp.py:79
static int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
Definition opencl.h:574
static int dt_opencl_set_kernel_arg(const int dev, const int kernel, const size_t size, const void *arg)
Definition opencl.h:570
static void dt_opencl_release_mem_object(void *mem)
Definition opencl.h:619
float * dt_dev_distort_detail_mask(const dt_dev_pixelpipe_t *pipe, float *src, const dt_iop_module_t *target_module)
Definition pixelpipe_rawdetail.c:142
gboolean dt_dev_write_rawdetail_mask(const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *const rgb, const dt_iop_roi_t *const roi_in, const int mode)
Definition pixelpipe_rawdetail.c:17
void dt_dev_clear_rawdetail_mask(dt_dev_pixelpipe_t *pipe)
Definition pixelpipe_rawdetail.c:11
struct dt_opencl_t * opencl
Definition darktable.h:713
Definition pixelpipe_hb.h:95
gboolean enabled
Definition pixelpipe_hb.h:110
dt_iop_buffer_dsc_t dsc_in
Definition pixelpipe_hb.h:140
struct dt_iop_module_t *void * data
Definition pixelpipe_hb.h:96
Definition pixelpipe_hb.h:216
int want_detail_mask
Definition pixelpipe_hb.h:257
GList * nodes
Definition pixelpipe_hb.h:237
float * rawdetail_mask_data
Definition pixelpipe_hb.h:255
struct dt_iop_roi_t rawdetail_mask_roi
Definition pixelpipe_hb.h:256
int devid
Definition pixelpipe_hb.h:292
dt_aligned_pixel_t coeffs
Definition develop/format.h:69
struct dt_iop_buffer_dsc_t::@17 temperature
Definition imageop.h:216
GModule *dt_dev_operation_t op
Definition imageop.h:226
Definition imageop.h:67
int width
Definition imageop.h:68
int height
Definition imageop.h:68