Skip to content

Commit e76cc38

Browse files
Special care for post-pipescale modules
Make sure those modules snap to demosaicer patterns for roi_in->x/y
1 parent c9a5ccc commit e76cc38

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

src/iop/ashift.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,10 +1278,20 @@ void modify_roi_in(dt_iop_module_t *self,
12781278
roi_in->width = xM + iw2 - xm + 1.0f;
12791279
roi_in->height = yM + iw2 - ym + 1.0f;
12801280

1281+
const uint32_t filters = piece->pipe->dsc.filters;
1282+
if(piece->pipe->pipescale_order > self->iop_order && filters)
1283+
{
1284+
dt_print(DT_DEBUG_PIPE, "detected pipescale (%d) after %s (%d)", piece->pipe->pipescale_order, self->so->op, self->iop_order);
1285+
const int snap = filters == 9u ? 3 : 2;
1286+
roi_in->x = (roi_in->x / snap) * snap;
1287+
roi_in->y = (roi_in->y / snap) * snap;
1288+
}
1289+
12811290

12821291
// sanity check.
12831292
roi_in->x = CLAMP(roi_in->x, 0, (int)floorf(orig_w));
12841293
roi_in->y = CLAMP(roi_in->y, 0, (int)floorf(orig_h));
1294+
12851295
roi_in->width = CLAMP(roi_in->width, 4, (int)floorf(orig_w) - roi_in->x);
12861296
roi_in->height = CLAMP(roi_in->height, 4, (int)floorf(orig_h) - roi_in->y);
12871297
}

src/iop/crop.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,14 @@ void modify_roi_in(dt_iop_module_t *self,
441441

442442
roi_in->x += iw * d->cx;
443443
roi_in->y += ih * d->cy;
444-
444+
const uint32_t filters = piece->pipe->dsc.filters;
445+
if(piece->pipe->pipescale_order > self->iop_order && filters)
446+
{
447+
dt_print(DT_DEBUG_PIPE, "detected pipescale (%d) after %s (%d)", piece->pipe->pipescale_order, self->so->op, self->iop_order);
448+
const int snap = filters == 9u ? 3 : 2;
449+
roi_in->x = (roi_in->x / snap) * snap;
450+
roi_in->y = (roi_in->y / snap) * snap;
451+
}
445452
roi_in->x = CLAMP(roi_in->x, 0, (int)floorf(iw));
446453
roi_in->y = CLAMP(roi_in->y, 0, (int)floorf(ih));
447454
}

src/iop/enlargecanvas.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ void modify_roi_in(dt_iop_module_t *self,
173173
// don't request outside image (no px for borders)
174174
roi_in->x = MAX(roundf(roi_out->x - border_size_l), 0);
175175
roi_in->y = MAX(roundf(roi_out->y - border_size_t), 0);
176+
const uint32_t filters = piece->pipe->dsc.filters;
177+
if(piece->pipe->pipescale_order > self->iop_order && filters)
178+
{
179+
dt_print(DT_DEBUG_PIPE, "detected pipescale (%d) after %s (%d)", piece->pipe->pipescale_order, self->so->op, self->iop_order);
180+
const int snap = filters == 9u ? 3 : 2;
181+
roi_in->x = (roi_in->x / snap) * snap;
182+
roi_in->y = (roi_in->y / snap) * snap;
183+
}
176184

177185
// subtract upper left border from dimensions
178186
roi_in->width -= MAX(roundf(border_size_l - roi_out->x), 0);

src/iop/lens.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3223,6 +3223,12 @@ void modify_roi_in(dt_iop_module_t *self,
32233223
dt_iop_roi_t *roi_in)
32243224
{
32253225
dt_iop_lens_data_t *d = (dt_iop_lens_data_t *)piece->data;
3226+
if(piece->pipe->pipescale_order > self->iop_order)
3227+
{
3228+
*roi_in = *roi_out;
3229+
dt_print(DT_DEBUG_PIPE, "detected pipescale (%d) after %s (%d)", piece->pipe->pipescale_order, self->so->op, self->iop_order);
3230+
return;
3231+
}
32263232

32273233
if(d->method == DT_IOP_LENS_METHOD_LENSFUN)
32283234
{

0 commit comments

Comments
 (0)