1 /*
2  *  Copyright (c) 2015 Dmitry Kazakov <dimula73@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 "kis_file_layer_test.h"
20 
21 #include <QTest>
22 
23 #include <KoColor.h>
24 
25 #include <kis_file_layer.h>
26 #include <kis_transform_mask.h>
27 #include <kis_transform_mask_params_interface.h>
28 
29 #include <testutil.h>
30 
31 #include "config-limit-long-tests.h"
32 
waitForMaskUpdates(KisNodeSP root)33 void waitForMaskUpdates(KisNodeSP root) {
34 #ifdef LIMIT_LONG_TESTS
35     KisLayerUtils::forceAllDelayedNodesUpdate(root);
36     QTest::qWait(100);
37 #else /* LIMIT_LONG_TESTS */
38     Q_UNUSED(root);
39     QTest::qWait(100);
40 #endif /* LIMIT_LONG_TESTS */
41 }
42 
testFileLayerPlusTransformMaskOffImage()43 void KisFileLayerTest::testFileLayerPlusTransformMaskOffImage()
44 {
45     TestUtil::ReferenceImageChecker chk("flayer_tmask_offimage", "file_layer");
46 
47     QRect refRect(0,0,640,441);
48     TestUtil::MaskParent p(refRect);
49 
50     QString refName(TestUtil::fetchDataFileLazy("hakonepa.png"));
51     KisLayerSP flayer = new KisFileLayer(p.image, "", refName, KisFileLayer::None, "flayer", OPACITY_OPAQUE_U8);
52 
53     p.image->addNode(flayer, p.image->root(), KisNodeSP());
54 
55     waitForMaskUpdates(p.image->root());
56     p.image->waitForDone();
57 
58     KisTransformMaskSP mask1 = new KisTransformMask(p.image, "mask1");
59     p.image->addNode(mask1, flayer);
60 
61     flayer->setDirty(refRect);
62     p.image->waitForDone();
63     chk.checkImage(p.image, "00_initial_layer_update");
64 
65     waitForMaskUpdates(p.image->root());
66     p.image->waitForDone();
67     chk.checkImage(p.image, "00X_initial_layer_update");
68 
69 
70     flayer->setX(580);
71     flayer->setY(400);
72 
73     flayer->setDirty(refRect);
74     p.image->waitForDone();
75     chk.checkImage(p.image, "01_file_layer_moved");
76 
77     waitForMaskUpdates(p.image->root());
78     p.image->waitForDone();
79     chk.checkImage(p.image, "01X_file_layer_moved");
80 
81 
82     QTransform transform = QTransform::fromTranslate(-580, -400);
83     mask1->setTransformParams(KisTransformMaskParamsInterfaceSP(
84                                   new KisDumbTransformMaskParams(transform)));
85 
86 
87     /**
88      * NOTE: here we see our image cropped by 1.5 image size rect!
89      *       That is expected and controlled by
90      *       KisImageConfig::transformMaskOffBoundsReadArea()
91      *       parameter
92      */
93 
94     mask1->setDirty(refRect);
95     p.image->waitForDone();
96     chk.checkImage(p.image, "02_mask1_moved_mask_update");
97 
98     waitForMaskUpdates(p.image->root());
99     p.image->waitForDone();
100     chk.checkImage(p.image, "02X_mask1_moved_mask_update");
101 
102     QVERIFY(chk.testPassed());
103 }
104 
testFileLayerPlusTransformMaskSmallFileBigOffset()105 void KisFileLayerTest::testFileLayerPlusTransformMaskSmallFileBigOffset()
106 {
107     TestUtil::ReferenceImageChecker chk("flayer_tmask_huge_offset", "file_layer");
108 
109     QRect refRect(0,0,2000,1500);
110     TestUtil::MaskParent p(refRect);
111 
112     QString refName(TestUtil::fetchDataFileLazy("file_layer_source.png"));
113     KisLayerSP flayer = new KisFileLayer(p.image, "", refName, KisFileLayer::None, "flayer", OPACITY_OPAQUE_U8);
114 
115     p.image->addNode(flayer, p.image->root(), KisNodeSP());
116 
117     waitForMaskUpdates(p.image->root());
118     p.image->waitForDone();
119 
120     // check whether the default bounds of the file layer are
121     // initialized properly
122     QCOMPARE(flayer->original()->defaultBounds()->bounds(), p.image->bounds());
123 
124     KisTransformMaskSP mask1 = new KisTransformMask(p.image, "mask1");
125     p.image->addNode(mask1, flayer);
126 
127     flayer->setDirty(refRect);
128     p.image->waitForDone();
129     chk.checkImage(p.image, "00_initial_layer_update");
130 
131     waitForMaskUpdates(p.image->root());
132     p.image->waitForDone();
133     chk.checkImage(p.image, "00X_initial_layer_update");
134 
135     QTransform transform;
136 
137     transform = QTransform::fromTranslate(1200, 300);
138     mask1->setTransformParams(KisTransformMaskParamsInterfaceSP(
139                                   new KisDumbTransformMaskParams(transform)));
140 
141     mask1->setDirty(refRect);
142     p.image->waitForDone();
143     chk.checkImage(p.image, "01_mask1_moved_mask_update");
144 
145     waitForMaskUpdates(p.image->root());
146     p.image->waitForDone();
147     chk.checkImage(p.image, "01X_mask1_moved_mask_update");
148 
149     QVERIFY(chk.testPassed());
150 }
151 
152 KISTEST_MAIN(KisFileLayerTest)
153