QPainterPath: Extend autotests for length and percentage functions

Also add a benchmark test for them.

Change-Id: Icc44f54786048550d0a96fd0d1acd3801eaca132
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
Eirik Aavitsland 2024-08-29 11:46:33 +02:00
parent c136de2deb
commit ff7221c677
3 changed files with 195 additions and 1 deletions

View File

@ -55,7 +55,8 @@ private slots:
void pointAtPercent_data();
void pointAtPercent();
void lengths_data();
void lengths();
void angleAtPercent();
void arcWinding_data();
@ -1105,6 +1106,37 @@ void tst_QPainterPath::pointAtPercent_data()
path.moveTo(100, 100);
QTest::newRow("Case 18") << path << qreal(0.0) << QPointF(100, 100);
QTest::newRow("Case 19") << path << qreal(1.0) << QPointF(100, 100);
path.clear();
path.lineTo(100, 0);
path.moveTo(0, 100);
path.lineTo(100, 100);
QTest::newRow("Case 20") << path << qreal(0.25) << QPointF(50, 0);
QTest::newRow("Case 21") << path << qreal(0.5) << QPointF(100, 0);
QTest::newRow("Case 22") << path << qreal(0.75) << QPointF(50, 100);
QTest::newRow("Case 23") << path << qreal(1.0) << QPointF(100, 100);
path.clear();
path.moveTo(100, 100);
path.lineTo(0, 100);
path.moveTo(100, 0);
path.lineTo(0, 0);
QTest::newRow("Case 24") << path << qreal(0.25) << QPointF(50, 100);
QTest::newRow("Case 25") << path << qreal(0.5) << QPointF(0, 100);
QTest::newRow("Case 26") << path << qreal(0.75) << QPointF(50, 0);
QTest::newRow("Case 27") << path << qreal(1.0) << QPointF(0, 0);
path.clear();
path.lineTo(0, 100);
path.cubicTo(QPointF(5, 0), QPointF(90, 100), QPointF(100, 100));
path.cubicTo(QPointF(80, 80), QPointF(80, 80), QPointF(100, 20));
path.closeSubpath();
path.addPath(path);
QTest::newRow("Case 28") << path << qreal(0.5) << QPointF(0, 0);
QTest::newRow("Case 29") << path << qreal(0.05) << path.pointAtPercent(0.5 + 0.05);
QTest::newRow("Case 30") << path << qreal(0.2) << path.pointAtPercent(0.5 + 0.2);
QTest::newRow("Case 31") << path << qreal(0.4) << path.pointAtPercent(0.5 + 0.4);
QTest::newRow("Case 32") << path << qreal(0.45) << path.pointAtPercent(0.5 + 0.45);
}
void tst_QPainterPath::pointAtPercent()
@ -1114,10 +1146,57 @@ void tst_QPainterPath::pointAtPercent()
QFETCH(QPointF, point);
QPointF result = path.pointAtPercent(percent);
QVERIFY(pathFuzzyCompare(point.x() , result.x()));
QVERIFY(pathFuzzyCompare(point.y() , result.y()));
}
void tst_QPainterPath::lengths_data()
{
QTest::addColumn<QPainterPath>("path");
QTest::addColumn<qreal>("length");
QTest::addColumn<qreal>("lenAt25");
QTest::addColumn<qreal>("lenAt50");
QTest::addColumn<qreal>("lenAt75");
QPainterPath p;
p.addRect(50, 50, 200, 100);
qreal len = 2 * 200 + 2 * 100;
QTest::newRow("rect") << p << len << len * 0.25 << len * 0.5 << len * 0.75;
p.clear();
p.addEllipse(50, 50, 100, 100);
len = M_PI * 100;
QTest::newRow("circle") << p << len << len * 0.25 << len * 0.5 << len * 0.75;
p.addEllipse(60, 60, 100, 100);
p.addEllipse(70, 70, 100, 100);
len *= 3;
QTest::newRow("three_circles") << p << len << len * 0.25 << len * 0.5 << len * 0.75;
p.clear();
p.lineTo(0, 100);
p.cubicTo(QPointF(5, 0), QPointF(90, 100), QPointF(100, 100));
p.cubicTo(QPointF(80, 80), QPointF(80, 80), QPointF(100, 20));
len = 332.113;
QTest::newRow("asymmetric") << p << len << len * 0.25 << 173.85 << 248.77;
}
void tst_QPainterPath::lengths()
{
QFETCH(QPainterPath, path);
QFETCH(qreal, length);
QFETCH(qreal, lenAt25);
QFETCH(qreal, lenAt50);
QFETCH(qreal, lenAt75);
QVERIFY(pathFuzzyCompare(path.length() / 1000, length / 1000));
QVERIFY(pathFuzzyCompare(path.percentAtLength(lenAt25), qreal(0.25)));
QVERIFY(pathFuzzyCompare(path.percentAtLength(lenAt50), qreal(0.50)));
QVERIFY(pathFuzzyCompare(path.percentAtLength(lenAt75), qreal(0.75)));
QVERIFY(pathFuzzyCompare(path.percentAtLength(length), qreal(1)));
}
void tst_QPainterPath::setElementPositionAt()
{
QPainterPath path(QPointF(42., 42.));

View File

@ -0,0 +1,16 @@
# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
cmake_minimum_required(VERSION 3.16)
project(tst_bench_qpainterpath LANGUAGES CXX)
find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
endif()
qt_internal_add_benchmark(tst_bench_qpainterpath
SOURCES
tst_bench_qpainterpath.cpp
LIBRARIES
Qt::Gui
Qt::Test
)

View File

@ -0,0 +1,99 @@
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <qtest.h>
#include <QPainterPath>
#include <QFont>
class tst_QPainterPath : public QObject
{
Q_OBJECT
public:
tst_QPainterPath();
private slots:
void initTestCase_data();
void length();
void percentAtLength();
void pointAtPercent();
};
tst_QPainterPath::tst_QPainterPath()
{
}
void tst_QPainterPath::initTestCase_data()
{
QTest::addColumn<QPainterPath>("path");
QPainterPath p;
QTest::newRow("null") << p;
p.moveTo(100, 100);
QTest::newRow("only_move") << p;
p.lineTo(0, 0);
QTest::newRow("single_line") << p;
p.clear();
p.cubicTo(QPointF(100, 25), QPointF(0, 75), QPointF(100, 100));
QTest::newRow("single_curve") << p;
p.clear();
for (int i = 0; i < 10; i++)
p.addRect(i * 10, i * 10, 100, 100);
QTest::newRow("40_lines") << p;
p.clear();
for (int i = 0; i < 10; i++)
p.addEllipse(i * 10, i * 10, 100, 100);
QTest::newRow("40_curves") << p;
p.clear();
for (int i = 0; i < 10; i++)
p.addRoundedRect(QRectF(i * 10, i * 10, 100, 100), 10, 20);
QTest::newRow("80_mixed") << p;
p.clear();
p.addText(QPoint(), QFont(), "Dommarane skal velja det som er best for domfelte.");
QTest::newRow("2k_text") << p;
}
void tst_QPainterPath::length()
{
QFETCH_GLOBAL(QPainterPath, path);
//const qreal len = path.length() * 0.72;
QBENCHMARK {
path.length();
}
}
void tst_QPainterPath::percentAtLength()
{
QFETCH_GLOBAL(QPainterPath, path);
const qreal len = path.length() * 0.72;
QBENCHMARK {
path.percentAtLength(len);
}
}
void tst_QPainterPath::pointAtPercent()
{
QFETCH_GLOBAL(QPainterPath, path);
const qreal t = 0.72;
QBENCHMARK {
path.pointAtPercent(t);
}
}
QTEST_MAIN(tst_QPainterPath)
#include "tst_bench_qpainterpath.moc"