40 void dither(
const quint8 *src, quint8 *dst,
int x,
int y)
const override
45 void dither(
const quint8 *srcRowStart,
int srcRowStride, quint8 *dstRowStart,
int dstRowStride,
int x,
int y,
int columns,
int rows)
const override
47 ditherImpl(srcRowStart, srcRowStride, dstRowStart, dstRowStride, x, y, columns, rows);
68 template<DitherType t = dType, typename std::enable_if<t == DITHER_NONE && std::is_same<srcCSTraits, dstCSTraits>::value,
void>
::type * =
nullptr>
inline void ditherImpl(
const quint8 *src, quint8 *dst,
int,
int)
const
70 memcpy(dst, src, srcCSTraits::pixelSize);
73 template<DitherType t = dType, typename std::enable_if<t == DITHER_NONE && !std::is_same<srcCSTraits, dstCSTraits>::value,
void>
::type * =
nullptr>
inline void ditherImpl(
const quint8 *src, quint8 *dst,
int,
int)
const
78 for (
uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
83 template<DitherType t = dType, typename std::enable_if<t != DITHER_NONE, void>::type * =
nullptr>
84 inline void ditherImpl(
const quint8 *src, quint8 *dst,
int x,
int y)
const
92 for (
uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
99 template<DitherType t = dType, typename std::enable_if<t == DITHER_NONE && std::is_same<srcCSTraits, dstCSTraits>::value,
void>
::type * =
nullptr>
100 inline void ditherImpl(
const quint8 *srcRowStart,
int srcRowStride, quint8 *dstRowStart,
int dstRowStride,
int,
int,
int columns,
int rows)
const
102 const quint8 *nativeSrc = srcRowStart;
103 quint8 *nativeDst = dstRowStart;
105 for (
int y = 0; y < rows; ++y) {
106 memcpy(nativeDst, nativeSrc, srcCSTraits::pixelSize * columns);
108 nativeSrc += srcRowStride;
109 nativeDst += dstRowStride;
113 template<DitherType t = dType, typename std::enable_if<t == DITHER_NONE && !std::is_same<srcCSTraits, dstCSTraits>::value,
void>
::type * =
nullptr>
114 inline void ditherImpl(
const quint8 *srcRowStart,
int srcRowStride, quint8 *dstRowStart,
int dstRowStride,
int,
int,
int columns,
int rows)
const
116 const quint8 *nativeSrc = srcRowStart;
117 quint8 *nativeDst = dstRowStart;
119 for (
int y = 0; y < rows; ++y) {
123 for (
int x = 0; x < columns; ++x) {
124 for (
uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
128 srcPtr += srcCSTraits::channels_nb;
129 dstPtr += dstCSTraits::channels_nb;
132 nativeSrc += srcRowStride;
133 nativeDst += dstRowStride;
137 template<DitherType t = dType, typename std::enable_if<t != DITHER_NONE, void>::type * =
nullptr>
138 inline void ditherImpl(
const quint8 *srcRowStart,
int srcRowStride, quint8 *dstRowStart,
int dstRowStride,
int x,
int y,
int columns,
int rows)
const
140 const quint8 *nativeSrc = srcRowStart;
141 quint8 *nativeDst = dstRowStart;
145 for (
int a = 0; a < rows; ++a) {
149 for (
int b = 0; b < columns; ++b) {
150 float f =
factor(x + b, y + a);
152 for (
uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
158 srcPtr += srcCSTraits::channels_nb;
159 dstPtr += dstCSTraits::channels_nb;
162 nativeSrc += srcRowStride;
163 nativeDst += dstRowStride;
167 template<typename U = typename dstCSTraits::channels_type, typename std::enable_if<!std::numeric_limits<U>::is_integer,
void>
::type * =
nullptr>
constexpr float scale()
const
172 template<typename U = typename dstCSTraits::channels_type, typename std::enable_if<std::numeric_limits<U>::is_integer,
void>
::type * =
nullptr>
constexpr float scale()
const
174 return 1.f /
static_cast<float>(1 << dstCSTraits::depth);
177 template<DitherType t = dType, typename std::enable_if<t == DITHER_BAYER, void>::type * =
nullptr>
inline float factor(
int x,
int y)
const
182 template<DitherType t = dType, typename std::enable_if<t == DITHER_BLUE_NOISE, void>::type * =
nullptr>
inline float factor(
int x,
int y)
const
void addDitherOpsByDepth(KoColorSpace *cs, const KoID &dstDepth)
typename dstCSTraits::channels_type dstChannelsType
void dither(const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int x, int y, int columns, int rows) const override
DitherType type() const override
constexpr float scale() const
KoID destinationDepthId() const override
KisDitherOpImpl(const KoID &srcId, const KoID &dstId)
void ditherImpl(const quint8 *src, quint8 *dst, int, int) const
typename srcCSTraits::channels_type srcChannelsType
void ditherImpl(const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int x, int y, int columns, int rows) const
void dither(const quint8 *src, quint8 *dst, int x, int y) const override
float factor(int x, int y) const
void ditherImpl(const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int, int, int columns, int rows) const
KoID sourceDepthId() const override
void ditherImpl(const quint8 *src, quint8 *dst, int x, int y) const
static _Tdst scaleToA(_T a)
virtual void addDitherOp(KisDitherOp *op)
virtual KoID colorDepthId() const =0
float apply_dither(float f, float d, float s)
float dither_factor_bayer_8(int x, int y)
float dither_factor_blue_noise_64(int x, int y)