From 5b4b437b30b320e2cd7c9a566999a39772e5d431 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Mon, 10 Jun 2019 15:57:52 +0200 Subject: WebGradients: redo implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous implementation was *extremely* expensive. It relied on loading a binary JSON file from resources (which involved decompressing it), then extracting information out of it to build a gradient. Already-loaded gradients were kept in a local cache, which had to be mutex protected. Instead, this patch extends the gradient generator to build static arrays filled with the web gradient data, sitting in .rodata. These arrays are used when building QGradient objects with a web gradient. No explicit mutex protection is necessary, since accesses will just read from the arrays. As benefits, this patch removes: * the binary json representation from QtGui's resources (~4KB compressed, ~50KB uncompressed) * the overhead of reading from the JSON for each used web gradient; * the startup costs of registering the webgradients in the resources; * all the overhead of mutex locking when building such gradients; * all the runtime memory allocations to load, parse and cache the web gradients (including the memory + CPU spike on first load due to the uncompression of the JSON data, as well as a couple of deep copies). Change-Id: If5c3d704430df76ce8faf55ee75ebd4639ba09c4 Reviewed-by: Tor Arne Vestbø Reviewed-by: Ulf Hermann Reviewed-by: Qt CI Bot Reviewed-by: Thiago Macieira Reviewed-by: Edward Welbourne --- src/gui/painting/WEBGRADIENTS_LICENSE.txt | 21 - src/gui/painting/painting.pri | 5 - src/gui/painting/qbrush.cpp | 55 +- src/gui/painting/qbrush.h | 24 +- src/gui/painting/qt_attribution.json | 14 - src/gui/painting/webgradients.binaryjson | Bin 50792 -> 0 bytes src/gui/painting/webgradients.cpp | 578 +++++++++++++++++++ src/gui/painting/webgradients.css | 909 ------------------------------ 8 files changed, 600 insertions(+), 1006 deletions(-) delete mode 100644 src/gui/painting/WEBGRADIENTS_LICENSE.txt delete mode 100644 src/gui/painting/webgradients.binaryjson create mode 100644 src/gui/painting/webgradients.cpp delete mode 100644 src/gui/painting/webgradients.css (limited to 'src/gui/painting') diff --git a/src/gui/painting/WEBGRADIENTS_LICENSE.txt b/src/gui/painting/WEBGRADIENTS_LICENSE.txt deleted file mode 100644 index 1a4d527a4d..0000000000 --- a/src/gui/painting/WEBGRADIENTS_LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 itmeo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index fcf6488edd..1a0f4f11e4 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -111,13 +111,8 @@ SOURCES += \ painting/qplatformbackingstore.cpp \ painting/qpathsimplifier.cpp -webgradients.files = painting/webgradients.binaryjson -webgradients.prefix = qgradient -webgradients.base = painting - RESOURCES += \ painting/qpdf.qrc \ - webgradients darwin { HEADERS += painting/qcoregraphics_p.h diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp index b23fb45952..83032bdc4f 100644 --- a/src/gui/painting/qbrush.cpp +++ b/src/gui/painting/qbrush.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -1347,6 +1348,8 @@ QGradient::QGradient() based on the gradients from https://webgradients.com/. */ +#include "webgradients.cpp" + /*! \fn QGradient::QGradient(QGradient::Preset preset) \since 5.12 @@ -1358,47 +1361,12 @@ QGradient::QGradient() to be applied to arbitrary object sizes. */ QGradient::QGradient(Preset preset) - : QGradient() -{ - static QHash cachedPresets; - static QMutex cacheMutex; - QMutexLocker locker(&cacheMutex); - if (cachedPresets.contains(preset)) { - const QGradient &cachedPreset = cachedPresets.value(preset); - m_type = cachedPreset.m_type; - m_data = cachedPreset.m_data; - m_stops = cachedPreset.m_stops; - m_spread = cachedPreset.m_spread; - dummy = cachedPreset.dummy; - } else { - static QJsonDocument jsonPresets = []() { - QFile webGradients(QLatin1String(":/qgradient/webgradients.binaryjson")); - webGradients.open(QFile::ReadOnly); - return QJsonDocument::fromBinaryData(webGradients.readAll()); - }(); - - const QJsonValue presetData = jsonPresets[preset - 1]; - if (!presetData.isObject()) - return; - - m_type = LinearGradient; - setCoordinateMode(ObjectMode); - setSpread(PadSpread); - - const QJsonValue start = presetData[QLatin1String("start")]; - const QJsonValue end = presetData[QLatin1String("end")]; - m_data.linear.x1 = start[QLatin1String("x")].toDouble(); - m_data.linear.y1 = start[QLatin1String("y")].toDouble(); - m_data.linear.x2 = end[QLatin1String("x")].toDouble(); - m_data.linear.y2 = end[QLatin1String("y")].toDouble(); - - for (const QJsonValue &stop : presetData[QLatin1String("stops")].toArray()) { - setColorAt(stop[QLatin1String("position")].toDouble(), - QColor(QRgb(stop[QLatin1String("color")].toInt()))); - } - - cachedPresets.insert(preset, *this); - } + : m_type(LinearGradient) + , m_spread(PadSpread) + , m_stops(qt_preset_gradient_stops(preset)) + , m_data(qt_preset_gradient_data[preset - 1]) + , dummy(qt_preset_gradient_dummy()) +{ } /*! @@ -1408,11 +1376,6 @@ QGradient::~QGradient() { } -QT_END_NAMESPACE -static void initGradientPresets() { Q_INIT_RESOURCE(qmake_webgradients); } -Q_CONSTRUCTOR_FUNCTION(initGradientPresets); -QT_BEGIN_NAMESPACE - /*! \enum QGradient::Type diff --git a/src/gui/painting/qbrush.h b/src/gui/painting/qbrush.h index 6a4ffab1c5..1d7199782f 100644 --- a/src/gui/painting/qbrush.h +++ b/src/gui/painting/qbrush.h @@ -400,16 +400,7 @@ public: inline bool operator!=(const QGradient &other) const { return !operator==(other); } -private: - friend class QLinearGradient; - friend class QRadialGradient; - friend class QConicalGradient; - friend class QBrush; - - Type m_type; - Spread m_spread; - QGradientStops m_stops; - union { + union QGradientData { struct { qreal x1, y1, x2, y2; } linear; @@ -419,7 +410,18 @@ private: struct { qreal cx, cy, angle; } conical; - } m_data; + }; + +private: + friend class QLinearGradient; + friend class QRadialGradient; + friend class QConicalGradient; + friend class QBrush; + + Type m_type; + Spread m_spread; + QGradientStops m_stops; + QGradientData m_data; void *dummy; // ### Qt 6: replace with actual content (CoordinateMode, InterpolationMode, ...) }; diff --git a/src/gui/painting/qt_attribution.json b/src/gui/painting/qt_attribution.json index 7b16e8c211..e2326a56c1 100644 --- a/src/gui/painting/qt_attribution.json +++ b/src/gui/painting/qt_attribution.json @@ -28,20 +28,6 @@ (C) Carsten Haitzler and various contributors. (C) Willem Monsuwe " }, - { - "Id": "webgradients", - "Name": "WebGradients", - "QDocModule": "qtgui", - "QtUsage": "Used in Qt GUI to provide presets for QGradient.", - "Files": "webgradients.css", - - "Description": "WebGradients is a free collection of 180 linear gradients.", - "Homepage": "https://webgradients.com/", - "License": "MIT License", - "LicenseId": "MIT", - "LicenseFile": "WEBGRADIENTS_LICENSE.txt", - "Copyright": "Copyright (c) 2017 itmeo" - }, { "Id": "xserverhelper", "Name": "X Server helper", diff --git a/src/gui/painting/webgradients.binaryjson b/src/gui/painting/webgradients.binaryjson deleted file mode 100644 index 75edd487be..0000000000 Binary files a/src/gui/painting/webgradients.binaryjson and /dev/null differ diff --git a/src/gui/painting/webgradients.cpp b/src/gui/painting/webgradients.cpp new file mode 100644 index 0000000000..b4d297450b --- /dev/null +++ b/src/gui/painting/webgradients.cpp @@ -0,0 +1,578 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// This file is auto-generated by gradientgen. DO NOT EDIT! + +static QArrayDataPointerRef qt_preset_gradient_stops(QGradient::Preset preset) +{ + Q_ASSERT(preset < QGradient::NumPresets); + switch (preset) { + case QGradient::WarmFlame: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 154, 158, 255)), QGradientStop(0.99, QColor(250, 208, 196, 255)), QGradientStop(1, QColor(250, 208, 196, 255))); + case QGradient::NightFade: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(161, 140, 209, 255)), QGradientStop(1, QColor(251, 194, 235, 255))); + case QGradient::SpringWarmth: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(250, 208, 196, 255)), QGradientStop(0.01, QColor(250, 208, 196, 255)), QGradientStop(1, QColor(255, 209, 255, 255))); + case QGradient::JuicyPeach: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 236, 210, 255)), QGradientStop(1, QColor(252, 182, 159, 255))); + case QGradient::YoungPassion: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 129, 119, 255)), QGradientStop(0, QColor(255, 134, 122, 255)), QGradientStop(0.21, QColor(255, 140, 127, 255)), QGradientStop(0.52, QColor(249, 145, 133, 255)), QGradientStop(0.78, QColor(207, 85, 108, 255)), QGradientStop(1, QColor(177, 42, 91, 255))); + case QGradient::LadyLips: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 154, 158, 255)), QGradientStop(0.99, QColor(254, 207, 239, 255)), QGradientStop(1, QColor(254, 207, 239, 255))); + case QGradient::SunnyMorning: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(246, 211, 101, 255)), QGradientStop(1, QColor(253, 160, 133, 255))); + case QGradient::RainyAshville: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(251, 194, 235, 255)), QGradientStop(1, QColor(166, 193, 238, 255))); + case QGradient::FrozenDreams: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(253, 203, 241, 255)), QGradientStop(0.01, QColor(253, 203, 241, 255)), QGradientStop(1, QColor(230, 222, 233, 255))); + case QGradient::WinterNeva: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(161, 196, 253, 255)), QGradientStop(1, QColor(194, 233, 251, 255))); + case QGradient::DustyGrass: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(212, 252, 121, 255)), QGradientStop(1, QColor(150, 230, 161, 255))); + case QGradient::TemptingAzure: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(132, 250, 176, 255)), QGradientStop(1, QColor(143, 211, 244, 255))); + case QGradient::HeavyRain: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(207, 217, 223, 255)), QGradientStop(1, QColor(226, 235, 240, 255))); + case QGradient::AmyCrisp: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(166, 192, 254, 255)), QGradientStop(1, QColor(246, 128, 132, 255))); + case QGradient::MeanFruit: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(252, 203, 144, 255)), QGradientStop(1, QColor(213, 126, 235, 255))); + case QGradient::DeepBlue: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(224, 195, 252, 255)), QGradientStop(1, QColor(142, 197, 252, 255))); + case QGradient::RipeMalinka: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(240, 147, 251, 255)), QGradientStop(1, QColor(245, 87, 108, 255))); + case QGradient::CloudyKnoxville: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(253, 251, 251, 255)), QGradientStop(1, QColor(235, 237, 238, 255))); + case QGradient::MalibuBeach: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(79, 172, 254, 255)), QGradientStop(1, QColor(0, 242, 254, 255))); + case QGradient::NewLife: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(67, 233, 123, 255)), QGradientStop(1, QColor(56, 249, 215, 255))); + case QGradient::TrueSunset: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(250, 112, 154, 255)), QGradientStop(1, QColor(254, 225, 64, 255))); + case QGradient::MorpheusDen: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(48, 207, 208, 255)), QGradientStop(1, QColor(51, 8, 103, 255))); + case QGradient::RareWind: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(168, 237, 234, 255)), QGradientStop(1, QColor(254, 214, 227, 255))); + case QGradient::NearMoon: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(94, 231, 223, 255)), QGradientStop(1, QColor(180, 144, 202, 255))); + case QGradient::WildApple: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(210, 153, 194, 255)), QGradientStop(1, QColor(254, 249, 215, 255))); + case QGradient::SaintPetersburg: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(245, 247, 250, 255)), QGradientStop(1, QColor(195, 207, 226, 255))); + case QGradient::PlumPlate: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(102, 126, 234, 255)), QGradientStop(1, QColor(118, 75, 162, 255))); + case QGradient::EverlastingSky: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(253, 252, 251, 255)), QGradientStop(1, QColor(226, 209, 195, 255))); + case QGradient::HappyFisher: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(137, 247, 254, 255)), QGradientStop(1, QColor(102, 166, 255, 255))); + case QGradient::Blessing: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(253, 219, 146, 255)), QGradientStop(1, QColor(209, 253, 255, 255))); + case QGradient::SharpeyeEagle: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(152, 144, 227, 255)), QGradientStop(1, QColor(177, 244, 207, 255))); + case QGradient::LadogaBottom: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(235, 192, 253, 255)), QGradientStop(1, QColor(217, 222, 216, 255))); + case QGradient::LemonGate: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(150, 251, 196, 255)), QGradientStop(1, QColor(249, 245, 134, 255))); + case QGradient::ItmeoBranding: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(42, 245, 152, 255)), QGradientStop(1, QColor(0, 158, 253, 255))); + case QGradient::ZeusMiracle: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(205, 156, 242, 255)), QGradientStop(1, QColor(246, 243, 255, 255))); + case QGradient::OldHat: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(228, 175, 203, 255)), QGradientStop(0, QColor(184, 203, 184, 255)), QGradientStop(0, QColor(184, 203, 184, 255)), QGradientStop(0.3, QColor(226, 197, 139, 255)), QGradientStop(0.64, QColor(194, 206, 156, 255)), QGradientStop(1, QColor(126, 219, 220, 255))); + case QGradient::StarWine: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(184, 203, 184, 255)), QGradientStop(0, QColor(184, 203, 184, 255)), QGradientStop(0, QColor(180, 101, 218, 255)), QGradientStop(0.33, QColor(207, 108, 201, 255)), QGradientStop(0.66, QColor(238, 96, 156, 255)), QGradientStop(1, QColor(238, 96, 156, 255))); + case QGradient::HappyAcid: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(55, 236, 186, 255)), QGradientStop(1, QColor(114, 175, 211, 255))); + case QGradient::AwesomePine: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(235, 187, 167, 255)), QGradientStop(1, QColor(207, 199, 248, 255))); + case QGradient::NewYork: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 241, 235, 255)), QGradientStop(1, QColor(172, 224, 249, 255))); + case QGradient::ShyRainbow: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(238, 162, 162, 255)), QGradientStop(0.19, QColor(187, 193, 191, 255)), QGradientStop(0.42, QColor(87, 198, 225, 255)), QGradientStop(0.79, QColor(180, 159, 218, 255)), QGradientStop(1, QColor(122, 197, 216, 255))); + case QGradient::MixedHopes: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(196, 113, 245, 255)), QGradientStop(1, QColor(250, 113, 205, 255))); + case QGradient::FlyHigh: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(72, 198, 239, 255)), QGradientStop(1, QColor(111, 134, 214, 255))); + case QGradient::StrongBliss: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(247, 140, 160, 255)), QGradientStop(0.19, QColor(249, 116, 143, 255)), QGradientStop(0.6, QColor(253, 134, 140, 255)), QGradientStop(1, QColor(254, 154, 139, 255))); + case QGradient::FreshMilk: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(254, 173, 166, 255)), QGradientStop(1, QColor(245, 239, 239, 255))); + case QGradient::SnowAgain: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(230, 233, 240, 255)), QGradientStop(1, QColor(238, 241, 245, 255))); + case QGradient::FebruaryInk: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(172, 203, 238, 255)), QGradientStop(1, QColor(231, 240, 253, 255))); + case QGradient::KindSteel: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(233, 222, 250, 255)), QGradientStop(1, QColor(251, 252, 219, 255))); + case QGradient::SoftGrass: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(193, 223, 196, 255)), QGradientStop(1, QColor(222, 236, 221, 255))); + case QGradient::GrownEarly: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(11, 163, 96, 255)), QGradientStop(1, QColor(60, 186, 146, 255))); + case QGradient::SharpBlues: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(0, 198, 251, 255)), QGradientStop(1, QColor(0, 91, 234, 255))); + case QGradient::ShadyWater: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(116, 235, 213, 255)), QGradientStop(1, QColor(159, 172, 230, 255))); + case QGradient::DirtyBeauty: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(106, 133, 182, 255)), QGradientStop(1, QColor(186, 200, 224, 255))); + case QGradient::GreatWhale: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(163, 189, 237, 255)), QGradientStop(1, QColor(105, 145, 199, 255))); + case QGradient::TeenNotebook: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(151, 149, 240, 255)), QGradientStop(1, QColor(251, 200, 212, 255))); + case QGradient::PoliteRumors: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(167, 166, 203, 255)), QGradientStop(0.52, QColor(137, 137, 186, 255)), QGradientStop(1, QColor(137, 137, 186, 255))); + case QGradient::SweetPeriod: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(63, 81, 177, 255)), QGradientStop(0.13, QColor(90, 85, 174, 255)), QGradientStop(0.25, QColor(123, 95, 172, 255)), QGradientStop(0.38, QColor(143, 106, 174, 255)), QGradientStop(0.5, QColor(168, 106, 164, 255)), QGradientStop(0.62, QColor(204, 107, 142, 255)), QGradientStop(0.75, QColor(241, 130, 113, 255)), QGradientStop(0.87, QColor(243, 164, 105, 255)), QGradientStop(1, QColor(247, 201, 120, 255))); + case QGradient::WideMatrix: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(252, 197, 228, 255)), QGradientStop(0.15, QColor(253, 163, 75, 255)), QGradientStop(0.35, QColor(255, 120, 130, 255)), QGradientStop(0.52, QColor(200, 105, 158, 255)), QGradientStop(0.71, QColor(112, 70, 170, 255)), QGradientStop(0.87, QColor(12, 29, 184, 255)), QGradientStop(1, QColor(2, 15, 117, 255))); + case QGradient::SoftCherish: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(219, 220, 215, 255)), QGradientStop(0.24, QColor(221, 220, 215, 255)), QGradientStop(0.3, QColor(226, 201, 204, 255)), QGradientStop(0.46, QColor(231, 98, 125, 255)), QGradientStop(0.59, QColor(184, 35, 90, 255)), QGradientStop(0.71, QColor(128, 19, 87, 255)), QGradientStop(0.84, QColor(61, 22, 53, 255)), QGradientStop(1, QColor(28, 26, 39, 255))); + case QGradient::RedSalvation: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(244, 59, 71, 255)), QGradientStop(1, QColor(69, 58, 148, 255))); + case QGradient::BurningSpring: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(79, 181, 118, 255)), QGradientStop(0.3, QColor(68, 196, 137, 255)), QGradientStop(0.46, QColor(40, 169, 174, 255)), QGradientStop(0.59, QColor(40, 162, 183, 255)), QGradientStop(0.71, QColor(76, 119, 136, 255)), QGradientStop(0.86, QColor(108, 79, 99, 255)), QGradientStop(1, QColor(67, 44, 57, 255))); + case QGradient::NightParty: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(2, 80, 197, 255)), QGradientStop(1, QColor(212, 63, 141, 255))); + case QGradient::SkyGlider: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(136, 211, 206, 255)), QGradientStop(1, QColor(110, 69, 226, 255))); + case QGradient::HeavenPeach: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(217, 175, 217, 255)), QGradientStop(1, QColor(151, 217, 225, 255))); + case QGradient::PurpleDivision: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(112, 40, 228, 255)), QGradientStop(1, QColor(229, 178, 202, 255))); + case QGradient::AquaSplash: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(19, 84, 122, 255)), QGradientStop(1, QColor(128, 208, 199, 255))); + case QGradient::SpikyNaga: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(80, 82, 133, 255)), QGradientStop(0.12, QColor(88, 94, 146, 255)), QGradientStop(0.25, QColor(101, 104, 159, 255)), QGradientStop(0.37, QColor(116, 116, 176, 255)), QGradientStop(0.5, QColor(126, 126, 187, 255)), QGradientStop(0.62, QColor(131, 137, 199, 255)), QGradientStop(0.75, QColor(151, 149, 212, 255)), QGradientStop(0.87, QColor(162, 161, 220, 255)), QGradientStop(1, QColor(181, 174, 228, 255))); + case QGradient::LoveKiss: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 8, 68, 255)), QGradientStop(1, QColor(255, 177, 153, 255))); + case QGradient::CleanMirror: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(147, 165, 207, 255)), QGradientStop(1, QColor(228, 239, 233, 255))); + case QGradient::PremiumDark: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(67, 67, 67, 255)), QGradientStop(1, QColor(0, 0, 0, 255))); + case QGradient::ColdEvening: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(12, 52, 131, 255)), QGradientStop(1, QColor(162, 182, 223, 255)), QGradientStop(1, QColor(107, 140, 206, 255)), QGradientStop(1, QColor(162, 182, 223, 255))); + case QGradient::CochitiLake: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(147, 165, 207, 255)), QGradientStop(1, QColor(228, 239, 233, 255))); + case QGradient::SummerGames: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(146, 254, 157, 255)), QGradientStop(1, QColor(0, 201, 255, 255))); + case QGradient::PassionateBed: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 117, 140, 255)), QGradientStop(1, QColor(255, 126, 179, 255))); + case QGradient::MountainRock: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(134, 143, 150, 255)), QGradientStop(1, QColor(89, 97, 100, 255))); + case QGradient::DesertHump: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(199, 144, 129, 255)), QGradientStop(1, QColor(223, 165, 121, 255))); + case QGradient::JungleDay: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(139, 170, 170, 255)), QGradientStop(1, QColor(174, 139, 156, 255))); + case QGradient::PhoenixStart: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(248, 54, 0, 255)), QGradientStop(1, QColor(249, 212, 35, 255))); + case QGradient::OctoberSilence: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(183, 33, 255, 255)), QGradientStop(1, QColor(33, 212, 253, 255))); + case QGradient::FarawayRiver: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(110, 69, 226, 255)), QGradientStop(1, QColor(136, 211, 206, 255))); + case QGradient::AlchemistLab: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(213, 88, 200, 255)), QGradientStop(1, QColor(36, 210, 146, 255))); + case QGradient::OverSun: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(171, 236, 214, 255)), QGradientStop(1, QColor(251, 237, 150, 255))); + case QGradient::PremiumWhite: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(213, 212, 208, 255)), QGradientStop(0.01, QColor(213, 212, 208, 255)), QGradientStop(0.31, QColor(238, 238, 236, 255)), QGradientStop(0.75, QColor(239, 238, 236, 255)), QGradientStop(1, QColor(233, 233, 231, 255))); + case QGradient::MarsParty: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(95, 114, 189, 255)), QGradientStop(1, QColor(155, 35, 234, 255))); + case QGradient::EternalConstance: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(9, 32, 63, 255)), QGradientStop(1, QColor(83, 120, 149, 255))); + case QGradient::JapanBlush: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(221, 214, 243, 255)), QGradientStop(1, QColor(250, 172, 168, 255)), QGradientStop(1, QColor(250, 172, 168, 255))); + case QGradient::SmilingRain: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(220, 176, 237, 255)), QGradientStop(1, QColor(153, 201, 156, 255))); + case QGradient::CloudyApple: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(243, 231, 233, 255)), QGradientStop(0.99, QColor(227, 238, 255, 255)), QGradientStop(1, QColor(227, 238, 255, 255))); + case QGradient::BigMango: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(199, 29, 111, 255)), QGradientStop(1, QColor(208, 150, 147, 255))); + case QGradient::HealthyWater: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(150, 222, 218, 255)), QGradientStop(1, QColor(80, 201, 195, 255))); + case QGradient::AmourAmour: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(247, 112, 98, 255)), QGradientStop(1, QColor(254, 81, 150, 255))); + case QGradient::RiskyConcrete: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(196, 197, 199, 255)), QGradientStop(0.52, QColor(220, 221, 223, 255)), QGradientStop(1, QColor(235, 235, 235, 255))); + case QGradient::StrongStick: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(168, 202, 186, 255)), QGradientStop(1, QColor(93, 65, 87, 255))); + case QGradient::ViciousStance: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(41, 50, 60, 255)), QGradientStop(1, QColor(72, 85, 99, 255))); + case QGradient::PaloAlto: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(22, 160, 133, 255)), QGradientStop(1, QColor(244, 208, 63, 255))); + case QGradient::HappyMemories: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 88, 88, 255)), QGradientStop(1, QColor(240, 152, 25, 255))); + case QGradient::MidnightBloom: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(43, 88, 118, 255)), QGradientStop(1, QColor(78, 67, 118, 255))); + case QGradient::Crystalline: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(0, 205, 172, 255)), QGradientStop(1, QColor(141, 218, 213, 255))); + case QGradient::PartyBliss: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(68, 129, 235, 255)), QGradientStop(1, QColor(4, 190, 254, 255))); + case QGradient::ConfidentCloud: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(218, 212, 236, 255)), QGradientStop(0.01, QColor(218, 212, 236, 255)), QGradientStop(1, QColor(243, 231, 233, 255))); + case QGradient::LeCocktail: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(135, 77, 162, 255)), QGradientStop(1, QColor(196, 58, 48, 255))); + case QGradient::RiverCity: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(68, 129, 235, 255)), QGradientStop(1, QColor(4, 190, 254, 255))); + case QGradient::FrozenBerry: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(232, 25, 139, 255)), QGradientStop(1, QColor(199, 234, 253, 255))); + case QGradient::ChildCare: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(247, 148, 164, 255)), QGradientStop(1, QColor(253, 214, 189, 255))); + case QGradient::FlyingLemon: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(100, 179, 244, 255)), QGradientStop(1, QColor(194, 229, 156, 255))); + case QGradient::NewRetrowave: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(59, 65, 197, 255)), QGradientStop(0.49, QColor(169, 129, 187, 255)), QGradientStop(1, QColor(255, 200, 169, 255))); + case QGradient::HiddenJaguar: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(15, 216, 80, 255)), QGradientStop(1, QColor(249, 240, 71, 255))); + case QGradient::AboveTheSky: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(211, 211, 211, 255)), QGradientStop(0.01, QColor(211, 211, 211, 255)), QGradientStop(0.26, QColor(224, 224, 224, 255)), QGradientStop(0.48, QColor(239, 239, 239, 255)), QGradientStop(0.75, QColor(217, 217, 217, 255)), QGradientStop(1, QColor(188, 188, 188, 255))); + case QGradient::Nega: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(238, 156, 167, 255)), QGradientStop(1, QColor(255, 221, 225, 255))); + case QGradient::DenseWater: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(58, 181, 176, 255)), QGradientStop(0.31, QColor(61, 153, 190, 255)), QGradientStop(1, QColor(86, 49, 122, 255))); + case QGradient::Seashore: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(32, 156, 255, 255)), QGradientStop(1, QColor(104, 224, 207, 255))); + case QGradient::MarbleWall: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(189, 194, 232, 255)), QGradientStop(0.01, QColor(189, 194, 232, 255)), QGradientStop(1, QColor(230, 222, 233, 255))); + case QGradient::CheerfulCaramel: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(230, 185, 128, 255)), QGradientStop(1, QColor(234, 205, 163, 255))); + case QGradient::NightSky: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(30, 60, 114, 255)), QGradientStop(0.01, QColor(30, 60, 114, 255)), QGradientStop(1, QColor(42, 82, 152, 255))); + case QGradient::MagicLake: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(213, 222, 231, 255)), QGradientStop(0, QColor(255, 175, 189, 255)), QGradientStop(1, QColor(201, 255, 191, 255))); + case QGradient::YoungGrass: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(155, 225, 93, 255)), QGradientStop(1, QColor(0, 227, 174, 255))); + case QGradient::ColorfulPeach: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(237, 110, 160, 255)), QGradientStop(1, QColor(236, 140, 105, 255))); + case QGradient::GentleCare: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 195, 160, 255)), QGradientStop(1, QColor(255, 175, 189, 255))); + case QGradient::PlumBath: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(204, 32, 142, 255)), QGradientStop(1, QColor(103, 19, 210, 255))); + case QGradient::HappyUnicorn: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(179, 255, 171, 255)), QGradientStop(1, QColor(18, 255, 247, 255))); + case QGradient::AfricanField: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(101, 189, 96, 255)), QGradientStop(0.25, QColor(90, 193, 168, 255)), QGradientStop(0.5, QColor(62, 198, 237, 255)), QGradientStop(0.75, QColor(183, 221, 183, 255)), QGradientStop(1, QColor(254, 243, 129, 255))); + case QGradient::SolidStone: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(36, 57, 73, 255)), QGradientStop(1, QColor(81, 127, 164, 255))); + case QGradient::OrangeJuice: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(252, 96, 118, 255)), QGradientStop(1, QColor(255, 154, 68, 255))); + case QGradient::GlassWater: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(223, 233, 243, 255)), QGradientStop(1, QColor(255, 255, 255, 255))); + case QGradient::NorthMiracle: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(0, 219, 222, 255)), QGradientStop(1, QColor(252, 0, 255, 255))); + case QGradient::FruitBlend: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(249, 212, 35, 255)), QGradientStop(1, QColor(255, 78, 80, 255))); + case QGradient::MillenniumPine: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(80, 204, 127, 255)), QGradientStop(1, QColor(245, 209, 0, 255))); + case QGradient::HighFlight: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(10, 207, 254, 255)), QGradientStop(1, QColor(73, 90, 255, 255))); + case QGradient::MoleHall: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(97, 97, 97, 255)), QGradientStop(1, QColor(155, 197, 195, 255))); + case QGradient::SpaceShift: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(61, 51, 147, 255)), QGradientStop(0.37, QColor(43, 118, 185, 255)), QGradientStop(0.65, QColor(44, 172, 209, 255)), QGradientStop(1, QColor(53, 235, 147, 255))); + case QGradient::ForestInei: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(223, 137, 181, 255)), QGradientStop(1, QColor(191, 217, 254, 255))); + case QGradient::RoyalGarden: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(237, 110, 160, 255)), QGradientStop(1, QColor(236, 140, 105, 255))); + case QGradient::RichMetal: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(215, 210, 204, 255)), QGradientStop(1, QColor(48, 67, 82, 255))); + case QGradient::JuicyCake: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(225, 79, 173, 255)), QGradientStop(1, QColor(249, 212, 35, 255))); + case QGradient::SmartIndigo: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(178, 36, 239, 255)), QGradientStop(1, QColor(117, 121, 255, 255))); + case QGradient::SandStrike: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(193, 193, 97, 255)), QGradientStop(0, QColor(193, 193, 97, 255)), QGradientStop(1, QColor(212, 212, 177, 255))); + case QGradient::NorseBeauty: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(236, 119, 171, 255)), QGradientStop(1, QColor(120, 115, 245, 255))); + case QGradient::AquaGuidance: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(0, 122, 223, 255)), QGradientStop(1, QColor(0, 236, 188, 255))); + case QGradient::SunVeggie: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(32, 226, 215, 255)), QGradientStop(1, QColor(249, 254, 165, 255))); + case QGradient::SeaLord: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(44, 216, 213, 255)), QGradientStop(0.56, QColor(197, 193, 255, 255)), QGradientStop(1, QColor(255, 186, 195, 255))); + case QGradient::BlackSea: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(44, 216, 213, 255)), QGradientStop(0.48, QColor(107, 141, 214, 255)), QGradientStop(1, QColor(142, 55, 215, 255))); + case QGradient::GrassShampoo: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(223, 255, 205, 255)), QGradientStop(0.48, QColor(144, 249, 196, 255)), QGradientStop(1, QColor(57, 243, 187, 255))); + case QGradient::LandingAircraft: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(93, 159, 255, 255)), QGradientStop(0.48, QColor(184, 220, 255, 255)), QGradientStop(1, QColor(107, 187, 255, 255))); + case QGradient::WitchDance: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(168, 191, 255, 255)), QGradientStop(1, QColor(136, 77, 128, 255))); + case QGradient::SleeplessNight: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(82, 113, 196, 255)), QGradientStop(0.48, QColor(177, 159, 255, 255)), QGradientStop(1, QColor(236, 161, 254, 255))); + case QGradient::AngelCare: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 226, 159, 255)), QGradientStop(0.48, QColor(255, 169, 159, 255)), QGradientStop(1, QColor(255, 113, 154, 255))); + case QGradient::CrystalRiver: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(34, 225, 255, 255)), QGradientStop(0.48, QColor(29, 143, 225, 255)), QGradientStop(1, QColor(98, 94, 177, 255))); + case QGradient::SoftLipstick: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(182, 206, 232, 255)), QGradientStop(1, QColor(245, 120, 220, 255))); + case QGradient::SaltMountain: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 254, 255, 255)), QGradientStop(1, QColor(215, 255, 254, 255))); + case QGradient::PerfectWhite: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(227, 253, 245, 255)), QGradientStop(1, QColor(255, 230, 250, 255))); + case QGradient::FreshOasis: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(125, 226, 252, 255)), QGradientStop(1, QColor(185, 182, 229, 255))); + case QGradient::StrictNovember: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(203, 186, 204, 255)), QGradientStop(1, QColor(37, 128, 179, 255))); + case QGradient::MorningSalad: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(183, 248, 219, 255)), QGradientStop(1, QColor(80, 167, 194, 255))); + case QGradient::DeepRelief: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(112, 133, 182, 255)), QGradientStop(0.5, QColor(135, 167, 217, 255)), QGradientStop(1, QColor(222, 243, 248, 255))); + case QGradient::SeaStrike: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(119, 255, 210, 255)), QGradientStop(0.48, QColor(98, 151, 219, 255)), QGradientStop(1, QColor(30, 236, 255, 255))); + case QGradient::NightCall: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(172, 50, 228, 255)), QGradientStop(0.48, QColor(121, 24, 242, 255)), QGradientStop(1, QColor(72, 1, 255, 255))); + case QGradient::SupremeSky: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(212, 255, 236, 255)), QGradientStop(0.48, QColor(87, 242, 204, 255)), QGradientStop(1, QColor(69, 150, 251, 255))); + case QGradient::LightBlue: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(158, 251, 211, 255)), QGradientStop(0.48, QColor(87, 233, 242, 255)), QGradientStop(1, QColor(69, 212, 251, 255))); + case QGradient::MindCrawl: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(71, 59, 123, 255)), QGradientStop(0.51, QColor(53, 132, 167, 255)), QGradientStop(1, QColor(48, 210, 190, 255))); + case QGradient::LilyMeadow: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(101, 55, 155, 255)), QGradientStop(0.53, QColor(136, 106, 234, 255)), QGradientStop(1, QColor(100, 87, 198, 255))); + case QGradient::SugarLollipop: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(164, 69, 178, 255)), QGradientStop(0.52, QColor(212, 24, 114, 255)), QGradientStop(1, QColor(255, 0, 102, 255))); + case QGradient::SweetDessert: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(119, 66, 178, 255)), QGradientStop(0.52, QColor(241, 128, 255, 255)), QGradientStop(1, QColor(253, 139, 217, 255))); + case QGradient::MagicRay: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 60, 172, 255)), QGradientStop(0.52, QColor(86, 43, 124, 255)), QGradientStop(1, QColor(43, 134, 197, 255))); + case QGradient::TeenParty: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 5, 124, 255)), QGradientStop(0.5, QColor(141, 11, 147, 255)), QGradientStop(1, QColor(50, 21, 117, 255))); + case QGradient::FrozenHeat: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(255, 5, 124, 255)), QGradientStop(0.48, QColor(124, 100, 213, 255)), QGradientStop(1, QColor(76, 195, 255, 255))); + case QGradient::GagarinView: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(105, 234, 203, 255)), QGradientStop(0.48, QColor(234, 204, 248, 255)), QGradientStop(1, QColor(102, 84, 241, 255))); + case QGradient::FabledSunset: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(35, 21, 87, 255)), QGradientStop(0.29, QColor(68, 16, 122, 255)), QGradientStop(0.67, QColor(255, 19, 97, 255)), QGradientStop(1, QColor(255, 248, 0, 255))); + case QGradient::PerfectBlue: + return Q_ARRAY_LITERAL(QGradientStop, QGradientStop(0, QColor(61, 78, 129, 255)), QGradientStop(0.48, QColor(87, 83, 201, 255)), QGradientStop(1, QColor(110, 127, 243, 255))); + case QGradient::NumPresets: + Q_UNREACHABLE(); + } + Q_UNREACHABLE(); + return {}; +} + +static Q_CONSTEXPR QGradient::QGradientData qt_preset_gradient_data[] = { + { { 0, 1, 1, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { 0.5, 1, 0.5, 0 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 0, 0 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { -0.0915064, 0.158494, 1.09151, 0.841506 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 0, 0.5, 1 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0, 0, 0 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.341506, 1.09151, 0.658494, -0.0915064 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 0, 0 } }, + { { 0, 1, 1, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 1, 1, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 1, 1, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { -0.0915064, 0.841506, 1.09151, 0.158494 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { -0.0915064, 0.841506, 1.09151, 0.158494 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { -0.0915064, 0.841506, 1.09151, 0.158494 } }, + { { 1.09151, 0.841506, -0.0915064, 0.158494 } }, + { { 1.09151, 0.841506, -0.0915064, 0.158494 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 1, 1, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 0, 0 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { -0.0915064, 0.841506, 1.09151, 0.158494 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 1, 1, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 0, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 0, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.719186, 1.10221, 0.280814, -0.102208 } }, + { { 0, 0, 0, 0 } }, + { { -0.0915064, 0.841506, 1.09151, 0.158494 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0, 0.5, 1, 0.5 } }, + { { 0.5, 1, 0.5, 0 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, + { { 0, 0, 1, 1 } }, +}; + +static void *qt_preset_gradient_dummy() +{ + union {void *p; uint i;}; + p = 0; + i |= uint(QGradient::ObjectMode); + return p; +} diff --git a/src/gui/painting/webgradients.css b/src/gui/painting/webgradients.css deleted file mode 100644 index 870866bb46..0000000000 --- a/src/gui/painting/webgradients.css +++ /dev/null @@ -1,909 +0,0 @@ -/*001 Warm Flame*/ -.warm_flame{ - background-image: linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%); -} - -/*002 Night Fade*/ -.night_fade{ - background-image: linear-gradient(to top, #a18cd1 0%, #fbc2eb 100%); -} - -/*003 Spring Warmth*/ -.spring_warmth{ - background-image: linear-gradient(to top, #fad0c4 0%, #fad0c4 1%, #ffd1ff 100%); -} - -/*004 Juicy Peach*/ -.juicy_peach{ - background-image: linear-gradient(to right, #ffecd2 0%, #fcb69f 100%); -} - -/*005 Young Passion*/ -.young_passion{ - background-image: linear-gradient(to right, #ff8177 0%, #ff867a 0%, #ff8c7f 21%, #f99185 52%, #cf556c 78%, #b12a5b 100%); -} - -/*006 Lady Lips*/ -.lady_lips{ - background-image: linear-gradient(to top, #ff9a9e 0%, #fecfef 99%, #fecfef 100%); -} - -/*007 Sunny Morning*/ -.sunny_morning{ - background-image: linear-gradient(120deg, #f6d365 0%, #fda085 100%); -} - -/*008 Rainy Ashville*/ -.rainy_ashville{ - background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%); -} - -/*009 Frozen Dreams*/ -.frozen_dreams{ - background-image: linear-gradient(to top, #fdcbf1 0%, #fdcbf1 1%, #e6dee9 100%); -} - -/*010 Winter Neva*/ -.winter_neva{ - background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%); -} - -/*011 Dusty Grass*/ -.dusty_grass{ - background-image: linear-gradient(120deg, #d4fc79 0%, #96e6a1 100%); -} - -/*012 Tempting Azure*/ -.tempting_azure{ - background-image: linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%); -} - -/*013 Heavy Rain*/ -.heavy_rain{ - background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); -} - -/*014 Amy Crisp*/ -.amy_crisp{ - background-image: linear-gradient(120deg, #a6c0fe 0%, #f68084 100%); -} - -/*015 Mean Fruit*/ -.mean_fruit{ - background-image: linear-gradient(120deg, #fccb90 0%, #d57eeb 100%); -} - -/*016 Deep Blue*/ -.deep_blue{ - background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%); -} - -/*017 Ripe Malinka*/ -.ripe_malinka{ - background-image: linear-gradient(120deg, #f093fb 0%, #f5576c 100%); -} - -/*018 Cloudy Knoxville*/ -.cloudy_knoxville{ - background-image: linear-gradient(120deg, #fdfbfb 0%, #ebedee 100%); -} - -/*019 Malibu Beach*/ -.malibu_beach{ - background-image: linear-gradient(to right, #4facfe 0%, #00f2fe 100%); -} - -/*020 New Life*/ -.new_life{ - background-image: linear-gradient(to right, #43e97b 0%, #38f9d7 100%); -} - -/*021 True Sunset*/ -.true_sunset{ - background-image: linear-gradient(to right, #fa709a 0%, #fee140 100%); -} - -/*022 Morpheus Den*/ -.morpheus_den{ - background-image: linear-gradient(to top, #30cfd0 0%, #330867 100%); -} - -/*023 Rare Wind*/ -.rare_wind{ - background-image: linear-gradient(to top, #a8edea 0%, #fed6e3 100%); -} - -/*024 Near Moon*/ -.near_moon{ - background-image: linear-gradient(to top, #5ee7df 0%, #b490ca 100%); -} - -/*025 Wild Apple*/ -.wild_apple{ - background-image: linear-gradient(to top, #d299c2 0%, #fef9d7 100%); -} - -/*026 Saint Petersburg*/ -.saint_petersburg{ - background-image: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); -} - -/*027 Arielle's Smile*/ -.arielles_smile{ - background-image: radial-gradient(circle 248px at center, #16d9e3 0%, #30c7ec 47%, #46aef7 100%); -} - -/*028 Plum Plate*/ -.plum_plate{ - background-image: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -} - -/*029 Everlasting Sky*/ -.everlasting_sky{ - background-image: linear-gradient(135deg, #fdfcfb 0%, #e2d1c3 100%); -} - -/*030 Happy Fisher*/ -.happy_fisher{ - background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%); -} - -/*031 Blessing*/ -.blessing{ - background-image: linear-gradient(to top, #fddb92 0%, #d1fdff 100%); -} - -/*032 Sharpeye Eagle*/ -.sharpeye_eagle{ - background-image: linear-gradient(to top, #9890e3 0%, #b1f4cf 100%); -} - -/*033 Ladoga Bottom*/ -.ladoga_bottom{ - background-image: linear-gradient(to top, #ebc0fd 0%, #d9ded8 100%); -} - -/*034 Lemon Gate*/ -.lemon_gate{ - background-image: linear-gradient(to top, #96fbc4 0%, #f9f586 100%); -} - -/*035 Itmeo Branding*/ -.itmeo_branding{ - background-image: linear-gradient(180deg, #2af598 0%, #009efd 100%); -} - -/*036 Zeus Miracle*/ -.zeus_miracle{ - background-image: linear-gradient(to top, #cd9cf2 0%, #f6f3ff 100%); -} - -/*037 Old Hat*/ -.old_hat{ - background-image: linear-gradient(to right, #e4afcb 0%, #b8cbb8 0%, #b8cbb8 0%, #e2c58b 30%, #c2ce9c 64%, #7edbdc 100%); -} - -/*038 Star Wine*/ -.star_wine{ - background-image: linear-gradient(to right, #b8cbb8 0%, #b8cbb8 0%, #b465da 0%, #cf6cc9 33%, #ee609c 66%, #ee609c 100%); -} - -/*039 Deep Blue*/ -.deep_blue{ - background-image: linear-gradient(to right, #6a11cb 0%, #2575fc 100%); -} - -/*040 Coup de Grace*/ -.coup_de_grace{ - background: #DCD9D4 linear-gradient(to bottom, rgba(255, 255, 255, 0.50) 0%, rgba(0, 0, 0, 0.50) 100%), radial-gradient(at 50% 0%, rgba(255, 255, 255, 0.10) 0%, rgba(0, 0, 0, 0.50) 50%); - background-blend-mode: soft-light,screen; -} - -/*041 Happy Acid*/ -.happy_acid{ - background-image: linear-gradient(to top, #37ecba 0%, #72afd3 100%); -} - -/*042 Awesome Pine*/ -.awesome_pine{ - background-image: linear-gradient(to top, #ebbba7 0%, #cfc7f8 100%); -} - -/*043 New York*/ -.new_york{ - background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%); -} - -/*044 Shy Rainbow*/ -.shy_rainbow{ - background-image: linear-gradient(to right, #eea2a2 0%, #bbc1bf 19%, #57c6e1 42%, #b49fda 79%, #7ac5d8 100%); -} - -/*045 Loon Crest*/ -.loon_crest{ - background: linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(0,0,0,0.15) 100%), radial-gradient(at top center, rgba(255,255,255,0.40) 0%, rgba(0,0,0,0.40) 120%) #989898; - background-blend-mode: multiply,multiply; -} - -/*046 Mixed Hopes*/ -.mixed_hopes{ - background-image: linear-gradient(to top, #c471f5 0%, #fa71cd 100%); -} - -/*047 Fly High*/ -.fly_high{ - background-image: linear-gradient(to top, #48c6ef 0%, #6f86d6 100%); -} - -/*048 Strong Bliss*/ -.strong_bliss{ - background-image: linear-gradient(to right, #f78ca0 0%, #f9748f 19%, #fd868c 60%, #fe9a8b 100%); -} - -/*049 Fresh Milk*/ -.fresh_milk{ - background-image: linear-gradient(to top, #feada6 0%, #f5efef 100%); -} - -/*050 Snow Again*/ -.snow_again{ - background-image: linear-gradient(to top, #e6e9f0 0%, #eef1f5 100%); -} - -/*051 February Ink*/ -.february_ink{ - background-image: linear-gradient(to top, #accbee 0%, #e7f0fd 100%); -} - -/*052 Kind Steel*/ -.kind_steel{ - background-image: linear-gradient(-20deg, #e9defa 0%, #fbfcdb 100%); -} - -/*053 Soft Grass*/ -.soft_grass{ - background-image: linear-gradient(to top, #c1dfc4 0%, #deecdd 100%); -} - -/*054 Grown Early*/ -.grown_early{ - background-image: linear-gradient(to top, #0ba360 0%, #3cba92 100%); -} - -/*055 Sharp Blues*/ -.sharp_blues{ - background-image: linear-gradient(to top, #00c6fb 0%, #005bea 100%); -} - -/*056 Shady Water*/ -.shady_water{ - background-image: linear-gradient(to right, #74ebd5 0%, #9face6 100%); -} - -/*057 Dirty Beauty*/ -.dirty_beauty{ - background-image: linear-gradient(to top, #6a85b6 0%, #bac8e0 100%); -} - -/*058 Great Whale*/ -.great_whale{ - background-image: linear-gradient(to top, #a3bded 0%, #6991c7 100%); -} - -/*059 Teen Notebook*/ -.teen_notebook{ - background-image: linear-gradient(to top, #9795f0 0%, #fbc8d4 100%); -} - -/*060 Polite Rumors*/ -.polite_rumors{ - background-image: linear-gradient(to top, #a7a6cb 0%, #8989ba 52%, #8989ba 100%); -} - -/*061 Sweet Period*/ -.sweet_period{ - background-image: linear-gradient(to top, #3f51b1 0%, #5a55ae 13%, #7b5fac 25%, #8f6aae 38%, #a86aa4 50%, #cc6b8e 62%, #f18271 75%, #f3a469 87%, #f7c978 100%); -} - -/*062 Wide Matrix*/ -.wide_matrix{ - background-image: linear-gradient(to top, #fcc5e4 0%, #fda34b 15%, #ff7882 35%, #c8699e 52%, #7046aa 71%, #0c1db8 87%, #020f75 100%); -} - -/*063 Soft Cherish*/ -.soft_cherish{ - background-image: linear-gradient(to top, #dbdcd7 0%, #dddcd7 24%, #e2c9cc 30%, #e7627d 46%, #b8235a 59%, #801357 71%, #3d1635 84%, #1c1a27 100%); -} - -/*064 Red Salvation*/ -.red_salvation{ - background-image: linear-gradient(to top, #f43b47 0%, #453a94 100%); -} - -/*065 Burning Spring*/ -.burning_spring{ - background-image: linear-gradient(to top, #4fb576 0%, #44c489 30%, #28a9ae 46%, #28a2b7 59%, #4c7788 71%, #6c4f63 86%, #432c39 100%); -} - -/*066 Night Party*/ -.night_party{ - background-image: linear-gradient(to top, #0250c5 0%, #d43f8d 100%); -} - -/*067 Sky Glider*/ -.sky_glider{ - background-image: linear-gradient(to top, #88d3ce 0%, #6e45e2 100%); -} - -/*068 Heaven Peach*/ -.heaven_peach{ - background-image: linear-gradient(to top, #d9afd9 0%, #97d9e1 100%); -} - -/*069 Purple Division*/ -.purple_division{ - background-image: linear-gradient(to top, #7028e4 0%, #e5b2ca 100%); -} - -/*070 Aqua Splash*/ -.aqua_splash{ - background-image: linear-gradient(15deg, #13547a 0%, #80d0c7 100%); -} - -/*071 Above Clouds*/ -.above_clouds{ - background-image: linear-gradient(to left, #BDBBBE 0%, #9D9EA3 100%), radial-gradient(88% 271%, rgba(255, 255, 255, 0.25) 0%, rgba(254, 254, 254, 0.25) 1%, rgba(0, 0, 0, 0.25) 100%), radial-gradient(50% 100%, rgba(255, 255, 255, 0.30) 0%, rgba(0, 0, 0, 0.30) 100%); - background-blend-mode: normal, lighten, soft-light; -} - -/*072 Spiky Naga*/ -.spiky_naga{ - background-image: linear-gradient(to top, #505285 0%, #585e92 12%, #65689f 25%, #7474b0 37%, #7e7ebb 50%, #8389c7 62%, #9795d4 75%, #a2a1dc 87%, #b5aee4 100%); -} - -/*073 Love Kiss*/ -.love_kiss{ - background-image: linear-gradient(to top, #ff0844 0%, #ffb199 100%); -} - -/*074 Sharp Glass*/ -.sharp_glass{ - background: #C9CCD3 linear-gradient(-180deg, rgba(255, 255, 255, 0.50) 0%, rgba(0, 0, 0, 0.50) 100%); - background-blend-mode: lighten; -} - -/*075 Clean Mirror*/ -.clean_mirror{ - background-image: linear-gradient(45deg, #93a5cf 0%, #e4efe9 100%); -} - -/*076 Premium Dark*/ -.premium_dark{ - background-image: linear-gradient(to right, #434343 0%, black 100%); -} - -/*077 Cold Evening*/ -.cold_evening{ - background-image: linear-gradient(to top, #0c3483 0%, #a2b6df 100%, #6b8cce 100%, #a2b6df 100%); -} - -/*078 Cochiti Lake*/ -.cochiti_lake{ - background-image: linear-gradient(45deg, #93a5cf 0%, #e4efe9 100%); -} - -/*079 Summer Games*/ -.summer_games{ - background-image: linear-gradient(to right, #92fe9d 0%, #00c9ff 100%); -} - -/*080 Passionate Bed*/ -.passionate_bed{ - background-image: linear-gradient(to right, #ff758c 0%, #ff7eb3 100%); -} - -/*081 Mountain Rock*/ -.mountain_rock{ - background-image: linear-gradient(to right, #868f96 0%, #596164 100%); -} - -/*082 Desert Hump*/ -.desert_hump{ - background-image: linear-gradient(to top, #c79081 0%, #dfa579 100%); -} - -/*083 Jungle Day*/ -.jungle_day{ - background-image: linear-gradient(45deg, #8baaaa 0%, #ae8b9c 100%); -} - -/*084 Phoenix Start*/ -.phoenix_start{ - background-image: linear-gradient(to right, #f83600 0%, #f9d423 100%); -} - -/*085 October Silence*/ -.october_silence{ - background-image: linear-gradient(-20deg, #b721ff 0%, #21d4fd 100%); -} - -/*086 Faraway River*/ -.faraway_river{ - background-image: linear-gradient(-20deg, #6e45e2 0%, #88d3ce 100%); -} - -/*087 Alchemist Lab*/ -.alchemist_lab{ - background-image: linear-gradient(-20deg, #d558c8 0%, #24d292 100%); -} - -/*088 Over Sun*/ -.over_sun{ - background-image: linear-gradient(60deg, #abecd6 0%, #fbed96 100%); -} - -/*089 Premium White*/ -.premium_white{ - background-image: linear-gradient(to top, #d5d4d0 0%, #d5d4d0 1%, #eeeeec 31%, #efeeec 75%, #e9e9e7 100%); -} - -/*090 Mars Party*/ -.mars_party{ - background-image: linear-gradient(to top, #5f72bd 0%, #9b23ea 100%); -} - -/*091 Eternal Constance*/ -.eternal_constance{ - background-image: linear-gradient(to top, #09203f 0%, #537895 100%); -} - -/*092 Japan Blush*/ -.japan_blush{ - background-image: linear-gradient(-20deg, #ddd6f3 0%, #faaca8 100%, #faaca8 100%); -} - -/*093 Smiling Rain*/ -.smiling_rain{ - background-image: linear-gradient(-20deg, #dcb0ed 0%, #99c99c 100%); -} - -/*094 Cloudy Apple*/ -.cloudy_apple{ - background-image: linear-gradient(to top, #f3e7e9 0%, #e3eeff 99%, #e3eeff 100%); -} - -/*095 Big Mango*/ -.big_mango{ - background-image: linear-gradient(to top, #c71d6f 0%, #d09693 100%); -} - -/*096 Healthy Water*/ -.healthy_water{ - background-image: linear-gradient(60deg, #96deda 0%, #50c9c3 100%); -} - -/*097 Amour Amour*/ -.amour_amour{ - background-image: linear-gradient(to top, #f77062 0%, #fe5196 100%); -} - -/*098 Risky Concrete*/ -.risky_concrete{ - background-image: linear-gradient(to top, #c4c5c7 0%, #dcdddf 52%, #ebebeb 100%); -} - -/*099 Strong Stick*/ -.strong_stick{ - background-image: linear-gradient(to right, #a8caba 0%, #5d4157 100%); -} - -/*100 Vicious Stance*/ -.vicious_stance{ - background-image: linear-gradient(60deg, #29323c 0%, #485563 100%); -} - -/*101 Palo Alto*/ -.palo_alto{ - background-image: linear-gradient(-60deg, #16a085 0%, #f4d03f 100%); -} - -/*102 Happy Memories*/ -.happy_memories{ - background-image: linear-gradient(-60deg, #ff5858 0%, #f09819 100%); -} - -/*103 Midnight Bloom*/ -.midnight_bloom{ - background-image: linear-gradient(-20deg, #2b5876 0%, #4e4376 100%); -} - -/*104 Crystalline*/ -.crystalline{ - background-image: linear-gradient(-20deg, #00cdac 0%, #8ddad5 100%); -} - -/*105 Raccoon Back*/ -.raccoon_back{ - background: linear-gradient(-180deg, #BCC5CE 0%, #929EAD 98%), radial-gradient(at top left, rgba(255,255,255,0.30) 0%, rgba(0,0,0,0.30) 100%); - background-blend-mode: screen; -} - -/*106 Party Bliss*/ -.party_bliss{ - background-image: linear-gradient(to top, #4481eb 0%, #04befe 100%); -} - -/*107 Confident Cloud*/ -.confident_cloud{ - background-image: linear-gradient(to top, #dad4ec 0%, #dad4ec 1%, #f3e7e9 100%); -} - -/*108 Le Cocktail*/ -.le_cocktail{ - background-image: linear-gradient(45deg, #874da2 0%, #c43a30 100%); -} - -/*109 River City*/ -.river_city{ - background-image: linear-gradient(to top, #4481eb 0%, #04befe 100%); -} - -/*110 Frozen Berry*/ -.frozen_berry{ - background-image: linear-gradient(to top, #e8198b 0%, #c7eafd 100%); -} - -/*111 Elegance*/ -.elegance{ - background-image: radial-gradient(73% 147%, #EADFDF 59%, #ECE2DF 100%), radial-gradient(91% 146%, rgba(255,255,255,0.50) 47%, rgba(0,0,0,0.50) 100%); - background-blend-mode: screen; -} - -/*112 Child Care*/ -.child_care{ - background-image: linear-gradient(-20deg, #f794a4 0%, #fdd6bd 100%); -} - -/*113 Flying Lemon*/ -.flying_lemon{ - background-image: linear-gradient(60deg, #64b3f4 0%, #c2e59c 100%); -} - -/*114 New Retrowave*/ -.new_retrowave{ - background-image: linear-gradient(to top, #3b41c5 0%, #a981bb 49%, #ffc8a9 100%); -} - -/*115 Hidden Jaguar*/ -.hidden_jaguar{ - background-image: linear-gradient(to top, #0fd850 0%, #f9f047 100%); -} - -/*116 Above The Sky*/ -.above_the_sky{ - background-image: linear-gradient(to top, lightgrey 0%, lightgrey 1%, #e0e0e0 26%, #efefef 48%, #d9d9d9 75%, #bcbcbc 100%); -} - -/*117 Nega*/ -.nega{ - background-image: linear-gradient(45deg, #ee9ca7 0%, #ffdde1 100%); -} - -/*118 Dense Water*/ -.dense_water{ - background-image: linear-gradient(to right, #3ab5b0 0%, #3d99be 31%, #56317a 100%); -} - -/*119 Chemic Aqua*/ -.chemic_aqua{ - background: #CDDCDC radial-gradient(at 50% 100%, rgba(255, 255, 255, 0.50) 0%, rgba(0, 0, 0, 0.50) 100%), linear-gradient(to bottom, rgba(255, 255, 255, 0.25) 0%, rgba(0, 0, 0, 0.25) 100%); - background-blend-mode: screen, overlay; -} - -/*120 Seashore*/ -.seashore{ - background-image: linear-gradient(to top, #209cff 0%, #68e0cf 100%); -} - -/*121 Marble Wall*/ -.marble_wall{ - background-image: linear-gradient(to top, #bdc2e8 0%, #bdc2e8 1%, #e6dee9 100%); -} - -/*122 Cheerful Caramel*/ -.cheerful_caramel{ - background-image: linear-gradient(to top, #e6b980 0%, #eacda3 100%); -} - -/*123 Night Sky*/ -.night_sky{ - background-image: linear-gradient(to top, #1e3c72 0%, #1e3c72 1%, #2a5298 100%); -} - -/*124 Magic Lake*/ -.magic_lake{ - background-image: linear-gradient(to top, #d5dee7 0%, #ffafbd 0%, #c9ffbf 100%); -} - -/*125 Young Grass*/ -.young_grass{ - background-image: linear-gradient(to top, #9be15d 0%, #00e3ae 100%); -} - -/*126 Colorful Peach*/ -.colorful_peach{ - background-image: linear-gradient(to right, #ed6ea0 0%, #ec8c69 100%); -} - -/*127 Gentle Care*/ -.gentle_care{ - background-image: linear-gradient(to right, #ffc3a0 0%, #ffafbd 100%); -} - -/*128 Plum Bath*/ -.plum_bath{ - background-image: linear-gradient(to top, #cc208e 0%, #6713d2 100%); -} - -/*129 Happy Unicorn*/ -.happy_unicorn{ - background-image: linear-gradient(to top, #b3ffab 0%, #12fff7 100%); -} - -/*130 Full Metal*/ -.full_metal{ - background: linear-gradient(to bottom, #D5DEE7 0%, #E8EBF2 50%, #E2E7ED 100%), linear-gradient(to bottom, rgba(0,0,0,0.02) 50%, rgba(255,255,255,0.02) 61%, rgba(0,0,0,0.02) 73%), linear-gradient(33deg, rgba(255,255,255,0.20) 0%, rgba(0,0,0,0.20) 100%); - background-blend-mode: normal,color-burn; -} - -/*131 African Field*/ -.african_field{ - background-image: linear-gradient(to top, #65bd60 0%, #5ac1a8 25%, #3ec6ed 50%, #b7ddb7 75%, #fef381 100%); -} - -/*132 Solid Stone*/ -.solid_stone{ - background-image: linear-gradient(to right, #243949 0%, #517fa4 100%); -} - -/*133 Orange Juice*/ -.orange_juice{ - background-image: linear-gradient(-20deg, #fc6076 0%, #ff9a44 100%); -} - -/*134 Glass Water*/ -.glass_water{ - background-image: linear-gradient(to top, #dfe9f3 0%, white 100%); -} - -/*135 Slick Carbon*/ -.slick_carbon{ - background: linear-gradient(to bottom, #323232 0%, #3F3F3F 40%, #1C1C1C 150%), linear-gradient(to top, rgba(255,255,255,0.40) 0%, rgba(0,0,0,0.25) 200%); - background-blend-mode: multiply; -} - -/*136 North Miracle*/ -.north_miracle{ - background-image: linear-gradient(to right, #00dbde 0%, #fc00ff 100%); -} - -/*137 Fruit Blend*/ -.fruit_blend{ - background-image: linear-gradient(to right, #f9d423 0%, #ff4e50 100%); -} - -/*138 Millennium Pine*/ -.millennium_pine{ - background-image: linear-gradient(to top, #50cc7f 0%, #f5d100 100%); -} - -/*139 High Flight*/ -.high_flight{ - background-image: linear-gradient(to right, #0acffe 0%, #495aff 100%); -} - -/*140 Mole Hall*/ -.mole_hall{ - background-image: linear-gradient(-20deg, #616161 0%, #9bc5c3 100%); -} - -/*141 Earl Gray*/ -.earl_gray{ - background: #E4E4E1 radial-gradient(at top center, rgba(255, 255, 255, 0.03) 0%, rgba(0, 0, 0, 0.03) 100%), linear-gradient(to top, rgba(255, 255, 255, 0.1) 0%, rgba(143, 152, 157, 0.60) 100%); - background-blend-mode: normal, multiply; -} - -/*142 Space Shift*/ -.space_shift{ - background-image: linear-gradient(60deg, #3d3393 0%, #2b76b9 37%, #2cacd1 65%, #35eb93 100%); -} - -/*143 Forest Inei*/ -.forest_inei{ - background-image: linear-gradient(to top, #df89b5 0%, #bfd9fe 100%); -} - -/*144 Royal Garden*/ -.royal_garden{ - background-image: linear-gradient(to right, #ed6ea0 0%, #ec8c69 100%); -} - -/*145 Rich Metal*/ -.rich_metal{ - background-image: linear-gradient(to right, #d7d2cc 0%, #304352 100%); -} - -/*146 Juicy Cake*/ -.juicy_cake{ - background-image: linear-gradient(to top, #e14fad 0%, #f9d423 100%); -} - -/*147 Smart Indigo*/ -.smart_indigo{ - background-image: linear-gradient(to top, #b224ef 0%, #7579ff 100%); -} - -/*148 Sand Strike*/ -.sand_strike{ - background-image: linear-gradient(to right, #c1c161 0%, #c1c161 0%, #d4d4b1 100%); -} - -/*149 Norse Beauty*/ -.norse_beauty{ - background-image: linear-gradient(to right, #ec77ab 0%, #7873f5 100%); -} - -/*150 Aqua Guidance*/ -.aqua_guidance{ - background-image: linear-gradient(to top, #007adf 0%, #00ecbc 100%); -} - -/*151 Sun Veggie*/ -.sun_veggie{ - background-image: linear-gradient(-225deg, #20E2D7 0%, #F9FEA5 100%); -} - -/*152 Sea Lord*/ -.sea_lord{ - background-image: linear-gradient(-225deg, #2CD8D5 0%, #C5C1FF 56%, #FFBAC3 100%); -} - -/*153 Black Sea*/ -.black_sea{ - background-image: linear-gradient(-225deg, #2CD8D5 0%, #6B8DD6 48%, #8E37D7 100%); -} - -/*154 Grass Shampoo*/ -.grass_shampoo{ - background-image: linear-gradient(-225deg, #DFFFCD 0%, #90F9C4 48%, #39F3BB 100%); -} - -/*155 Landing Aircraft*/ -.landing_aircraft{ - background-image: linear-gradient(-225deg, #5D9FFF 0%, #B8DCFF 48%, #6BBBFF 100%); -} - -/*156 Witch Dance*/ -.witch_dance{ - background-image: linear-gradient(-225deg, #A8BFFF 0%, #884D80 100%); -} - -/*157 Sleepless Night*/ -.sleepless_night{ - background-image: linear-gradient(-225deg, #5271C4 0%, #B19FFF 48%, #ECA1FE 100%); -} - -/*158 Angel Care*/ -.angel_care{ - background-image: linear-gradient(-225deg, #FFE29F 0%, #FFA99F 48%, #FF719A 100%); -} - -/*159 Crystal River*/ -.crystal_river{ - background-image: linear-gradient(-225deg, #22E1FF 0%, #1D8FE1 48%, #625EB1 100%); -} - -/*160 Soft Lipstick*/ -.soft_lipstick{ - background-image: linear-gradient(-225deg, #B6CEE8 0%, #F578DC 100%); -} - -/*161 Salt Mountain*/ -.salt_mountain{ - background-image: linear-gradient(-225deg, #FFFEFF 0%, #D7FFFE 100%); -} - -/*162 Perfect White*/ -.perfect_white{ - background-image: linear-gradient(-225deg, #E3FDF5 0%, #FFE6FA 100%); -} - -/*163 Fresh Oasis*/ -.fresh_oasis{ - background-image: linear-gradient(-225deg, #7DE2FC 0%, #B9B6E5 100%); -} - -/*164 Strict November*/ -.strict_november{ - background-image: linear-gradient(-225deg, #CBBACC 0%, #2580B3 100%); -} - -/*165 Morning Salad*/ -.morning_salad{ - background-image: linear-gradient(-225deg, #B7F8DB 0%, #50A7C2 100%); -} - -/*166 Deep Relief*/ -.deep_relief{ - background-image: linear-gradient(-225deg, #7085B6 0%, #87A7D9 50%, #DEF3F8 100%); -} - -/*167 Sea Strike*/ -.sea_strike{ - background-image: linear-gradient(-225deg, #77FFD2 0%, #6297DB 48%, #1EECFF 100%); -} - -/*168 Night Call*/ -.night_call{ - background-image: linear-gradient(-225deg, #AC32E4 0%, #7918F2 48%, #4801FF 100%); -} - -/*169 Supreme Sky*/ -.supreme_sky{ - background-image: linear-gradient(-225deg, #D4FFEC 0%, #57F2CC 48%, #4596FB 100%); -} - -/*170 Light Blue*/ -.light_blue{ - background-image: linear-gradient(-225deg, #9EFBD3 0%, #57E9F2 48%, #45D4FB 100%); -} - -/*171 Mind Crawl*/ -.mind_crawl{ - background-image: linear-gradient(-225deg, #473B7B 0%, #3584A7 51%, #30D2BE 100%); -} - -/*172 Lily Meadow*/ -.lily_meadow{ - background-image: linear-gradient(-225deg, #65379B 0%, #886AEA 53%, #6457C6 100%); -} - -/*173 Sugar Lollipop*/ -.sugar_lollipop{ - background-image: linear-gradient(-225deg, #A445B2 0%, #D41872 52%, #FF0066 100%); -} - -/*174 Sweet Dessert*/ -.sweet_dessert{ - background-image: linear-gradient(-225deg, #7742B2 0%, #F180FF 52%, #FD8BD9 100%); -} - -/*175 Magic Ray*/ -.magic_ray{ - background-image: linear-gradient(-225deg, #FF3CAC 0%, #562B7C 52%, #2B86C5 100%); -} - -/*176 Teen Party*/ -.teen_party{ - background-image: linear-gradient(-225deg, #FF057C 0%, #8D0B93 50%, #321575 100%); -} - -/*177 Frozen Heat*/ -.frozen_heat{ - background-image: linear-gradient(-225deg, #FF057C 0%, #7C64D5 48%, #4CC3FF 100%); -} - -/*178 Gagarin View*/ -.gagarin_view{ - background-image: linear-gradient(-225deg, #69EACB 0%, #EACCF8 48%, #6654F1 100%); -} - -/*179 Fabled Sunset*/ -.fabled_sunset{ - background-image: linear-gradient(-225deg, #231557 0%, #44107A 29%, #FF1361 67%, #FFF800 100%); -} - -/*180 Perfect Blue*/ -.perfect_blue{ - background-image: linear-gradient(-225deg, #3D4E81 0%, #5753C9 48%, #6E7FF3 100%); -} -- cgit v1.2.3 From a1a3a7cd8abbfcc778c3b57953fd931c87a49278 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 12 Dec 2019 11:36:47 +0100 Subject: Avoid crashing when constructing color-space from invalid enum This is not to be taken as supported and is still undefined behavior, but I prefer we do not crash. Change-Id: Icf4f3398bfd57fcbdc611a5a821a1f2de0838330 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qcolorspace.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qcolorspace.cpp b/src/gui/painting/qcolorspace.cpp index 9631fdb416..0fb0e9ee33 100644 --- a/src/gui/painting/qcolorspace.cpp +++ b/src/gui/painting/qcolorspace.cpp @@ -422,6 +422,10 @@ QColorSpace::QColorSpace() */ QColorSpace::QColorSpace(NamedColorSpace namedColorSpace) { + if (namedColorSpace < QColorSpace::SRgb || namedColorSpace > QColorSpace::ProPhotoRgb) { + qWarning() << "QColorSpace attempted constructed from invalid QColorSpace::NamedColorSpace: " << int(namedColorSpace); + return; + } static QColorSpacePrivate *predefinedColorspacePrivates[QColorSpace::ProPhotoRgb + 1]; if (!predefinedColorspacePrivates[namedColorSpace]) { predefinedColorspacePrivates[namedColorSpace] = new QColorSpacePrivate(namedColorSpace); -- cgit v1.2.3 From 05d52685028a46e340d610093c7e7c98479ac18b Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Tue, 17 Dec 2019 13:13:16 +0100 Subject: Fix QPainter::drawLines() with cosmetic pen Even though each line in the array passed to drawLines() should be rendered as an independent line, some state was kept in the cosmetic stroker from one line to the next. This could result in visible rendering errors. Fixes: QTBUG-80834 Change-Id: Ief7bf78eab83ae34459802bff5a57d6beec4a5e5 Reviewed-by: Allan Sandfeld Jensen --- src/gui/painting/qcosmeticstroker.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp index 0fb89a75b5..fa34c5598e 100644 --- a/src/gui/painting/qcosmeticstroker.cpp +++ b/src/gui/painting/qcosmeticstroker.cpp @@ -375,6 +375,7 @@ void QCosmeticStroker::drawLine(const QPointF &p1, const QPointF &p2) patternOffset = state->lastPen.dashOffset()*64; lastPixel.x = INT_MIN; + lastPixel.y = INT_MIN; stroke(this, start.x(), start.y(), end.x(), end.y(), drawCaps ? CapBegin|CapEnd : 0); -- cgit v1.2.3 From 9d6b4d11424cdcd6c572cdcc50b3b790b6e673c0 Mon Sep 17 00:00:00 2001 From: Jordi Pujol Foyo Date: Fri, 13 Dec 2019 14:27:11 +0100 Subject: New features for QPdfWriter Added new API setDocumentXmpMetadata/documentXmpMetadata and addFileAttachment [ChangeLog][QtGui][QPdfWriter] New API to provide external document XMP metadata and attach files to PDF. Fixes: QTBUG-78651 Fixes: QTBUG-78764 Change-Id: Ic0b37e8d12899f907001db469080594c14c87655 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qpdf.cpp | 159 ++++++++++++++++++++++++++++++++-------- src/gui/painting/qpdf_p.h | 21 +++++- src/gui/painting/qpdfwriter.cpp | 44 +++++++++++ src/gui/painting/qpdfwriter.h | 5 ++ 4 files changed, 196 insertions(+), 33 deletions(-) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index 932c3e6f5a..de9fc13331 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -1390,6 +1390,18 @@ void QPdfEngine::setPdfVersion(PdfVersion version) d->pdfVersion = version; } +void QPdfEngine::setDocumentXmpMetadata(const QByteArray &xmpMetadata) +{ + Q_D(QPdfEngine); + d->xmpDocumentMetadata = xmpMetadata; +} + +QByteArray QPdfEngine::documentXmpMetadata() const +{ + Q_D(const QPdfEngine); + return d->xmpDocumentMetadata; +} + void QPdfEngine::setPageLayout(const QPageLayout &pageLayout) { Q_D(QPdfEngine); @@ -1520,6 +1532,8 @@ bool QPdfEngine::begin(QPaintDevice *pdev) d->xrefPositions.clear(); d->pageRoot = 0; + d->embeddedfilesRoot = 0; + d->namesRoot = 0; d->catalog = 0; d->info = 0; d->graphicsState = 0; @@ -1555,10 +1569,18 @@ bool QPdfEngine::end() d->outDevice = nullptr; } + d->fileCache.clear(); + setActive(false); return true; } +void QPdfEngine::addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType) +{ + Q_D(QPdfEngine); + d->fileCache.push_back({fileName, data, mimeType}); +} + QPdfEnginePrivate::~QPdfEnginePrivate() { qDeleteAll(fonts); @@ -1586,13 +1608,19 @@ void QPdfEnginePrivate::writeHeader() int metaDataObj = -1; int outputIntentObj = -1; + if (pdfVersion == QPdfEngine::Version_A1b || !xmpDocumentMetadata.isEmpty()) { + metaDataObj = writeXmpDcumentMetaData(); + } if (pdfVersion == QPdfEngine::Version_A1b) { - metaDataObj = writeXmpMetaData(); outputIntentObj = writeOutputIntent(); } catalog = addXrefEntry(-1); pageRoot = requestObject(); + if (!fileCache.isEmpty()) { + namesRoot = requestObject(); + embeddedfilesRoot = requestObject(); + } // catalog { @@ -1602,10 +1630,15 @@ void QPdfEnginePrivate::writeHeader() << "/Type /Catalog\n" << "/Pages " << pageRoot << "0 R\n"; - if (pdfVersion == QPdfEngine::Version_A1b) { - s << "/OutputIntents [" << outputIntentObj << "0 R]\n"; + // Embedded files, if any + if (!fileCache.isEmpty()) + s << "/Names " << embeddedfilesRoot << "0 R\n"; + + if (pdfVersion == QPdfEngine::Version_A1b || !xmpDocumentMetadata.isEmpty()) s << "/Metadata " << metaDataObj << "0 R\n"; - } + + if (pdfVersion == QPdfEngine::Version_A1b) + s << "/OutputIntents [" << outputIntentObj << "0 R]\n"; s << ">>\n" << "endobj\n"; @@ -1613,6 +1646,12 @@ void QPdfEnginePrivate::writeHeader() write(catalog); } + if (!fileCache.isEmpty()) { + addXrefEntry(embeddedfilesRoot); + xprintf("<>\n" + "endobj\n", namesRoot); + } + // graphics state graphicsState = addXrefEntry(-1); xprintf("<<\n" @@ -1664,39 +1703,45 @@ void QPdfEnginePrivate::writeInfo() "endobj\n"); } -int QPdfEnginePrivate::writeXmpMetaData() +int QPdfEnginePrivate::writeXmpDcumentMetaData() { const int metaDataObj = addXrefEntry(-1); + QByteArray metaDataContent; + + if (xmpDocumentMetadata.isEmpty()) { + const QString producer(QString::fromLatin1("Qt " QT_VERSION_STR)); + + const QDateTime now = QDateTime::currentDateTime(); + const QDate date = now.date(); + const QTime time = now.time(); + const QString timeStr = + QString::asprintf("%d-%02d-%02dT%02d:%02d:%02d", + date.year(), date.month(), date.day(), + time.hour(), time.minute(), time.second()); + + const int offset = now.offsetFromUtc(); + const int hours = (offset / 60) / 60; + const int mins = (offset / 60) % 60; + QString tzStr; + if (offset < 0) + tzStr = QString::asprintf("-%02d:%02d", -hours, -mins); + else if (offset > 0) + tzStr = QString::asprintf("+%02d:%02d", hours , mins); + else + tzStr = QLatin1String("Z"); - const QString producer(QString::fromLatin1("Qt " QT_VERSION_STR)); - - const QDateTime now = QDateTime::currentDateTime(); - const QDate date = now.date(); - const QTime time = now.time(); - const QString timeStr = - QString::asprintf("%d-%02d-%02dT%02d:%02d:%02d", - date.year(), date.month(), date.day(), - time.hour(), time.minute(), time.second()); + const QString metaDataDate = timeStr + tzStr; - const int offset = now.offsetFromUtc(); - const int hours = (offset / 60) / 60; - const int mins = (offset / 60) % 60; - QString tzStr; - if (offset < 0) - tzStr = QString::asprintf("-%02d:%02d", -hours, -mins); - else if (offset > 0) - tzStr = QString::asprintf("+%02d:%02d", hours , mins); + QFile metaDataFile(QLatin1String(":/qpdf/qpdfa_metadata.xml")); + metaDataFile.open(QIODevice::ReadOnly); + metaDataContent = QString::fromUtf8(metaDataFile.readAll()).arg(producer.toHtmlEscaped(), + title.toHtmlEscaped(), + creator.toHtmlEscaped(), + metaDataDate).toUtf8(); + } else - tzStr = QLatin1String("Z"); + metaDataContent = xmpDocumentMetadata; - const QString metaDataDate = timeStr + tzStr; - - QFile metaDataFile(QLatin1String(":/qpdf/qpdfa_metadata.xml")); - metaDataFile.open(QIODevice::ReadOnly); - const QByteArray metaDataContent = QString::fromUtf8(metaDataFile.readAll()).arg(producer.toHtmlEscaped(), - title.toHtmlEscaped(), - creator.toHtmlEscaped(), - metaDataDate).toUtf8(); xprintf("<<\n" "/Type /Metadata /Subtype /XML\n" "/Length %d\n" @@ -1774,6 +1819,56 @@ void QPdfEnginePrivate::writePageRoot() "endobj\n"); } +void QPdfEnginePrivate::writeAttachmentRoot() +{ + if (fileCache.isEmpty()) + return; + + QVector attachments; + const int size = fileCache.size(); + for (int i = 0; i < size; ++i) { + auto attachment = fileCache.at(i); + const int attachmentID = addXrefEntry(-1); + xprintf("<<\n"); + if (do_compress) + xprintf("/Filter /FlateDecode\n"); + + const int lenobj = requestObject(); + xprintf("/Length %d 0 R\n", lenobj); + int len = 0; + xprintf(">>\nstream\n"); + len = writeCompressed(attachment.data); + xprintf("\nendstream\n" + "endobj\n"); + addXrefEntry(lenobj); + xprintf("%d\n" + "endobj\n", len); + + attachments.push_back(addXrefEntry(-1)); + xprintf("<<\n" + "/F (%s)", attachment.fileName.toLatin1().constData()); + + xprintf("\n/EF <>\n" + "/Type/Filespec\n" + , attachmentID); + if (!attachment.mimeType.isEmpty()) + xprintf("/Subtype/%s\n", + attachment.mimeType.replace(QLatin1String("/"), + QLatin1String("#2F")).toLatin1().constData()); + xprintf(">>\nendobj\n"); + } + + // names + addXrefEntry(namesRoot); + xprintf("<>\n" + "endobj\n"); +} void QPdfEnginePrivate::embedFont(QFontSubset *font) { @@ -2031,6 +2126,8 @@ void QPdfEnginePrivate::writeTail() writePage(); writeFonts(); writePageRoot(); + writeAttachmentRoot(); + addXrefEntry(xrefPositions.size(),false); xprintf("xref\n" "0 %d\n" diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index 89e549614a..57d70db442 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -187,6 +187,11 @@ public: void setPdfVersion(PdfVersion version); + void setDocumentXmpMetadata(const QByteArray &xmpMetadata); + QByteArray documentXmpMetadata() const; + + void addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType); + // reimplementations QPaintEngine bool begin(QPaintDevice *pdev) override; bool end() override; @@ -297,9 +302,10 @@ private: int createShadingFunction(const QGradient *gradient, int from, int to, bool reflect, bool alpha); void writeInfo(); - int writeXmpMetaData(); + int writeXmpDcumentMetaData(); int writeOutputIntent(); void writePageRoot(); + void writeAttachmentRoot(); void writeFonts(); void embedFont(QFontSubset *font); qreal calcUserUnit() const; @@ -324,11 +330,22 @@ private: inline int writeCompressed(const QByteArray &data) { return writeCompressed(data.constData(), data.length()); } int writeCompressed(QIODevice *dev); + struct AttachmentInfo + { + AttachmentInfo (const QString &fileName, const QByteArray &data, const QString &mimeType) + : fileName(fileName), data(data), mimeType(mimeType) {} + QString fileName; + QByteArray data; + QString mimeType; + }; + // various PDF objects - int pageRoot, catalog, info, graphicsState, patternColorSpace; + int pageRoot, embeddedfilesRoot, namesRoot, catalog, info, graphicsState, patternColorSpace; QVector pages; QHash imageCache; QHash, uint > alphaCache; + QVector fileCache; + QByteArray xmpDocumentMetadata; }; QT_END_NAMESPACE diff --git a/src/gui/painting/qpdfwriter.cpp b/src/gui/painting/qpdfwriter.cpp index 35814d146c..4f70fe6ad2 100644 --- a/src/gui/painting/qpdfwriter.cpp +++ b/src/gui/painting/qpdfwriter.cpp @@ -266,6 +266,50 @@ int QPdfWriter::resolution() const return d->engine->resolution(); } +/*! + \since 5.15 + + Sets the document metadata. This metadata is not influenced by the setTitle / setCreator methods, + so is up to the user to keep it consistent. + \a xmpMetadata contains XML formatted metadata to embed into the PDF file. + + \sa documentXmpMetadata() +*/ + +void QPdfWriter::setDocumentXmpMetadata(const QByteArray &xmpMetadata) +{ + Q_D(const QPdfWriter); + d->engine->setDocumentXmpMetadata(xmpMetadata); +} + +/*! + \since 5.15 + + Gets the document metadata, as it was provided with a call to setDocumentXmpMetadata. It will not + return the default metadata. + + \sa setDocumentXmpMetadata() +*/ + +QByteArray QPdfWriter::documentXmpMetadata() const +{ + Q_D(const QPdfWriter); + return d->engine->documentXmpMetadata(); +} + +/*! + \since 5.15 + + Adds \a fileName attachment to the PDF with (optional) \a mimeType + \a data contains the raw file data to embed into the PDF file. +*/ + +void QPdfWriter::addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType) +{ + Q_D(QPdfWriter); + d->engine->addFileAttachment(fileName, data, mimeType); +} + // Defined in QPagedPaintDevice but non-virtual, add QPdfWriter specific doc here #ifdef Q_QDOC /*! diff --git a/src/gui/painting/qpdfwriter.h b/src/gui/painting/qpdfwriter.h index 668081e008..04039a0104 100644 --- a/src/gui/painting/qpdfwriter.h +++ b/src/gui/painting/qpdfwriter.h @@ -75,6 +75,11 @@ public: void setResolution(int resolution); int resolution() const; + void setDocumentXmpMetadata(const QByteArray &xmpMetadata); + QByteArray documentXmpMetadata() const; + + void addFileAttachment(const QString &fileName, const QByteArray &data, const QString &mimeType = QString()); + #ifdef Q_QDOC bool setPageLayout(const QPageLayout &pageLayout); bool setPageSize(const QPageSize &pageSize); -- cgit v1.2.3