Revision control

Copy as Markdown

// Copyright (C) 2025 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
// Qt-Security score:significant reason:default
#include "qquickcolor_p.h"
#include <private/qqmlcontextdata_p.h>
#include <private/qquickvaluetypes_p.h>
#include <private/qv4engine_p.h>
QT_BEGIN_NAMESPACE
/*!
* \qmltype Color
* \nativetype QQuickColor
* \inqmlmodule QtQuick
* \brief Holds utility functions for colors.
* \since 6.12
*/
QQuickColor::QQuickColor(QObject *parent) : QObject(parent)
{
}
/*!
* \qmlmethod color Color::rgba(real red, real green, real blue, real alpha)
*
* Returns a color with the specified \a red, \a green, \a blue, and \a alpha
* components. All components should be in the range 0-1 (inclusive).
*/
QColor QQuickColor::rgba(double r, double g, double b, double a) const
{
return QColor::fromRgbF(r, g, b, a);
}
/*!
* \qmlmethod color Color::hsla(real hue, real saturation, real lightness, real alpha)
*
* Returns a color with the specified \a hue, \a saturation, \a lightness, and \a alpha
* components. All components should be in the range 0-1 (inclusive).
*/
QColor QQuickColor::hsla(double h, double s, double l, double a) const
{
return QColor::fromHslF(h, s, l, a);
}
/*!
* \qmlmethod color Color::hsva(real hue, real saturation, real value, real alpha)
*
* Returns a color with the specified \a hue, \a saturation, \a value and \a alpha
* components. All components should be in the range 0-1 (inclusive).
*/
QColor QQuickColor::hsva(double h, double s, double v, double a) const
{
return QColor::fromHsvF(h, s, v, a);
}
/*!
* \qmlmethod color Color::fromString(string name)
*
* Returns the color corresponding to the given \a name (i.e. red or #ff0000).
* If there is no such color, an exception is thrown.
*/
QColor QQuickColor::fromString(const QString &name) const
{
QColor c = QColor::fromString(name);
if (!c.isValid()) {
const auto *qmlContext = QQmlData::get(this)->outerContext;
Q_ASSERT(qmlContext);
if (qmlContext)
qmlContext->engine()->throwError(
QStringLiteral("\"%1\" is not a valid color name").arg(name));
return {};
}
return c;
}
/*!
* \qmlmethod bool Color::equal(color lhs, color rhs)
*
* Returns true if \a lhs and \a rhs are equal.
* See \l{QColor::}{operator==()}.
*
* \note This function is a typed version of \l{Qt::colorEqual()}
*/
bool QQuickColor::equal(const QColor &lhs, const QColor &rhs) const
{
return lhs == rhs;
}
/*!
* \qmlmethod color Color::transparent(color color, real opacity)
*
* Returns \a color with an alpha value of \a opacity, which ranges from 0
* (completely transparent) to 1 (completely opaque).
*/
QColor QQuickColor::transparent(const QColor &color, qreal opacity) const
{
QColor newColor = color;
newColor.setAlphaF(opacity);
return newColor;
}
/*!
* \qmlmethod color Color::blend(color a, color b, real factor)
*
* Returns a color that is a blend of \a a and \a b. The resulting color is constructed from the
* independent linear interpolations of the RGB color channels of \a a and \a b.
*
* If \a factor is smaller than 0.0, \a a is returned. If factor is larger than 1.0, \a b is
* returned.
*/
QColor QQuickColor::blend(const QColor &a, const QColor &b, qreal factor) const
{
if (std::isnan(factor)) {
qWarning("NaN given as argument to Color.blend()");
return QColor();
}
if (factor <= 0.0)
return a;
if (factor >= 1.0)
return b;
const auto rgbA = a.toRgb();
const auto rgbB = b.toRgb();
QColor color;
color.setRedF(rgbA.redF() * (1.0 - factor) + rgbB.redF() * factor);
color.setGreenF(rgbA.greenF() * (1.0 - factor) + rgbB.greenF() * factor);
color.setBlueF(rgbA.blueF() * (1.0 - factor) + rgbB.blueF() * factor);
return color;
}
/*!
* \qmlmethod color Color::darker(color baseColor, real factor)
*
* Returns a color darker than \a baseColor by the \a factor provided.
*
* The function converts the current RGB color to HSV, divides the value (V) component
* by factor and converts the color back to RGB.
*
* If the factor is greater than 1.0, this function returns a darker color. Setting factor to 3.0
* returns a color that has one-third the brightness. If the factor is less than 1.0, the return
* color is lighter, but we recommend using the \l{Color::lighter()} function for this purpose. If
* the factor is 0 or negative, the return value is unspecified.
*/
QColor QQuickColor::darker(const QColor &baseColor, double factor) const
{
return QQuickColorValueType(baseColor).darker(factor);
}
/*!
* \qmlmethod color Color::lighter(color baseColor, real factor)
*
* Returns a color lighter than \a baseColor by the \a factor provided.
*
* The function converts the current RGB color to HSV, multiplies the value (V) component
* by factor and converts the color back to RGB.
*
* If the factor is greater than 1.0, this functions returns a lighter color. Setting factor to 1.5
* returns a color that is 50% brighter. If the factor is less than 1.0, the return color is
* darker, but we recommend using the \l{Color::darker()} function for this purpose. If the factor
* is 0 or negative, the return value is unspecified.
*/
QColor QQuickColor::lighter(const QColor &baseColor, double factor) const
{
return QQuickColorValueType(baseColor).lighter(factor);
}
/*!
* \qmlmethod color Color::tint(color baseColor, color tintColor)
*
* This function allows tinting one color (\a baseColor) with another (\a tintColor).
*
* The tint color should usually be mostly transparent, or you will not be
* able to see the underlying color. The example below provides a slight red
* tint by having the tint color be pure red, which is only 1/16th opaque.
*
* \qml
* Item {
* Rectangle {
* x: 0
* width: 80
* height: 80
* color: "lightsteelblue"
* }
* Rectangle {
* x: 100; width: 80; height: 80
* color: Color.tint("lightsteelblue", "#10FF0000")
* }
* }
* \endqml
* \image declarative-rect_tint.png {Side-by-side representation of a light
* steel blue square and a light steel blue square with a tint applied}
*
* Tint is most useful when a subtle change is intended to be conveyed due to some event;
* you can then use tinting to more effectively tune the visible color.
*/
QColor QQuickColor::tint(const QColor &baseColor, const QColor &tintColor) const
{
return QQuickColorValueType(baseColor).tint(tintColor);
}
QT_END_NAMESPACE
#include "moc_qquickcolor_p.cpp"