void TestShapePainting::testPaintOrder() { // the stacking order determines the painting order so things on top // get their paint called last. // Each shape has a zIndex and within the children a container has // it determines the stacking order. Its important to realize that // the zIndex is thus local to a container, if you have layer1 and layer2 // with both various child shapes the stacking order of the layer shapes // is most important, then within this the child shape index is used. class OrderedMockShape : public MockShape { public: OrderedMockShape(QList<MockShape*> &list) : order(list) {} void paint(QPainter &painter, const KViewConverter &converter) { order.append(this); MockShape::paint(painter, converter); } QList<MockShape*> ℴ }; QList<MockShape*> order; MockContainer top; top.setZIndex(2); OrderedMockShape shape1(order); shape1.setZIndex(5); OrderedMockShape shape2(order); shape2.setZIndex(0); top.addShape(&shape1); top.addShape(&shape2); MockContainer bottom; bottom.setZIndex(1); OrderedMockShape shape3(order); shape3.setZIndex(-1); OrderedMockShape shape4(order); shape4.setZIndex(9); bottom.addShape(&shape3); bottom.addShape(&shape4); MockCanvas canvas; KShapeManager manager(&canvas); manager.addShape(&top); manager.addShape(&bottom); QCOMPARE(manager.shapes().count(), 6); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top.paintedCount, 1); QCOMPARE(bottom.paintedCount, 1); QCOMPARE(shape1.paintedCount, 1); QCOMPARE(shape2.paintedCount, 1); QCOMPARE(shape3.paintedCount, 1); QCOMPARE(shape4.paintedCount, 1); QCOMPARE(order.count(), 4); QVERIFY(order[0] == &shape3); // lowest first QVERIFY(order[1] == &shape4); QVERIFY(order[2] == &shape2); QVERIFY(order[3] == &shape1); // again, with clipping. order.clear(); painter.setClipRect(0, 0, 100, 100); manager.paint(painter, vc, false); QCOMPARE(top.paintedCount, 2); QCOMPARE(bottom.paintedCount, 2); QCOMPARE(shape1.paintedCount, 2); QCOMPARE(shape2.paintedCount, 2); QCOMPARE(shape3.paintedCount, 2); QCOMPARE(shape4.paintedCount, 2); QCOMPARE(order.count(), 4); QVERIFY(order[0] == &shape3); // lowest first QVERIFY(order[1] == &shape4); QVERIFY(order[2] == &shape2); QVERIFY(order[3] == &shape1); order.clear(); MockContainer root; root.setZIndex(0); MockContainer branch1; branch1.setZIndex(1); OrderedMockShape child1_1(order); child1_1.setZIndex(1); OrderedMockShape child1_2(order); child1_2.setZIndex(2); branch1.addShape(&child1_1); branch1.addShape(&child1_2); MockContainer branch2; branch2.setZIndex(2); OrderedMockShape child2_1(order); child2_1.setZIndex(1); OrderedMockShape child2_2(order); child2_2.setZIndex(2); branch2.addShape(&child2_1); branch2.addShape(&child2_2); root.addShape(&branch1); root.addShape(&branch2); QList<KShape*> sortedShapes; sortedShapes.append(&root); sortedShapes.append(&branch1); sortedShapes.append(&branch2); sortedShapes.append(branch1.shapes()); sortedShapes.append(branch2.shapes()); qSort(sortedShapes.begin(), sortedShapes.end(), KShape::compareShapeZIndex); QCOMPARE(sortedShapes.count(), 7); QVERIFY(sortedShapes[0] == &root); QVERIFY(sortedShapes[1] == &branch1); QVERIFY(sortedShapes[2] == &child1_1); QVERIFY(sortedShapes[3] == &child1_2); QVERIFY(sortedShapes[4] == &branch2); QVERIFY(sortedShapes[5] == &child2_1); QVERIFY(sortedShapes[6] == &child2_2); }
void TestShapePainting::testPaintOrder() { // the stacking order determines the painting order so things on top // get their paint called last. // Each shape has a zIndex and within the children a container has // it determines the stacking order. Its important to realize that // the zIndex is thus local to a container, if you have layer1 and layer2 // with both various child shapes the stacking order of the layer shapes // is most important, then within this the child shape index is used. class OrderedMockShape : public MockShape { public: OrderedMockShape(QList<MockShape*> &list) : order(list) {} void paint(QPainter &painter, const KoViewConverter &converter, KoShapePaintingContext &paintcontext) override { order.append(this); MockShape::paint(painter, converter, paintcontext); } QList<MockShape*> ℴ }; QList<MockShape*> order; MockContainer *top = new MockContainer(); top->setZIndex(2); OrderedMockShape *shape1 = new OrderedMockShape(order); shape1->setZIndex(5); OrderedMockShape *shape2 = new OrderedMockShape(order); shape2->setZIndex(0); top->addShape(shape1); top->addShape(shape2); MockContainer *bottom = new MockContainer(); bottom->setZIndex(1); OrderedMockShape *shape3 = new OrderedMockShape(order); shape3->setZIndex(-1); OrderedMockShape *shape4 = new OrderedMockShape(order); shape4->setZIndex(9); bottom->addShape(shape3); bottom->addShape(shape4); MockCanvas canvas; KoShapeManager manager(&canvas); manager.addShape(top); manager.addShape(bottom); QCOMPARE(manager.shapes().count(), 6); QImage image(100, 100, QImage::Format_Mono); QPainter painter(&image); KoViewConverter vc; manager.paint(painter, vc, false); QCOMPARE(top->paintedCount, 1); QCOMPARE(bottom->paintedCount, 1); QCOMPARE(shape1->paintedCount, 1); QCOMPARE(shape2->paintedCount, 1); QCOMPARE(shape3->paintedCount, 1); QCOMPARE(shape4->paintedCount, 1); QCOMPARE(order.count(), 4); QVERIFY(order[0] == shape3); // lowest first QVERIFY(order[1] == shape4); QVERIFY(order[2] == shape2); QVERIFY(order[3] == shape1); // again, with clipping. order.clear(); painter.setClipRect(0, 0, 100, 100); manager.paint(painter, vc, false); QCOMPARE(top->paintedCount, 2); QCOMPARE(bottom->paintedCount, 2); QCOMPARE(shape1->paintedCount, 2); QCOMPARE(shape2->paintedCount, 2); QCOMPARE(shape3->paintedCount, 2); QCOMPARE(shape4->paintedCount, 2); QCOMPARE(order.count(), 4); QVERIFY(order[0] == shape3); // lowest first QVERIFY(order[1] == shape4); QVERIFY(order[2] == shape2); QVERIFY(order[3] == shape1); order.clear(); MockContainer *root = new MockContainer(); root->setZIndex(0); MockContainer *branch1 = new MockContainer(); branch1->setZIndex(1); OrderedMockShape *child1_1 = new OrderedMockShape(order); child1_1->setZIndex(1); OrderedMockShape *child1_2 = new OrderedMockShape(order); child1_2->setZIndex(2); branch1->addShape(child1_1); branch1->addShape(child1_2); MockContainer *branch2 = new MockContainer(); branch2->setZIndex(2); OrderedMockShape *child2_1 = new OrderedMockShape(order); child2_1->setZIndex(1); OrderedMockShape *child2_2 = new OrderedMockShape(order); child2_2->setZIndex(2); branch2->addShape(child2_1); branch2->addShape(child2_2); root->addShape(branch1); root->addShape(branch2); QList<KoShape*> sortedShapes; sortedShapes.append(root); sortedShapes.append(branch1); sortedShapes.append(branch2); sortedShapes.append(branch1->shapes()); sortedShapes.append(branch2->shapes()); qSort(sortedShapes.begin(), sortedShapes.end(), KoShape::compareShapeZIndex); QCOMPARE(sortedShapes.count(), 7); QVERIFY(sortedShapes[0] == root); QVERIFY(sortedShapes[1] == branch1); QVERIFY(sortedShapes[2] == child1_1); QVERIFY(sortedShapes[3] == child1_2); QVERIFY(sortedShapes[4] == branch2); QVERIFY(sortedShapes[5] == child2_1); QVERIFY(sortedShapes[6] == child2_2); delete top; delete bottom; delete root; }