File indexing completed on 2024-05-26 04:27:55
0001 /* 0002 * SPDX-FileCopyrightText: 2007 Sven Langkamp <sven.langkamp@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_pixel_selection_test.h" 0008 #include <simpletest.h> 0009 0010 0011 #include <kis_debug.h> 0012 #include <QRect> 0013 0014 #include <KoColorSpace.h> 0015 #include <KoColorSpaceRegistry.h> 0016 #include <KoCompositeOp.h> 0017 #include "kis_image.h" 0018 #include "kis_default_bounds.h" 0019 #include "kis_paint_layer.h" 0020 #include "kis_paint_device.h" 0021 #include "kis_fixed_paint_device.h" 0022 #include "kis_pixel_selection.h" 0023 #include <testutil.h> 0024 #include <testimage.h> 0025 #include "kis_fill_painter.h" 0026 #include "kis_transaction.h" 0027 #include "kis_surrogate_undo_adapter.h" 0028 #include "commands/kis_selection_commands.h" 0029 0030 0031 void KisPixelSelectionTest::testCreation() 0032 { 0033 const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); 0034 KisImageSP image = new KisImage(0, 512, 512, cs, "merge test"); 0035 KisPaintLayerSP layer = new KisPaintLayer(image, "test", OPACITY_OPAQUE_U8); 0036 KisPaintDeviceSP dev = layer->paintDevice(); 0037 0038 KisPixelSelectionSP selection = new KisPixelSelection(); 0039 QVERIFY(selection); 0040 QVERIFY(selection->isTotallyUnselected(QRect(0, 0, 512, 512))); 0041 0042 selection = new KisPixelSelection(new KisSelectionDefaultBounds(dev)); 0043 QVERIFY(selection); 0044 QVERIFY(selection->isTotallyUnselected(QRect(0, 0, 512, 512))); 0045 selection->setDirty(QRect(10, 10, 10, 10)); 0046 } 0047 0048 void KisPixelSelectionTest::testSetSelected() 0049 { 0050 KisPixelSelectionSP selection = new KisPixelSelection(); 0051 QVERIFY(TestUtil::alphaDevicePixel(selection, 1, 1) == MIN_SELECTED); 0052 TestUtil::alphaDeviceSetPixel(selection, 1, 1, MAX_SELECTED); 0053 QVERIFY(TestUtil::alphaDevicePixel(selection, 1, 1) == MAX_SELECTED); 0054 TestUtil::alphaDeviceSetPixel(selection, 1, 1, 128); 0055 QVERIFY(TestUtil::alphaDevicePixel(selection, 1, 1) == 128); 0056 } 0057 0058 void KisPixelSelectionTest::testInvert() 0059 { 0060 KisDefaultBounds defaultBounds; 0061 0062 KisPixelSelectionSP selection = new KisPixelSelection(); 0063 selection->select(QRect(5, 5, 10, 10)); 0064 selection->invert(); 0065 0066 QCOMPARE(TestUtil::alphaDevicePixel(selection, 20, 20), MAX_SELECTED); 0067 QCOMPARE(TestUtil::alphaDevicePixel(selection, 6, 6), MIN_SELECTED); 0068 QCOMPARE(selection->selectedExactRect(), defaultBounds.bounds()); 0069 QCOMPARE(selection->selectedRect(), defaultBounds.bounds()); 0070 } 0071 0072 void KisPixelSelectionTest::testInvertWithImage() 0073 { 0074 const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); 0075 KisImageSP image = new KisImage(0, 200, 200, cs, "merge test"); 0076 0077 KisSetEmptyGlobalSelectionCommand(image).redo(); 0078 KisPixelSelectionSP selection = image->globalSelection()->pixelSelection(); 0079 selection->select(QRect(5, 5, 10, 10)); 0080 selection->invert(); 0081 QCOMPARE(selection->selectedExactRect(), QRect(0, 0, 200, 200)); 0082 0083 // round trip 0084 selection->invert(); 0085 QCOMPARE(selection->selectedExactRect(), QRect(5, 5, 10, 10)); 0086 } 0087 0088 void KisPixelSelectionTest::testClear() 0089 { 0090 KisPixelSelectionSP selection = new KisPixelSelection(); 0091 selection->select(QRect(5, 5, 300, 300)); 0092 selection->clear(QRect(5, 5, 200, 200)); 0093 0094 QCOMPARE(TestUtil::alphaDevicePixel(selection, 0, 0), MIN_SELECTED); 0095 QCOMPARE(TestUtil::alphaDevicePixel(selection, 5, 5), MIN_SELECTED); 0096 QCOMPARE(TestUtil::alphaDevicePixel(selection, 10, 10), MIN_SELECTED); 0097 QCOMPARE(TestUtil::alphaDevicePixel(selection, 204, 204), MIN_SELECTED); 0098 QCOMPARE(TestUtil::alphaDevicePixel(selection, 205, 205), MAX_SELECTED); 0099 QCOMPARE(TestUtil::alphaDevicePixel(selection, 250, 250), MAX_SELECTED); 0100 0101 // everything deselected 0102 selection->clear(); 0103 // completely selected 0104 selection->invert(); 0105 // deselect a certain area 0106 selection->clear(QRect(5, 5, 200, 200)); 0107 0108 QCOMPARE(TestUtil::alphaDevicePixel(selection, 0, 0), MAX_SELECTED); 0109 QCOMPARE(TestUtil::alphaDevicePixel(selection, 5, 5), MIN_SELECTED); 0110 QCOMPARE(TestUtil::alphaDevicePixel(selection, 10, 10), MIN_SELECTED); 0111 QCOMPARE(TestUtil::alphaDevicePixel(selection, 204, 204), MIN_SELECTED); 0112 QCOMPARE(TestUtil::alphaDevicePixel(selection, 205, 205), MAX_SELECTED); 0113 QCOMPARE(TestUtil::alphaDevicePixel(selection, 250, 250), MAX_SELECTED); 0114 } 0115 0116 void KisPixelSelectionTest::testSelect() 0117 { 0118 KisPixelSelectionSP selection = new KisPixelSelection(); 0119 selection->select(QRect(0, 0, 512, 441)); 0120 for (int i = 0; i < 441; ++i) { 0121 for (int j = 0; j < 512; ++j) { 0122 QCOMPARE(TestUtil::alphaDevicePixel(selection, j, i), MAX_SELECTED); 0123 } 0124 } 0125 QCOMPARE(selection->selectedExactRect(), QRect(0, 0, 512, 441)); 0126 QCOMPARE(selection->selectedRect(), QRect(0, 0, 512, 448)); 0127 } 0128 0129 void KisPixelSelectionTest::testExtent() 0130 { 0131 KisPixelSelectionSP selection = new KisPixelSelection(); 0132 selection->select(QRect(0, 0, 516, 441)); 0133 QCOMPARE(selection->selectedExactRect(), QRect(0, 0, 516, 441)); 0134 QCOMPARE(selection->selectedRect(), QRect(0, 0, 576, 448)); 0135 } 0136 0137 0138 void KisPixelSelectionTest::testAddSelection() 0139 { 0140 KisPixelSelectionSP sel1 = new KisPixelSelection(); 0141 KisPixelSelectionSP sel2 = new KisPixelSelection(); 0142 sel1->select(QRect(0, 0, 50, 50)); 0143 sel2->select(QRect(25, 0, 50, 50)); 0144 sel1->applySelection(sel2, SELECTION_ADD); 0145 QCOMPARE(sel1->selectedExactRect(), QRect(0, 0, 75, 50)); 0146 } 0147 0148 void KisPixelSelectionTest::testSubtractSelection() 0149 { 0150 KisPixelSelectionSP sel1 = new KisPixelSelection(); 0151 KisPixelSelectionSP sel2 = new KisPixelSelection(); 0152 sel1->select(QRect(0, 0, 50, 50)); 0153 sel2->select(QRect(25, 0, 50, 50)); 0154 sel1->applySelection(sel2, SELECTION_SUBTRACT); 0155 QCOMPARE(sel1->selectedExactRect(), QRect(0, 0, 25, 50)); 0156 } 0157 0158 void KisPixelSelectionTest::testIntersectSelection() 0159 { 0160 KisPixelSelectionSP sel1 = new KisPixelSelection(); 0161 KisPixelSelectionSP sel2 = new KisPixelSelection(); 0162 sel1->select(QRect(0, 0, 50, 50)); 0163 sel2->select(QRect(25, 0, 50, 50)); 0164 sel1->applySelection(sel2, SELECTION_INTERSECT); 0165 QCOMPARE(sel1->selectedExactRect(), QRect(25, 0, 25, 50)); 0166 } 0167 0168 void KisPixelSelectionTest::testTotally() 0169 { 0170 KisPixelSelectionSP sel = new KisPixelSelection(); 0171 sel->select(QRect(0, 0, 100, 100)); 0172 QVERIFY(sel->isTotallyUnselected(QRect(100, 0, 100, 100))); 0173 QVERIFY(!sel->isTotallyUnselected(QRect(50, 0, 100, 100))); 0174 } 0175 0176 void KisPixelSelectionTest::testUpdateProjection() 0177 { 0178 KisSelectionSP sel = new KisSelection(); 0179 KisPixelSelectionSP psel = new KisPixelSelection(); 0180 psel->select(QRect(0, 0, 100, 100)); 0181 psel->renderToProjection(sel->projection().data()); 0182 QCOMPARE(sel->selectedExactRect(), QRect(0, 0, 100, 100)); 0183 } 0184 0185 void KisPixelSelectionTest::testExactRectWithImage() 0186 { 0187 const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8(); 0188 KisImageSP image = new KisImage(0, 200, 200, cs, "merge test"); 0189 0190 KisSetEmptyGlobalSelectionCommand(image).redo(); 0191 KisPixelSelectionSP selection = image->globalSelection()->pixelSelection(); 0192 selection->select(QRect(100, 50, 200, 100)); 0193 QCOMPARE(selection->selectedExactRect(), QRect(100, 50, 200, 100)); 0194 } 0195 0196 0197 0198 void KisPixelSelectionTest::testUndo() 0199 { 0200 KisPixelSelectionSP psel = new KisPixelSelection(); 0201 0202 { 0203 KisTransaction transaction(psel); 0204 psel->select(QRect(50, 50, 100, 100)); 0205 transaction.end(); 0206 } 0207 0208 QCOMPARE(psel->selectedExactRect(), QRect(50, 50, 100, 100)); 0209 0210 { 0211 KisTransaction transaction(psel); 0212 psel->select(QRect(150, 50, 100, 100)); 0213 transaction.end(); 0214 } 0215 0216 QCOMPARE(psel->selectedExactRect(), QRect(50, 50, 200, 100)); 0217 0218 { 0219 KisTransaction transaction(psel); 0220 psel->crop(QRect(75, 75, 10, 10)); 0221 transaction.revert(); 0222 } 0223 0224 QCOMPARE(psel->selectedExactRect(), QRect(50, 50, 200, 100)); 0225 } 0226 0227 void KisPixelSelectionTest::testCrossColorSpacePainting() 0228 { 0229 QRect r0(0,0,50,50); 0230 QRect r1(40,40,60,60); 0231 QRect r2(80,40,50,50); 0232 QRect r3(85,45,45,45); 0233 0234 KisPixelSelectionSP psel1 = new KisPixelSelection(); 0235 psel1->select(r0); 0236 0237 const KoColorSpace *cs = psel1->compositionSourceColorSpace(); 0238 0239 KisPaintDeviceSP dev1 = new KisPaintDevice(cs); 0240 KisFixedPaintDeviceSP dev2 = new KisFixedPaintDevice(cs); 0241 KisFixedPaintDeviceSP dev3 = new KisFixedPaintDevice(KoColorSpaceRegistry::instance()->alpha8()); 0242 0243 dev1->fill(r1, KoColor(Qt::white, cs)); 0244 dev2->fill(r2.x(), r2.y(), r2.width(), r2.height() ,KoColor(Qt::white, cs).data()); 0245 dev3->fill(r3.x(), r3.y(), r3.width(), r3.height() ,KoColor(Qt::white, cs).data()); 0246 0247 KisPainter painter(psel1); 0248 0249 painter.bitBlt(r1.topLeft(), dev1, r1); 0250 QCOMPARE(psel1->selectedExactRect(), r0 | r1); 0251 0252 painter.bltFixed(r2.x(), r2.y(), dev2, r2.x(), r2.y(), r2.width(), r2.height()); 0253 QCOMPARE(psel1->selectedExactRect(), r0 | r1 | r2); 0254 0255 psel1->clear(); 0256 psel1->select(r0); 0257 0258 painter.bitBltWithFixedSelection(r3.x(), r3.y(), dev1, dev3, r3.x(), r3.y(), r3.x(), r3.y(), r3.width(), r3.height()); 0259 QCOMPARE(psel1->selectedExactRect(), r0 | (r1 & r3)); 0260 0261 psel1->clear(); 0262 psel1->select(r0); 0263 0264 painter.bltFixedWithFixedSelection(r3.x(), r3.y(), dev2, dev3, r3.x(), r3.y(), r3.x(), r3.y(), r3.width(), r3.height()); 0265 QCOMPARE(psel1->selectedExactRect(), r0 | (r2 & r3)); 0266 0267 psel1->clear(); 0268 psel1->select(r0); 0269 0270 painter.fill(r3.x(), r3.y(), r3.width(), r3.height(), KoColor(Qt::white, cs)); 0271 QCOMPARE(psel1->selectedExactRect(), r0 | r3); 0272 } 0273 0274 void KisPixelSelectionTest::testOutlineCache() 0275 { 0276 KisPixelSelectionSP psel1 = new KisPixelSelection(); 0277 KisPixelSelectionSP psel2 = new KisPixelSelection(); 0278 0279 QVERIFY(psel1->outlineCacheValid()); 0280 QVERIFY(psel2->outlineCacheValid()); 0281 0282 psel1->select(QRect(10,10,90,90), 100); 0283 QVERIFY(psel1->outlineCacheValid()); 0284 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0285 0286 psel2->select(QRect(20,20,100,100), 200); 0287 QVERIFY(psel2->outlineCacheValid()); 0288 QCOMPARE(psel2->outlineCache().boundingRect(), QRectF(20,20,100,100)); 0289 0290 psel1->applySelection(psel2, SELECTION_ADD); 0291 QVERIFY(psel1->outlineCacheValid()); 0292 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,110,110)); 0293 0294 psel1->applySelection(psel2, SELECTION_INTERSECT); 0295 QVERIFY(psel1->outlineCacheValid()); 0296 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(20,20,100,100)); 0297 0298 psel2->invalidateOutlineCache(); 0299 QVERIFY(!psel2->outlineCacheValid()); 0300 0301 psel1->applySelection(psel2, SELECTION_SUBTRACT); 0302 QVERIFY(!psel1->outlineCacheValid()); 0303 0304 psel1->clear(); 0305 QVERIFY(psel1->outlineCacheValid()); 0306 } 0307 0308 void KisPixelSelectionTest::testOutlineCacheTransactions() 0309 { 0310 KisSurrogateUndoAdapter undoAdapter; 0311 KisPixelSelectionSP psel1 = new KisPixelSelection(); 0312 0313 QVERIFY(psel1->outlineCacheValid()); 0314 0315 psel1->clear(); 0316 psel1->select(QRect(10,10,90,90), 100); 0317 QVERIFY(psel1->outlineCacheValid()); 0318 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0319 0320 { 0321 KisTransaction t(psel1); 0322 t.end(); 0323 QVERIFY(!psel1->outlineCacheValid()); 0324 } 0325 0326 psel1->clear(); 0327 psel1->select(QRect(10,10,90,90), 100); 0328 QVERIFY(psel1->outlineCacheValid()); 0329 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0330 0331 { 0332 KisTransaction t(psel1); 0333 t.revert(); 0334 QVERIFY(psel1->outlineCacheValid()); 0335 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0336 } 0337 0338 psel1->clear(); 0339 psel1->select(QRect(10,10,90,90), 100); 0340 QVERIFY(psel1->outlineCacheValid()); 0341 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0342 0343 { 0344 KisSelectionTransaction t(psel1); 0345 0346 QVERIFY(psel1->outlineCacheValid()); 0347 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0348 0349 psel1->select(QRect(10,10,200,200)); 0350 0351 QVERIFY(psel1->outlineCacheValid()); 0352 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,200,200)); 0353 0354 t.commit(&undoAdapter); 0355 0356 QVERIFY(psel1->outlineCacheValid()); 0357 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,200,200)); 0358 0359 undoAdapter.undo(); 0360 0361 QVERIFY(psel1->outlineCacheValid()); 0362 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,90,90)); 0363 0364 undoAdapter.redo(); 0365 0366 QVERIFY(psel1->outlineCacheValid()); 0367 QCOMPARE(psel1->outlineCache().boundingRect(), QRectF(10,10,200,200)); 0368 } 0369 } 0370 0371 #include "kis_paint_device_debug_utils.h" 0372 #include <testing_timed_default_bounds.h> 0373 0374 bool compareRect(KisPixelSelectionSP psel, const QRect &rc) 0375 { 0376 QPolygon poly; 0377 poly << rc.topLeft(); 0378 poly << QPoint(rc.x(), rc.bottom() + 1); 0379 poly << QPoint(rc.right() + 1, rc.bottom() + 1); 0380 poly << QPoint(rc.right() + 1, rc.top()); 0381 poly << rc.topLeft(); 0382 0383 psel->select(rc); 0384 //KIS_DUMP_DEVICE_2(psel, psel->defaultBounds()->bounds(), "selection_rect", "dd"); 0385 0386 const QVector<QPolygon> outline = psel->outline(); 0387 const QVector<QPolygon> ref({poly}); 0388 0389 const bool result = outline == ref; 0390 0391 if (!result) { 0392 qDebug() << "Failed rect" << rc; 0393 qDebug() << "Exp: " << ref; 0394 qDebug() << "Act: " << outline; 0395 } 0396 0397 psel->clear(); 0398 0399 return result; 0400 } 0401 0402 bool compareRegion(KisPixelSelectionSP psel, 0403 const QVector<QRect> &rects, 0404 const QVector<QPolygon> &ref) 0405 { 0406 Q_FOREACH(const QRect &rc, rects) { 0407 psel->select(rc); 0408 } 0409 0410 //KIS_DUMP_DEVICE_2(psel, psel->defaultBounds()->bounds(), "selection_poly", "dd"); 0411 0412 const QVector<QPolygon> outline = psel->outline(); 0413 0414 const bool result = outline == ref; 0415 0416 if (!result) { 0417 qDebug() << "Failed rect" << rects; 0418 qDebug() << "Exp: " << ref; 0419 qDebug() << "Act: " << outline; 0420 } 0421 0422 psel->clear(); 0423 0424 return result; 0425 } 0426 0427 void KisPixelSelectionTest::testOutlineArtifacts() 0428 { 0429 KisDefaultBoundsBaseSP bounds = new TestUtil::TestingTimedDefaultBounds(QRect(0,0,20,22)); 0430 KisPixelSelectionSP psel = new KisPixelSelection(); 0431 psel->setDefaultBounds(bounds); 0432 0433 QVERIFY(compareRect(psel, QRect(10,10,1,4))); 0434 QVERIFY(compareRect(psel, QRect(10,10,2,4))); 0435 QVERIFY(compareRect(psel, QRect(10,10,4,1))); 0436 QVERIFY(compareRect(psel, QRect(10,10,4,2))); 0437 QVERIFY(compareRect(psel, QRect(10,10,1,1))); 0438 0439 0440 QVERIFY(compareRegion(psel, 0441 {QRect(10,10,5,4), QRect(10,15,5,4), QRect(13,14,1,1)}, 0442 {QPolygon({QPoint(10,10), 0443 QPoint(10,14), 0444 QPoint(13,14), 0445 QPoint(13,15), 0446 QPoint(10,15), 0447 QPoint(10,19), 0448 QPoint(15,19), 0449 QPoint(15,15), 0450 QPoint(14,15), 0451 QPoint(14,14), 0452 QPoint(15,14), 0453 QPoint(15,10), 0454 QPoint(10,10)})})); 0455 0456 QVERIFY(compareRegion(psel, 0457 {QRect(10,10,5,4), QRect(10,16,5,4), QRect(12,14,2,2)}, 0458 {QPolygon({QPoint(10,10), 0459 QPoint(10,14), 0460 QPoint(12,14), 0461 QPoint(12,16), 0462 QPoint(10,16), 0463 QPoint(10,20), 0464 QPoint(15,20), 0465 QPoint(15,16), 0466 QPoint(14,16), 0467 QPoint(14,14), 0468 QPoint(15,14), 0469 QPoint(15,10), 0470 QPoint(10,10)})})); 0471 0472 QVERIFY(compareRegion(psel, 0473 {QRect(10,10,4,5), QRect(15,10,4,5), QRect(14,13,1,1)}, 0474 {QPolygon({QPoint(10,10), 0475 QPoint(10,15), 0476 QPoint(14,15), 0477 QPoint(14,14), 0478 QPoint(15,14), 0479 QPoint(15,15), 0480 QPoint(19,15), 0481 QPoint(19,10), 0482 QPoint(15,10), 0483 QPoint(15,13), 0484 QPoint(14,13), 0485 QPoint(14,10), 0486 QPoint(10,10)})})); 0487 0488 QVERIFY(compareRegion(psel, 0489 {QRect(10,10,3,5), QRect(15,10,4,5), QRect(13,13,2,1)}, 0490 {QPolygon({QPoint(10,10), 0491 QPoint(10,15), 0492 QPoint(13,15), 0493 QPoint(13,14), 0494 QPoint(15,14), 0495 QPoint(15,15), 0496 QPoint(19,15), 0497 QPoint(19,10), 0498 QPoint(15,10), 0499 QPoint(15,13), 0500 QPoint(13,13), 0501 QPoint(13,10), 0502 QPoint(10,10)})})); 0503 0504 QVERIFY(compareRegion(psel, 0505 {QRect(10,10,1,4), QRect(15,10,1,4)}, 0506 {QPolygon({QPoint(10,10), 0507 QPoint(10,14), 0508 QPoint(11,14), 0509 QPoint(11,10), 0510 QPoint(10,10)}), 0511 QPolygon({QPoint(15,10), 0512 QPoint(15,14), 0513 QPoint(16,14), 0514 QPoint(16,10), 0515 QPoint(15,10)})})); 0516 0517 QVERIFY(compareRegion(psel, 0518 {QRect(10,10,4,1), QRect(15,10,4,1)}, 0519 {QPolygon({QPoint(10,10), 0520 QPoint(10,11), 0521 QPoint(14,11), 0522 QPoint(14,10), 0523 QPoint(10,10)}), 0524 QPolygon({QPoint(15,10), 0525 QPoint(15,11), 0526 QPoint(19,11), 0527 QPoint(19,10), 0528 QPoint(15,10)})})); 0529 0530 QVERIFY(compareRegion(psel, 0531 {QRect(10,10,4,1), QRect(14,11,4,1)}, 0532 {QPolygon({QPoint(10,10), 0533 QPoint(10,11), 0534 QPoint(14,11), 0535 QPoint(14,12), 0536 QPoint(18,12), 0537 QPoint(18,11), 0538 QPoint(14,11), 0539 QPoint(14,10), 0540 QPoint(10,10)})})); 0541 0542 QVERIFY(compareRegion(psel, 0543 {QRect(0,0,10,22), QRect(15,0,5,22), 0544 QRect(10,0,5,10), QRect(10,15,5,7)}, 0545 {QPolygon({QPoint(0,0), 0546 QPoint(0,22), 0547 QPoint(20,22), 0548 QPoint(20,0), 0549 QPoint(0,0)}), 0550 QPolygon({QPoint(10,10), 0551 QPoint(15,10), 0552 QPoint(15,15), 0553 QPoint(10,15), 0554 QPoint(10,10)})})); 0555 0556 QVERIFY(compareRegion(psel, 0557 {QRect(0,0,20,5), QRect(0,10,20,12), 0558 QRect(5,5,15,5)}, 0559 {QPolygon({QPoint(0,0), 0560 QPoint(0,5), 0561 QPoint(5,5), 0562 QPoint(5,10), 0563 QPoint(0,10), 0564 QPoint(0,22), 0565 QPoint(20,22), 0566 QPoint(20,0), 0567 QPoint(0,0)})})); 0568 0569 QVERIFY(compareRegion(psel, 0570 {QRect(0,0,20,5), QRect(0,10,20,12), 0571 QRect(0,5,15,5)}, 0572 {QPolygon({QPoint(0,0), 0573 QPoint(0,22), 0574 QPoint(20,22), 0575 QPoint(20,10), 0576 QPoint(15,10), 0577 QPoint(15,5), 0578 QPoint(20,5), 0579 QPoint(20,0), 0580 QPoint(0,0)})})); 0581 } 0582 0583 KISTEST_MAIN(KisPixelSelectionTest) 0584