Reviewed by Sam.
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Feb 2008 21:40:47 +0000 (21:40 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Feb 2008 21:40:47 +0000 (21:40 +0000)
        - removed use of DeprecatedString in the Color class

        * platform/graphics/Color.cpp:
        (WebCore::Color::parseHexColor): Streamlined logic a bit with early returns.
        Used toASCIIHexValue a character at a time rather than using toIntStrict
        in base 16 mode.
        (WebCore::findNamedColor): Added. Uses a fixed-size char buffer to look up
        a color using the gperf-generated findColor function. Saves a memory allocation
        vs. the old version that called DeprecatedString::latin1().
        (WebCore::Color::setNamedColor): Changed to use findNamedColor.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@30381 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/graphics/Color.cpp

index 8ec2b0c7e966e8c4fed2ab74efa8b5e20c78d2c4..82ed8f146c184ceffb518948343edabfb98e1b09 100644 (file)
@@ -1,3 +1,18 @@
+2008-02-18  Darin Adler  <darin@apple.com>
+
+        Reviewed by Sam.
+
+        - removed use of DeprecatedString in the Color class
+
+        * platform/graphics/Color.cpp:
+        (WebCore::Color::parseHexColor): Streamlined logic a bit with early returns.
+        Used toASCIIHexValue a character at a time rather than using toIntStrict
+        in base 16 mode.
+        (WebCore::findNamedColor): Added. Uses a fixed-size char buffer to look up
+        a color using the gperf-generated findColor function. Saves a memory allocation
+        vs. the old version that called DeprecatedString::latin1().
+        (WebCore::Color::setNamedColor): Changed to use findNamedColor.
+
 2008-02-18  Darin Adler  <darin@apple.com>
 
         Reviewed by Sam.
index 47fc923a7902007361d6dca988c8bbd3b622df59..e974a065d02c8a808333467dc01b7961e4bed15d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,7 +26,6 @@
 #include "config.h"
 #include "Color.h"
 
-#include "DeprecatedString.h"
 #include "PlatformString.h"
 #include <math.h>
 #include <wtf/Assertions.h>
@@ -35,6 +34,7 @@
 #include "ColorData.c"
 
 using namespace std;
+using namespace WTF;
 
 namespace WebCore {
 
@@ -92,24 +92,26 @@ RGBA32 makeRGBAFromHSLA(double hue, double saturation, double lightness, double
 // originally moved here from the CSS parser
 bool Color::parseHexColor(const String& name, RGBA32& rgb)
 {
-    int len = name.length();
-    if (len == 3 || len == 6) {
-        bool ok;
-        int val = name.toIntStrict(&ok, 16);
-        if (ok) {
-            if (len == 6) {
-                rgb = 0xFF000000 | val;
-                return true;
-            }
-            // #abc converts to #aabbcc according to the specs
-            rgb = 0xFF000000
-                | (val & 0xF00) << 12 | (val & 0xF00) << 8
-                | (val & 0xF0) << 8 | (val & 0xF0) << 4
-                | (val & 0xF) << 4 | (val & 0xF);
-            return true;
-        }
+    unsigned length = name.length();
+    if (length != 3 && length != 6)
+        return false;
+    unsigned value = 0;
+    for (unsigned i = 0; i < length; ++i) {
+        if (!isASCIIHexDigit(name[i]))
+            return false;
+        value <<= 4;
+        value |= toASCIIHexValue(name[i]);
     }
-    return false;
+    if (length == 6) {
+        rgb = 0xFF000000 | value;
+        return true;
+    }
+    // #abc converts to #aabbcc
+    rgb = 0xFF000000
+        | (value & 0xF00) << 12 | (value & 0xF00) << 8
+        | (value & 0xF0) << 8 | (value & 0xF0) << 4
+        | (value & 0xF) << 4 | (value & 0xF);
+    return true;
 }
 
 int differenceSquared(const Color& c1, const Color& c2)
@@ -147,10 +149,25 @@ String Color::name() const
     return String::format("#%02X%02X%02X", red(), green(), blue());
 }
 
+static inline const NamedColor* findNamedColor(const String& name)
+{
+    char buffer[64]; // easily big enough for the longest color name
+    unsigned length = name.length();
+    if (length > sizeof(buffer) - 1)
+        return 0;
+    for (unsigned i = 0; i < length; ++i) {
+        UChar c = name[i];
+        if (!c || c > 0x7F)
+            return 0;
+        buffer[i] = static_cast<char>(c);
+    }
+    buffer[length] = '\0';
+    return findColor(buffer, length);
+}
+
 void Color::setNamedColor(const String& name)
 {
-    DeprecatedString dname = name.deprecatedString();
-    const NamedColor* foundColor = dname.isAllASCII() ? findColor(dname.latin1(), dname.length()) : 0;
+    const NamedColor* foundColor = findNamedColor(name);
     m_color = foundColor ? foundColor->RGBValue : 0;
     m_color |= 0xFF000000;
     m_valid = foundColor;