int HSLFilter::vibranceBias(double sat, double hue, double vib, bool sixteenbit) { double ratio; int localsat; double normalized_hue = hue / (sixteenbit ? 65535.0: 255.0); if (normalized_hue>0.85 || normalized_hue <0.2) { ratio = 0.3; } else { ratio = 1.0; } localsat = lround((sat * (100.0 + vib*ratio)) / 100.0 ); if (sixteenbit) { return(CLAMP065535(localsat)); } else { return(CLAMP0255(localsat)); } }
void HSLFilter::setSaturation(double val) { val = CLAMP(val, -100.0, 100.0); int value; for (int i = 0; i < 65536; ++i) { value = lround( (i * (100.0 + val)) / 100.0 ); d->stransfer16[i] = CLAMP065535(value); } for (int i = 0; i < 256; ++i) { value = lround( (i * (100.0 + val)) / 100.0 ); d->stransfer[i] = CLAMP0255(value); } }
void BCGFilter::applyBCG(uchar* const bits, uint width, uint height, bool sixteenBits) { if (!bits) { return; } uint size = width * height; int progress; if (!sixteenBits) // 8 bits image. { uchar* data = bits; for (uint i = 0; runningFlag() && (i < size); ++i) { switch (d->settings.channel) { case BlueChannel: data[0] = CLAMP0255(d->map[data[0]]); break; case GreenChannel: data[1] = CLAMP0255(d->map[data[1]]); break; case RedChannel: data[2] = CLAMP0255(d->map[data[2]]); break; default: // all channels data[0] = CLAMP0255(d->map[data[0]]); data[1] = CLAMP0255(d->map[data[1]]); data[2] = CLAMP0255(d->map[data[2]]); break; } data += 4; progress = (int)(((double)i * 100.0) / size); if (progress % 5 == 0) { postProgress(progress); } } } else // 16 bits image. { ushort* data = reinterpret_cast<ushort*>(bits); for (uint i = 0; runningFlag() && (i < size); ++i) { switch (d->settings.channel) { case BlueChannel: data[0] = CLAMP065535(d->map16[data[0]]); break; case GreenChannel: data[1] = CLAMP065535(d->map16[data[1]]); break; case RedChannel: data[2] = CLAMP065535(d->map16[data[2]]); break; default: // all channels data[0] = CLAMP065535(d->map16[data[0]]); data[1] = CLAMP065535(d->map16[data[1]]); data[2] = CLAMP065535(d->map16[data[2]]); break; } data += 4; progress = (int)(((double)i * 100.0) / size); if (progress % 5 == 0) { postProgress(progress); } } } }