Changeset View
Changeset View
Standalone View
Standalone View
libs/image/tests/kis_mask_similarity_test.cpp
Context not available. | |||||
19 | #include "kis_mask_similarity_test.h" | 19 | #include "kis_mask_similarity_test.h" | ||
---|---|---|---|---|---|
20 | 20 | | |||
21 | #include <QTest> | 21 | #include <QTest> | ||
22 | #include <QPointF> | ||||
23 | | ||||
22 | #include <KoColor.h> | 24 | #include <KoColor.h> | ||
23 | #include <testutil.h> | 25 | #include <testutil.h> | ||
24 | 26 | | |||
25 | #include "kis_brush_mask_applicator_base.h" | 27 | #include "kis_brush_mask_applicator_base.h" | ||
26 | #include "kis_mask_generator.h" | 28 | #include "kis_mask_generator.h" | ||
29 | #include "kis_cubic_curve.h" | ||||
27 | #include "krita_utils.h" | 30 | #include "krita_utils.h" | ||
28 | 31 | | |||
32 | enum MaskType { | ||||
33 | DEFAULT, CIRC_GAUSS, CIRC_SOFT, RECT_GAUSS, RECT_SOFT, STAMP | ||||
34 | }; | ||||
29 | 35 | | |||
30 | class KisMaskSimilarityTester | 36 | class KisMaskSimilarityTester | ||
31 | { | 37 | { | ||
38 | | ||||
32 | public: | 39 | public: | ||
33 | KisMaskSimilarityTester(KisBrushMaskApplicatorBase *_legacy, KisBrushMaskApplicatorBase *_vectorized, QRect _bounds) | 40 | KisMaskSimilarityTester(KisBrushMaskApplicatorBase *_legacy, KisBrushMaskApplicatorBase *_vectorized, QRect _bounds, MaskType type, bool renderImage = true) | ||
34 | : legacy(_legacy) | 41 | : legacy(_legacy) | ||
35 | , vectorized(_vectorized) | 42 | , vectorized(_vectorized) | ||
36 | , m_bounds(_bounds) | 43 | , m_bounds(_bounds) | ||
Context not available. | |||||
49 | 56 | | |||
50 | QImage scalarImage(m_paintDev->convertToQImage(m_colorSpace->profile())); | 57 | QImage scalarImage(m_paintDev->convertToQImage(m_colorSpace->profile())); | ||
51 | scalarImage.invertPixels(); // Make pixel color black | 58 | scalarImage.invertPixels(); // Make pixel color black | ||
52 | scalarImage.save(QString("scalar_mask.png"),"PNG"); | | |||
53 | 59 | | |||
54 | // Start vector processing | 60 | // Start vector processing | ||
55 | m_paintDev->initialize(255); | 61 | m_paintDev->initialize(255); | ||
Context not available. | |||||
58 | 64 | | |||
59 | QImage vectorImage(m_paintDev->convertToQImage(m_colorSpace->profile())); | 65 | QImage vectorImage(m_paintDev->convertToQImage(m_colorSpace->profile())); | ||
60 | vectorImage.invertPixels(); // Make pixel color black | 66 | vectorImage.invertPixels(); // Make pixel color black | ||
61 | vectorImage.save(QString("vector_mask.png"),"PNG"); | 67 | | ||
62 | 68 | if (renderImage) { | |||
63 | // Development debug. | 69 | scalarImage.save(QString(getTypeName(type) + "_scalar_mask.png"),"PNG"); | ||
64 | // Count number of identical pixels | 70 | vectorImage.save(QString(getTypeName(type) +"_vector_mask.png"),"PNG"); | ||
65 | // int equals = 0; | 71 | } | ||
66 | // for (int i = 0; i < scalarImage.width(); ++i) { | 72 | | ||
67 | // for (int j = 0; j < scalarImage.height(); ++j) { | 73 | // Check for differences, max errors: 0 | ||
68 | // if (scalarImage.pixelColor(i,j) == vectorImage.pixelColor(i,j)){ | | |||
69 | // equals++; | | |||
70 | // } else { | | |||
71 | // qDebug() << scalarImage.pixelColor(i,j) << " " << vectorImage.pixelColor(i,j); | | |||
72 | // } | | |||
73 | // } | | |||
74 | // } | | |||
75 | // qDebug() << "Equal Pixels: " << equals; | | |||
76 | | ||||
77 | // Check for differences, max error .5% of pixel mismatch | | |||
78 | int tolerance = m_bounds.width() * m_bounds.height() * .005f; | | |||
79 | QPoint tmpPt; | 74 | QPoint tmpPt; | ||
80 | QVERIFY(TestUtil::compareQImages(tmpPt,scalarImage, vectorImage, 0, 1, tolerance)); | 75 | QVERIFY(TestUtil::compareQImages(tmpPt,scalarImage, vectorImage, 0, 2, 0)); | ||
81 | } | 76 | } | ||
82 | 77 | | |||
83 | private: | 78 | private: | ||
79 | QString getTypeName(MaskType type) { | ||||
80 | QString strName; | ||||
81 | switch (type) { | ||||
82 | case CIRC_GAUSS: | ||||
83 | strName = "CircGauss"; | ||||
84 | break; | ||||
85 | case CIRC_SOFT: | ||||
86 | strName = "CircSoft"; | ||||
87 | break; | ||||
88 | case RECT_GAUSS: | ||||
89 | strName = "RectGauss"; | ||||
90 | break; | ||||
91 | case RECT_SOFT: | ||||
92 | strName = "RectSoft"; | ||||
93 | break; | ||||
94 | case STAMP: | ||||
95 | strName = "Stamp"; | ||||
96 | break; | ||||
97 | default: | ||||
98 | strName = "Default"; | ||||
99 | break; | ||||
100 | } | ||||
101 | return strName; | ||||
102 | } | ||||
84 | 103 | | |||
85 | protected: | 104 | protected: | ||
86 | const KoColorSpace *m_colorSpace = KoColorSpaceRegistry::instance()->rgb8(); | 105 | const KoColorSpace *m_colorSpace = KoColorSpaceRegistry::instance()->rgb8(); | ||
Context not available. | |||||
96 | { | 115 | { | ||
97 | QRect bounds(0,0,500,500); | 116 | QRect bounds(0,0,500,500); | ||
98 | { | 117 | { | ||
99 | KisCircleMaskGenerator circVectr(480, 1.0, 0.5, 0.5, 2, true); | 118 | KisCircleMaskGenerator circVectr(500, 1.0, 0.5, 0.5, 2, true); | ||
100 | KisCircleMaskGenerator circScalar(circVectr); | 119 | KisCircleMaskGenerator circScalar(circVectr); | ||
101 | 120 | | |||
102 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | 121 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | ||
103 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds); | 122 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds, DEFAULT); | ||
104 | } | 123 | } | ||
105 | } | 124 | } | ||
106 | 125 | | |||
Context not available. | |||||
108 | { | 127 | { | ||
109 | QRect bounds(0,0,500,500); | 128 | QRect bounds(0,0,500,500); | ||
110 | { | 129 | { | ||
111 | KisGaussCircleMaskGenerator circVectr(480, 1.0, 0.5, 0.5, 2, true); | 130 | KisGaussCircleMaskGenerator circVectr(500, 1.0, .8, .2, 2, true); | ||
112 | circVectr.setDiameter(480); | 131 | circVectr.setDiameter(500); | ||
113 | KisGaussCircleMaskGenerator circScalar(circVectr); | 132 | KisGaussCircleMaskGenerator circScalar(circVectr); | ||
133 | | ||||
134 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | ||||
135 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds, CIRC_GAUSS); | ||||
136 | } | ||||
137 | // Exahustive test | ||||
138 | for (size_t i = 0; i <= 100; i += 3){ | ||||
139 | for (size_t j = 0; j <= 100; j += 3){ | ||||
140 | for (size_t k = 0; k <= 100; k += 15){ | ||||
141 | { | ||||
142 | KisGaussCircleMaskGenerator circVectr(500, k/100.f, i/100.f, j/100.f, 2, true); | ||||
143 | circVectr.setDiameter(500); | ||||
144 | KisGaussCircleMaskGenerator circScalar(circVectr); | ||||
145 | | ||||
146 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | ||||
147 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds,CIRC_GAUSS,false); | ||||
148 | } | ||||
149 | } } } // end for | ||||
150 | } | ||||
151 | | ||||
152 | void KisMaskSimilarityTest::testSoftCircleMask() | ||||
153 | { | ||||
154 | QRect bounds(0,0,500,500); | ||||
155 | KisCubicCurve pointsCurve; | ||||
156 | pointsCurve.fromString(QString("0,1;1,0")); | ||||
157 | { | ||||
158 | KisCurveCircleMaskGenerator circVectr(500, 1.0, 0.5, 0.5, 2, pointsCurve,true); | ||||
159 | circVectr.setDiameter(500); | ||||
160 | // circVectr.setSoftness(1.0); | ||||
161 | KisCurveCircleMaskGenerator circScalar(circVectr); | ||||
114 | 162 | | |||
115 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | 163 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | ||
116 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds); | 164 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds, CIRC_SOFT); | ||
117 | } | 165 | } | ||
166 | | ||||
167 | // Exahustive test | ||||
168 | for (size_t i = 0; i <= 100; i += 3){ | ||||
169 | for (size_t j = 0; j <= 100; j += 3){ | ||||
170 | for (size_t k = 0; k <= 100; k += 15){ | ||||
171 | { | ||||
172 | KisCurveCircleMaskGenerator circVectr(500, k/100.f, i/100.f, j/100.f, 2,pointsCurve, true); | ||||
173 | circVectr.setDiameter(500); | ||||
174 | KisCurveCircleMaskGenerator circScalar(circVectr); | ||||
175 | | ||||
176 | circScalar.resetMaskApplicator(true); // Force usage of scalar backend | ||||
177 | KisMaskSimilarityTester(circScalar.applicator(), circVectr.applicator(), bounds,CIRC_SOFT,false); | ||||
178 | } | ||||
179 | } } } // end for | ||||
118 | } | 180 | } | ||
119 | 181 | | |||
120 | QTEST_MAIN(KisMaskSimilarityTest) | 182 | QTEST_MAIN(KisMaskSimilarityTest) | ||
Context not available. |