1/****************************************************************************
2**
3** Copyright (C) 2017 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Graphical Effects module.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29#include <qtest.h>
30#include <QtCore/qscopedpointer.h>
31#include <QtQml>
32
33class tst_qtgraphicaleffects : public QObject
34{
35 Q_OBJECT
36
37private slots:
38 void initTestCase();
39
40 void blend();
41 void brightnessContrast();
42 void colorize();
43 void colorOverlay();
44 void conicalGradient();
45 void desaturate();
46 void directionalBlur();
47 void displace();
48 void dropShadow();
49 void fastBlur();
50 void gammaAdjust();
51 void gaussianBlur();
52 void glow();
53 void hueSaturation();
54 void innerShadow();
55 void levelAdjust();
56 void linearGradient();
57 void maskedBlur();
58 void opacityMask();
59 void radialBlur();
60 void radialGradient();
61 void recursiveBlur();
62 void rectangularGlow();
63 void thresholdMask();
64 void zoomBlur();
65
66private:
67 QString componentErrors(const QQmlComponent*) const;
68
69 QString importSelf;
70 QQmlEngine engine;
71};
72
73QString tst_qtgraphicaleffects::componentErrors(const QQmlComponent* component) const
74{
75 if (!component) {
76 return "(null component)";
77 }
78
79 QStringList out;
80
81 const auto errors = component->errors();
82 for (const QQmlError &error : errors)
83 out << error.toString();
84
85 return out.join(sep: "\n");
86}
87
88void tst_qtgraphicaleffects::initTestCase()
89{
90 QString import;
91
92 QString qmlImportPath = qgetenv(varName: "QML2_IMPORT_PATH");
93 if (qmlImportPath.isEmpty() || !QFile::exists(fileName: qmlImportPath))
94 qmlImportPath = QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath);
95
96 // Allow the test to work whether or not the module is yet installed.
97 if (QFile::exists(fileName: qmlImportPath + "/QtGraphicalEffects")) {
98 // Module is installed - import it the nice way
99 import = "QtGraphicalEffects";
100 }
101 else {
102 // Module is not installed - import it from the source tree, by URI
103 QString qmldir = QFINDTESTDATA("../../src/effects/qmldir");
104 QVERIFY2(QFile::exists(qmldir), qPrintable(qmldir));
105
106 QUrl url = QUrl::fromLocalFile(localfile: QFileInfo(qmldir).canonicalPath());
107 import = "\"" + url.toString() + "\"";
108 }
109
110 importSelf = QString("import %1 1.0\n").arg(a: import);
111}
112
113
114void tst_qtgraphicaleffects::brightnessContrast()
115{
116 // Creation
117 QString componentStr = "import QtQuick 2.0\n"
118 + importSelf +
119 "BrightnessContrast {"
120 "width: 50; height: 50\n"
121 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
122 "}";
123 QQmlComponent component(&engine);
124 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
125 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
126 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
127 QScopedPointer<QObject> obj(component.create());
128 QVERIFY(!obj.isNull());
129
130 // Default values
131 QCOMPARE(obj->property("brightness").type(), QVariant::Double);
132 QCOMPARE(obj->property("brightness").toDouble(), 0.0);
133 QCOMPARE(obj->property("contrast").type(), QVariant::Double);
134 QCOMPARE(obj->property("contrast").toDouble(), 0.0);
135 QCOMPARE(obj->property("source").toInt(), 0);
136 QCOMPARE(obj->property("cached").toBool(), false);
137}
138
139void tst_qtgraphicaleffects::colorize()
140{
141 // Creation
142 QString componentStr = "import QtQuick 2.0\n"
143 + importSelf +
144 "Colorize {"
145 "width: 50; height: 50\n"
146 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
147 "}";
148 QQmlComponent component(&engine);
149 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
150 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
151 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
152 QScopedPointer<QObject> obj(component.create());
153 QVERIFY(!obj.isNull());
154
155 // Default values
156 QCOMPARE(obj->property("hue").type(), QVariant::Double);
157 QCOMPARE(obj->property("hue").toDouble(), 0.0);
158 QCOMPARE(obj->property("saturation").type(), QVariant::Double);
159 QCOMPARE(obj->property("saturation").toDouble(), 1.0);
160 QCOMPARE(obj->property("lightness").type(), QVariant::Double);
161 QCOMPARE(obj->property("lightness").toDouble(), 0.0);
162 QCOMPARE(obj->property("source").toInt(), 0);
163 QCOMPARE(obj->property("cached").toBool(), false);
164}
165
166void tst_qtgraphicaleffects::fastBlur()
167{
168 // Creation
169 QString componentStr = "import QtQuick 2.0\n"
170 + importSelf +
171 "FastBlur {"
172 "width: 50; height: 50\n"
173 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
174 "}";
175 QQmlComponent component(&engine);
176 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
177 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
178 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
179 QScopedPointer<QObject> obj(component.create());
180 QVERIFY(!obj.isNull());
181
182 // Default values
183 QCOMPARE(obj->property("radius").type(), QVariant::Double);
184 QCOMPARE(obj->property("radius").toDouble(), 0.0);
185 QCOMPARE(obj->property("transparentBorder").toBool(), false);
186 QCOMPARE(obj->property("source").toInt(), 0);
187 QCOMPARE(obj->property("cached").toBool(), false);
188}
189
190void tst_qtgraphicaleffects::desaturate()
191{
192 // Creation
193 QString componentStr = "import QtQuick 2.0\n"
194 + importSelf +
195 "Desaturate {"
196 "width: 50; height: 50\n"
197 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
198 "}";
199 QQmlComponent component(&engine);
200 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
201 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
202 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
203 QScopedPointer<QObject> obj(component.create());
204 QVERIFY(!obj.isNull());
205
206 // Default values
207 QCOMPARE(obj->property("desaturation").type(), QVariant::Double);
208 QCOMPARE(obj->property("desaturation").toDouble(), 0.0);
209 QCOMPARE(obj->property("source").toInt(), 0);
210 QCOMPARE(obj->property("cached").toBool(), false);
211}
212
213void tst_qtgraphicaleffects::hueSaturation()
214{
215 // Creation
216 QString componentStr = "import QtQuick 2.0\n"
217 + importSelf +
218 "HueSaturation {"
219 "width: 50; height: 50\n"
220 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
221 "}";
222 QQmlComponent component(&engine);
223 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
224 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
225 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
226 QScopedPointer<QObject> obj(component.create());
227 QVERIFY(!obj.isNull());
228
229 // Default values
230 QCOMPARE(obj->property("hue").type(), QVariant::Double);
231 QCOMPARE(obj->property("hue").toDouble(), 0.0);
232 QCOMPARE(obj->property("saturation").type(), QVariant::Double);
233 QCOMPARE(obj->property("saturation").toDouble(), 0.0);
234 QCOMPARE(obj->property("lightness").type(), QVariant::Double);
235 QCOMPARE(obj->property("lightness").toDouble(), 0.0);
236 QCOMPARE(obj->property("source").toInt(), 0);
237 QCOMPARE(obj->property("cached").toBool(), false);
238}
239
240void tst_qtgraphicaleffects::opacityMask()
241{
242 // Creation
243 QString componentStr = "import QtQuick 2.0\n"
244 + importSelf +
245 "OpacityMask {"
246 "width: 50; height: 50\n"
247 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
248 "maskSource: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
249 "}";
250 QQmlComponent component(&engine);
251 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
252 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
253 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
254 QScopedPointer<QObject> obj(component.create());
255 QVERIFY(!obj.isNull());
256
257 // Default values
258 QCOMPARE(obj->property("source").toInt(), 0);
259 QCOMPARE(obj->property("maskSource").toInt(), 0);
260 QCOMPARE(obj->property("cached").toBool(), false);
261}
262
263void tst_qtgraphicaleffects::radialGradient()
264{
265 // Creation
266 QString componentStr = "import QtQuick 2.0\n"
267 + importSelf +
268 "RadialGradient {"
269 "width: 50; height: 50\n"
270 "}";
271 QQmlComponent component(&engine);
272 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
273 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
274 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
275 QScopedPointer<QObject> obj(component.create());
276 QVERIFY(!obj.isNull());
277
278 // Default values
279 QCOMPARE(obj->property("gradient").toInt(), 0);
280 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
281 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
282 QCOMPARE(obj->property("verticalOffset").type(), QVariant::Double);
283 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
284 QCOMPARE(obj->property("horizontalRadius").type(), QVariant::Double);
285 QCOMPARE(obj->property("horizontalRadius").toDouble(), 50.0);
286 QCOMPARE(obj->property("verticalRadius").type(), QVariant::Double);
287 QCOMPARE(obj->property("verticalRadius").toDouble(), 50.0);
288 QCOMPARE(obj->property("source").toInt(), 0);
289 QCOMPARE(obj->property("angle").type(), QVariant::Double);
290 QCOMPARE(obj->property("angle").toDouble(), 0.0);
291 QCOMPARE(obj->property("cached").toBool(), false);
292}
293
294void tst_qtgraphicaleffects::linearGradient()
295{
296 // Creation
297 QString componentStr = "import QtQuick 2.0\n"
298 + importSelf +
299 "LinearGradient {"
300 "width: 50; height: 50\n"
301 "}";
302 QQmlComponent component(&engine);
303 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
304 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
305 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
306 QScopedPointer<QObject> obj(component.create());
307 QVERIFY(!obj.isNull());
308
309 // Default values
310 QCOMPARE(obj->property("gradient").toInt(), 0);
311 QCOMPARE(obj->property("start").toPointF(), QPointF(0.0, 0.0));
312 QCOMPARE(obj->property("end").toPointF(), QPointF(0.0, 50.0));
313 QCOMPARE(obj->property("source").toInt(), 0);
314 QCOMPARE(obj->property("cached").toBool(), false);
315}
316
317void tst_qtgraphicaleffects::rectangularGlow()
318{
319 // Creation
320 QString componentStr = "import QtQuick 2.0\n"
321 + importSelf +
322 "RectangularGlow {"
323 "width: 50; height: 50\n"
324 "}";
325 QQmlComponent component(&engine);
326 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
327 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
328 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
329 QScopedPointer<QObject> obj(component.create());
330 QVERIFY(!obj.isNull());
331
332 // Default values
333 QCOMPARE(obj->property("spread").type(), QVariant::Double);
334 QCOMPARE(obj->property("spread").toDouble(), 0.0);
335 QCOMPARE(obj->property("glowRadius").type(), QVariant::Double);
336 QCOMPARE(obj->property("glowRadius").toDouble(), 0.0);
337 QCOMPARE(obj->property("color").toString(), QString("#ffffff"));
338 QCOMPARE(obj->property("cornerRadius").type(), QVariant::Double);
339 QCOMPARE(obj->property("cornerRadius").toDouble(), 0.0);
340 QCOMPARE(obj->property("cached").toBool(), false);
341}
342
343void tst_qtgraphicaleffects::conicalGradient()
344{
345 // Creation
346 QString componentStr = "import QtQuick 2.0\n"
347 + importSelf +
348 "ConicalGradient {"
349 "width: 50; height: 50\n"
350 "}";
351 QQmlComponent component(&engine);
352 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
353 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
354 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
355 QScopedPointer<QObject> obj(component.create());
356 QVERIFY(!obj.isNull());
357
358 // Default values
359 QCOMPARE(obj->property("angle").type(), QVariant::Double);
360 QCOMPARE(obj->property("angle").toDouble(), 0.0);
361 QCOMPARE(obj->property("gradient").toInt(), 0);
362 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
363 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
364 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
365 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
366 QCOMPARE(obj->property("source").toInt(), 0);
367 QCOMPARE(obj->property("cached").toBool(), false);
368}
369
370void tst_qtgraphicaleffects::colorOverlay()
371{
372 // Creation
373 QString componentStr = "import QtQuick 2.0\n"
374 + importSelf +
375 "ColorOverlay {"
376 "width: 50; height: 50\n"
377 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
378 "}";
379 QQmlComponent component(&engine);
380 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
381 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
382 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
383 QScopedPointer<QObject> obj(component.create());
384 QVERIFY(!obj.isNull());
385
386 // Default values
387 QCOMPARE(obj->property("cached").toBool(), false);
388 QCOMPARE(obj->property("color").toString(), QString("#00000000"));
389}
390
391void tst_qtgraphicaleffects::gaussianBlur()
392{
393 // Creation
394 QString componentStr = "import QtQuick 2.0\n"
395 + importSelf +
396 "GaussianBlur {"
397 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
398 "width: 50; height: 50\n"
399 "}";
400 QQmlComponent component(&engine);
401 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
402 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
403 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
404 QScopedPointer<QObject> obj(component.create());
405 QVERIFY(!obj.isNull());
406
407 // Default values
408 QCOMPARE(obj->property("radius").type(), QVariant::Double);
409 QCOMPARE(obj->property("radius").toDouble(), 4.0);
410 QCOMPARE(obj->property("samples").toInt(), 9);
411 QCOMPARE(obj->property("transparentBorder").toBool(), false);
412
413 double res = obj->property(name: "deviation").toDouble();
414 QVERIFY(res > 0.0);
415
416 QCOMPARE(obj->property("cached").toBool(), false);
417}
418
419void tst_qtgraphicaleffects::dropShadow()
420{
421 // Creation
422 QString componentStr = "import QtQuick 2.0\n"
423 + importSelf +
424 "DropShadow {"
425 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
426 "width: 50; height: 50\n"
427 "}";
428 QQmlComponent component(&engine);
429 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
430 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
431 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
432 QScopedPointer<QObject> obj(component.create());
433 QVERIFY(!obj.isNull());
434
435 // Default values
436 QCOMPARE(obj->property("radius").type(), QVariant::Double);
437 QCOMPARE(obj->property("radius").toDouble(), 4.0);
438 QCOMPARE(obj->property("samples").toInt(), 9);
439 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
440 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
441 QCOMPARE(obj->property("verticalOffset").type(), QVariant::Double);
442 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
443 QCOMPARE(obj->property("cached").toBool(), false);
444 QCOMPARE(obj->property("source").toInt(), 0);
445 QCOMPARE(obj->property("color").toString(), QString("#000000"));
446 QCOMPARE(obj->property("spread").type(), QVariant::Double);
447 QCOMPARE(obj->property("spread").toDouble(), 0.0);
448 QCOMPARE(obj->property("transparentBorder").toBool(), true);
449}
450
451void tst_qtgraphicaleffects::innerShadow()
452{
453 // Creation
454 QString componentStr = "import QtQuick 2.0\n"
455 + importSelf +
456 "InnerShadow {"
457 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
458 "width: 50; height: 50\n"
459 "}";
460 QQmlComponent component(&engine);
461 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
462 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
463 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
464 QScopedPointer<QObject> obj(component.create());
465 QVERIFY(!obj.isNull());
466
467 // Default values
468 QCOMPARE(obj->property("radius").type(), QVariant::Double);
469 QCOMPARE(obj->property("radius").toDouble(), 0.0);
470 QCOMPARE(obj->property("samples").toInt(), 0);
471 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
472 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
473 QCOMPARE(obj->property("verticalOffset").type(), QVariant::Double);
474 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
475 QCOMPARE(obj->property("cached").toBool(), false);
476 QCOMPARE(obj->property("source").toInt(), 0);
477 QCOMPARE(obj->property("color").toString(), QString("#000000"));
478 QCOMPARE(obj->property("spread").type(), QVariant::Double);
479 QCOMPARE(obj->property("spread").toDouble(), 0.0);
480 QCOMPARE(obj->property("fast").toBool(), false);
481}
482
483void tst_qtgraphicaleffects::gammaAdjust()
484{
485 // Creation
486 QString componentStr = "import QtQuick 2.0\n"
487 + importSelf +
488 "GammaAdjust {"
489 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
490 "width: 50; height: 50\n"
491 "}";
492 QQmlComponent component(&engine);
493 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
494 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
495 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
496 QScopedPointer<QObject> obj(component.create());
497 QVERIFY(!obj.isNull());
498
499 // Default values
500 QCOMPARE(obj->property("gamma").type(), QVariant::Double);
501 QCOMPARE(obj->property("gamma").toDouble(), 1.0);
502 QCOMPARE(obj->property("source").toInt(), 0);
503 QCOMPARE(obj->property("cached").toBool(), false);
504}
505
506void tst_qtgraphicaleffects::thresholdMask()
507{
508 // Creation
509 QString componentStr = "import QtQuick 2.0\n"
510 + importSelf +
511 "ThresholdMask {"
512 "width: 50; height: 50\n"
513 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
514 "maskSource: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
515 "}";
516 QQmlComponent component(&engine);
517 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
518 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
519 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
520 QScopedPointer<QObject> obj(component.create());
521 QVERIFY(!obj.isNull());
522
523 // Default values
524 QCOMPARE(obj->property("source").toInt(), 0);
525 QCOMPARE(obj->property("maskSource").toInt(), 0);
526 QCOMPARE(obj->property("cached").toBool(), false);
527 QCOMPARE(obj->property("threshold").type(), QVariant::Double);
528 QCOMPARE(obj->property("threshold").toDouble(), 0.0);
529 QCOMPARE(obj->property("spread").type(), QVariant::Double);
530 QCOMPARE(obj->property("spread").toDouble(), 0.0);
531}
532
533void tst_qtgraphicaleffects::glow()
534{
535 // Creation
536 QString componentStr = "import QtQuick 2.0\n"
537 + importSelf +
538 "Glow {"
539 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
540 "width: 50; height: 50\n"
541 "}";
542 QQmlComponent component(&engine);
543 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
544 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
545 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
546 QScopedPointer<QObject> obj(component.create());
547 QVERIFY(!obj.isNull());
548
549 // Default values
550 QCOMPARE(obj->property("radius").type(), QVariant::Double);
551 QCOMPARE(obj->property("radius").toDouble(), 4.0);
552 QCOMPARE(obj->property("samples").toInt(), 9);
553 QCOMPARE(obj->property("cached").toBool(), false);
554 QCOMPARE(obj->property("spread").type(), QVariant::Double);
555 QCOMPARE(obj->property("spread").toDouble(), 0.5);
556 QCOMPARE(obj->property("color").toString(), QString("#ffffff"));
557 QCOMPARE(obj->property("transparentBorder").toBool(), true);
558}
559
560void tst_qtgraphicaleffects::blend()
561{
562 // Creation
563 QString componentStr = "import QtQuick 2.0\n"
564 + importSelf +
565 "Blend {"
566 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
567 "foregroundSource: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
568 "width: 50; height: 50\n"
569 "}";
570 QQmlComponent component(&engine);
571 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
572 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
573 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
574 QScopedPointer<QObject> obj(component.create());
575 QVERIFY(!obj.isNull());
576
577 // Default values
578 QCOMPARE(obj->property("source").toInt(), 0);
579 QCOMPARE(obj->property("foregroundSource").toInt(), 0);
580 QCOMPARE(obj->property("cached").toBool(), false);
581 QCOMPARE(obj->property("mode").toString(), QString("normal"));
582}
583
584void tst_qtgraphicaleffects::displace()
585{
586 // Creation
587 QString componentStr = "import QtQuick 2.0\n"
588 + importSelf +
589 "Displace {"
590 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
591 "displacementSource: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
592 "width: 50; height: 50\n"
593 "}";
594 QQmlComponent component(&engine);
595 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
596 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
597 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
598 QScopedPointer<QObject> obj(component.create());
599 QVERIFY(!obj.isNull());
600
601 // Default values
602 QCOMPARE(obj->property("source").toInt(), 0);
603 QCOMPARE(obj->property("displacementSource").toInt(), 0);
604 QCOMPARE(obj->property("cached").toBool(), false);
605 QCOMPARE(obj->property("displacement").type(), QVariant::Double);
606 QCOMPARE(obj->property("displacement").toDouble(), 0.0);
607}
608
609void tst_qtgraphicaleffects::recursiveBlur()
610{
611 // Creation
612 QString componentStr = "import QtQuick 2.0\n"
613 + importSelf +
614 "RecursiveBlur {"
615 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
616 "width: 50; height: 50\n"
617 "}";
618 QQmlComponent component(&engine);
619 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
620 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
621 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
622 QScopedPointer<QObject> obj(component.create());
623 QVERIFY(!obj.isNull());
624
625 // Default values
626 QCOMPARE(obj->property("source").toInt(), 0);
627 QCOMPARE(obj->property("loops").toInt(), 0);
628 QCOMPARE(obj->property("radius").type(), QVariant::Double);
629 QCOMPARE(obj->property("radius").toDouble(), 0.0);
630 QCOMPARE(obj->property("progress").type(), QVariant::Double);
631 QCOMPARE(obj->property("progress").toDouble(), 0.0);
632 QCOMPARE(obj->property("transparentBorder").toBool(), false);
633 QCOMPARE(obj->property("cached").toBool(), false);
634}
635
636void tst_qtgraphicaleffects::directionalBlur()
637{
638 // Creation
639 QString componentStr = "import QtQuick 2.0\n"
640 + importSelf +
641 "DirectionalBlur {"
642 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
643 "width: 50; height: 50\n"
644 "}";
645 QQmlComponent component(&engine);
646 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
647 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
648 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
649 QScopedPointer<QObject> obj(component.create());
650 QVERIFY(!obj.isNull());
651
652 // Default values
653 QCOMPARE(obj->property("source").toInt(), 0);
654 QCOMPARE(obj->property("length").toInt(), 0);
655 QCOMPARE(obj->property("samples").type(), QVariant::Int);
656 QCOMPARE(obj->property("samples").toInt(), 0);
657 QCOMPARE(obj->property("angle").type(), QVariant::Double);
658 QCOMPARE(obj->property("angle").toDouble(), 0.0);
659 QCOMPARE(obj->property("transparentBorder").toBool(), false);
660 QCOMPARE(obj->property("cached").toBool(), false);
661}
662
663void tst_qtgraphicaleffects::radialBlur()
664{
665 // Creation
666 QString componentStr = "import QtQuick 2.0\n"
667 + importSelf +
668 "RadialBlur {"
669 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
670 "width: 50; height: 50\n"
671 "}";
672 QQmlComponent component(&engine);
673 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
674 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
675 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
676 QScopedPointer<QObject> obj(component.create());
677 QVERIFY(!obj.isNull());
678
679 // Default values
680 QCOMPARE(obj->property("source").toInt(), 0);
681 QCOMPARE(obj->property("samples").type(), QVariant::Int);
682 QCOMPARE(obj->property("samples").toInt(), 0);
683 QCOMPARE(obj->property("angle").type(), QVariant::Double);
684 QCOMPARE(obj->property("angle").toDouble(), 0.0);
685 QCOMPARE(obj->property("transparentBorder").toBool(), false);
686 QCOMPARE(obj->property("cached").toBool(), false);
687 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
688 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
689 QCOMPARE(obj->property("verticalOffset").type(), QVariant::Double);
690 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
691}
692
693void tst_qtgraphicaleffects::zoomBlur()
694{
695 // Creation
696 QString componentStr = "import QtQuick 2.0\n"
697 + importSelf +
698 "ZoomBlur {"
699 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
700 "width: 50; height: 50\n"
701 "}";
702 QQmlComponent component(&engine);
703 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
704 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
705 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
706 QScopedPointer<QObject> obj(component.create());
707 QVERIFY(!obj.isNull());
708
709 // Default values
710 QCOMPARE(obj->property("source").toInt(), 0);
711 QCOMPARE(obj->property("length").toInt(), 0);
712 QCOMPARE(obj->property("samples").type(), QVariant::Int);
713 QCOMPARE(obj->property("samples").toInt(), 0);
714 QCOMPARE(obj->property("transparentBorder").toBool(), false);
715 QCOMPARE(obj->property("cached").toBool(), false);
716 QCOMPARE(obj->property("horizontalOffset").type(), QVariant::Double);
717 QCOMPARE(obj->property("horizontalOffset").toDouble(), 0.0);
718 QCOMPARE(obj->property("verticalOffset").type(), QVariant::Double);
719 QCOMPARE(obj->property("verticalOffset").toDouble(), 0.0);
720}
721
722void tst_qtgraphicaleffects::levelAdjust()
723{
724 // Creation
725 QString componentStr = "import QtQuick 2.0\n"
726 + importSelf +
727 "LevelAdjust {"
728 "width: 50; height: 50\n"
729 "}";
730 QQmlComponent component(&engine);
731 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
732 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
733 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
734 QScopedPointer<QObject> obj(component.create());
735 QVERIFY(!obj.isNull());
736
737 // Default values
738 QCOMPARE(obj->property("source").toInt(), 0);
739 QCOMPARE(obj->property("minimumInput").toString(), QString("#00000000"));
740 QCOMPARE(obj->property("maximumInput").toString(), QString("#ffffff"));
741 QCOMPARE(obj->property("minimumOutput").toString(), QString("#00000000"));
742 QCOMPARE(obj->property("maximumOutput").toString(), QString("#ffffff"));
743 QCOMPARE(obj->property("cached").toBool(), false);
744}
745
746void tst_qtgraphicaleffects::maskedBlur()
747{
748 // Creation
749 QString componentStr = "import QtQuick 2.0\n"
750 + importSelf +
751 "MaskedBlur {"
752 "source: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
753 "maskSource: ShaderEffectSource {sourceItem: Rectangle {width: 100; height: 100}}"
754 "width: 50; height: 50\n"
755 "}";
756 QQmlComponent component(&engine);
757 component.setData(componentStr.toLatin1(), baseUrl: QUrl::fromLocalFile(localfile: ""));
758 QVERIFY2(component.status() != QQmlComponent::Error, qPrintable(componentErrors(&component)));
759 QTRY_COMPARE(component.status(), QQmlComponent::Ready);
760 QScopedPointer<QObject> obj(component.create());
761 QVERIFY(!obj.isNull());
762
763 // Default values
764 QCOMPARE(obj->property("source").toInt(), 0);
765 QCOMPARE(obj->property("maskSource").toInt(), 0);
766 QCOMPARE(obj->property("radius").type(), QVariant::Double);
767 QCOMPARE(obj->property("radius").toDouble(), 4.0);
768 QCOMPARE(obj->property("samples").toInt(), 9);
769 QCOMPARE(obj->property("cached").toBool(), false);
770}
771
772QTEST_MAIN(tst_qtgraphicaleffects)
773
774#include "tst_qtgraphicaleffects.moc"
775

source code of qtgraphicaleffects/tests/auto/tst_qtgraphicaleffects.cpp