Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDitherOpImpl< srcCSTraits, dstCSTraits, dType > Class Template Reference

#include <KisDitherOpImpl.h>

+ Inheritance diagram for KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >:

Public Member Functions

KoID destinationDepthId () const override
 
void dither (const quint8 *src, quint8 *dst, int x, int y) const override
 
void dither (const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int x, int y, int columns, int rows) const override
 
 KisDitherOpImpl (const KoID &srcId, const KoID &dstId)
 
KoID sourceDepthId () const override
 
DitherType type () const override
 
- Public Member Functions inherited from KisDitherOp
virtual ~KisDitherOp ()=default
 

Private Types

using dstChannelsType = typename dstCSTraits::channels_type
 
using srcChannelsType = typename srcCSTraits::channels_type
 

Private Member Functions

template<DitherType t = dType, typename std::enable_if< t !=DITHER_NONE, void >::type * = nullptr>
void ditherImpl (const quint8 *src, quint8 *dst, int x, int y) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void ditherImpl (const quint8 *src, quint8 *dst, int, int) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&!std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void ditherImpl (const quint8 *src, quint8 *dst, int, int) const
 
template<DitherType t = dType, typename std::enable_if< t !=DITHER_NONE, void >::type * = nullptr>
void ditherImpl (const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int x, int y, int columns, int rows) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void ditherImpl (const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int, int, int columns, int rows) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&!std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void ditherImpl (const quint8 *srcRowStart, int srcRowStride, quint8 *dstRowStart, int dstRowStride, int, int, int columns, int rows) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_BAYER, void >::type * = nullptr>
float factor (int x, int y) const
 
template<DitherType t = dType, typename std::enable_if< t==DITHER_BLUE_NOISE, void >::type * = nullptr>
float factor (int x, int y) const
 
template<typename U = typename dstCSTraits::channels_type, typename std::enable_if<!std::numeric_limits< U >::is_integer, void >::type * = nullptr>
constexpr float scale () const
 
template<typename U = typename dstCSTraits::channels_type, typename std::enable_if< std::numeric_limits< U >::is_integer, void >::type * = nullptr>
constexpr float scale () const
 

Private Attributes

const KoID m_dstDepthId
 
const KoID m_srcDepthId
 

Detailed Description

template<typename srcCSTraits, typename dstCSTraits, DitherType dType>
class KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >

Definition at line 28 of file KisDitherOpImpl.h.

Member Typedef Documentation

◆ dstChannelsType

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
using KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::dstChannelsType = typename dstCSTraits::channels_type
private

Definition at line 31 of file KisDitherOpImpl.h.

◆ srcChannelsType

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
using KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::srcChannelsType = typename srcCSTraits::channels_type
private

Definition at line 30 of file KisDitherOpImpl.h.

Constructor & Destructor Documentation

◆ KisDitherOpImpl()

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::KisDitherOpImpl ( const KoID & srcId,
const KoID & dstId )
inline

Definition at line 34 of file KisDitherOpImpl.h.

35 : m_srcDepthId(srcId)
36 , m_dstDepthId(dstId)
37 {
38 }
const KoID m_dstDepthId
const KoID m_srcDepthId

Member Function Documentation

◆ destinationDepthId()

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
KoID KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::destinationDepthId ( ) const
inlineoverridevirtual
Returns
the identifier of this op's destination depth

Implements KisDitherOp.

Definition at line 55 of file KisDitherOpImpl.h.

56 {
57 return m_dstDepthId;
58 }

References KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::m_dstDepthId.

