Unimportant
Unimportant

Reputation: 2096

QT QPainter drawing onto QPixmap with coordinates outside the pixmap

What happens when I draw to a QPixmap with a QPainter using coordinates that are outside the pixmap? For example:

QPixmap pixmap(500, 500);
QPainter painter(&pixmap);
painter.setPen(Qt::red);
painter.drawRect(600, 600, 100, 100); 
//Position 600, 600 is far outside the 500x500 pixmap...

I was about to write some code that checks if a object to draw is inside the bounds or not but if the painter skips painting out of bounds objects anyway then that would be superfluous.

Upvotes: 1

Views: 1088

Answers (1)

eyllanesc
eyllanesc

Reputation: 243887

Painting is one of the main tasks that consume time so it must be optimized, and as experimentally verified with the following example QPainter is optimized by recognizing when it is necessary to repaint.

#include <QtWidgets>
#include <random>

struct Info{
    QRect r;
    double percentage;
    qint64 time;
};

static qint64 measure_task(const QSize & size, const QRect & rect, int times=1000){
    QPixmap pixmap(size);
    pixmap.fill(Qt::transparent);
    QPainter painter(&pixmap);
    QElapsedTimer timer;
    timer.start();
    painter.setPen(Qt::red);
    for (int i=0;i<times;i++)
        painter.drawRect(rect);
    painter.end();
    return timer.elapsed();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    const QSize size(500, 500);
    const QRect rect({}, size);
    std::random_device rd;
    std::mt19937 gen(rd()) ;
    std::uniform_int_distribution<> dis(0, 600) ;
    std::vector<Info> infos;
    for(int i=0; i<50; i++){
        QRect r(dis(gen), dis(gen), 100, 100);
        QSize s = rect.intersected(r).size();
        Info info{r, s.width()*s.height()*1.0/(r.width()*r.height()), measure_task(size, r)};
        infos.push_back(info);
    }
    std::sort(infos.begin(), infos.end(), [](const Info & a, const Info & b) -> bool{
        return a.percentage < b.percentage;
    });
    for(const Info & info: infos){
        qDebug()<< info.r << "percentage:" << info.percentage << "time:" << info.time << "ms";
    }
    return 0;
}

Output:

QRect(463,576 100x100) percentage: 0 time: 0 ms
QRect(544,413 100x100) percentage: 0 time: 0 ms
QRect(223,539 100x100) percentage: 0 time: 0 ms
QRect(405,571 100x100) percentage: 0 time: 0 ms
QRect(33,502 100x100) percentage: 0 time: 0 ms
QRect(539,118 100x100) percentage: 0 time: 0 ms
QRect(576,205 100x100) percentage: 0 time: 0 ms
QRect(594,71 100x100) percentage: 0 time: 0 ms
QRect(386,535 100x100) percentage: 0 time: 0 ms
QRect(596,185 100x100) percentage: 0 time: 0 ms
QRect(343,525 100x100) percentage: 0 time: 0 ms
QRect(324,537 100x100) percentage: 0 time: 0 ms
QRect(43,525 100x100) percentage: 0 time: 0 ms
QRect(499,79 100x100) percentage: 0.01 time: 2 ms
QRect(292,482 100x100) percentage: 0.18 time: 3 ms
QRect(353,474 100x100) percentage: 0.26 time: 3 ms
QRect(442,451 100x100) percentage: 0.2842 time: 2 ms
QRect(457,296 100x100) percentage: 0.43 time: 5 ms
QRect(455,150 100x100) percentage: 0.45 time: 4 ms
QRect(203,450 100x100) percentage: 0.5 time: 5 ms
QRect(448,217 100x100) percentage: 0.52 time: 4 ms
QRect(47,437 100x100) percentage: 0.63 time: 4 ms
QRect(434,5 100x100) percentage: 0.66 time: 4 ms
QRect(419,406 100x100) percentage: 0.7614 time: 3 ms
QRect(215,417 100x100) percentage: 0.83 time: 5 ms
QRect(171,408 100x100) percentage: 0.92 time: 5 ms
QRect(304,180 100x100) percentage: 1 time: 8 ms
QRect(192,242 100x100) percentage: 1 time: 8 ms
QRect(295,162 100x100) percentage: 1 time: 8 ms
QRect(136,96 100x100) percentage: 1 time: 8 ms
QRect(348,243 100x100) percentage: 1 time: 8 ms
QRect(60,46 100x100) percentage: 1 time: 8 ms
QRect(125,281 100x100) percentage: 1 time: 8 ms
QRect(340,44 100x100) percentage: 1 time: 8 ms
QRect(107,204 100x100) percentage: 1 time: 8 ms
QRect(24,120 100x100) percentage: 1 time: 8 ms
QRect(246,271 100x100) percentage: 1 time: 8 ms
QRect(344,90 100x100) percentage: 1 time: 8 ms
QRect(239,329 100x100) percentage: 1 time: 8 ms
QRect(386,314 100x100) percentage: 1 time: 8 ms
QRect(241,218 100x100) percentage: 1 time: 8 ms
QRect(348,312 100x100) percentage: 1 time: 8 ms
QRect(187,315 100x100) percentage: 1 time: 8 ms
QRect(362,268 100x100) percentage: 1 time: 8 ms
QRect(112,43 100x100) percentage: 1 time: 8 ms
QRect(276,106 100x100) percentage: 1 time: 8 ms
QRect(378,201 100x100) percentage: 1 time: 8 ms
QRect(356,131 100x100) percentage: 1 time: 8 ms
QRect(308,269 100x100) percentage: 1 time: 8 ms
QRect(326,322 100x100) percentage: 1 time: 8 ms

In the previous example, a correlation is observed with the painted area and the time consumed by said operation.

Upvotes: 2

Related Questions