aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickvaluetypes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/util/qquickvaluetypes.cpp')
-rw-r--r--src/quick/util/qquickvaluetypes.cpp280
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 &params)
{
- 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 &params)
{
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 &params)
{
- 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 &params)
{
- 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 &params)
{
- 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 &params)
{
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 &params)
{
if (!params.isObject())