/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** 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 http://www.qt.io/terms-conditions. For further ** information use the contact form at http://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 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qglobal.h" #include "qrgb.h" #include "qstringlist.h" #include QT_BEGIN_NAMESPACE static inline int h2i(char hex) { if (hex >= '0' && hex <= '9') return hex - '0'; if (hex >= 'a' && hex <= 'f') return hex - 'a' + 10; if (hex >= 'A' && hex <= 'F') return hex - 'A' + 10; return -1; } static inline int hex2int(const char *s) { return (h2i(s[0]) << 4) | h2i(s[1]); } static inline int hex2int(char s) { int h = h2i(s); return (h << 4) | h; } bool qt_get_hex_rgb(const char *name, QRgb *rgb) { if(name[0] != '#') return false; name++; int len = qstrlen(name); int a, r, g, b; a = 255; if (len == 12) { r = hex2int(name); g = hex2int(name + 4); b = hex2int(name + 8); } else if (len == 9) { r = hex2int(name); g = hex2int(name + 3); b = hex2int(name + 6); } else if (len == 8) { a = hex2int(name); r = hex2int(name + 2); g = hex2int(name + 4); b = hex2int(name + 6); } else if (len == 6) { r = hex2int(name); g = hex2int(name + 2); b = hex2int(name + 4); } else if (len == 3) { r = hex2int(name[0]); g = hex2int(name[1]); b = hex2int(name[2]); } else { r = g = b = -1; } if ((uint)r > 255 || (uint)g > 255 || (uint)b > 255 || (uint)a > 255) { *rgb = 0; return false; } *rgb = qRgba(r, g ,b, a); return true; } bool qt_get_hex_rgb(const QChar *str, int len, QRgb *rgb) { if (len > 13) return false; char tmp[16]; for(int i = 0; i < len; ++i) tmp[i] = str[i].toLatin1(); tmp[len] = 0; return qt_get_hex_rgb(tmp, rgb); } #ifndef QT_NO_COLORNAMES /* CSS color names = SVG 1.0 color names + transparent (rgba(0,0,0,0)) */ #ifdef rgb # undef rgb #endif #define rgb(r,g,b) (0xff000000 | (r << 16) | (g << 8) | b) static const struct RGBData { const char *name; uint value; } rgbTbl[] = { { "aliceblue", rgb(240, 248, 255) }, { "antiquewhite", rgb(250, 235, 215) }, { "aqua", rgb( 0, 255, 255) }, { "aquamarine", rgb(127, 255, 212) }, { "azure", rgb(240, 255, 255) }, { "beige", rgb(245, 245, 220) }, { "bisque", rgb(255, 228, 196) }, { "black", rgb( 0, 0, 0) }, { "blanchedalmond", rgb(255, 235, 205) }, { "blue", rgb( 0, 0, 255) }, { "blueviolet", rgb(138, 43, 226) }, { "brown", rgb(165, 42, 42) }, { "burlywood", rgb(222, 184, 135) }, { "cadetblue", rgb( 95, 158, 160) }, { "chartreuse", rgb(127, 255, 0) }, { "chocolate", rgb(210, 105, 30) }, { "coral", rgb(255, 127, 80) }, { "cornflowerblue", rgb(100, 149, 237) }, { "cornsilk", rgb(255, 248, 220) }, { "crimson", rgb(220, 20, 60) }, { "cyan", rgb( 0, 255, 255) }, { "darkblue", rgb( 0, 0, 139) }, { "darkcyan", rgb( 0, 139, 139) }, { "darkgoldenrod", rgb(184, 134, 11) }, { "darkgray", rgb(169, 169, 169) }, { "darkgreen", rgb( 0, 100, 0) }, { "darkgrey", rgb(169, 169, 169) }, { "darkkhaki", rgb(189, 183, 107) }, { "darkmagenta", rgb(139, 0, 139) }, { "darkolivegreen", rgb( 85, 107, 47) }, { "darkorange", rgb(255, 140, 0) }, { "darkorchid", rgb(153, 50, 204) }, { "darkred", rgb(139, 0, 0) }, { "darksalmon", rgb(233, 150, 122) }, { "darkseagreen", rgb(143, 188, 143) }, { "darkslateblue", rgb( 72, 61, 139) }, { "darkslategray", rgb( 47, 79, 79) }, { "darkslategrey", rgb( 47, 79, 79) }, { "darkturquoise", rgb( 0, 206, 209) }, { "darkviolet", rgb(148, 0, 211) }, { "deeppink", rgb(255, 20, 147) }, { "deepskyblue", rgb( 0, 191, 255) }, { "dimgray", rgb(105, 105, 105) }, { "dimgrey", rgb(105, 105, 105) }, { "dodgerblue", rgb( 30, 144, 255) }, { "firebrick", rgb(178, 34, 34) }, { "floralwhite", rgb(255, 250, 240) }, { "forestgreen", rgb( 34, 139, 34) }, { "fuchsia", rgb(255, 0, 255) }, { "gainsboro", rgb(220, 220, 220) }, { "ghostwhite", rgb(248, 248, 255) }, { "gold", rgb(255, 215, 0) }, { "goldenrod", rgb(218, 165, 32) }, { "gray", rgb(128, 128, 128) }, { "green", rgb( 0, 128, 0) }, { "greenyellow", rgb(173, 255, 47) }, { "grey", rgb(128, 128, 128) }, { "honeydew", rgb(240, 255, 240) }, { "hotpink", rgb(255, 105, 180) }, { "indianred", rgb(205, 92, 92) }, { "indigo", rgb( 75, 0, 130) }, { "ivory", rgb(255, 255, 240) }, { "khaki", rgb(240, 230, 140) }, { "lavender", rgb(230, 230, 250) }, { "lavenderblush", rgb(255, 240, 245) }, { "lawngreen", rgb(124, 252, 0) }, { "lemonchiffon", rgb(255, 250, 205) }, { "lightblue", rgb(173, 216, 230) }, { "lightcoral", rgb(240, 128, 128) }, { "lightcyan", rgb(224, 255, 255) }, { "lightgoldenrodyellow", rgb(250, 250, 210) }, { "lightgray", rgb(211, 211, 211) }, { "lightgreen", rgb(144, 238, 144) }, { "lightgrey", rgb(211, 211, 211) }, { "lightpink", rgb(255, 182, 193) }, { "lightsalmon", rgb(255, 160, 122) }, { "lightseagreen", rgb( 32, 178, 170) }, { "lightskyblue", rgb(135, 206, 250) }, { "lightslategray", rgb(119, 136, 153) }, { "lightslategrey", rgb(119, 136, 153) }, { "lightsteelblue", rgb(176, 196, 222) }, { "lightyellow", rgb(255, 255, 224) }, { "lime", rgb( 0, 255, 0) }, { "limegreen", rgb( 50, 205, 50) }, { "linen", rgb(250, 240, 230) }, { "magenta", rgb(255, 0, 255) }, { "maroon", rgb(128, 0, 0) }, { "mediumaquamarine", rgb(102, 205, 170) }, { "mediumblue", rgb( 0, 0, 205) }, { "mediumorchid", rgb(186, 85, 211) }, { "mediumpurple", rgb(147, 112, 219) }, { "mediumseagreen", rgb( 60, 179, 113) }, { "mediumslateblue", rgb(123, 104, 238) }, { "mediumspringgreen", rgb( 0, 250, 154) }, { "mediumturquoise", rgb( 72, 209, 204) }, { "mediumvioletred", rgb(199, 21, 133) }, { "midnightblue", rgb( 25, 25, 112) }, { "mintcream", rgb(245, 255, 250) }, { "mistyrose", rgb(255, 228, 225) }, { "moccasin", rgb(255, 228, 181) }, { "navajowhite", rgb(255, 222, 173) }, { "navy", rgb( 0, 0, 128) }, { "oldlace", rgb(253, 245, 230) }, { "olive", rgb(128, 128, 0) }, { "olivedrab", rgb(107, 142, 35) }, { "orange", rgb(255, 165, 0) }, { "orangered", rgb(255, 69, 0) }, { "orchid", rgb(218, 112, 214) }, { "palegoldenrod", rgb(238, 232, 170) }, { "palegreen", rgb(152, 251, 152) }, { "paleturquoise", rgb(175, 238, 238) }, { "palevioletred", rgb(219, 112, 147) }, { "papayawhip", rgb(255, 239, 213) }, { "peachpuff", rgb(255, 218, 185) }, { "peru", rgb(205, 133, 63) }, { "pink", rgb(255, 192, 203) }, { "plum", rgb(221, 160, 221) }, { "powderblue", rgb(176, 224, 230) }, { "purple", rgb(128, 0, 128) }, { "red", rgb(255, 0, 0) }, { "rosybrown", rgb(188, 143, 143) }, { "royalblue", rgb( 65, 105, 225) }, { "saddlebrown", rgb(139, 69, 19) }, { "salmon", rgb(250, 128, 114) }, { "sandybrown", rgb(244, 164, 96) }, { "seagreen", rgb( 46, 139, 87) }, { "seashell", rgb(255, 245, 238) }, { "sienna", rgb(160, 82, 45) }, { "silver", rgb(192, 192, 192) }, { "skyblue", rgb(135, 206, 235) }, { "slateblue", rgb(106, 90, 205) }, { "slategray", rgb(112, 128, 144) }, { "slategrey", rgb(112, 128, 144) }, { "snow", rgb(255, 250, 250) }, { "springgreen", rgb( 0, 255, 127) }, { "steelblue", rgb( 70, 130, 180) }, { "tan", rgb(210, 180, 140) }, { "teal", rgb( 0, 128, 128) }, { "thistle", rgb(216, 191, 216) }, { "tomato", rgb(255, 99, 71) }, { "transparent", 0 }, { "turquoise", rgb( 64, 224, 208) }, { "violet", rgb(238, 130, 238) }, { "wheat", rgb(245, 222, 179) }, { "white", rgb(255, 255, 255) }, { "whitesmoke", rgb(245, 245, 245) }, { "yellow", rgb(255, 255, 0) }, { "yellowgreen", rgb(154, 205, 50) } }; static const int rgbTblSize = sizeof(rgbTbl) / sizeof(RGBData); #undef rgb #if defined(Q_CC_MSVC) && _MSC_VER < 1600 inline bool operator<(const RGBData &data1, const RGBData &data2) { return qstrcmp(data1.name, data2.name) < 0; } #endif inline bool operator<(const char *name, const RGBData &data) { return qstrcmp(name, data.name) < 0; } inline bool operator<(const RGBData &data, const char *name) { return qstrcmp(data.name, name) < 0; } static bool get_named_rgb(const char *name_no_space, QRgb *rgb) { const RGBData *r = std::lower_bound(rgbTbl, rgbTbl + rgbTblSize, name_no_space); if ((r != rgbTbl + rgbTblSize) && !(name_no_space < *r)) { *rgb = r->value; return true; } return false; } bool qt_get_named_rgb(const char *name, QRgb* rgb) { int len = int(strlen(name)); if(len > 255) return false; char name_no_space[256]; int pos = 0; for(int i = 0; i < len; i++) { if(name[i] != '\t' && name[i] != ' ') name_no_space[pos++] = QChar::toLower(name[i]); } name_no_space[pos] = 0; return get_named_rgb(name_no_space, rgb); } bool qt_get_named_rgb(const QChar *name, int len, QRgb *rgb) { if(len > 255) return false; char name_no_space[256]; int pos = 0; for(int i = 0; i < len; i++) { if(name[i] != QLatin1Char('\t') && name[i] != QLatin1Char(' ')) name_no_space[pos++] = name[i].toLower().toLatin1(); } name_no_space[pos] = 0; return get_named_rgb(name_no_space, rgb); } uint qt_get_rgb_val(const char *name) { QRgb r = 0; qt_get_named_rgb(name,&r); return r; } QStringList qt_get_colornames() { int i = 0; QStringList lst; lst.reserve(rgbTblSize); for (i = 0; i < rgbTblSize; i++) lst << QLatin1String(rgbTbl[i].name); return lst; } #else bool qt_get_named_rgb(const char *, QRgb*) { return false; } uint qt_get_rgb_val(const char *) { return 0; } QStringList qt_get_colornames() { return QStringList(); } #endif // QT_NO_COLORNAMES QT_END_NAMESPACE