diff options
Diffstat (limited to 'src/quick/util/qquickvaluetypes.cpp')
-rw-r--r-- | src/quick/util/qquickvaluetypes.cpp | 280 |
1 files changed, 192 insertions, 88 deletions
diff --git a/src/quick/util/qquickvaluetypes.cpp b/src/quick/util/qquickvaluetypes.cpp index cbd641fecf..350f55e143 100644 --- a/src/quick/util/qquickvaluetypes.cpp +++ b/src/quick/util/qquickvaluetypes.cpp @@ -1,54 +1,24 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include <private/qquickvaluetypes_p.h> #include <qtquickglobal.h> #include <private/qqmlvaluetype_p.h> +#include <private/qqmlstringconverters_p.h> #include <private/qcolorspace_p.h> #include <private/qfont_p.h> QT_BEGIN_NAMESPACE +QQuickColorValueType::QQuickColorValueType(const QString &string) + : v(QColor::fromString(string)) +{ +} + QVariant QQuickColorValueType::create(const QJSValue ¶ms) { - return params.isString() ? QColor(params.toString()) : QVariant(); + return params.isString() ? QColor::fromString(params.toString()) : QVariant(); } QString QQuickColorValueType::toString() const @@ -193,48 +163,10 @@ void QQuickColorValueType::setHslLightness(qreal hslLightness) v.setHslF(hue, saturation, hslLightness, alpha); } -template<typename T, int NumParams> -QVariant createValueTypeFromNumberString(const QString &s) -{ - Q_STATIC_ASSERT_X(NumParams == 2 || NumParams == 3 || NumParams == 4 || NumParams == 16, - "Unsupported number of params; add an additional case below if necessary."); - - if (s.count(u',') != NumParams - 1) - return QVariant(); - - QVarLengthArray<float, NumParams> parameters; - bool ok = true; - for (qsizetype prev = 0, next = s.indexOf(u','), length = s.length(); ok && prev < length;) { - parameters.append(s.mid(prev, next - prev).toFloat(&ok)); - prev = next + 1; - next = (parameters.length() == NumParams - 1) ? length : s.indexOf(u',', prev); - } - - if (!ok) - return QVariant(); - - if constexpr (NumParams == 2) { - return T(parameters[0], parameters[1]); - } else if constexpr (NumParams == 3) { - return T(parameters[0], parameters[1], parameters[2]); - } else if constexpr (NumParams == 4) { - return T(parameters[0], parameters[1], parameters[2], parameters[3]); - } else if constexpr (NumParams == 16) { - return T(parameters[0], parameters[1], parameters[2], parameters[3], - parameters[4], parameters[5], parameters[6], parameters[7], - parameters[8], parameters[9], parameters[10], parameters[11], - parameters[12], parameters[13], parameters[14], parameters[15]); - } else { - Q_UNREACHABLE(); - } - - return QVariant(); -} - QVariant QQuickVector2DValueType::create(const QJSValue ¶ms) { if (params.isString()) - return createValueTypeFromNumberString<QVector2D, 2>(params.toString()); + return QQmlStringConverters::valueTypeFromNumberString<QVector2D, 2, u','>(params.toString()); if (params.isArray()) return QVector2D(params.property(0).toNumber(), params.property(1).toNumber()); return QVariant(); @@ -327,8 +259,10 @@ bool QQuickVector2DValueType::fuzzyEquals(const QVector2D &vec) const QVariant QQuickVector3DValueType::create(const QJSValue ¶ms) { - if (params.isString()) - return createValueTypeFromNumberString<QVector3D, 3>(params.toString()); + if (params.isString()) { + return QQmlStringConverters::valueTypeFromNumberString<QVector3D, 3, u',', u','>( + params.toString()); + } if (params.isArray()) { return QVector3D(params.property(0).toNumber(), params.property(1).toNumber(), @@ -384,7 +318,7 @@ qreal QQuickVector3DValueType::dotProduct(const QVector3D &vec) const QVector3D QQuickVector3DValueType::times(const QMatrix4x4 &m) const { - return v * m; + return (QVector4D(v, 1) * m).toVector3DAffine(); } QVector3D QQuickVector3DValueType::times(const QVector3D &vec) const @@ -446,8 +380,10 @@ bool QQuickVector3DValueType::fuzzyEquals(const QVector3D &vec) const QVariant QQuickVector4DValueType::create(const QJSValue ¶ms) { - if (params.isString()) - return createValueTypeFromNumberString<QVector4D, 4>(params.toString()); + if (params.isString()) { + return QQmlStringConverters::valueTypeFromNumberString<QVector4D, 4, u',', u',', u','>( + params.toString()); + } if (params.isArray()) { return QVector4D(params.property(0).toNumber(), params.property(1).toNumber(), @@ -573,8 +509,10 @@ bool QQuickVector4DValueType::fuzzyEquals(const QVector4D &vec) const QVariant QQuickQuaternionValueType::create(const QJSValue ¶ms) { - if (params.isString()) - return createValueTypeFromNumberString<QQuaternion, 4>(params.toString()); + if (params.isString()) { + return QQmlStringConverters::valueTypeFromNumberString<QQuaternion, 4, u',', u',', u','>( + params.toString()); + } if (params.isArray()) { return QQuaternion(params.property(0).toNumber(), params.property(1).toNumber(), @@ -629,13 +567,96 @@ void QQuickQuaternionValueType::setZ(qreal z) v.setZ(z); } +qreal QQuickQuaternionValueType::dotProduct(const QQuaternion &q) const +{ + return QQuaternion::dotProduct(v, q); +} + +QQuaternion QQuickQuaternionValueType::times(const QQuaternion &q) const +{ + return v * q; +} + +QVector3D QQuickQuaternionValueType::times(const QVector3D &vec) const +{ + return v * vec; +} + +QQuaternion QQuickQuaternionValueType::times(qreal factor) const +{ + return v * factor; +} + +QQuaternion QQuickQuaternionValueType::plus(const QQuaternion &q) const +{ + return v + q; +} + +QQuaternion QQuickQuaternionValueType::minus(const QQuaternion &q) const +{ + return v - q; +} + +QQuaternion QQuickQuaternionValueType::normalized() const +{ + return v.normalized(); +} + +QQuaternion QQuickQuaternionValueType::inverted() const +{ + return v.inverted(); +} + +QQuaternion QQuickQuaternionValueType::conjugated() const +{ + return v.conjugated(); +} + +qreal QQuickQuaternionValueType::length() const +{ + return v.length(); +} + +QVector3D QQuickQuaternionValueType::toEulerAngles() const +{ + return v.toEulerAngles(); +} + +QVector4D QQuickQuaternionValueType::toVector4d() const +{ + return v.toVector4D(); +} + +bool QQuickQuaternionValueType::fuzzyEquals(const QQuaternion &q, qreal epsilon) const +{ + qreal absEps = qAbs(epsilon); + if (qAbs(v.scalar() - q.scalar()) > absEps) + return false; + if (qAbs(v.x() - q.x()) > absEps) + return false; + if (qAbs(v.y() - q.y()) > absEps) + return false; + if (qAbs(v.z() - q.z()) > absEps) + return false; + return true; +} + +bool QQuickQuaternionValueType::fuzzyEquals(const QQuaternion &q) const +{ + return qFuzzyCompare(v, q); +} + QVariant QQuickMatrix4x4ValueType::create(const QJSValue ¶ms) { if (params.isNull() || params.isUndefined()) return QMatrix4x4(); - if (params.isString()) - return createValueTypeFromNumberString<QMatrix4x4, 16>(params.toString()); + if (params.isString()) { + return QQmlStringConverters::valueTypeFromNumberString<QMatrix4x4, 16, u',', u',', u',', + u',', u',', u',', u',', u',', u',', + u',', u',', u',', u',', u',', u','>( + params.toString()); + } if (params.isArray() && params.property(QStringLiteral("length")).toInt() == 16) { return QMatrix4x4(params.property(0).toNumber(), @@ -671,7 +692,7 @@ QVector4D QQuickMatrix4x4ValueType::times(const QVector4D &vec) const QVector3D QQuickMatrix4x4ValueType::times(const QVector3D &vec) const { - return v * vec; + return v.map(vec); } QMatrix4x4 QQuickMatrix4x4ValueType::times(qreal factor) const @@ -714,6 +735,16 @@ QMatrix4x4 QQuickMatrix4x4ValueType::transposed() const return v.transposed(); } +QPointF QQuickMatrix4x4ValueType::map(const QPointF p) const +{ + return v.map(p); +} + +QRectF QQuickMatrix4x4ValueType::mapRect(const QRectF r) const +{ + return v.mapRect(r); +} + bool QQuickMatrix4x4ValueType::fuzzyEquals(const QMatrix4x4 &m, qreal epsilon) const { qreal absEps = qAbs(epsilon); @@ -989,6 +1020,79 @@ void QQuickFontValueType::setPreferShaping(bool enable) v.setStyleStrategy(static_cast<QFont::StyleStrategy>(v.styleStrategy() | QFont::PreferNoShaping)); } +void QQuickFontValueType::setVariableAxes(const QVariantMap &variableAxes) +{ + v.clearVariableAxes(); + for (auto [variableAxisName, variableAxisValue] : variableAxes.asKeyValueRange()) { + const auto maybeTag = QFont::Tag::fromString(variableAxisName); + if (!maybeTag) { + qWarning() << "Invalid variable axis" << variableAxisName << "ignored"; + continue; + } + + bool ok; + float value = variableAxisValue.toFloat(&ok); + if (!ok) { + qWarning() << "Variable axis" << variableAxisName << "value" << variableAxisValue << "is not a floating point value."; + continue; + } + + v.setVariableAxis(*maybeTag, value); + } +} + +QVariantMap QQuickFontValueType::variableAxes() const +{ + QVariantMap ret; + for (const auto &tag : v.variableAxisTags()) + ret.insert(QString::fromUtf8(tag.toString()), v.variableAxisValue(tag)); + + return ret; +} + +void QQuickFontValueType::setFeatures(const QVariantMap &features) +{ + v.clearFeatures(); + for (auto [featureName, featureValue] : features.asKeyValueRange()) { + const auto maybeTag = QFont::Tag::fromString(featureName); + if (!maybeTag) { + qWarning() << "Invalid font feature" << featureName << "ignored"; + continue; + } + + bool ok; + quint32 value = featureValue.toUInt(&ok); + if (!ok) { + qWarning() << "Font feature" << featureName << "value" << featureValue << "is not an integer."; + continue; + } + + v.setFeature(*maybeTag, value); + } +} + +QVariantMap QQuickFontValueType::features() const +{ + QVariantMap ret; + for (const auto &tag : v.featureTags()) + ret.insert(QString::fromUtf8(tag.toString()), v.featureValue(tag)); + + return ret; +} + +bool QQuickFontValueType::contextFontMerging() const +{ + return (v.styleStrategy() & QFont::ContextFontMerging) != 0; +} + +void QQuickFontValueType::setContextFontMerging(bool enable) +{ + if (enable) + v.setStyleStrategy(static_cast<QFont::StyleStrategy>(v.styleStrategy() | QFont::ContextFontMerging)); + else + v.setStyleStrategy(static_cast<QFont::StyleStrategy>(v.styleStrategy() & ~QFont::ContextFontMerging)); +} + QVariant QQuickColorSpaceValueType::create(const QJSValue ¶ms) { if (!params.isObject()) |