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