◆ dither() [1/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::dither ( const quint8 * src,
quint8 * dst,
int x,
int y ) const
inlineoverridevirtual

Implements KisDitherOp.

Definition at line 40 of file KisDitherOpImpl.h.

41 {
42 ditherImpl(src, dst, x, y);
43 }
void ditherImpl(const quint8 *src, quint8 *dst, int, int) const

References KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl().

◆ dither() [2/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::dither ( const quint8 * srcRowStart,
int srcRowStride,
quint8 * dstRowStart,
int dstRowStride,
int x,
int y,
int columns,
int rows ) const
inlineoverridevirtual

Implements KisDitherOp.

Definition at line 45 of file KisDitherOpImpl.h.

46 {
47 ditherImpl(srcRowStart, srcRowStride, dstRowStart, dstRowStride, x, y, columns, rows);
48 }

References KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl().

◆ ditherImpl() [1/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t !=DITHER_NONE, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * src,
quint8 * dst,
int x,
int y ) const
inlineprivate

Definition at line 84 of file KisDitherOpImpl.h.

85 {
86 const srcChannelsType *nativeSrc = srcCSTraits::nativeArray(src);
87 dstChannelsType *nativeDst = dstCSTraits::nativeArray(dst);
88
89 float f = factor(x, y);
90 float s = scale();
91
92 for (uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
93 float c = KoColorSpaceMaths<srcChannelsType, float>::scaleToA(nativeSrc[channelIndex]);
95 nativeDst[channelIndex] = KoColorSpaceMaths<float, dstChannelsType>::scaleToA(c);
96 }
97 }
unsigned int uint
typename dstCSTraits::channels_type dstChannelsType
constexpr float scale() const
typename srcCSTraits::channels_type srcChannelsType
float factor(int x, int y) const
static _Tdst scaleToA(_T a)
float apply_dither(float f, float d, float s)

References KisDitherMaths::apply_dither(), KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::factor(), KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::scale(), and KoColorSpaceMaths< _T, _Tdst >::scaleToA().

◆ ditherImpl() [2/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * src,
quint8 * dst,
int ,
int  ) const
inlineprivate

Definition at line 68 of file KisDitherOpImpl.h.

69 {
70 memcpy(dst, src, srcCSTraits::pixelSize);
71 }

◆ ditherImpl() [3/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&!std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * src,
quint8 * dst,
int ,
int  ) const
inlineprivate

Definition at line 73 of file KisDitherOpImpl.h.

74 {
75 const srcChannelsType *nativeSrc = srcCSTraits::nativeArray(src);
76 dstChannelsType *nativeDst = dstCSTraits::nativeArray(dst);
77
78 for (uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
79 nativeDst[channelIndex] = KoColorSpaceMaths<srcChannelsType, dstChannelsType>::scaleToA(nativeSrc[channelIndex]);
80 }
81 }

References KoColorSpaceMaths< _T, _Tdst >::scaleToA().

◆ ditherImpl() [4/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t !=DITHER_NONE, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * srcRowStart,
int srcRowStride,
quint8 * dstRowStart,
int dstRowStride,
int x,
int y,
int columns,
int rows ) const
inlineprivate

Definition at line 138 of file KisDitherOpImpl.h.

139 {
140 const quint8 *nativeSrc = srcRowStart;
141 quint8 *nativeDst = dstRowStart;
142
143 float s = scale();
144
145 for (int a = 0; a < rows; ++a) {
146 const srcChannelsType *srcPtr = srcCSTraits::nativeArray(nativeSrc);
147 dstChannelsType *dstPtr = dstCSTraits::nativeArray(nativeDst);
148
149 for (int b = 0; b < columns; ++b) {
150 float f = factor(x + b, y + a);
151
152 for (uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
153 float c = KoColorSpaceMaths<srcChannelsType, float>::scaleToA(srcPtr[channelIndex]);
154 c = KisDitherMaths::apply_dither(c, f, s);
156 }
157
158 srcPtr += srcCSTraits::channels_nb;
159 dstPtr += dstCSTraits::channels_nb;
160 }
161
162 nativeSrc += srcRowStride;
163 nativeDst += dstRowStride;
164 }
165 }

References KisDitherMaths::apply_dither(), KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::factor(), KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::scale(), and KoColorSpaceMaths< _T, _Tdst >::scaleToA().

◆ ditherImpl() [5/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * srcRowStart,
int srcRowStride,
quint8 * dstRowStart,
int dstRowStride,
int ,
int ,
int columns,
int rows ) const
inlineprivate

Definition at line 100 of file KisDitherOpImpl.h.

101 {
102 const quint8 *nativeSrc = srcRowStart;
103 quint8 *nativeDst = dstRowStart;
104
105 for (int y = 0; y < rows; ++y) {
106 memcpy(nativeDst, nativeSrc, srcCSTraits::pixelSize * columns);
107
108 nativeSrc += srcRowStride;
109 nativeDst += dstRowStride;
110 }
111 }

◆ ditherImpl() [6/6]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_NONE &&!std::is_same< srcCSTraits, dstCSTraits >::value, void >::type * = nullptr>
void KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::ditherImpl ( const quint8 * srcRowStart,
int srcRowStride,
quint8 * dstRowStart,
int dstRowStride,
int ,
int ,
int columns,
int rows ) const
inlineprivate

Definition at line 114 of file KisDitherOpImpl.h.

115 {
116 const quint8 *nativeSrc = srcRowStart;
117 quint8 *nativeDst = dstRowStart;
118
119 for (int y = 0; y < rows; ++y) {
120 const srcChannelsType *srcPtr = srcCSTraits::nativeArray(nativeSrc);
121 dstChannelsType *dstPtr = dstCSTraits::nativeArray(nativeDst);
122
123 for (int x = 0; x < columns; ++x) {
124 for (uint channelIndex = 0; channelIndex < srcCSTraits::channels_nb; ++channelIndex) {
125 dstPtr[channelIndex] = KoColorSpaceMaths<srcChannelsType, dstChannelsType>::scaleToA(srcPtr[channelIndex]);
126 }
127
128 srcPtr += srcCSTraits::channels_nb;
129 dstPtr += dstCSTraits::channels_nb;
130 }
131
132 nativeSrc += srcRowStride;
133 nativeDst += dstRowStride;
134 }
135 }

References KoColorSpaceMaths< _T, _Tdst >::scaleToA().

◆ factor() [1/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_BAYER, void >::type * = nullptr>
float KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::factor ( int x,
int y ) const
inlineprivate

Definition at line 177 of file KisDitherOpImpl.h.

178 {
180 }
float dither_factor_bayer_8(int x, int y)

References KisDitherMaths::dither_factor_bayer_8().

◆ factor() [2/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<DitherType t = dType, typename std::enable_if< t==DITHER_BLUE_NOISE, void >::type * = nullptr>
float KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::factor ( int x,
int y ) const
inlineprivate

Definition at line 182 of file KisDitherOpImpl.h.

183 {
185 }
float dither_factor_blue_noise_64(int x, int y)

References KisDitherMaths::dither_factor_blue_noise_64().

◆ scale() [1/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<typename U = typename dstCSTraits::channels_type, typename std::enable_if<!std::numeric_limits< U >::is_integer, void >::type * = nullptr>
constexpr float KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::scale ( ) const
inlineconstexprprivate

Definition at line 167 of file KisDitherOpImpl.h.

168 {
169 return 0.f; // no dithering for floating point
170 }

◆ scale() [2/2]

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
template<typename U = typename dstCSTraits::channels_type, typename std::enable_if< std::numeric_limits< U >::is_integer, void >::type * = nullptr>
constexpr float KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::scale ( ) const
inlineconstexprprivate

Definition at line 172 of file KisDitherOpImpl.h.

173 {
174 return 1.f / static_cast<float>(1 << dstCSTraits::depth);
175 }

◆ sourceDepthId()

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
KoID KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::sourceDepthId ( ) const
inlineoverridevirtual
Returns
the identifier of this op's source depth

Implements KisDitherOp.

Definition at line 50 of file KisDitherOpImpl.h.

51 {
52 return m_srcDepthId;
53 }

References KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::m_srcDepthId.

◆ type()

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
DitherType KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::type ( ) const
inlineoverridevirtual
Returns
the identifier of this op's type

Implements KisDitherOp.

Definition at line 60 of file KisDitherOpImpl.h.

61 {
62 return dType;
63 }

Member Data Documentation

◆ m_dstDepthId

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
const KoID KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::m_dstDepthId
private

Definition at line 66 of file KisDitherOpImpl.h.

◆ m_srcDepthId

template<typename srcCSTraits , typename dstCSTraits , DitherType dType>
const KoID KisDitherOpImpl< srcCSTraits, dstCSTraits, dType >::m_srcDepthId
private

Definition at line 66 of file KisDitherOpImpl.h.


The documentation for this class was generated from the following file: