1 /*
2  *  Copyright (c) 2018 Iván Santa María <ghevan@gmail.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include <QTest>
20 #include <QPointF>
21 #include <KoColor.h>
22 #include <QElapsedTimer>
23 
24 #include "KisMaskGeneratorTest.h"
25 
26 #include "kis_mask_similarity_test.h"
27 
28 #include "kis_brush_mask_applicator_base.h"
29 #include "kis_mask_generator.h"
30 #include "kis_cubic_curve.h"
31 #include "krita_utils.h"
32 
33 #include "testutil.h"
34 
35 class KisMaskGeneratorTestTester
36 {
37 public:
KisMaskGeneratorTestTester(KisBrushMaskApplicatorBase * _applicatorBase,QRect _bounds)38     KisMaskGeneratorTestTester(KisBrushMaskApplicatorBase *_applicatorBase, QRect _bounds)
39         : m_bounds(_bounds),
40           applicatorBase(_applicatorBase)
41     {
42         KisFixedPaintDeviceSP m_paintDev = new KisFixedPaintDevice(m_colorSpace);
43         m_paintDev->setRect(m_bounds);
44         m_paintDev->initialize(255);
45 
46         MaskProcessingData data(m_paintDev, m_colorSpace, nullptr,
47                                 0.0, 1.0,
48                                 m_bounds.width() / 2.0, m_bounds.height() / 2.0,0);
49 
50         // Start Benchmark
51         applicatorBase->initializeData(&data);
52 
53         QElapsedTimer maskGenerationTime;
54         maskGenerationTime.start();
55 
56         QBENCHMARK {
57 
58             applicatorBase->process(m_bounds);
59         }
60     }
61 
62 protected:
63     const KoColorSpace *m_colorSpace = KoColorSpaceRegistry::instance()->rgb8();
64     QRect m_bounds;
65 
66     KisBrushMaskApplicatorBase *applicatorBase;
67     KisFixedPaintDeviceSP m_paintDev;
68 };
69 
testDefaultScalarMask()70 void KisMaskGeneratorTest::testDefaultScalarMask()
71 {
72     QRect bounds(0,0,1000,1000);
73     {
74         KisCircleMaskGenerator circScalar(1000, 1.0, 0.5, 0.5, 2, true);
75         circScalar.resetMaskApplicator(true); // Force usage of scalar backend
76 
77         KisMaskGeneratorTestTester(circScalar.applicator(), bounds);
78     }
79 }
80 
testDefaultVectorMask()81 void KisMaskGeneratorTest::testDefaultVectorMask()
82 {
83     QRect bounds(0,0,1000,1000);
84     {
85         KisCircleMaskGenerator circVectr(1000, 1.0, 0.5, 0.5, 2, true);
86         KisMaskGeneratorTestTester(circVectr.applicator(), bounds);
87     }
88 }
89 
testCircularGaussScalarMask()90 void KisMaskGeneratorTest::testCircularGaussScalarMask()
91 {
92     QRect bounds(0,0,1000,1000);
93     {
94     KisGaussCircleMaskGenerator circScalar(1000, 1.0, 0.5, 0.5, 2, true);
95     circScalar.setDiameter(1000);
96     circScalar.resetMaskApplicator(true); // Force usage of scalar backend
97 
98     KisMaskGeneratorTestTester(circScalar.applicator(), bounds);
99     }
100 }
101 
testCircularGaussVectorMask()102 void KisMaskGeneratorTest::testCircularGaussVectorMask()
103 {
104     QRect bounds(0,0,1000,1000);
105     {
106     KisGaussCircleMaskGenerator circVectr(1000, 1.0, 0.5, 0.5, 2, true);
107     circVectr.setDiameter(1000);
108     KisMaskGeneratorTestTester(circVectr.applicator(), bounds);
109     }
110 }
111 
testCircularSoftScalarMask()112 void KisMaskGeneratorTest::testCircularSoftScalarMask()
113 {
114     QRect bounds(0,0,1000,1000);
115     KisCubicCurve pointsCurve;
116     pointsCurve.fromString(QString("0,1;1,0"));
117     {
118     KisCurveCircleMaskGenerator circScalar(1000, 1.0, 0.5, 0.5, 2, pointsCurve, true);
119     circScalar.setSoftness(0.5);
120     circScalar.resetMaskApplicator(true); // Force usage of scalar backend
121 
122     KisMaskGeneratorTestTester(circScalar.applicator(), bounds);
123     }
124 }
125 
testCircularSoftVectorMask()126 void KisMaskGeneratorTest::testCircularSoftVectorMask()
127 {
128     QRect bounds(0,0,1000,1000);
129     KisCubicCurve pointsCurve;
130     pointsCurve.fromString(QString("0,1;1,0"));
131     {
132     KisCurveCircleMaskGenerator circVectr(1000, 1.0, 0.5, 0.5, 2, pointsCurve, true);
133     circVectr.setSoftness(0.5);
134     KisMaskGeneratorTestTester(circVectr.applicator(), bounds);
135     }
136 }
137 
testRectangularScalarMask()138 void KisMaskGeneratorTest::testRectangularScalarMask(){
139     QRect bounds(0,0,1000,1000);
140     {
141         KisRectangleMaskGenerator rectScalar(1000, 1.0, 0.5, 0.5, 2, true);
142         rectScalar.resetMaskApplicator(true); // Force usage of scalar backend
143 
144         KisMaskGeneratorTestTester(rectScalar.applicator(), bounds);
145     }
146 }
147 
testRectangularVectorMask()148 void KisMaskGeneratorTest::testRectangularVectorMask(){
149     QRect bounds(0,0,1000,1000);
150     {
151         KisRectangleMaskGenerator rectScalar(1000, 1.0, 0.5, 0.5, 2, true);
152         KisMaskGeneratorTestTester(rectScalar.applicator(), bounds);
153     }
154 }
155 
testRectangularGaussScalarMask()156 void KisMaskGeneratorTest::testRectangularGaussScalarMask()
157 {
158     QRect bounds(0,0,1000,1000);
159     {
160     KisGaussRectangleMaskGenerator circScalar(1000, 1.0, 0.5, 0.5, 2, true);
161 //    circScalar.setDiameter(1000);
162     circScalar.resetMaskApplicator(true); // Force usage of scalar backend
163 
164     KisMaskGeneratorTestTester(circScalar.applicator(), bounds);
165     }
166 }
testRectangularGaussVectorMask()167 void KisMaskGeneratorTest::testRectangularGaussVectorMask()
168 {
169     QRect bounds(0,0,1000,1000);
170     {
171     KisGaussRectangleMaskGenerator circVectr(1000, 1.0, 0.5, 0.5, 2, true);
172 //    circVectr.setDiameter(1000);
173     KisMaskGeneratorTestTester(circVectr.applicator(), bounds);
174     }
175 }
176 
testRectangularSoftScalarMask()177 void KisMaskGeneratorTest::testRectangularSoftScalarMask()
178 {
179     QRect bounds(0,0,1000,1000);
180     KisCubicCurve pointsCurve;
181     pointsCurve.fromString(QString("0,1;1,0"));
182     {
183     KisCurveRectangleMaskGenerator circScalar(1000, 1.0, 0.5, 0.5, 2, pointsCurve, true);
184 
185     circScalar.resetMaskApplicator(true); // Force usage of scalar backend
186 
187     KisMaskGeneratorTestTester(circScalar.applicator(), bounds);
188     }
189 }
testRectangularSoftVectorMask()190 void KisMaskGeneratorTest::testRectangularSoftVectorMask()
191 {
192     QRect bounds(0,0,1000,1000);
193     KisCubicCurve pointsCurve;
194     pointsCurve.fromString(QString("0,1;1,0"));
195     {
196     KisCurveRectangleMaskGenerator circVectr(1000, 1.0, 0.5, 0.5, 2, pointsCurve, true);
197 
198     KisMaskGeneratorTestTester(circVectr.applicator(), bounds);
199     }
200 }
201 
202 QTEST_MAIN(KisMaskGeneratorTest)
203