本文整理汇总了C++中dt_iop_alpha_copy函数的典型用法代码示例。如果您正苦于以下问题:C++ dt_iop_alpha_copy函数的具体用法?C++ dt_iop_alpha_copy怎么用?C++ dt_iop_alpha_copy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dt_iop_alpha_copy函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: process
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o,
const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
// this is called for preview and full pipe separately, each with its own pixelpipe piece.
// get our data struct:
dt_iop_bilat_data_t *d = (dt_iop_bilat_data_t *)piece->data;
// the total scale is composed of scale before input to the pipeline (iscale),
// and the scale of the roi.
const float scale = piece->iscale / roi_in->scale;
const float sigma_r = d->sigma_r; // does not depend on scale
const float sigma_s = d->sigma_s / scale;
if(d->mode == s_mode_bilateral)
{
dt_bilateral_t *b = dt_bilateral_init(roi_in->width, roi_in->height, sigma_s, sigma_r);
dt_bilateral_splat(b, (float *)i);
dt_bilateral_blur(b);
dt_bilateral_slice(b, (float *)i, (float *)o, d->detail);
dt_bilateral_free(b);
}
else // s_mode_local_laplacian
{
local_laplacian(i, o, roi_in->width, roi_in->height, d->midtone, d->sigma_s, d->sigma_r, d->detail, 0);
}
if(piece->pipe->mask_display & DT_DEV_PIXELPIPE_DISPLAY_MASK) dt_iop_alpha_copy(i, o, roi_in->width, roi_in->height);
}
示例2: process
void process(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_profilegamma_data_t *data = (dt_iop_profilegamma_data_t *)piece->data;
const int ch = piece->colors;
#ifdef _OPENMP
#pragma omp parallel for default(none) shared(roi_out, ivoid, ovoid, data) schedule(static)
#endif
for(int k = 0; k < roi_out->height; k++)
{
const float *in = ((float *)ivoid) + (size_t)ch * k * roi_out->width;
float *out = ((float *)ovoid) + (size_t)ch * k * roi_out->width;
for(int j = 0; j < roi_out->width; j++, in += ch, out += ch)
{
for(int i = 0; i < 3; i++)
{
// use base curve for values < 1, else use extrapolation.
if(in[i] < 1.0f)
out[i] = data->table[CLAMP((int)(in[i] * 0x10000ul), 0, 0xffff)];
else
out[i] = dt_iop_eval_exp(data->unbounded_coeffs, in[i]);
}
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例3: process
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, void *i, void *o,
const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out)
{
dt_iop_exposure_data_t *d = (dt_iop_exposure_data_t *)piece->data;
commit_params_late(self, piece);
const float black = d->black;
const float white = exposure2white(d->exposure);
const int ch = piece->colors;
const float scale = 1.0 / (white - black);
const __m128 blackv = _mm_set1_ps(black);
const __m128 scalev = _mm_set1_ps(scale);
#ifdef _OPENMP
#pragma omp parallel for default(none) shared(roi_out, i, o) schedule(static)
#endif
for(int k = 0; k < roi_out->height; k++)
{
const float *in = ((float *)i) + (size_t)ch * k * roi_out->width;
float *out = ((float *)o) + (size_t)ch * k * roi_out->width;
for(int j = 0; j < roi_out->width; j++, in += 4, out += 4)
_mm_store_ps(out, (_mm_load_ps(in) - blackv) * scalev);
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(i, o, roi_out->width, roi_out->height);
for(int k = 0; k < 3; k++) piece->pipe->processed_maximum[k] *= scale;
}
示例4: process
void process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, void *i, void *o, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out)
{
float *d = (float *)piece->data;
const float gamma = d[0];
const float linear = d[1];
float table[0x10000];
float a, b, c, g;
if(gamma == 1.0)
{
for(int k=0; k<0x10000; k++) table[k] = 1.0*k/0x10000;
}
else
{
if(linear == 0.0)
{
for(int k=0; k<0x10000; k++)
table[k] = powf(1.00*k/0x10000, gamma);
}
else
{
if(linear<1.0)
{
g = gamma*(1.0-linear)/(1.0-gamma*linear);
a = 1.0/(1.0+linear*(g-1));
b = linear*(g-1)*a;
c = powf(a*linear+b, g)/linear;
}
else
{
a = b = g = 0.0;
c = 1.0;
}
for(int k=0; k<0x10000; k++)
{
float tmp;
if (k<0x10000*linear) tmp = c*k/0x10000;
else tmp = powf(a*k/0x10000+b, g);
table[k] = tmp;
}
}
}
float *in = (float *)i;
float *out = (float *)o;
const int ch = piece->colors;
for(int k=0; k<roi_out->width*roi_out->height; k++)
{
out[0] = table[CLAMP((int)(in[0]*0x10000ul), 0, 0xffff)];
out[1] = table[CLAMP((int)(in[1]*0x10000ul), 0, 0xffff)];
out[2] = table[CLAMP((int)(in[2]*0x10000ul), 0, 0xffff)];
in += ch;
out += ch;
}
if(piece->pipe->mask_display)
dt_iop_alpha_copy(i, o, roi_out->width, roi_out->height);
}
示例5: process
void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid,
const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
const int ch = piece->colors;
const dt_iop_levels_data_t *const d = (dt_iop_levels_data_t *)piece->data;
if(d->mode == LEVELS_MODE_AUTOMATIC)
{
commit_params_late(self, piece);
}
#ifdef _OPENMP
#pragma omp parallel for default(none) schedule(static)
#endif
for(int k = 0; k < roi_out->height; k++)
{
float *in = (float *)ivoid + (size_t)k * ch * roi_out->width;
float *out = (float *)ovoid + (size_t)k * ch * roi_out->width;
for(int j = 0; j < roi_out->width; j++, in += ch, out += ch)
{
float L_in = in[0] / 100.0f;
if(L_in <= d->levels[0])
{
// Anything below the lower threshold just clips to zero
out[0] = 0.0f;
}
else if(L_in >= d->levels[2])
{
float percentage = (L_in - d->levels[0]) / (d->levels[2] - d->levels[0]);
out[0] = 100.0f * pow(percentage, d->in_inv_gamma);
}
else
{
// Within the expected input range we can use the lookup table
float percentage = (L_in - d->levels[0]) / (d->levels[2] - d->levels[0]);
// out[0] = 100.0 * pow(percentage, d->in_inv_gamma);
out[0] = d->lut[CLAMP((int)(percentage * 0xfffful), 0, 0xffff)];
}
// Preserving contrast
if(in[0] > 0.01f)
{
out[1] = in[1] * out[0] / in[0];
out[2] = in[2] * out[0] / in[0];
}
else
{
out[1] = in[1] * out[0] / 0.01f;
out[2] = in[2] * out[0] / 0.01f;
}
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例6: process
void
process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void * const ivoid, void *ovoid, const dt_iop_roi_t *roi_in, const dt_iop_roi_t * const roi_out)
{
dt_develop_t *dev = self->dev;
const int ch = piece->colors;
const __m128 upper = _mm_set_ps(FLT_MAX,
dev->overexposed.upper / 100.0f,
dev->overexposed.upper / 100.0f,
dev->overexposed.upper / 100.0f);
const __m128 lower = _mm_set_ps(FLT_MAX,
dev->overexposed.lower / 100.0f,
dev->overexposed.lower / 100.0f,
dev->overexposed.lower / 100.0f);
const int colorscheme = dev->overexposed.colorscheme;
const __m128 upper_color = _mm_load_ps(dt_iop_overexposed_colors[colorscheme][0]);
const __m128 lower_color = _mm_load_ps(dt_iop_overexposed_colors[colorscheme][1]);
#ifdef _OPENMP
#pragma omp parallel for default(none) shared(ovoid) schedule(static)
#endif
for(int k=0; k<roi_out->height; k++)
{
const float *in = ((float *)ivoid) + (size_t)ch*k*roi_out->width;
float *out = ((float *)ovoid) + (size_t)ch*k*roi_out->width;
for (int j=0; j<roi_out->width; j++,in+=4,out+=4)
{
const __m128 pixel = _mm_load_ps(in);
__m128 isoe = _mm_cmpge_ps(pixel, upper);
isoe = _mm_or_ps(_mm_unpacklo_ps(isoe, isoe), _mm_unpackhi_ps(isoe, isoe));
isoe = _mm_or_ps(_mm_unpacklo_ps(isoe, isoe), _mm_unpackhi_ps(isoe, isoe));
__m128 isue = _mm_cmple_ps(pixel, lower);
isue = _mm_and_ps(_mm_unpacklo_ps(isue, isue), _mm_unpackhi_ps(isue, isue));
isue = _mm_and_ps(_mm_unpacklo_ps(isue, isue), _mm_unpackhi_ps(isue, isue));
__m128 result = _mm_or_ps(_mm_andnot_ps(isoe, pixel),
_mm_and_ps(isoe, upper_color));
result = _mm_or_ps(_mm_andnot_ps(isue, result),
_mm_and_ps(isue, lower_color));
_mm_stream_ps(out, result);
}
}
_mm_sfence();
if(piece->pipe->mask_display)
dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例7: process
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
dt_develop_t *dev = self->dev;
const int ch = piece->colors;
const float lower = dev->overexposed.lower / 100.0;
const float upper = dev->overexposed.upper / 100.0;
const int colorscheme = dev->overexposed.colorscheme;
const float *const upper_color = dt_iop_overexposed_colors[colorscheme][0];
const float *const lower_color = dt_iop_overexposed_colors[colorscheme][1];
const float *const in = (const float *const)ivoid;
float *const out = (float *const)ovoid;
#ifdef _OPENMP
#pragma omp parallel for default(none) schedule(static)
#endif
for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch)
{
if(in[k + 0] >= upper || in[k + 1] >= upper || in[k + 2] >= upper)
{
for(int c = 0; c < 3; c++)
{
out[k + c] = upper_color[c];
}
}
else if(in[k + 0] <= lower || in[k + 1] <= lower || in[k + 2] <= lower)
{
for(int c = 0; c < 3; c++)
{
out[k + c] = lower_color[c];
}
}
else
{
for(int c = 0; c < 3; c++)
{
const size_t p = (size_t)k + c;
out[p] = in[p];
}
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例8: process_sse2
void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
const dt_iop_colorchecker_data_t *const data = (dt_iop_colorchecker_data_t *)piece->data;
const int ch = piece->colors;
// TODO: swizzle this so we can eval the distance of one point
// TODO: to four patches at the same time
v4sf source_Lab[data->num_patches];
for(int i=0;i<data->num_patches;i++)
source_Lab[i] = _mm_set_ps(1.0,
data->source_Lab[3*i+0],
data->source_Lab[3*i+1],
data->source_Lab[3*i+2]);
#ifdef _OPENMP
#pragma omp parallel for default(none) schedule(static) collapse(2)
#endif
for(int j=0;j<roi_out->height;j++)
{
for(int i=0;i<roi_out->width;i++)
{
const float *in = ((float *)ivoid) + (size_t)ch * (j * roi_in->width + i);
float *out = ((float *)ovoid) + (size_t)ch * (j * roi_in->width + i);
// TODO: do this part in SSE (maybe need to store coeff_L in _mm128 on data struct)
out[0] = data->coeff_L[data->num_patches];
out[1] = data->coeff_a[data->num_patches];
out[2] = data->coeff_b[data->num_patches];
// polynomial part:
out[0] += data->coeff_L[data->num_patches+1] * in[0] +
data->coeff_L[data->num_patches+2] * in[1] +
data->coeff_L[data->num_patches+3] * in[2];
out[1] += data->coeff_a[data->num_patches+1] * in[0] +
data->coeff_a[data->num_patches+2] * in[1] +
data->coeff_a[data->num_patches+3] * in[2];
out[2] += data->coeff_b[data->num_patches+1] * in[0] +
data->coeff_b[data->num_patches+2] * in[1] +
data->coeff_b[data->num_patches+3] * in[2];
for(int k=0;k<data->num_patches;k+=4)
{ // rbf from thin plate spline
const v4sf phi = kerneldist4(in, source_Lab[k]);
// TODO: add up 4x output channels
out[0] += data->coeff_L[k] * phi[0];
out[1] += data->coeff_a[k] * phi[0];
out[2] += data->coeff_b[k] * phi[0];
}
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例9: process
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
const dt_iop_colorchecker_data_t *const data = (dt_iop_colorchecker_data_t *)piece->data;
const int ch = piece->colors;
#ifdef _OPENMP
#pragma omp parallel for default(none) schedule(static) collapse(2)
#endif
for(int j=0;j<roi_out->height;j++)
{
for(int i=0;i<roi_out->width;i++)
{
const float *in = ((float *)ivoid) + (size_t)ch * (j * roi_in->width + i);
float *out = ((float *)ovoid) + (size_t)ch * (j * roi_in->width + i);
out[0] = data->coeff_L[data->num_patches];
out[1] = data->coeff_a[data->num_patches];
out[2] = data->coeff_b[data->num_patches];
// polynomial part:
out[0] += data->coeff_L[data->num_patches+1] * in[0] +
data->coeff_L[data->num_patches+2] * in[1] +
data->coeff_L[data->num_patches+3] * in[2];
out[1] += data->coeff_a[data->num_patches+1] * in[0] +
data->coeff_a[data->num_patches+2] * in[1] +
data->coeff_a[data->num_patches+3] * in[2];
out[2] += data->coeff_b[data->num_patches+1] * in[0] +
data->coeff_b[data->num_patches+2] * in[1] +
data->coeff_b[data->num_patches+3] * in[2];
#if defined(_OPENMP) && defined(OPENMP_SIMD_) // <== nice try, i don't think this does anything here
#pragma omp SIMD()
#endif
for(int k=0;k<data->num_patches;k++)
{ // rbf from thin plate spline
const float phi = kernel(in, data->source_Lab + 3*k);
out[0] += data->coeff_L[k] * phi;
out[1] += data->coeff_a[k] * phi;
out[2] += data->coeff_b[k] * phi;
}
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例10: process
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);
}
示例11: process
/** process, all real work is done here. */
void process (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, void *i, void *o, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out)
{
// this is called for preview and full pipe separately, each with its own pixelpipe piece.
assert(dt_iop_module_colorspace(self) == iop_cs_Lab);
// get our data struct:
dt_iop_colorcontrast_params_t *d = (dt_iop_colorcontrast_params_t *)piece->data;
// how many colors in our buffer?
const int ch = piece->colors;
// iterate over all output pixels (same coordinates as input)
#ifdef _OPENMP
// optional: parallelize it!
#pragma omp parallel for default(none) schedule(static) shared(i,o,roi_in,roi_out,d)
#endif
for(int j=0; j<roi_out->height; j++)
{
float *in = ((float *)i) + ch*roi_in->width *j;
float *out = ((float *)o) + ch*roi_out->width*j;
const __m128 scale = _mm_set_ps(0.0f,d->b_steepness,d->a_steepness,1.0f);
const __m128 offset = _mm_set_ps(0.0f,d->b_offset,d->a_offset,0.0f);
const __m128 min = _mm_set_ps(0.0f,-128.0f,-128.0f, -INFINITY);
const __m128 max = _mm_set_ps(0.0f, 128.0f, 128.0f, INFINITY);
for(int i=0; i<roi_out->width; i++)
{
_mm_stream_ps(out,_mm_min_ps(max,_mm_max_ps(min,_mm_add_ps(offset,_mm_mul_ps(scale,_mm_load_ps(in))))));
in+=ch;
out+=ch;
}
}
_mm_sfence();
if(piece->pipe->mask_display)
dt_iop_alpha_copy(i, o, roi_out->width, roi_out->height);
}
示例12: process
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)
{
const dt_iop_channelmixer_data_t *data = (dt_iop_channelmixer_data_t *)piece->data;
const gboolean gray_mix_mode = ( data->red[CHANNEL_GRAY] !=0.0 || data->green[CHANNEL_GRAY] !=0.0 || data->blue[CHANNEL_GRAY] !=0.0)?TRUE:FALSE;
const int ch = piece->colors;
#ifdef _OPENMP
#pragma omp parallel for default(none) shared(ivoid, ovoid, roi_in, roi_out, data) schedule(static)
#endif
for(int j=0; j<roi_out->height; j++)
{
const float *in = ((float *)ivoid) + (size_t)ch*j*roi_out->width;
float *out = ((float *)ovoid) + (size_t)ch*j*roi_out->width;
for(int i=0; i<roi_out->width; i++)
{
float h,s,l, hmix,smix,lmix,rmix,gmix,bmix,graymix;
// Calculate the HSL mix
hmix = CLIP( in[0] * data->red[CHANNEL_HUE] )+( in[1] * data->green[CHANNEL_HUE])+( in[2] * data->blue[CHANNEL_HUE] );
smix = CLIP( in[0] * data->red[CHANNEL_SATURATION] )+( in[1] * data->green[CHANNEL_SATURATION])+( in[2] * data->blue[CHANNEL_SATURATION] );
lmix = CLIP( in[0] * data->red[CHANNEL_LIGHTNESS] )+( in[1] * data->green[CHANNEL_LIGHTNESS])+( in[2] * data->blue[CHANNEL_LIGHTNESS] );
// If HSL mix is used apply to out[]
if( hmix != 0.0 || smix != 0.0 || lmix != 0.0 )
{
// mix into HSL output channels
rgb2hsl(in,&h,&s,&l);
h = (hmix != 0.0 ) ? hmix : h;
s = (smix != 0.0 ) ? smix : s;
l = (lmix != 0.0 ) ? lmix : l;
hsl2rgb(out,h,s,l);
}
else // no HSL copt in[] to out[]
for(int i=0; i<3; i++) out[i]=in[i];
// Calculate graymix and RGB mix
graymix = CLIP(( out[0] * data->red[CHANNEL_GRAY] )+( out[1] * data->green[CHANNEL_GRAY])+( out[2] * data->blue[CHANNEL_GRAY] ));
rmix = CLIP(( out[0] * data->red[CHANNEL_RED] )+( out[1] * data->green[CHANNEL_RED])+( out[2] * data->blue[CHANNEL_RED] ));
gmix = CLIP(( out[0] * data->red[CHANNEL_GREEN] )+( out[1] * data->green[CHANNEL_GREEN])+( out[2] * data->blue[CHANNEL_GREEN] ));
bmix = CLIP(( out[0] * data->red[CHANNEL_BLUE] )+( out[1] * data->green[CHANNEL_BLUE])+( out[2] * data->blue[CHANNEL_BLUE] ));
if (gray_mix_mode) // Graymix is used...
out[0] = out[1] = out[2] = graymix;
else // RGB mix is used...
{
out[0] = rmix;
out[1] = gmix;
out[2] = bmix;
}
/*mix = CLIP( in[0] * data->red)+( in[1] * data->green)+( in[2] * data->blue );
if( data->output_channel <= CHANNEL_LIGHTNESS ) {
// mix into HSL output channels
rgb2hsl(in,&h,&s,&l);
h = ( data->output_channel == CHANNEL_HUE ) ? mix : h;
s = ( data->output_channel == CHANNEL_SATURATION ) ? mix : s;
l = ( data->output_channel == CHANNEL_LIGHTNESS ) ? mix : l;
hsl2rgb(out,h,s,l);
} else if( data->output_channel > CHANNEL_LIGHTNESS && data->output_channel < CHANNEL_GRAY) {
// mix into rgb output channels
out[0] = ( data->output_channel == CHANNEL_RED ) ? mix : in[0];
out[1] = ( data->output_channel == CHANNEL_GREEN ) ? mix : in[1];
out[2] = ( data->output_channel == CHANNEL_BLUE ) ? mix : in[2];
} else if( data->output_channel <= CHANNEL_GRAY ) {
out[0]=out[1]=out[2] = mix;
}
*/
out += ch;
in += ch;
}
}
if(piece->pipe->mask_display)
dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例13: process
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const ivoid,
void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
{
const uint32_t filters = piece->pipe->dsc.filters;
dt_iop_highlights_data_t *data = (dt_iop_highlights_data_t *)piece->data;
const float clip
= data->clip * fminf(piece->pipe->dsc.processed_maximum[0],
fminf(piece->pipe->dsc.processed_maximum[1], piece->pipe->dsc.processed_maximum[2]));
// const int ch = piece->colors;
if(!filters)
{
process_clip(piece, ivoid, ovoid, roi_in, roi_out, clip);
for(int k=0;k<3;k++)
piece->pipe->dsc.processed_maximum[k]
= fminf(piece->pipe->dsc.processed_maximum[0],
fminf(piece->pipe->dsc.processed_maximum[1], piece->pipe->dsc.processed_maximum[2]));
return;
}
switch(data->mode)
{
case DT_IOP_HIGHLIGHTS_INPAINT: // a1ex's (magiclantern) idea of color inpainting:
{
const float clips[4] = { 0.987 * data->clip * piece->pipe->dsc.processed_maximum[0],
0.987 * data->clip * piece->pipe->dsc.processed_maximum[1],
0.987 * data->clip * piece->pipe->dsc.processed_maximum[2], clip };
if(filters == 9u)
{
const uint8_t(*const xtrans)[6] = (const uint8_t(*const)[6])piece->pipe->dsc.xtrans;
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none)
#endif
for(int j = 0; j < roi_out->height; j++)
{
interpolate_color_xtrans(ivoid, ovoid, roi_in, roi_out, 0, 1, j, clips, xtrans, 0);
interpolate_color_xtrans(ivoid, ovoid, roi_in, roi_out, 0, -1, j, clips, xtrans, 1);
}
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none)
#endif
for(int i = 0; i < roi_out->width; i++)
{
interpolate_color_xtrans(ivoid, ovoid, roi_in, roi_out, 1, 1, i, clips, xtrans, 2);
interpolate_color_xtrans(ivoid, ovoid, roi_in, roi_out, 1, -1, i, clips, xtrans, 3);
}
}
else
{
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none) shared(data, piece)
#endif
for(int j = 0; j < roi_out->height; j++)
{
interpolate_color(ivoid, ovoid, roi_out, 0, 1, j, clips, filters, 0);
interpolate_color(ivoid, ovoid, roi_out, 0, -1, j, clips, filters, 1);
}
// up/down directions
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none) shared(data, piece)
#endif
for(int i = 0; i < roi_out->width; i++)
{
interpolate_color(ivoid, ovoid, roi_out, 1, 1, i, clips, filters, 2);
interpolate_color(ivoid, ovoid, roi_out, 1, -1, i, clips, filters, 3);
}
}
break;
}
case DT_IOP_HIGHLIGHTS_LCH:
if(filters == 9u)
process_lch_xtrans(self, piece, ivoid, ovoid, roi_in, roi_out, clip);
else
process_lch_bayer(self, piece, ivoid, ovoid, roi_in, roi_out, clip);
break;
default:
case DT_IOP_HIGHLIGHTS_CLIP:
process_clip(piece, ivoid, ovoid, roi_in, roi_out, clip);
break;
}
// update processed maximum
const float m = fmaxf(fmaxf(piece->pipe->dsc.processed_maximum[0], piece->pipe->dsc.processed_maximum[1]),
piece->pipe->dsc.processed_maximum[2]);
for(int k = 0; k < 3; k++) piece->pipe->dsc.processed_maximum[k] = m;
if(piece->pipe->mask_display & DT_DEV_PIXELPIPE_DISPLAY_MASK) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例14: process
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_highlights_data_t *data = (dt_iop_highlights_data_t *)piece->data;
float *in;
float *out;
const int ch = piece->colors;
const float clip = data->clip * fminf(piece->pipe->processed_maximum[0], fminf(piece->pipe->processed_maximum[1], piece->pipe->processed_maximum[2]));
float inc[3], lch[3], lchc[3], lchi[3];
switch(data->mode)
{
case DT_IOP_HIGHLIGHTS_LCH:
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none) shared(ovoid, ivoid, roi_out, data, piece) private(in, out, inc, lch, lchc, lchi)
#endif
for(int j=0; j<roi_out->height; j++)
{
out = (float *)ovoid + ch*roi_out->width*j;
in = (float *)ivoid + ch*roi_out->width*j;
for(int i=0; i<roi_out->width; i++)
{
if(in[0] <= clip && in[1] <= clip && in[2] <= clip)
{
// fast path for well-exposed pixels.
for(int c=0; c<3; c++) out[c] = in[c];
}
else
{
for(int c=0; c<3; c++) inc[c] = fminf(clip, in[c]);
rgb_to_lch(in, lchi);
rgb_to_lch(inc, lchc);
lch[0] = lchc[0] + data->blendL * (lchi[0] - lchc[0]);
lch[1] = lchc[1] + data->blendC * (lchi[1] - lchc[1]);
lch[2] = lchc[2] + data->blendh * (lchi[2] - lchc[2]);
lch_to_rgb(lch, out);
}
out += ch;
in += ch;
}
}
break;
default:
case DT_IOP_HIGHLIGHTS_CLIP:
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic) default(none) shared(ovoid, ivoid, roi_out) private(in, out, inc, lch, lchc, lchi)
#endif
for(int j=0; j<roi_out->height; j++)
{
out = (float *)ovoid + ch*roi_out->width*j;
in = (float *)ivoid + ch*roi_out->width*j;
for(int i=0; i<roi_out->width; i++)
{
for(int c=0; c<3; c++) out[c] = fminf(clip, in[c]);
out += ch;
in += ch;
}
}
break;
}
if(piece->pipe->mask_display)
dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}
示例15: process
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)
{
const dt_iop_colorout_data_t *const d = (dt_iop_colorout_data_t *)piece->data;
const int ch = piece->colors;
const int gamutcheck = (d->mode == DT_PROFILE_GAMUTCHECK);
if(!isnan(d->cmatrix[0]))
{
// fprintf(stderr,"Using cmatrix codepath\n");
// convert to rgb using matrix
#ifdef _OPENMP
#pragma omp parallel for schedule(static) default(none) shared(roi_in, roi_out, ivoid, ovoid)
#endif
for(int j = 0; j < roi_out->height; j++)
{
float *in = (float *)ivoid + (size_t)ch * roi_in->width * j;
float *out = (float *)ovoid + (size_t)ch * roi_out->width * j;
const __m128 m0 = _mm_set_ps(0.0f, d->cmatrix[6], d->cmatrix[3], d->cmatrix[0]);
const __m128 m1 = _mm_set_ps(0.0f, d->cmatrix[7], d->cmatrix[4], d->cmatrix[1]);
const __m128 m2 = _mm_set_ps(0.0f, d->cmatrix[8], d->cmatrix[5], d->cmatrix[2]);
for(int i = 0; i < roi_out->width; i++, in += ch, out += ch)
{
const __m128 xyz = dt_Lab_to_XYZ_SSE(_mm_load_ps(in));
const __m128 t
= _mm_add_ps(_mm_mul_ps(m0, _mm_shuffle_ps(xyz, xyz, _MM_SHUFFLE(0, 0, 0, 0))),
_mm_add_ps(_mm_mul_ps(m1, _mm_shuffle_ps(xyz, xyz, _MM_SHUFFLE(1, 1, 1, 1))),
_mm_mul_ps(m2, _mm_shuffle_ps(xyz, xyz, _MM_SHUFFLE(2, 2, 2, 2)))));
_mm_stream_ps(out, t);
}
}
_mm_sfence();
// apply profile
#ifdef _OPENMP
#pragma omp parallel for schedule(static) default(none) shared(roi_in, roi_out, ivoid, ovoid)
#endif
for(int j = 0; j < roi_out->height; j++)
{
float *in = (float *)ivoid + (size_t)ch * roi_in->width * j;
float *out = (float *)ovoid + (size_t)ch * roi_out->width * j;
for(int i = 0; i < roi_out->width; i++, in += ch, out += ch)
{
for(int i = 0; i < 3; i++)
if(d->lut[i][0] >= 0.0f)
{
out[i] = (out[i] < 1.0f) ? lerp_lut(d->lut[i], out[i])
: dt_iop_eval_exp(d->unbounded_coeffs[i], out[i]);
}
}
}
}
else
{
// fprintf(stderr,"Using xform codepath\n");
const __m128 outofgamutpixel = _mm_set_ps(0.0f, 1.0f, 1.0f, 0.0f);
#ifdef _OPENMP
#pragma omp parallel for schedule(static) default(none) shared(ivoid, ovoid, roi_out)
#endif
for(int k = 0; k < roi_out->height; k++)
{
const float *in = ((float *)ivoid) + (size_t)ch * k * roi_out->width;
float *out = ((float *)ovoid) + (size_t)ch * k * roi_out->width;
if(!gamutcheck)
{
cmsDoTransform(d->xform, in, out, roi_out->width);
}
else
{
void *rgb = dt_alloc_align(16, 4 * sizeof(float) * roi_out->width);
cmsDoTransform(d->xform, in, rgb, roi_out->width);
float *rgbptr = (float *)rgb;
for(int j = 0; j < roi_out->width; j++, rgbptr += 4, out += 4)
{
const __m128 pixel = _mm_load_ps(rgbptr);
__m128 ingamut = _mm_cmplt_ps(pixel, _mm_set_ps(-FLT_MAX, 0.0f, 0.0f, 0.0f));
ingamut = _mm_or_ps(_mm_unpacklo_ps(ingamut, ingamut), _mm_unpackhi_ps(ingamut, ingamut));
ingamut = _mm_or_ps(_mm_unpacklo_ps(ingamut, ingamut), _mm_unpackhi_ps(ingamut, ingamut));
const __m128 result
= _mm_or_ps(_mm_and_ps(ingamut, outofgamutpixel), _mm_andnot_ps(ingamut, pixel));
_mm_stream_ps(out, result);
}
dt_free_align(rgb);
}
}
_mm_sfence();
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(ivoid, ovoid, roi_out->width, roi_out->height);
}