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