183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch/*
283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch *
483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * Redistribution and use in source and binary forms, with or without
583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * modification, are permitted provided that the following conditions
683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * are met:
783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 1. Redistributions of source code must retain the above copyright
883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch *    notice, this list of conditions and the following disclaimer.
983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch *    notice, this list of conditions and the following disclaimer in the
1183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch *    documentation and/or other materials provided with the distribution.
1283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch *
1383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
1483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
1783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
1983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
2183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch */
2583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
2683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "config.h"
2783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "core/css/StyleColor.h"
2883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
2983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "core/platform/HashTools.h"
3083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch#include "wtf/text/WTFString.h"
3183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
3283750176c3ee2cea66c8a9751271026a5901be3aBen Murdochnamespace WebCore {
3383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
3483750176c3ee2cea66c8a9751271026a5901be3aBen MurdochStyleColor::StyleColor(const String& name)
3583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{
3683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (name[0] == '#') {
3783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        RGBA32 rgba;
3883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        if (name.is8Bit())
3983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            m_valid = Color::parseHexColor(name.characters8() + 1, name.length() - 1, rgba);
4083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        else
4183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            m_valid = Color::parseHexColor(name.characters16() + 1, name.length() - 1, rgba);
4283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_color = rgba;
4383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    } else {
4483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        setNamedColor(name);
4583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    }
4683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch}
4783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
4883750176c3ee2cea66c8a9751271026a5901be3aBen MurdochStyleColor::StyleColor(const char* name)
4983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{
5083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (name[0] == '#') {
5183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        RGBA32 rgba;
5283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_valid = Color::parseHexColor(&name[1], rgba);
5383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_color = rgba;
5483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    } else {
5583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        const NamedColor* foundColor = findColor(name, strlen(name));
5683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_color = foundColor ? foundColor->ARGBValue : 0;
5783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        m_valid = foundColor;
5883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    }
5983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch}
6083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
6183750176c3ee2cea66c8a9751271026a5901be3aBen Murdochstatic inline const NamedColor* findNamedColor(const String& name)
6283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{
6383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    char buffer[64]; // easily big enough for the longest color name
6483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    unsigned length = name.length();
6583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (length > sizeof(buffer) - 1)
6683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        return 0;
6783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    for (unsigned i = 0; i < length; ++i) {
6883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        UChar c = name[i];
6983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        if (!c || c > 0x7F)
7083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            return 0;
7183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        buffer[i] = toASCIILower(static_cast<char>(c));
7283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    }
7383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    buffer[length] = '\0';
7483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    return findColor(buffer, length);
7583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch}
7683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
7783750176c3ee2cea66c8a9751271026a5901be3aBen Murdochvoid StyleColor::setNamedColor(const String& name)
7883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{
7983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    const NamedColor* foundColor = findNamedColor(name);
8083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    m_color = foundColor ? foundColor->ARGBValue : 0;
8183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    m_valid = foundColor;
8283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch}
8383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch
8483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} // namespace WebCore
85