本文整理汇总了C++中dt_iop_alpha_copy函数 的典型用法代码示例。如果您正苦于以下问题:C++ dt_iop_alpha_copy函数的具体用法?C++ dt_iop_alpha_copy怎么用?C++ dt_iop_alpha_copy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dt_iop_alpha_copy函数 的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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);
}
开发者ID:CChiappa, 项目名称:darktable, 代码行数:27, 代码来源:bilat.c
示例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);
}
开发者ID:dirkbr, 项目名称:darktable, 代码行数:30, 代码来源:profile_gamma.c
示例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;
}
开发者ID:Acidburn0zzz, 项目名称:darktable, 代码行数:28, 代码来源:exposure.c
示例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);
}
开发者ID:MarcAntoine-Arnaud, 项目名称:darktable, 代码行数:58, 代码来源:profile_gamma.c
示例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);
}
开发者ID:AdamMajer, 项目名称:darktable, 代码行数:56, 代码来源:levels.c
示例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);
}
开发者ID:Coshibu, 项目名称:darktable, 代码行数:54, 代码来源:overexposed.c
示例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);
}
开发者ID:dtorop, 项目名称:darktable, 代码行数:48, 代码来源:overexposed.c
示例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);
}
开发者ID:PkmX, 项目名称:darktable, 代码行数:48, 代码来源:colorchecker.c
示例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);
}
开发者ID:PkmX, 项目名称:darktable, 代码行数:41, 代码来源:colorchecker.c
示例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);
}
开发者ID:rpoisel, 项目名称:darktable, 代码行数:40, 代码来源:globaltonemap.c
示例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);
}
开发者ID:gthb, 项目名称:darktable, 代码行数:38, 代码来源:colorcontrast.c
示例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);
}
开发者ID:PolarFox, 项目名称:darktable, 代码行数:77, 代码来源:channelmixer.c
示例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);
}
开发者ID:VolkerChristian, 项目名称:darktable, 代码行数:90, 代码来源:highlights.c
示例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);
}
开发者ID:amitkr, 项目名称:darktable, 代码行数:64, 代码来源:highlights.c
示例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);
}
开发者ID:dirkbr, 项目名称:darktable, 代码行数:97, 代码来源:colorout.c
示例16: process
//.........这里部分代码省略.........
}
#ifdef _OPENMP
// dynamically/guided scheduled due to possible uneven edge-chroma distribution (thanks to rawtherapee code
// for this hint!)
#pragma omp parallel for default(none) shared(width, height, d, xy_small, xy_avg, xy_artifact) \
firstprivate(thresh, avg_edge_chroma) schedule(guided, 32)
#endif
for(int v = 0; v < height; v++)
{
for(int t = 0; t < width; t++)
{
float local_thresh = thresh;
// think of compiler setting "-funswitch-loops" to maybe improve these things:
if(MODE_LOCAL_AVERAGE == d->op_mode && out[(size_t)v * width * ch + t * ch + 3] > thresh)
{
float local_avg = 0.0;
// use some and not all values from the neigbourhood to speed things up:
const int *tmp = xy_avg;
for(int u = 0; u < samples_avg; u++)
{
int dx = *tmp++;
int dy = *tmp++;
int x = MAX(0, MIN(width - 1, t + dx));
int y = MAX(0, MIN(height - 1, v + dy));
local_avg += out[(size_t)y * width * ch + x * ch + 3];
}
avg_edge_chroma = fmax(0.01f, (float)local_avg / samples_avg);
local_thresh = fmax(0.1f, 4.0 * d->thresh * avg_edge_chroma / MAGIC_THRESHOLD_COEFF);
}
if(out[(size_t)v * width * ch + t * ch + 3] > local_thresh
// reduces artifacts ("region growing by 1 pixel"):
|| out[(size_t)MAX(0, (v - 1)) * width * ch + MAX(0, (t - 1)) * ch + 3] > local_thresh
|| out[(size_t)MAX(0, (v - 1)) * width * ch + t * ch + 3] > local_thresh
|| out[(size_t)MAX(0, (v - 1)) * width * ch + MIN(width - 1, (t + 1)) * ch + 3] > local_thresh
|| out[(size_t)v * width * ch + MAX(0, (t - 1)) * ch + 3] > local_thresh
|| out[(size_t)v * width * ch + MIN(width - 1, (t + 1)) * ch + 3] > local_thresh
|| out[(size_t)MIN(height - 1, (v + 1)) * width * ch + MAX(0, (t - 1)) * ch + 3] > local_thresh
|| out[(size_t)MIN(height - 1, (v + 1)) * width * ch + t * ch + 3] > local_thresh
|| out[(size_t)MIN(height - 1, (v + 1)) * width * ch + MIN(width - 1, (t + 1)) * ch + 3]
> local_thresh)
{
float atot = 0, btot = 0;
float norm = 0;
float weight;
// it seems better to use only some pixels from a larger window instead of all pixels from a smaller
// window
// we use a fibonacci lattice for that, samples amount need to be a fibonacci number, this can then be
// scaled to
// a certain radius
// use some neighbourhood pixels for lowest chroma average
const int *tmp = xy_small;
for(int u = 0; u < samples_small; u++)
{
int dx = *tmp++;
int dy = *tmp++;
int x = MAX(0, MIN(width - 1, t + dx));
int y = MAX(0, MIN(height - 1, v + dy));
// inverse chroma weighted average of neigbouring pixels inside window
// also taking average edge chromaticity into account (either global or local average)
weight = 1.0 / (out[(size_t)y * width * ch + x * ch + 3] + avg_edge_chroma);
atot += weight * in[(size_t)y * width * ch + x * ch + 1];
btot += weight * in[(size_t)y * width * ch + x * ch + 2];
norm += weight;
}
// here we could try using a "balance" between original and changed value, this could be used to
// reduce artifcats
// but on first tries, results weren't very convincing, and there are blend settings available anyway
// in dt
// float balance = (out[v*width*ch +t*ch +3]-thresh)/out[v*width*ch +t*ch +3];
double a = (atot / norm); // *balance + in[v*width*ch + t*ch +1]*(1.0-balance);
double b = (btot / norm); // *balance + in[v*width*ch + t*ch +2]*(1.0-balance);
// if (a < -128.0 || a > 127.0) CLIP(a,-128.0,127.0);
// if (b < -128.0 || b > 127.0) CLIP(b,-128.0,127.0);
out[(size_t)v * width * ch + t * ch + 1] = a;
out[(size_t)v * width * ch + t * ch + 2] = b;
}
else
{
out[(size_t)v * width * ch + t * ch + 1] = in[(size_t)v * width * ch + t * ch + 1];
out[(size_t)v * width * ch + t * ch + 2] = in[(size_t)v * width * ch + t * ch + 2];
}
out[(size_t)v * width * ch + t * ch] = in[(size_t)v * width * ch + t * ch];
}
}
if(piece->pipe->mask_display) dt_iop_alpha_copy(i, o, roi_out->width, roi_out->height);
goto FINISH_PROCESS;
ERROR_EXIT:
memcpy(o, i, (size_t)sizeof(float) * ch * roi_out->width * roi_out->height);
FINISH_PROCESS:
free(xy_artifact);
free(xy_small);
free(xy_avg);
}
开发者ID:Acidburn0zzz, 项目名称:darktable, 代码行数:101, 代码来源:defringe.c
示例17: process_sse2
void process_sse2(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;
dt_iop_bilat_gui_data_t *g = self->gui_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_boundary_t b = {0};
if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW)
{
b.mode = 1;
}
else if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_FULL)
{
// full pipeline working on ROI needs boundary conditions from preview pipe
// only do this if roi covers less than 90% of full width
if(MIN(roi_in->width/roi_in->scale / piece->buf_in.width,
roi_in->height/roi_in->scale / piece->buf_in.height) < 0.9)
{
dt_pthread_mutex_lock(&g->lock);
const uint64_t hash = g->hash;
dt_pthread_mutex_unlock(&g->lock);
if(hash != 0 && !dt_dev_sync_pixelpipe_hash(self->dev, piece->pipe, 0, self->priority, &g->lock, &g->hash))
{
// TODO: remove this debug output at some point:
dt_control_log(_("local laplacian: inconsistent output"));
}
else
{
dt_pthread_mutex_lock(&g->lock);
// grab preview pipe buffers here:
b = g->ll_boundary;
dt_pthread_mutex_unlock(&g->lock);
if(b.wd > 0 && b.ht > 0) b.mode = 2;
}
}
}
b.roi = roi_in;
b.buf = &piece->buf_in;
// also lock the ll_boundary in case we're using it.
// could get away without this if the preview pipe didn't also free the data below.
const int lockit = self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_FULL;
if(lockit)
{
dt_pthread_mutex_lock(&g->lock);
local_laplacian_sse2(i, o, roi_in->width, roi_in->height, d->midtone, d->sigma_s, d->sigma_r, d->detail, &b);
dt_pthread_mutex_unlock(&g->lock);
}
else local_laplacian_sse2(i, o, roi_in->width, roi_in->height, d->midtone, d->sigma_s, d->sigma_r, d->detail, &b);
// preview pixelpipe stores values.
if(self->dev->gui_attached && g && piece->pipe->type == DT_DEV_PIXELPIPE_PREVIEW)
{
uint64_t hash = dt_dev_hash_plus(self->dev, piece->pipe, 0, self->priority);
dt_pthread_mutex_lock(&g->lock);
// store buffer pointers on gui struct. maybe need to swap/free old ones
local_laplacian_boundary_free(&g->ll_boundary);
g->ll_boundary = b;
g->hash = hash;
dt_pthread_mutex_unlock(&g->lock);
}
}
if(piece->pipe->mask_display & DT_DEV_PIXELPIPE_DISPLAY_MASK) dt_iop_alpha_copy(i, o, roi_in->width, roi_in->height);
}
开发者ID:CChiappa, 项目名称:darktable, 代码行数:82, 代码来源:bilat.c
六六分期app的软件客服如何联系?不知道吗?加qq群【895510560】即可!标题:六六分期
阅读:19242| 2023-10-27
今天小编告诉大家如何处理win10系统火狐flash插件总是崩溃的问题,可能很多用户都不知
阅读:10002| 2022-11-06
今天小编告诉大家如何对win10系统删除桌面回收站图标进行设置,可能很多用户都不知道
阅读:8332| 2022-11-06
今天小编告诉大家如何对win10系统电脑设置节能降温的设置方法,想必大家都遇到过需要
阅读:8702| 2022-11-06
我们在使用xp系统的过程中,经常需要对xp系统无线网络安装向导设置进行设置,可能很多
阅读:8648| 2022-11-06
今天小编告诉大家如何处理win7系统玩cf老是与主机连接不稳定的问题,可能很多用户都不
阅读:9674| 2022-11-06
电脑对日常生活的重要性小编就不多说了,可是一旦碰到win7系统设置cf烟雾头的问题,很
阅读:8633| 2022-11-06
我们在日常使用电脑的时候,有的小伙伴们可能在打开应用的时候会遇见提示应用程序无法
阅读:8007| 2022-11-06
今天小编告诉大家如何对win7系统打开vcf文件进行设置,可能很多用户都不知道怎么对win
阅读:8670| 2022-11-06
今天小编告诉大家如何对win10系统s4开启USB调试模式进行设置,可能很多用户都不知道怎
阅读:7541| 2022-11-06
请发表评论