7#ifndef __KIS_FILTER_WEIGHTS_BUFFER_H
8#define __KIS_FILTER_WEIGHTS_BUFFER_H
14#ifdef SANITY_CHECKS_ENABLED
15static bool checkForAsymmetricZeros =
false;
17#define SANITY_CENTER_POSITION() \
19 Q_ASSERT(scaledIter >= beginDst); \
20 Q_ASSERT(scaledIter <= endDst); \
22 if (j == centerIndex) { \
23 Q_ASSERT(scaledIter == centerSrc); \
27#define SANITY_ZEROS() \
29 if (checkForAsymmetricZeros) { \
30 for (int j = 0; j < span; j++) { \
31 int idx2 = span - j - 1; \
33 if ((m_filterWeights[i].weight[j] && !m_filterWeights[i].weight[idx2]) || \
34 (!m_filterWeights[i].weight[j] && m_filterWeights[i].weight[idx2])) { \
36 dbgKrita << "*******"; \
37 dbgKrita << "Non-symmetric zero found:" << centerSrc; \
38 dbgKrita << "Weight" << j << ":" << m_filterWeights[i].weight[j]; \
39 dbgKrita << "Weight" << idx2 << ":" << m_filterWeights[i].weight[idx2]; \
40 qFatal("Non-symmetric zero -> fail"); \
46#define SANITY_CHECKSUM() \
48 Q_ASSERT(sum == 255); \
52#define SANITY_CENTER_POSITION()
54#define SANITY_CHECKSUM()
60 dbgKrita << "************** i =" << i; \
61 dbgKrita << ppVar(centerSrc); \
62 dbgKrita << ppVar(centerIndex); \
63 dbgKrita << ppVar(beginSrc) << ppVar(endSrc); \
64 dbgKrita << ppVar(beginDst) << ppVar(endDst); \
65 dbgKrita << ppVar(scaledIter) << ppVar(scaledInc); \
66 dbgKrita << ppVar(span); \
70#define DEBUG_SAMPLE() \
72 dbgKrita << ppVar(scaledIter) << ppVar(t); \
75#define DEBUG_ALL() Q_UNUSED(beginDst); Q_UNUSED(endDst);
148 Q_ASSERT(realScale > 0);
157 if (realScale < 1.0 && realScale > (1.0 / (1 << 8))) {
167 for (
int i = 0; i < 256; i++) {
177 int span = (2 * supportSrc).toInt() +
180 int centerIndex = -beginSrc.
toInt();
194 for (
int j = 0; j < span; j++) {
202 scaledIter += scaledInc;
207 if (sum != 255 && sum > 0) {
208 qreal fixFactor = 255.0 / sum;
211 for (
int j = 0; j < span; j++) {
220 int diff = sum < 255 ? 1 : -1;
262 int maxValue = buf[0];
265 for (
int i = 1; i < size; i++) {
266 if (buf[i] > maxValue) {
virtual qint32 intSupport(qreal weightsPositionScale)
virtual qint32 intValueAt(qint32 t, qreal weightsPositionScale) const
KisFilterWeightsBuffer(KisFilterStrategy *filterStrategy, qreal realScale)
int findMaxIndex(qint16 *buf, int size)
FilterWeights * weights(KisFixedPoint pos) const
KisFixedPoint m_weightsPositionScale
~KisFilterWeightsBuffer()
FilterWeights * m_filterWeights
KisFixedPoint weightsPositionScale() const
KisFixedPoint & from256Frac(qint32 v)
#define SANITY_CHECKSUM()
#define SANITY_CENTER_POSITION()