|
/*
|
|
* Copyright 2006 The Android Open Source Project
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
|
|
#include "include/utils/SkParse.h"
|
|
|
|
static constexpr const char* gColorNames[] = {
|
|
"aliceblue",
|
|
"antiquewhite",
|
|
"aqua",
|
|
"aquamarine",
|
|
"azure",
|
|
"beige",
|
|
"bisque",
|
|
"black",
|
|
"blanchedalmond",
|
|
"blue",
|
|
"blueviolet",
|
|
"brown",
|
|
"burlywood",
|
|
"cadetblue",
|
|
"chartreuse",
|
|
"chocolate",
|
|
"coral",
|
|
"cornflowerblue",
|
|
"cornsilk",
|
|
"crimson",
|
|
"cyan",
|
|
"darkblue",
|
|
"darkcyan",
|
|
"darkgoldenrod",
|
|
"darkgray",
|
|
"darkgreen",
|
|
"darkkhaki",
|
|
"darkmagenta",
|
|
"darkolivegreen",
|
|
"darkorange",
|
|
"darkorchid",
|
|
"darkred",
|
|
"darksalmon",
|
|
"darkseagreen",
|
|
"darkslateblue",
|
|
"darkslategray",
|
|
"darkturquoise",
|
|
"darkviolet",
|
|
"deeppink",
|
|
"deepskyblue",
|
|
"dimgray",
|
|
"dodgerblue",
|
|
"firebrick",
|
|
"floralwhite",
|
|
"forestgreen",
|
|
"fuchsia",
|
|
"gainsboro",
|
|
"ghostwhite",
|
|
"gold",
|
|
"goldenrod",
|
|
"gray",
|
|
"green",
|
|
"greenyellow",
|
|
"honeydew",
|
|
"hotpink",
|
|
"indianred",
|
|
"indigo",
|
|
"ivory",
|
|
"khaki",
|
|
"lavender",
|
|
"lavenderblush",
|
|
"lawngreen",
|
|
"lemonchiffon",
|
|
"lightblue",
|
|
"lightcoral",
|
|
"lightcyan",
|
|
"lightgoldenrodyellow",
|
|
"lightgreen",
|
|
"lightgrey",
|
|
"lightpink",
|
|
"lightsalmon",
|
|
"lightseagreen",
|
|
"lightskyblue",
|
|
"lightslategray",
|
|
"lightsteelblue",
|
|
"lightyellow",
|
|
"lime",
|
|
"limegreen",
|
|
"linen",
|
|
"magenta",
|
|
"maroon",
|
|
"mediumaquamarine",
|
|
"mediumblue",
|
|
"mediumorchid",
|
|
"mediumpurple",
|
|
"mediumseagreen",
|
|
"mediumslateblue",
|
|
"mediumspringgreen",
|
|
"mediumturquoise",
|
|
"mediumvioletred",
|
|
"midnightblue",
|
|
"mintcream",
|
|
"mistyrose",
|
|
"moccasin",
|
|
"navajowhite",
|
|
"navy",
|
|
"oldlace",
|
|
"olive",
|
|
"olivedrab",
|
|
"orange",
|
|
"orangered",
|
|
"orchid",
|
|
"palegoldenrod",
|
|
"palegreen",
|
|
"paleturquoise",
|
|
"palevioletred",
|
|
"papayawhip",
|
|
"peachpuff",
|
|
"peru",
|
|
"pink",
|
|
"plum",
|
|
"powderblue",
|
|
"purple",
|
|
"red",
|
|
"rosybrown",
|
|
"royalblue",
|
|
"saddlebrown",
|
|
"salmon",
|
|
"sandybrown",
|
|
"seagreen",
|
|
"seashell",
|
|
"sienna",
|
|
"silver",
|
|
"skyblue",
|
|
"slateblue",
|
|
"slategray",
|
|
"snow",
|
|
"springgreen",
|
|
"steelblue",
|
|
"tan",
|
|
"teal",
|
|
"thistle",
|
|
"tomato",
|
|
"turquoise",
|
|
"violet",
|
|
"wheat",
|
|
"white",
|
|
"whitesmoke",
|
|
"yellow",
|
|
"yellowgreen",
|
|
};
|
|
|
|
static constexpr struct ColorRec {
|
|
uint8_t r, g, b;
|
|
} gColors[] = {
|
|
{ 0xf0,0xf8,0xff }, // aliceblue
|
|
{ 0xfa,0xeb,0xd7 }, // antiquewhite
|
|
{ 0x00,0xff,0xff }, // aqua
|
|
{ 0x7f,0xff,0xd4 }, // aquamarine
|
|
{ 0xf0,0xff,0xff }, // azure
|
|
{ 0xf5,0xf5,0xdc }, // beige
|
|
{ 0xff,0xe4,0xc4 }, // bisque
|
|
{ 0x00,0x00,0x00 }, // black
|
|
{ 0xff,0xeb,0xcd }, // blanchedalmond
|
|
{ 0x00,0x00,0xff }, // blue
|
|
{ 0x8a,0x2b,0xe2 }, // blueviolet
|
|
{ 0xa5,0x2a,0x2a }, // brown
|
|
{ 0xde,0xb8,0x87 }, // burlywood
|
|
{ 0x5f,0x9e,0xa0 }, // cadetblue
|
|
{ 0x7f,0xff,0x00 }, // chartreuse
|
|
{ 0xd2,0x69,0x1e }, // chocolate
|
|
{ 0xff,0x7f,0x50 }, // coral
|
|
{ 0x64,0x95,0xed }, // cornflowerblue
|
|
{ 0xff,0xf8,0xdc }, // cornsilk
|
|
{ 0xdc,0x14,0x3c }, // crimson
|
|
{ 0x00,0xff,0xff }, // cyan
|
|
{ 0x00,0x00,0x8b }, // darkblue
|
|
{ 0x00,0x8b,0x8b }, // darkcyan
|
|
{ 0xb8,0x86,0x0b }, // darkgoldenrod
|
|
{ 0xa9,0xa9,0xa9 }, // darkgray
|
|
{ 0x00,0x64,0x00 }, // darkgreen
|
|
{ 0xbd,0xb7,0x6b }, // darkkhaki
|
|
{ 0x8b,0x00,0x8b }, // darkmagenta
|
|
{ 0x55,0x6b,0x2f }, // darkolivegreen
|
|
{ 0xff,0x8c,0x00 }, // darkorange
|
|
{ 0x99,0x32,0xcc }, // darkorchid
|
|
{ 0x8b,0x00,0x00 }, // darkred
|
|
{ 0xe9,0x96,0x7a }, // darksalmon
|
|
{ 0x8f,0xbc,0x8f }, // darkseagreen
|
|
{ 0x48,0x3d,0x8b }, // darkslateblue
|
|
{ 0x2f,0x4f,0x4f }, // darkslategray
|
|
{ 0x00,0xce,0xd1 }, // darkturquoise
|
|
{ 0x94,0x00,0xd3 }, // darkviolet
|
|
{ 0xff,0x14,0x93 }, // deeppink
|
|
{ 0x00,0xbf,0xff }, // deepskyblue
|
|
{ 0x69,0x69,0x69 }, // dimgray
|
|
{ 0x1e,0x90,0xff }, // dodgerblue
|
|
{ 0xb2,0x22,0x22 }, // firebrick
|
|
{ 0xff,0xfa,0xf0 }, // floralwhite
|
|
{ 0x22,0x8b,0x22 }, // forestgreen
|
|
{ 0xff,0x00,0xff }, // fuchsia
|
|
{ 0xdc,0xdc,0xdc }, // gainsboro
|
|
{ 0xf8,0xf8,0xff }, // ghostwhite
|
|
{ 0xff,0xd7,0x00 }, // gold
|
|
{ 0xda,0xa5,0x20 }, // goldenrod
|
|
{ 0x80,0x80,0x80 }, // gray
|
|
{ 0x00,0x80,0x00 }, // green
|
|
{ 0xad,0xff,0x2f }, // greenyellow
|
|
{ 0xf0,0xff,0xf0 }, // honeydew
|
|
{ 0xff,0x69,0xb4 }, // hotpink
|
|
{ 0xcd,0x5c,0x5c }, // indianred
|
|
{ 0x4b,0x00,0x82 }, // indigo
|
|
{ 0xff,0xff,0xf0 }, // ivory
|
|
{ 0xf0,0xe6,0x8c }, // khaki
|
|
{ 0xe6,0xe6,0xfa }, // lavender
|
|
{ 0xff,0xf0,0xf5 }, // lavenderblush
|
|
{ 0x7c,0xfc,0x00 }, // lawngreen
|
|
{ 0xff,0xfa,0xcd }, // lemonchiffon
|
|
{ 0xad,0xd8,0xe6 }, // lightblue
|
|
{ 0xf0,0x80,0x80 }, // lightcoral
|
|
{ 0xe0,0xff,0xff }, // lightcyan
|
|
{ 0xfa,0xfa,0xd2 }, // lightgoldenrodyellow
|
|
{ 0x90,0xee,0x90 }, // lightgreen
|
|
{ 0xd3,0xd3,0xd3 }, // lightgrey
|
|
{ 0xff,0xb6,0xc1 }, // lightpink
|
|
{ 0xff,0xa0,0x7a }, // lightsalmon
|
|
{ 0x20,0xb2,0xaa }, // lightseagreen
|
|
{ 0x87,0xce,0xfa }, // lightskyblue
|
|
{ 0x77,0x88,0x99 }, // lightslategray
|
|
{ 0xb0,0xc4,0xde }, // lightsteelblue
|
|
{ 0xff,0xff,0xe0 }, // lightyellow
|
|
{ 0x00,0xff,0x00 }, // lime
|
|
{ 0x32,0xcd,0x32 }, // limegreen
|
|
{ 0xfa,0xf0,0xe6 }, // linen
|
|
{ 0xff,0x00,0xff }, // magenta
|
|
{ 0x80,0x00,0x00 }, // maroon
|
|
{ 0x66,0xcd,0xaa }, // mediumaquamarine
|
|
{ 0x00,0x00,0xcd }, // mediumblue
|
|
{ 0xba,0x55,0xd3 }, // mediumorchid
|
|
{ 0x93,0x70,0xdb }, // mediumpurple
|
|
{ 0x3c,0xb3,0x71 }, // mediumseagreen
|
|
{ 0x7b,0x68,0xee }, // mediumslateblue
|
|
{ 0x00,0xfa,0x9a }, // mediumspringgreen
|
|
{ 0x48,0xd1,0xcc }, // mediumturquoise
|
|
{ 0xc7,0x15,0x85 }, // mediumvioletred
|
|
{ 0x19,0x19,0x70 }, // midnightblue
|
|
{ 0xf5,0xff,0xfa }, // mintcream
|
|
{ 0xff,0xe4,0xe1 }, // mistyrose
|
|
{ 0xff,0xe4,0xb5 }, // moccasin
|
|
{ 0xff,0xde,0xad }, // navajowhite
|
|
{ 0x00,0x00,0x80 }, // navy
|
|
{ 0xfd,0xf5,0xe6 }, // oldlace
|
|
{ 0x80,0x80,0x00 }, // olive
|
|
{ 0x6b,0x8e,0x23 }, // olivedrab
|
|
{ 0xff,0xa5,0x00 }, // orange
|
|
{ 0xff,0x45,0x00 }, // orangered
|
|
{ 0xda,0x70,0xd6 }, // orchid
|
|
{ 0xee,0xe8,0xaa }, // palegoldenrod
|
|
{ 0x98,0xfb,0x98 }, // palegreen
|
|
{ 0xaf,0xee,0xee }, // paleturquoise
|
|
{ 0xdb,0x70,0x93 }, // palevioletred
|
|
{ 0xff,0xef,0xd5 }, // papayawhip
|
|
{ 0xff,0xda,0xb9 }, // peachpuff
|
|
{ 0xcd,0x85,0x3f }, // peru
|
|
{ 0xff,0xc0,0xcb }, // pink
|
|
{ 0xdd,0xa0,0xdd }, // plum
|
|
{ 0xb0,0xe0,0xe6 }, // powderblue
|
|
{ 0x80,0x00,0x80 }, // purple
|
|
{ 0xff,0x00,0x00 }, // red
|
|
{ 0xbc,0x8f,0x8f }, // rosybrown
|
|
{ 0x41,0x69,0xe1 }, // royalblue
|
|
{ 0x8b,0x45,0x13 }, // saddlebrown
|
|
{ 0xfa,0x80,0x72 }, // salmon
|
|
{ 0xf4,0xa4,0x60 }, // sandybrown
|
|
{ 0x2e,0x8b,0x57 }, // seagreen
|
|
{ 0xff,0xf5,0xee }, // seashell
|
|
{ 0xa0,0x52,0x2d }, // sienna
|
|
{ 0xc0,0xc0,0xc0 }, // silver
|
|
{ 0x87,0xce,0xeb }, // skyblue
|
|
{ 0x6a,0x5a,0xcd }, // slateblue
|
|
{ 0x70,0x80,0x90 }, // slategray
|
|
{ 0xff,0xfa,0xfa }, // snow
|
|
{ 0x00,0xff,0x7f }, // springgreen
|
|
{ 0x46,0x82,0xb4 }, // steelblue
|
|
{ 0xd2,0xb4,0x8c }, // tan
|
|
{ 0x00,0x80,0x80 }, // teal
|
|
{ 0xd8,0xbf,0xd8 }, // thistle
|
|
{ 0xff,0x63,0x47 }, // tomato
|
|
{ 0x40,0xe0,0xd0 }, // turquoise
|
|
{ 0xee,0x82,0xee }, // violet
|
|
{ 0xf5,0xde,0xb3 }, // wheat
|
|
{ 0xff,0xff,0xff }, // white
|
|
{ 0xf5,0xf5,0xf5 }, // whitesmoke
|
|
{ 0xff,0xff,0x00 }, // yellow
|
|
{ 0x9a,0xcd,0x32 }, // yellowgreen
|
|
};
|
|
|
|
const char* SkParse::FindNamedColor(const char* name, size_t len, SkColor* color) {
|
|
int Tot = 140;
|
|
int i;
|
|
bool found = 0;
|
|
|
|
for (i=0; i<Tot; i++) {
|
|
if (strcmp(name, gColorNames[i]) == 0) {
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) return nullptr;
|
|
|
|
if (color) {
|
|
*color = SkColorSetRGB(gColors[i].r, gColors[i].g, gColors[i].b);
|
|
}
|
|
|
|
return name + strlen(name);
|
|
|
|
/*const auto rec = std::lower_bound(std::begin(gColorNames),
|
|
std::end (gColorNames),
|
|
name, // key
|
|
[](const char* name, const char* key) {
|
|
return strcmp(name, key) < 0;
|
|
});
|
|
|
|
if (rec == std::end(gColorNames) || 0 != strcmp(name, *rec)) {
|
|
return nullptr;
|
|
}
|
|
|
|
if (color) {
|
|
int index = rec - gColorNames;
|
|
*color = SkColorSetRGB(gColors[index].r, gColors[index].g, gColors[index].b);
|
|
}
|
|
|
|
return name + strlen(*rec);*/
|
|
}
|
|
|
|
// !!! move to char utilities
|
|
//static int count_separators(const char* str, const char* sep) {
|
|
// char c;
|
|
// int separators = 0;
|
|
// while ((c = *str++) != '\0') {
|
|
// if (strchr(sep, c) == nullptr)
|
|
// continue;
|
|
// do {
|
|
// if ((c = *str++) == '\0')
|
|
// goto goHome;
|
|
// } while (strchr(sep, c) != nullptr);
|
|
// separators++;
|
|
// }
|
|
//goHome:
|
|
// return separators;
|
|
//}
|
|
|
|
static inline unsigned nib2byte(unsigned n)
|
|
{
|
|
SkASSERT((n & ~0xF) == 0);
|
|
return (n << 4) | n;
|
|
}
|
|
|
|
const char* SkParse::FindColor(const char* value, SkColor* colorPtr) {
|
|
unsigned int oldAlpha = SkColorGetA(*colorPtr);
|
|
if (value[0] == '#') {
|
|
uint32_t hex;
|
|
const char* end = SkParse::FindHex(value + 1, &hex);
|
|
// SkASSERT(end);
|
|
if (end == nullptr)
|
|
return end;
|
|
size_t len = end - value - 1;
|
|
if (len == 3 || len == 4) {
|
|
unsigned a = len == 4 ? nib2byte(hex >> 12) : oldAlpha;
|
|
unsigned r = nib2byte((hex >> 8) & 0xF);
|
|
unsigned g = nib2byte((hex >> 4) & 0xF);
|
|
unsigned b = nib2byte(hex & 0xF);
|
|
*colorPtr = SkColorSetARGB(a, r, g, b);
|
|
return end;
|
|
} else if (len == 6 || len == 8) {
|
|
if (len == 6)
|
|
hex |= oldAlpha << 24;
|
|
*colorPtr = hex;
|
|
return end;
|
|
} else {
|
|
// SkASSERT(0);
|
|
return nullptr;
|
|
}
|
|
// } else if (strchr(value, ',')) {
|
|
// SkScalar array[4];
|
|
// int count = count_separators(value, ",") + 1; // !!! count commas, add 1
|
|
// SkASSERT(count == 3 || count == 4);
|
|
// array[0] = SK_Scalar1 * 255;
|
|
// const char* end = SkParse::FindScalars(value, &array[4 - count], count);
|
|
// if (end == nullptr)
|
|
// return nullptr;
|
|
// !!! range check for errors?
|
|
// *colorPtr = SkColorSetARGB(SkScalarRoundToInt(array[0]), SkScalarRoundToInt(array[1]),
|
|
// SkScalarRoundToInt(array[2]), SkScalarRoundToInt(array[3]));
|
|
// return end;
|
|
} else
|
|
return FindNamedColor(value, strlen(value), colorPtr);
|
|
}
|