File indexing completed on 2024-12-01 12:32:58
0001 /* This file is part of the KDE project 0002 SPDX-FileCopyrightText: 2007 Matthew Woehlke <mw_triad@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2007 Thomas Zander <zander@kde.org> 0004 SPDX-FileCopyrightText: 2007 Zack Rusin <zack@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #ifndef KCOLORUTILS_H 0010 #define KCOLORUTILS_H 0011 0012 #include <kguiaddons_export.h> 0013 0014 #include <QPainter> 0015 0016 class QColor; 0017 0018 /** 0019 * A set of methods used to work with colors. 0020 */ 0021 namespace KColorUtils 0022 { 0023 /** 0024 * Calculate the hue of a color. The range is from 0.0 (red) to almost 1.0 (slightly blue-ish red). 0025 * 0026 * The result is computed in linear (not sRGB) color space and may differ slightly from QColor::hue(). 0027 * 0028 * @see https://en.wikipedia.org/wiki/Hue 0029 * @since 5.68 0030 */ 0031 KGUIADDONS_EXPORT qreal hue(const QColor &); 0032 0033 /** 0034 * Calculate the chroma of a color. The range is from 0.0 (none) to 1.0 (full). 0035 * 0036 * The result is computed in linear (not sRGB) color space. 0037 * 0038 * @see https://en.wikipedia.org/wiki/Colorfulness 0039 * @since 5.68 0040 */ 0041 KGUIADDONS_EXPORT qreal chroma(const QColor &); 0042 0043 /** 0044 * Calculate the luma of a color. Luma is weighted sum of gamma-adjusted 0045 * R'G'B' components of a color. The result is similar to qGray. The range 0046 * is from 0.0 (black) to 1.0 (white). 0047 * 0048 * The result is computed in linear (not sRGB) color space. 0049 * 0050 * KColorUtils::darken(), KColorUtils::lighten() and KColorUtils::shade() 0051 * operate on the luma of a color. 0052 * 0053 * @see http://en.wikipedia.org/wiki/Luma_(video) 0054 */ 0055 KGUIADDONS_EXPORT qreal luma(const QColor &); 0056 0057 /** 0058 * Calculate hue, chroma and luma of a color in one call. 0059 * 0060 * The range of hue is from 0.0 (red) to almost 1.0 (slightly blue-ish red). 0061 * The range of chroma is from 0.0 (none) to 1.0 (full). 0062 * The range of luma is from 0.0 (black) to 1.0 (white). 0063 * 0064 * The hue, chroma and luma values are computed in linear (not sRGB) color space. 0065 * 0066 * @since 5.0 0067 */ 0068 KGUIADDONS_EXPORT void getHcy(const QColor &, qreal *hue, qreal *chroma, qreal *luma, qreal *alpha = nullptr); 0069 0070 /** 0071 * Return a QColor based on the given hue, chroma, luma and alpha values. 0072 * 0073 * The range of hue is cyclical. For example, 0.0 and 1.0 are both red while -0.166667 and 0.833333 are both magenta. 0074 * The range of chroma is from 0.0 (none) to 1.0 (full). Out of range values will be clamped. 0075 * The range of luma is from 0.0 (black) to 1.0 (white). Out of range values will be clamped. 0076 * 0077 * The hue, chroma and luma values are computed in linear (not sRGB) color space. 0078 * 0079 * @since 5.68 0080 */ 0081 KGUIADDONS_EXPORT QColor hcyColor(qreal hue, qreal chroma, qreal luma, qreal alpha = 1.0); 0082 0083 /** 0084 * Calculate the contrast ratio between two colors, according to the 0085 * W3C/WCAG2.0 algorithm, (Lmax + 0.05)/(Lmin + 0.05), where Lmax and Lmin 0086 * are the luma values of the lighter color and the darker color, 0087 * respectively. 0088 * 0089 * A contrast ration of 5:1 (result == 5.0) is the minimum for "normal" 0090 * text to be considered readable (large text can go as low as 3:1). The 0091 * ratio ranges from 1:1 (result == 1.0) to 21:1 (result == 21.0). 0092 * 0093 * @see KColorUtils::luma 0094 */ 0095 KGUIADDONS_EXPORT qreal contrastRatio(const QColor &, const QColor &); 0096 0097 /** 0098 * Adjust the luma of a color by changing its distance from white. 0099 * 0100 * @li amount == 1.0 gives white 0101 * @li amount == 0.5 results in a color whose luma is halfway between 1.0 0102 * and that of the original color 0103 * @li amount == 0.0 gives the original color 0104 * @li amount == -1.0 gives a color that is 'twice as far from white' as 0105 * the original color, that is luma(result) == 1.0 - 2*(1.0 - luma(color)) 0106 * 0107 * @param amount factor by which to adjust the luma component of the color 0108 * @param chromaInverseGain (optional) factor by which to adjust the chroma 0109 * component of the color; 1.0 means no change, 0.0 maximizes chroma 0110 * @see KColorUtils::shade 0111 */ 0112 KGUIADDONS_EXPORT QColor lighten(const QColor &, qreal amount = 0.5, qreal chromaInverseGain = 1.0); 0113 0114 /** 0115 * Adjust the luma of a color by changing its distance from black. 0116 * 0117 * @li amount == 1.0 gives black 0118 * @li amount == 0.5 results in a color whose luma is halfway between 0.0 0119 * and that of the original color 0120 * @li amount == 0.0 gives the original color 0121 * @li amount == -1.0 gives a color that is 'twice as far from black' as 0122 * the original color, that is luma(result) == 2*luma(color) 0123 * 0124 * @param amount factor by which to adjust the luma component of the color 0125 * @param chromaGain (optional) factor by which to adjust the chroma 0126 * component of the color; 1.0 means no change, 0.0 minimizes chroma 0127 * @see KColorUtils::shade 0128 */ 0129 KGUIADDONS_EXPORT QColor darken(const QColor &, qreal amount = 0.5, qreal chromaGain = 1.0); 0130 0131 /** 0132 * Adjust the luma and chroma components of a color. The amount is added 0133 * to the corresponding component. 0134 * 0135 * @param lumaAmount amount by which to adjust the luma component of the 0136 * color; 0.0 results in no change, -1.0 turns anything black, 1.0 turns 0137 * anything white 0138 * @param chromaAmount (optional) amount by which to adjust the chroma 0139 * component of the color; 0.0 results in no change, -1.0 minimizes chroma, 0140 * 1.0 maximizes chroma 0141 * @see KColorUtils::luma 0142 */ 0143 KGUIADDONS_EXPORT QColor shade(const QColor &, qreal lumaAmount, qreal chromaAmount = 0.0); 0144 0145 /** 0146 * Create a new color by tinting one color with another. This function is 0147 * meant for creating additional colors withings the same class (background, 0148 * foreground) from colors in a different class. Therefore when @p amount 0149 * is low, the luma of @p base is mostly preserved, while the hue and 0150 * chroma of @p color is mostly inherited. 0151 * 0152 * @param base color to be tinted 0153 * @param color color with which to tint 0154 * @param amount how strongly to tint the base; 0.0 gives @p base, 0155 * 1.0 gives @p color 0156 */ 0157 KGUIADDONS_EXPORT QColor tint(const QColor &base, const QColor &color, qreal amount = 0.3); 0158 0159 /** 0160 * Blend two colors into a new color by linear combination. 0161 * @code 0162 QColor lighter = KColorUtils::mix(myColor, Qt::white) 0163 * @endcode 0164 * @param c1 first color. 0165 * @param c2 second color. 0166 * @param bias weight to be used for the mix. @p bias <= 0 gives @p c1, 0167 * @p bias >= 1 gives @p c2. @p bias == 0.5 gives a 50% blend of @p c1 0168 * and @p c2. 0169 */ 0170 KGUIADDONS_EXPORT QColor mix(const QColor &c1, const QColor &c2, qreal bias = 0.5); 0171 0172 /** 0173 * Blend two colors into a new color by painting the second color over the 0174 * first using the specified composition mode. 0175 * @code 0176 QColor white(Qt::white); 0177 white.setAlphaF(0.5); 0178 QColor lighter = KColorUtils::overlayColors(myColor, white); 0179 @endcode 0180 * @param base the base color (alpha channel is ignored). 0181 * @param paint the color to be overlaid onto the base color. 0182 * @param comp the CompositionMode used to do the blending. 0183 */ 0184 KGUIADDONS_EXPORT QColor overlayColors(const QColor &base, const QColor &paint, QPainter::CompositionMode comp = QPainter::CompositionMode_SourceOver); 0185 } 0186 0187 #endif // KCOLORUTILS_H