diff -r 000000000000 -r 1918ee327afb tests/auto/qsvggenerator/tst_qsvggenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qsvggenerator/tst_qsvggenerator.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,443 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +//TESTED_CLASS= +//TESTED_FILES= + +#ifdef Q_OS_SYMBIAN +#define SRCDIR "" +#endif + +class tst_QSvgGenerator : public QObject +{ +Q_OBJECT + +public: + tst_QSvgGenerator(); + virtual ~tst_QSvgGenerator(); + +private slots: + void construction(); + void fileName(); + void outputDevice(); + void sizeAndViewBox(); + void metric(); + void radialGradient(); + void fileEncoding(); + void fractionalFontSize(); + void titleAndDescription(); + void gradientInterpolation(); +}; + +tst_QSvgGenerator::tst_QSvgGenerator() +{ +} + +tst_QSvgGenerator::~tst_QSvgGenerator() +{ + QFile::remove(QLatin1String("fileName_output.svg")); + QFile::remove(QLatin1String("outputDevice_output.svg")); + QFile::remove(QLatin1String("radial_gradient.svg")); +} + +void tst_QSvgGenerator::construction() +{ + QSvgGenerator generator; + QCOMPARE(generator.fileName(), QString()); + QCOMPARE(generator.outputDevice(), (QIODevice *)0); + QCOMPARE(generator.resolution(), 72); + QCOMPARE(generator.size(), QSize()); +} + +static void removeAttribute(const QDomNode &node, const QString &attribute) +{ + if (node.isNull()) + return; + + node.toElement().removeAttribute(attribute); + + removeAttribute(node.firstChild(), attribute); + removeAttribute(node.nextSibling(), attribute); +} + +static void compareWithoutFontInfo(const QByteArray &source, const QByteArray &reference) +{ + QDomDocument sourceDoc; + sourceDoc.setContent(source); + + QDomDocument referenceDoc; + referenceDoc.setContent(reference); + + QList fontAttributes; + fontAttributes << "font-family" << "font-size" << "font-weight" << "font-style"; + + foreach (QString attribute, fontAttributes) { + removeAttribute(sourceDoc, attribute); + removeAttribute(referenceDoc, attribute); + } + + QCOMPARE(sourceDoc.toByteArray(), referenceDoc.toByteArray()); +} + +static void checkFile(const QString &fileName) +{ + QVERIFY(QFile::exists(fileName));; + + QFile file(fileName); + QVERIFY(file.open(QIODevice::ReadOnly)); + + QFile referenceFile(SRCDIR "referenceSvgs/" + fileName); + QVERIFY(referenceFile.open(QIODevice::ReadOnly)); + + compareWithoutFontInfo(file.readAll(), referenceFile.readAll()); +} + +void tst_QSvgGenerator::fileName() +{ + QString fileName = "fileName_output.svg"; + QFile::remove(fileName); + + QSvgGenerator generator; + generator.setFileName(fileName); + QCOMPARE(generator.fileName(), fileName); + + QPainter painter(&generator); + painter.fillRect(0, 0, 100, 100, Qt::red); + painter.end(); + + checkFile(fileName); +} + +void tst_QSvgGenerator::outputDevice() +{ + QString fileName = "outputDevice_output.svg"; + QFile::remove(fileName); + + QFile file(fileName); + + { + // Device is not open + QSvgGenerator generator; + generator.setOutputDevice(&file); + QCOMPARE(generator.outputDevice(), (QIODevice *)&file); + + QPainter painter; + QVERIFY(painter.begin(&generator)); + QCOMPARE(file.openMode(), QIODevice::OpenMode(QIODevice::Text | QIODevice::WriteOnly)); + file.close(); + } + { + // Device is not open, WriteOnly + file.open(QIODevice::WriteOnly); + + QSvgGenerator generator; + generator.setOutputDevice(&file); + QCOMPARE(generator.outputDevice(), (QIODevice *)&file); + + QPainter painter; + QVERIFY(painter.begin(&generator)); + QCOMPARE(file.openMode(), QIODevice::OpenMode(QIODevice::WriteOnly)); + file.close(); + } + { + // Device is not open, ReadOnly + file.open(QIODevice::ReadOnly); + + QSvgGenerator generator; + generator.setOutputDevice(&file); + QCOMPARE(generator.outputDevice(), (QIODevice *)&file); + + QPainter painter; + QTest::ignoreMessage(QtWarningMsg, "QSvgPaintEngine::begin(), could not write to read-only output device: 'Unknown error'"); + QVERIFY(!painter.begin(&generator)); + QCOMPARE(file.openMode(), QIODevice::OpenMode(QIODevice::ReadOnly)); + file.close(); + } +} + +void tst_QSvgGenerator::sizeAndViewBox() +{ + { // Setting neither properties should result in + // none of the attributes written to the SVG + QSvgGenerator generator; + QByteArray byteArray; + QBuffer buffer(&byteArray); + generator.setOutputDevice(&buffer); + QPainter painter(&generator); + painter.end(); + + QVERIFY(!byteArray.contains("foo")); + QVERIFY(byteArray.contains("bar")); +} + +static void drawTestGradients(QPainter &painter) +{ + int w = painter.device()->width(); + int h = painter.device()->height(); + if (w <= 0 || h <= 0) + h = w = 72; + + QLinearGradient gradient(QPoint(0, 0), QPoint(1, 1)); + gradient.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient.setColorAt(0, QColor(255, 0, 0, 0)); + gradient.setColorAt(1, QColor(0, 0, 255, 255)); + painter.fillRect(QRectF(0, 0, w/2, h/2), gradient); + + gradient.setInterpolationMode(QGradient::ComponentInterpolation); + painter.fillRect(QRectF(0, h/2, w/2, h - h/2), gradient); + + gradient.setInterpolationMode(QGradient::ColorInterpolation); + gradient.setColorAt(0, QColor(255, 0, 0, 123)); + gradient.setColorAt(1, QColor(0, 0, 255, 123)); + painter.fillRect(QRectF(w/2, 0, w - w/2, h/2), gradient); + + gradient.setInterpolationMode(QGradient::ComponentInterpolation); + painter.fillRect(QRectF(w/2, h/2, w - w/2, h - h/2), gradient); +} + +static qreal sqrImageDiff(const QImage &image1, const QImage &image2) +{ + if (image1.size() != image2.size()) + return 1e30; + quint64 sum = 0; + for (int y = 0; y < image1.height(); ++y) { + const quint8 *line1 = reinterpret_cast(image1.scanLine(y)); + const quint8 *line2 = reinterpret_cast(image2.scanLine(y)); + for (int x = 0; x < image1.width() * 4; ++x) + sum += quint64((int(line1[x]) - int(line2[x])) * (int(line1[x]) - int(line2[x]))); + } + return qreal(sum) / qreal(image1.width() * image1.height()); +} + +void tst_QSvgGenerator::gradientInterpolation() +{ + QByteArray byteArray; + QPainter painter; + QImage image(576, 576, QImage::Format_ARGB32_Premultiplied); + QImage refImage(576, 576, QImage::Format_ARGB32_Premultiplied); + image.fill(0x80208050); + refImage.fill(0x80208050); + + { + QSvgGenerator generator; + QBuffer buffer(&byteArray); + generator.setOutputDevice(&buffer); + + QVERIFY(painter.begin(&generator)); + drawTestGradients(painter); + painter.end(); + } + + { + QVERIFY(painter.begin(&image)); + QSvgRenderer renderer(byteArray); + renderer.render(&painter, image.rect()); + painter.end(); + } + + { + QVERIFY(painter.begin(&refImage)); + drawTestGradients(painter); + painter.end(); + } + + QVERIFY(sqrImageDiff(image, refImage) < 2); // pixel error < 1.41 (L2-norm) +} + +QTEST_MAIN(tst_QSvgGenerator) +#include "tst_qsvggenerator.moc"