
/*
 * 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 "SkParse.h"

#ifdef SK_DEBUG
#include "SkString.h"

#ifdef SK_SUPPORT_UNITTEST
    // compress names 6 chars per long (packed 5 bits/char )
        // note: little advantage to splitting chars across longs, since 3 longs at 2 unused bits each
        // allow for one additional split char (vs. the 18 unsplit chars in the three longs)
    // use extra two bits to represent:
        // 00 : final 6 (or fewer) chars (if 'a' is 0x01, zero could have special meaning)
        // 01 : not final 6 chars
        // 10 : color
        // 11 : unused, except as debugging sentinal? (could be -1 for easier test)
    // !!! the bit to end the word (last) is at the low bit for binary search
    // lookup first character in offset for quick start
        // offset is 27-entry table of bytes(?) that trims linear search to at most 21 entries ('d')
    // shift match into long; set bit 30 if it all doesn't fit
    // while longs don't match, march forward
        // if they do match, and bit 30 is set, advance match, clearing bit 30 if
        // final chars, and advance to next test
        // if they do match, and bit 30 is clear, get next long (color) and return it
    // stop at lookup of first char + 1
static const struct SkNameRGB {
    const char* name;
    int rgb;
} colorNames[] = {
    { "aliceblue",            0xF0F8FF },
    { "antiquewhite",         0xFAEBD7 },
    { "aqua",                 0x00FFFF },
    { "aquamarine",           0x7FFFD4 },
    { "azure",                0xF0FFFF },
    { "beige",                0xF5F5DC },
    { "bisque",               0xFFE4C4 },
    { "black",                0x000000 },
    { "blanchedalmond",       0xFFEBCD },
    { "blue",                 0x0000FF },
    { "blueviolet",           0x8A2BE2 },
    { "brown",                0xA52A2A },
    { "burlywood",            0xDEB887 },
    { "cadetblue",            0x5F9EA0 },
    { "chartreuse",           0x7FFF00 },
    { "chocolate",            0xD2691E },
    { "coral",                0xFF7F50 },
    { "cornflowerblue",       0x6495ED },
    { "cornsilk",             0xFFF8DC },
    { "crimson",              0xDC143C },
    { "cyan",                 0x00FFFF },
    { "darkblue",             0x00008B },
    { "darkcyan",             0x008B8B },
    { "darkgoldenrod",        0xB8860B },
    { "darkgray",             0xA9A9A9 },
    { "darkgreen",            0x006400 },
    { "darkkhaki",            0xBDB76B },
    { "darkmagenta",          0x8B008B },
    { "darkolivegreen",       0x556B2F },
    { "darkorange",           0xFF8C00 },
    { "darkorchid",           0x9932CC },
    { "darkred",              0x8B0000 },
    { "darksalmon",           0xE9967A },
    { "darkseagreen",         0x8FBC8F },
    { "darkslateblue",        0x483D8B },
    { "darkslategray",        0x2F4F4F },
    { "darkturquoise",        0x00CED1 },
    { "darkviolet",           0x9400D3 },
    { "deeppink",             0xFF1493 },
    { "deepskyblue",          0x00BFFF },
    { "dimgray",              0x696969 },
    { "dodgerblue",           0x1E90FF },
    { "firebrick",            0xB22222 },
    { "floralwhite",          0xFFFAF0 },
    { "forestgreen",          0x228B22 },
    { "fuchsia",              0xFF00FF },
    { "gainsboro",            0xDCDCDC },
    { "ghostwhite",           0xF8F8FF },
    { "gold",                 0xFFD700 },
    { "goldenrod",            0xDAA520 },
    { "gray",                 0x808080 },
    { "green",                0x008000 },
    { "greenyellow",          0xADFF2F },
    { "honeydew",             0xF0FFF0 },
    { "hotpink",              0xFF69B4 },
    { "indianred",            0xCD5C5C },
    { "indigo",               0x4B0082 },
    { "ivory",                0xFFFFF0 },
    { "khaki",                0xF0E68C },
    { "lavender",             0xE6E6FA },
    { "lavenderblush",        0xFFF0F5 },
    { "lawngreen",            0x7CFC00 },
    { "lemonchiffon",         0xFFFACD },
    { "lightblue",            0xADD8E6 },
    { "lightcoral",           0xF08080 },
    { "lightcyan",            0xE0FFFF },
    { "lightgoldenrodyellow", 0xFAFAD2 },
    { "lightgreen",           0x90EE90 },
    { "lightgrey",            0xD3D3D3 },
    { "lightpink",            0xFFB6C1 },
    { "lightsalmon",          0xFFA07A },
    { "lightseagreen",        0x20B2AA },
    { "lightskyblue",         0x87CEFA },
    { "lightslategray",       0x778899 },
    { "lightsteelblue",       0xB0C4DE },
    { "lightyellow",          0xFFFFE0 },
    { "lime",                 0x00FF00 },
    { "limegreen",            0x32CD32 },
    { "linen",                0xFAF0E6 },
    { "magenta",              0xFF00FF },
    { "maroon",               0x800000 },
    { "mediumaquamarine",     0x66CDAA },
    { "mediumblue",           0x0000CD },
    { "mediumorchid",         0xBA55D3 },
    { "mediumpurple",         0x9370DB },
    { "mediumseagreen",       0x3CB371 },
    { "mediumslateblue",      0x7B68EE },
    { "mediumspringgreen",    0x00FA9A },
    { "mediumturquoise",      0x48D1CC },
    { "mediumvioletred",      0xC71585 },
    { "midnightblue",         0x191970 },
    { "mintcream",            0xF5FFFA },
    { "mistyrose",            0xFFE4E1 },
    { "moccasin",             0xFFE4B5 },
    { "navajowhite",          0xFFDEAD },
    { "navy",                 0x000080 },
    { "oldlace",              0xFDF5E6 },
    { "olive",                0x808000 },
    { "olivedrab",            0x6B8E23 },
    { "orange",               0xFFA500 },
    { "orangered",            0xFF4500 },
    { "orchid",               0xDA70D6 },
    { "palegoldenrod",        0xEEE8AA },
    { "palegreen",            0x98FB98 },
    { "paleturquoise",        0xAFEEEE },
    { "palevioletred",        0xDB7093 },
    { "papayawhip",           0xFFEFD5 },
    { "peachpuff",            0xFFDAB9 },
    { "peru",                 0xCD853F },
    { "pink",                 0xFFC0CB },
    { "plum",                 0xDDA0DD },
    { "powderblue",           0xB0E0E6 },
    { "purple",               0x800080 },
    { "red",                  0xFF0000 },
    { "rosybrown",            0xBC8F8F },
    { "royalblue",            0x4169E1 },
    { "saddlebrown",          0x8B4513 },
    { "salmon",               0xFA8072 },
    { "sandybrown",           0xF4A460 },
    { "seagreen",             0x2E8B57 },
    { "seashell",             0xFFF5EE },
    { "sienna",               0xA0522D },
    { "silver",               0xC0C0C0 },
    { "skyblue",              0x87CEEB },
    { "slateblue",            0x6A5ACD },
    { "slategray",            0x708090 },
    { "snow",                 0xFFFAFA },
    { "springgreen",          0x00FF7F },
    { "steelblue",            0x4682B4 },
    { "tan",                  0xD2B48C },
    { "teal",                 0x008080 },
    { "thistle",              0xD8BFD8 },
    { "tomato",               0xFF6347 },
    { "turquoise",            0x40E0D0 },
    { "violet",               0xEE82EE },
    { "wheat",                0xF5DEB3 },
    { "white",                0xFFFFFF },
    { "whitesmoke",           0xF5F5F5 },
    { "yellow",               0xFFFF00 },
    { "yellowgreen",          0x9ACD32 }
};

int colorNamesSize = SK_ARRAY_COUNT(colorNames);

static void CreateTable() {
    SkString comment;
    size_t originalSize = 0;
    int replacement = 0;
    for (int index = 0; index < colorNamesSize; index++) {
        SkNameRGB nameRGB =  colorNames[index];
        const char* name = nameRGB.name;
        size_t len = strlen(name);
        originalSize += len + 9;
        bool first = true;
        bool last = false;
        do {
            int compressed = 0;
            const char* start = name;
            for (int chIndex = 0; chIndex < 6; chIndex++) {
                compressed <<= 5;
                compressed |= *name ? *name++ - 'a' + 1 : 0 ;
            }
            replacement += sizeof(int);
            compressed <<= 1;
            compressed |= 1;
            if (first) {
                compressed |= 0x80000000;
                first = false;
            }
            if (len <= 6) { // last
                compressed &= ~1;
                last = true;
            }
            len -= 6;
            SkDebugf("0x%08x, ", compressed);
            comment.append(start, name - start);
        } while (last == false);
        replacement += sizeof(int);
        SkDebugf("0x%08x, ", nameRGB.rgb);
        SkDebugf("// %s\n", comment.c_str());
        comment.reset();
    }
    SkDebugf("// original = %d : replacement = %d\n", originalSize, replacement);
    SkASSERT(0); // always stop after creating table
}
#endif

#endif

static const unsigned int gColorNames[] = {
0x85891945, 0x32a50000, 0x00f0f8ff, // aliceblue
0x85d44c6b, 0x16e84d0a, 0x00faebd7, // antiquewhite
0x86350800, 0x0000ffff, // aqua
0x86350b43, 0x492e2800, 0x007fffd4, // aquamarine
0x87559140, 0x00f0ffff, // azure
0x88a93940, 0x00f5f5dc, // beige
0x89338d4a, 0x00ffe4c4, // bisque
0x89811ac0, 0x00000000, // black
0x898170d1, 0x1481635f, 0x38800000, 0x00ffebcd, // blanchedalmond
0x89952800, 0x000000ff, // blue
0x89952d93, 0x3d85a000, 0x008a2be2, // blueviolet
0x8a4fbb80, 0x00a52a2a, // brown
0x8ab2666f, 0x3de40000, 0x00deb887, // burlywood
0x8c242d05, 0x32a50000, 0x005f9ea0, // cadetblue
0x8d019525, 0x16b32800, 0x007fff00, // chartreuse
0x8d0f1bd9, 0x06850000, 0x00d2691e, // chocolate
0x8df20b00, 0x00ff7f50, // coral
0x8df27199, 0x3ee59099, 0x54a00000, 0x006495ed, // cornflowerblue
0x8df274d3, 0x31600000, 0x00fff8dc, // cornsilk
0x8e496cdf, 0x38000000, 0x00dc143c, // crimson
0x8f217000, 0x0000ffff, // cyan
0x90325899, 0x54a00000, 0x0000008b, // darkblue
0x903258f3, 0x05c00000, 0x00008b8b, // darkcyan
0x903259df, 0x3085749f, 0x10000000, 0x00b8860b, // darkgoldenrod
0x903259e5, 0x07200000, 0x00a9a9a9, // darkgray
0x903259e5, 0x14ae0000, 0x00006400, // darkgreen
0x90325ad1, 0x05690000, 0x00bdb76b, // darkkhaki
0x90325b43, 0x1caea040, 0x008b008b, // darkmagenta
0x90325bd9, 0x26c53c8b, 0x15c00000, 0x00556b2f, // darkolivegreen
0x90325be5, 0x05c72800, 0x00ff8c00, // darkorange
0x90325be5, 0x0d092000, 0x009932cc, // darkorchid
0x90325c8b, 0x10000000, 0x008b0000, // darkred
0x90325cc3, 0x31af7000, 0x00e9967a, // darksalmon
0x90325ccb, 0x04f2295c, 0x008fbc8f, // darkseagreen
0x90325cd9, 0x0685132b, 0x14000000, 0x00483d8b, // darkslateblue
0x90325cd9, 0x06853c83, 0x64000000, 0x002f4f4f, // darkslategray
0x90325d2b, 0x4a357a67, 0x14000000, 0x0000ced1, // darkturquoise
0x90325d93, 0x3d85a000, 0x009400d3, // darkviolet
0x90a58413, 0x39600000, 0x00ff1493, // deeppink
0x90a584d7, 0x644ca940, 0x0000bfff, // deepskyblue
0x912d3c83, 0x64000000, 0x00696969, // dimgray
0x91e43965, 0x09952800, 0x001e90ff, // dodgerblue
0x993228a5, 0x246b0000, 0x00b22222, // firebrick
0x998f9059, 0x5d09a140, 0x00fffaf0, // floralwhite
0x99f22ce9, 0x1e452b80, 0x00228b22, // forestgreen
0x9aa344d3, 0x04000000, 0x00ff00ff, // fuchsia
0x9c2974c5, 0x3e4f0000, 0x00dcdcdc, // gainsboro
0x9d0f9d2f, 0x21342800, 0x00f8f8ff, // ghostwhite
0x9dec2000, 0x00ffd700, // gold
0x9dec215d, 0x49e40000, 0x00daa520, // goldenrod
0x9e41c800, 0x00808080, // gray
0x9e452b80, 0x00008000, // green
0x9e452bb3, 0x158c7dc0, 0x00adff2f, // greenyellow
0xa1ee2e49, 0x16e00000, 0x00f0fff0, // honeydew
0xa1f4825d, 0x2c000000, 0x00ff69b4, // hotpink
0xa5c4485d, 0x48a40000, 0x00cd5c5c, // indianred
0xa5c449de, 0x004b0082, // indigo
0xa6cf9640, 0x00fffff0, // ivory
0xad015a40, 0x00f0e68c, // khaki
0xb0362b89, 0x16400000, 0x00e6e6fa, // lavender
0xb0362b89, 0x16426567, 0x20000000, 0x00fff0f5, // lavenderblush
0xb03771e5, 0x14ae0000, 0x007cfc00, // lawngreen
0xb0ad7b87, 0x212633dc, 0x00fffacd, // lemonchiffon
0xb1274505, 0x32a50000, 0x00add8e6, // lightblue
0xb1274507, 0x3e416000, 0x00f08080, // lightcoral
0xb1274507, 0x642e0000, 0x00e0ffff, // lightcyan
0xb127450f, 0x3d842ba5, 0x3c992b19, 0x3ee00000, 0x00fafad2, // lightgoldenrodyellow
0xb127450f, 0x48a57000, 0x0090ee90, // lightgreen
0xb127450f, 0x48b90000, 0x00d3d3d3, // lightgrey
0xb1274521, 0x25cb0000, 0x00ffb6c1, // lightpink
0xb1274527, 0x058d7b80, 0x00ffa07a, // lightsalmon
0xb1274527, 0x1427914b, 0x38000000, 0x0020b2aa, // lightseagreen
0xb1274527, 0x2f22654a, 0x0087cefa, // lightskyblue
0xb1274527, 0x303429e5, 0x07200000, 0x00778899, // lightslategray
0xb1274527, 0x50a56099, 0x54a00000, 0x00b0c4de, // lightsteelblue
0xb1274533, 0x158c7dc0, 0x00ffffe0, // lightyellow
0xb12d2800, 0x0000ff00, // lime
0xb12d29e5, 0x14ae0000, 0x0032cd32, // limegreen
0xb12e2b80, 0x00faf0e6, // linen
0xb4272ba9, 0x04000000, 0x00ff00ff, // magenta
0xb4327bdc, 0x00800000, // maroon
0xb4a44d5b, 0x06350b43, 0x492e2800, 0x0066cdaa, // mediumaquamarine
0xb4a44d5b, 0x09952800, 0x000000cd, // mediumblue
0xb4a44d5b, 0x3e434248, 0x00ba55d3, // mediumorchid
0xb4a44d5b, 0x42b2830a, 0x009370db, // mediumpurple
0xb4a44d5b, 0x4ca13c8b, 0x15c00000, 0x003cb371, // mediumseagreen
0xb4a44d5b, 0x4d81a145, 0x32a50000, 0x007b68ee, // mediumslateblue
0xb4a44d5b, 0x4e124b8f, 0x1e452b80, 0x0000fa9a, // mediumspringgreen
0xb4a44d5b, 0x52b28d5f, 0x26650000, 0x0048d1cc, // mediumturquoise
0xb4a44d5b, 0x592f6169, 0x48a40000, 0x00c71585, // mediumvioletred
0xb524724f, 0x2282654a, 0x00191970, // midnightblue
0xb52ea0e5, 0x142d0000, 0x00f5fffa, // mintcream
0xb533a665, 0x3e650000, 0x00ffe4e1, // mistyrose
0xb5e31867, 0x25c00000, 0x00ffe4b5, // moccasin
0xb8360a9f, 0x5d09a140, 0x00ffdead, // navajowhite
0xb836c800, 0x00000080, // navy
0xbd846047, 0x14000000, 0x00fdf5e6, // oldlace
0xbd89b140, 0x00808000, // olive
0xbd89b149, 0x48220000, 0x006b8e23, // olivedrab
0xbe4171ca, 0x00ffa500, // orange
0xbe4171cb, 0x48a40000, 0x00ff4500, // orangered
0xbe434248, 0x00da70d6, // orchid
0xc02c29df, 0x3085749f, 0x10000000, 0x00eee8aa, // palegoldenrod
0xc02c29e5, 0x14ae0000, 0x0098fb98, // palegreen
0xc02c2d2b, 0x4a357a67, 0x14000000, 0x00afeeee, // paleturquoise
0xc02c2d93, 0x3d85a48b, 0x10000000, 0x00db7093, // palevioletred
0xc0300e43, 0x5d098000, 0x00ffefd5, // papayawhip
0xc0a11a21, 0x54c60000, 0x00ffdab9, // peachpuff
0xc0b2a800, 0x00cd853f, // peru
0xc12e5800, 0x00ffc0cb, // pink
0xc1956800, 0x00dda0dd, // plum
0xc1f72165, 0x09952800, 0x00b0e0e6, // powderblue
0xc2b2830a, 0x00800080, // purple
0xc8a40000, 0x00ff0000, // red
0xc9f3c8a5, 0x3eee0000, 0x00bc8f8f, // rosybrown
0xc9f90b05, 0x32a50000, 0x004169e1, // royalblue
0xcc24230b, 0x0a4fbb80, 0x008b4513, // saddlebrown
0xcc2c6bdc, 0x00fa8072, // salmon
0xcc2e2645, 0x49f77000, 0x00f4a460, // sandybrown
0xcca13c8b, 0x15c00000, 0x002e8b57, // seagreen
0xcca19a0b, 0x31800000, 0x00fff5ee, // seashell
0xcd257382, 0x00a0522d, // sienna
0xcd2cb164, 0x00c0c0c0, // silver
0xcd79132b, 0x14000000, 0x0087ceeb, // skyblue
0xcd81a145, 0x32a50000, 0x006a5acd, // slateblue
0xcd81a14f, 0x48390000, 0x00708090, // slategray
0xcdcfb800, 0x00fffafa, // snow
0xce124b8f, 0x1e452b80, 0x0000ff7f, // springgreen
0xce852b05, 0x32a50000, 0x004682b4, // steelblue
0xd02e0000, 0x00d2b48c, // tan
0xd0a16000, 0x00008080, // teal
0xd1099d19, 0x14000000, 0x00d8bfd8, // thistle
0xd1ed0d1e, 0x00ff6347, // tomato
0xd2b28d5f, 0x26650000, 0x0040e0d0, // turquoise
0xd92f6168, 0x00ee82ee, // violet
0xdd050d00, 0x00f5deb3, // wheat
0xdd09a140, 0x00ffffff, // white
0xdd09a167, 0x35eb2800, 0x00f5f5f5, // whitesmoke
0xe4ac63ee, 0x00ffff00, // yellow
0xe4ac63ef, 0x1e452b80, 0x009acd32 // yellowgreen
}; // original = 2505 : replacement = 1616


const char* SkParse::FindNamedColor(const char* name, size_t len, SkColor* color) {
    const char* namePtr = name;
    unsigned int sixMatches[4];
    unsigned int* sixMatchPtr = sixMatches;
    bool first = true;
    bool last = false;
    char ch;
    do {
        unsigned int sixMatch = 0;
        for (int chIndex = 0; chIndex < 6; chIndex++) {
            sixMatch <<= 5;
            ch = *namePtr  | 0x20;
            if (ch < 'a' || ch > 'z')
                ch = 0;
            else {
                ch = ch - 'a' + 1;
                namePtr++;
            }
            sixMatch |= ch ;  // turn 'A' (0x41) into 'a' (0x61);
        }
        sixMatch <<= 1;
        sixMatch |= 1;
        if (first) {
            sixMatch |= 0x80000000;
            first = false;
        }
        ch = *namePtr | 0x20;
        last = ch < 'a' || ch > 'z';
        if (last)
            sixMatch &= ~1;
        len -= 6;
        *sixMatchPtr++ = sixMatch;
    } while (last == false && len > 0);
    const int colorNameSize = sizeof(gColorNames) / sizeof(unsigned int);
    int lo = 0;
    int hi = colorNameSize - 3; // back off to beginning of yellowgreen
    while (lo <= hi) {
        int mid = (hi + lo) >> 1;
        while ((int) gColorNames[mid] >= 0)
            --mid;
        sixMatchPtr = sixMatches;
        while (gColorNames[mid] == *sixMatchPtr) {
            ++mid;
            if ((*sixMatchPtr & 1) == 0) { // last
                *color = gColorNames[mid] | 0xFF000000;
                return namePtr;
            }
            ++sixMatchPtr;
        }
        int sixMask = *sixMatchPtr & ~0x80000000;
        int midMask = gColorNames[mid] & ~0x80000000;
        if (sixMask > midMask) {
            lo = mid + 2;   // skip color
            while ((int) gColorNames[lo] >= 0)
                ++lo;
        } else if (hi == mid)
            return NULL;
        else
            hi = mid;
    }
    return NULL;
}

// !!! 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) == NULL)
//          continue;
//      do {
//          if ((c = *str++) == '\0')
//              goto goHome;
//      } while (strchr(sep, c) != NULL);
//      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 == NULL)
            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 NULL;
        }
//  } 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 == NULL)
//          return NULL;
        // !!! 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);
}

#ifdef SK_SUPPORT_UNITTEST
void SkParse::TestColor() {
    if (false)
        CreateTable();  // regenerates data table in the output window
    SkColor result;
    int index;
    for (index = 0; index < colorNamesSize; index++) {
        result = SK_ColorBLACK;
        SkNameRGB nameRGB = colorNames[index];
        SkASSERT(FindColor(nameRGB.name, &result) != NULL);
        SkASSERT(result == (SkColor) (nameRGB.rgb | 0xFF000000));
    }
    for (index = 0; index < colorNamesSize; index++) {
        result = SK_ColorBLACK;
        SkNameRGB nameRGB = colorNames[index];
        char bad[24];
        size_t len = strlen(nameRGB.name);
        memcpy(bad, nameRGB.name, len);
        bad[len - 1] -= 1;
        SkASSERT(FindColor(bad, &result) == NULL);
        bad[len - 1] += 2;
        SkASSERT(FindColor(bad, &result) == NULL);
    }
    result = SK_ColorBLACK;
    SkASSERT(FindColor("lightGrey", &result));
    SkASSERT(result == 0xffd3d3d3);
//  SkASSERT(FindColor("12,34,56,78", &result));
//  SkASSERT(result == ((12 << 24) | (34 << 16) | (56 << 8) | (78 << 0)));
    result = SK_ColorBLACK;
    SkASSERT(FindColor("#ABCdef", &result));
    SkASSERT(result == 0XFFABCdef);
    SkASSERT(FindColor("#12ABCdef", &result));
    SkASSERT(result == 0X12ABCdef);
    result = SK_ColorBLACK;
    SkASSERT(FindColor("#123", &result));
    SkASSERT(result == 0Xff112233);
    SkASSERT(FindColor("#abcd", &result));
    SkASSERT(result == 0Xaabbccdd);
    result = SK_ColorBLACK;
//  SkASSERT(FindColor("71,162,253", &result));
//  SkASSERT(result == ((0xFF << 24) | (71 << 16) | (162 << 8) | (253 << 0)));
}
#endif
