LayoutTests:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2006 06:15:38 +0000 (06:15 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2006 06:15:38 +0000 (06:15 +0000)
        Reviewed by Darin.

        - tests changed by http://bugzilla.opendarwin.org/show_bug.cgi?id=9955
        Colors scaled from [0, 1] range to [0, 255] incorrectly

        * fast/css/hsl-color-expected.checksum:
        * fast/css/hsl-color-expected.png:
        * fast/css/hsl-color-expected.txt:
        * fast/forms/input-disabled-color-expected.checksum:
        * fast/forms/input-disabled-color-expected.png:
        * fast/forms/input-disabled-color-expected.txt:

WebCore:

        Reviewed by Darin.

        - patch for http://bugzilla.opendarwin.org/show_bug.cgi?id=9955
        Colors scaled from [0, 1] range to [0, 255] incorrectly

        Fixes scaling issue and fixes Color to follow style guidelines.

        * css/cssstyleselector.cpp:
        (WebCore::CSSStyleSelector::getColorFromPrimitiveValue):
        * platform/Color.cpp:
        (WebCore::calcHue):
        (WebCore::makeRGBAFromHSLA):
        (WebCore::Color::Color):
        (WebCore::Color::name):
        (WebCore::Color::setNamedColor):
        (WebCore::Color::light):
        (WebCore::Color::dark):
        (WebCore::blend):
        * platform/Color.h:
        (WebCore::Color::Color):
        (WebCore::Color::isValid):
        (WebCore::Color::red):
        (WebCore::Color::green):
        (WebCore::Color::blue):
        (WebCore::Color::alpha):
        (WebCore::Color::rgb):
        (WebCore::Color::setRGB):
        (WebCore::operator==):
        (WebCore::operator!=):
        * rendering/RenderObject.cpp:
        (WebCore::RenderObject::drawBorder):

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

12 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/css/hsl-color-expected.checksum
LayoutTests/fast/css/hsl-color-expected.png
LayoutTests/fast/css/hsl-color-expected.txt
LayoutTests/fast/forms/input-disabled-color-expected.checksum
LayoutTests/fast/forms/input-disabled-color-expected.png
LayoutTests/fast/forms/input-disabled-color-expected.txt
WebCore/ChangeLog
WebCore/css/cssstyleselector.cpp
WebCore/platform/Color.cpp
WebCore/platform/Color.h
WebCore/rendering/RenderObject.cpp

index 20adccdd18783cb254c30c07032cf0c5edf8b5ff..46ce194ff5c1d35c38c7abfb038fd9a4a58a5435 100644 (file)
@@ -1,3 +1,17 @@
+2006-07-31  Sam Weinig  <sam.weinig@gmail.com>
+
+        Reviewed by Darin.
+
+        - tests changed by http://bugzilla.opendarwin.org/show_bug.cgi?id=9955
+        Colors scaled from [0, 1] range to [0, 255] incorrectly
+
+        * fast/css/hsl-color-expected.checksum:
+        * fast/css/hsl-color-expected.png:
+        * fast/css/hsl-color-expected.txt:
+        * fast/forms/input-disabled-color-expected.checksum:
+        * fast/forms/input-disabled-color-expected.png:
+        * fast/forms/input-disabled-color-expected.txt:
+
 2006-07-31  Mitz Pettel  <opendarwin.org@mitzpettel.com>
 
         - test for http://bugzilla.opendarwin.org/show_bug.cgi?id=10158
index 0f4b1b0f9b5291ef98f449bbe7b257e021bddf21..5205ea3d6bea9d24afc4cde9d834a49c8108d196 100644 (file)
@@ -1 +1 @@
-da7ae5e54a6465e4cb8bd7ad050e98e8
\ No newline at end of file
+34f560db9acd52d2a78a17325e247c0a
\ No newline at end of file
index 8212696aebc77eef42844824a3af03a833bb7d13..cc2472ffbeaa5854d0afef9c145b7724651f5bab 100644 (file)
Binary files a/LayoutTests/fast/css/hsl-color-expected.png and b/LayoutTests/fast/css/hsl-color-expected.png differ
index 443b924574a8a969d4f4ad804af9170234285791..831c9c4c4f83d32c94f1aa177ecdfaa3f80c5f9f 100644 (file)
@@ -9,7 +9,7 @@ layer at (0,0) size 785x1128
       RenderBlock {H1} at (0,58) size 769x37 [color=#00FF00]
         RenderText {#text} at (0,0) size 587x37
           text run at (0,0) width 587: "This should be green: hsl(120, 100%, 50%)"
-      RenderBlock {H1} at (0,116) size 769x37 [color=#00FEFF]
+      RenderBlock {H1} at (0,116) size 769x37 [color=#00FFFF]
         RenderText {#text} at (0,0) size 579x37
           text run at (0,0) width 579: "This should be aqua: hsl(180, 100%, 50%)"
       RenderBlock {H1} at (0,174) size 769x37 [color=#0000FF]
index 01198eb89a9faf5c2b0c11a9389469f91ef65506..8ba441127256d28277f2f2e4736c1b4000164657 100644 (file)
@@ -1 +1 @@
-db85b2e56c4347e4a9ce517141406829
\ No newline at end of file
+aac508da3b0e15c4c09290c8fb66f245
\ No newline at end of file
index a0e2e99c72238abd1a6e1bc35991c7b2c2ee408c..4dbaa55f9473c34d6f7167674f652493fee9ab03 100644 (file)
Binary files a/LayoutTests/fast/forms/input-disabled-color-expected.png and b/LayoutTests/fast/forms/input-disabled-color-expected.png differ
index c19f65f98b6646a9df48c5d769156440a535c251..208a8a932483250e3934bb636252244748e8224f 100644 (file)
@@ -86,7 +86,7 @@ layer at (169,77) size 142x13 scrollWidth 158
     RenderText {#text} at (1,0) size 156x13
       text run at (1,0) width 156: "This text field is not disabled"
 layer at (13,100) size 142x13 scrollWidth 357
-  RenderBlock {DIV} at (3,3) size 142x13 [color=#AA0000]
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#AB0000]
     RenderText {#text} at (1,0) size 355x13
       text run at (1,0) width 355: "The text in this disabled field should displayed as dimmed or grey"
 layer at (169,100) size 142x13 scrollWidth 158
@@ -102,7 +102,7 @@ layer at (169,123) size 142x13 scrollWidth 158
     RenderText {#text} at (1,0) size 156x13
       text run at (1,0) width 156: "This text field is not disabled"
 layer at (13,146) size 142x13 scrollWidth 357
-  RenderBlock {DIV} at (3,3) size 142x13 [color=#AAAAAA]
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#ABABAB]
     RenderText {#text} at (1,0) size 355x13
       text run at (1,0) width 355: "The text in this disabled field should displayed as dimmed or grey"
 layer at (169,146) size 142x13 scrollWidth 158
@@ -118,7 +118,7 @@ layer at (169,169) size 142x13 scrollWidth 158
     RenderText {#text} at (1,0) size 156x13
       text run at (1,0) width 156: "This text field is not disabled"
 layer at (13,192) size 142x13 scrollWidth 357
-  RenderBlock {DIV} at (3,3) size 142x13 [color=#AAAAAA]
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#ABABAB]
     RenderText {#text} at (1,0) size 355x13
       text run at (1,0) width 355: "The text in this disabled field should displayed as dimmed or grey"
 layer at (169,192) size 142x13 scrollWidth 158
@@ -126,7 +126,7 @@ layer at (169,192) size 142x13 scrollWidth 158
     RenderText {#text} at (1,0) size 156x13
       text run at (1,0) width 156: "This text field is not disabled"
 layer at (13,215) size 142x13 scrollWidth 357
-  RenderBlock {DIV} at (3,3) size 142x13 [color=#2B2B2B]
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#2C2C2C]
     RenderText {#text} at (1,0) size 355x13
       text run at (1,0) width 355: "The text in this disabled field should displayed as dimmed or grey"
 layer at (169,215) size 142x13 scrollWidth 158
@@ -142,7 +142,7 @@ layer at (169,238) size 142x13 scrollWidth 158
     RenderText {#text} at (1,0) size 156x13
       text run at (1,0) width 156: "This text field is not disabled"
 layer at (13,261) size 142x13 scrollWidth 357
-  RenderBlock {DIV} at (3,3) size 142x13 [color=#2B2B2B]
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#2C2C2C]
     RenderText {#text} at (1,0) size 355x13
       text run at (1,0) width 355: "The text in this disabled field should displayed as dimmed or grey"
 layer at (169,261) size 142x13 scrollWidth 158
index 33fa1d15aa19cd2cef97fbbb5507f456b68edf2f..e8a95d615205713ce542a01c1d6a6d01572f1042 100644 (file)
@@ -1,3 +1,37 @@
+2006-07-31  Sam Weinig  <sam.weinig@gmail.com>
+
+        Reviewed by Darin.
+
+        - patch for http://bugzilla.opendarwin.org/show_bug.cgi?id=9955
+        Colors scaled from [0, 1] range to [0, 255] incorrectly
+        
+        Fixes scaling issue and fixes Color to follow style guidelines.
+
+        * css/cssstyleselector.cpp:
+        (WebCore::CSSStyleSelector::getColorFromPrimitiveValue):
+        * platform/Color.cpp:
+        (WebCore::calcHue):
+        (WebCore::makeRGBAFromHSLA):
+        (WebCore::Color::Color):
+        (WebCore::Color::name):
+        (WebCore::Color::setNamedColor):
+        (WebCore::Color::light):
+        (WebCore::Color::dark):
+        (WebCore::blend):
+        * platform/Color.h:
+        (WebCore::Color::Color):
+        (WebCore::Color::isValid):
+        (WebCore::Color::red):
+        (WebCore::Color::green):
+        (WebCore::Color::blue):
+        (WebCore::Color::alpha):
+        (WebCore::Color::rgb):
+        (WebCore::Color::setRGB):
+        (WebCore::operator==):
+        (WebCore::operator!=):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::drawBorder):
+
 2006-07-31  Mitz Pettel  <opendarwin.org@mitzpettel.com>
 
         - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=10158
index 09fe9b777850c843b62bf6f60f245f7d958d5f4c..49afdb94b3350ac329e5d97f42255c9040fda0e9 100644 (file)
@@ -4527,7 +4527,7 @@ Color CSSStyleSelector::getColorFromPrimitiveValue(CSSPrimitiveValue* primitiveV
         else
             col = colorForCSSValue(ident);
     } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RGBCOLOR)
-        col.setRgb(primitiveValue->getRGBColorValue());
+        col.setRGB(primitiveValue->getRGBColorValue());
     return col;
 }
 
index 884e31d5310497052e0e5c79f25c955a146ed56d..7dddff7ed71c548d859723844d684616d16d73cf 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "DeprecatedString.h"
 #include "PlatformString.h"
+#include <math.h>
 #include <wtf/Assertions.h>
 
 #include "ColorData.c"
@@ -48,16 +49,16 @@ RGBA32 makeRGBA(int r, int g, int b, int a)
 
 double calcHue(double temp1, double temp2, double hueVal)
 {
-    if (hueVal < 0)
+    if (hueVal < 0.0)
         hueVal++;
-    else if (hueVal > 1)
+    else if (hueVal > 1.0)
         hueVal--;
-    if (hueVal * 6 < 1)
-        return temp1 + (temp2 - temp1) * hueVal * 6;
-    if (hueVal * 2 < 1)
+    if (hueVal * 6.0 < 1.0)
+        return temp1 + (temp2 - temp1) * hueVal * 6.0;
+    if (hueVal * 2.0 < 1.0)
         return temp2;
-    if (hueVal * 3 < 2)
-        return temp1 + (temp2 - temp1) * (2.0 / 3.0 - hueVal) * 6;
+    if (hueVal * 3.0 < 2.0)
+        return temp1 + (temp2 - temp1) * (2.0 / 3.0 - hueVal) * 6.0;
     return temp1;
 }
 
@@ -66,15 +67,22 @@ double calcHue(double temp1, double temp2, double hueVal)
 // explanation available at http://en.wikipedia.org/wiki/HSL_color_space 
 
 // all values are in the range of 0 to 1.0
-RGBA32 makeRGBAFromHSLA(double h, double s, double l, double a)
+RGBA32 makeRGBAFromHSLA(double hue, double saturation, double lightness, double alpha)
 {
-    double temp2 = l < 0.5 ? l * (1.0 + s) : l + s - l * s;
-    double temp1 = 2.0 * l - temp2;
+    const double scaleFactor = nextafter(256.0, 0.0);
     
-    return makeRGBA(static_cast<int>(calcHue(temp1, temp2, h + 1.0 / 3.0) * 255), 
-                    static_cast<int>(calcHue(temp1, temp2, h) * 255),
-                    static_cast<int>(calcHue(temp1, temp2, h - 1.0 / 3.0) * 255),
-                    static_cast<int>(a * 255));
+    if (!saturation) {
+        int greyValue = static_cast<int>(lightness * scaleFactor);
+        return makeRGBA(greyValue, greyValue, greyValue, static_cast<int>(alpha * scaleFactor));
+    }
+
+    double temp2 = lightness < 0.5 ? lightness * (1.0 + saturation) : lightness + saturation - lightness * saturation;
+    double temp1 = 2.0 * lightness - temp2;
+    
+    return makeRGBA(static_cast<int>(calcHue(temp1, temp2, hue + 1.0 / 3.0) * scaleFactor), 
+                    static_cast<int>(calcHue(temp1, temp2, hue) * scaleFactor),
+                    static_cast<int>(calcHue(temp1, temp2, hue - 1.0 / 3.0) * scaleFactor),
+                    static_cast<int>(alpha * scaleFactor));
 }
 
 // originally moved here from the CSS parser
@@ -114,7 +122,7 @@ int differenceSquared(const Color& c1, const Color& c2)
 Color::Color(const String& name)
 {
     if (name.startsWith("#"))
-        valid = parseHexColor(name.substring(1), color);
+        m_valid = parseHexColor(name.substring(1), m_color);
     else
         setNamedColor(name);
 }
@@ -122,32 +130,29 @@ Color::Color(const String& name)
 Color::Color(const char* name)
 {
     if (name[0] == '#')
-        valid = parseHexColor(&name[1], color);
+        m_valid = parseHexColor(&name[1], m_color);
     else {
         const NamedColor* foundColor = findColor(name, strlen(name));
-        color = foundColor ? foundColor->RGBValue : 0;
-        color |= 0xFF000000;
-        valid = foundColor;
+        m_color = foundColor ? foundColor->RGBValue : 0;
+        m_color |= 0xFF000000;
+        m_valid = foundColor;
     }
 }
 
 String Color::name() const
 {
-    String name;
     if (alpha() < 0xFF)
-        name = String::sprintf("#%02X%02X%02X%02X", red(), green(), blue(), alpha());
-    else
-        name = String::sprintf("#%02X%02X%02X", red(), green(), blue());
-    return name;
+        return String::sprintf("#%02X%02X%02X%02X", red(), green(), blue(), alpha());
+    return String::sprintf("#%02X%02X%02X", red(), green(), blue());
 }
 
 void Color::setNamedColor(const String& name)
 {
     DeprecatedString dname = name.deprecatedString();
     const NamedColor* foundColor = dname.isAllASCII() ? findColor(dname.latin1(), dname.length()) : 0;
-    color = foundColor ? foundColor->RGBValue : 0;
-    color |= 0xFF000000;
-    valid = foundColor;
+    m_color = foundColor ? foundColor->RGBValue : 0;
+    m_color |= 0xFF000000;
+    m_valid = foundColor;
 }
 
 const float undefinedHue = -1;
@@ -222,34 +227,43 @@ static void convertHSVToRGB(float h, float s, float v, float& r, float& g, float
     }
 }
 
-
 Color Color::light() const
 {
+    const float scaleFactor = nextafterf(256.0f, 0.0f);
+
     float r, g, b, a, h, s, v;
     getRGBA(r, g, b, a);
     convertRGBToHSV(r, g, b, h, s, v);
     v = max(0.0f, min(v + 0.33f, 1.0f));
     convertHSVToRGB(h, s, v, r, g, b);
-    return Color((int)(r * 255), (int)(g * 255), (int)(b * 255), (int)(a * 255));
+    return Color(static_cast<int>(r * scaleFactor),
+                 static_cast<int>(g * scaleFactor),
+                 static_cast<int>(b * scaleFactor),
+                 static_cast<int>(a * scaleFactor));
 }
 
 Color Color::dark() const
 {
+    const float scaleFactor = nextafterf(256.0f, 0.0f);
+
     float r, g, b, a, h, s, v;
     getRGBA(r, g, b, a);
     convertRGBToHSV(r, g, b, h, s, v);
     v = max(0.0f, min(v - 0.33f, 1.0f));
     convertHSVToRGB(h, s, v, r, g, b);
-    return Color((int)(r * 255), (int)(g * 255), (int)(b * 255), (int)(a * 255));
+    return Color(static_cast<int>(r * scaleFactor),
+                 static_cast<int>(g * scaleFactor),
+                 static_cast<int>(b * scaleFactor),
+                 static_cast<int>(a * scaleFactor));
 }
 
 static int blend(int c, int a)
 {
     // We use white.
-    float alpha = (float)(a) / 255;
+    float alpha = a / 255.0f;
     int whiteBlend = 255 - a;
     c -= whiteBlend;
-    return (int)(c / alpha);
+    return static_cast<int>(c / alpha);
 }
 
 const int cStartAlpha = 153; // 60%
@@ -294,4 +308,4 @@ void Color::getRGBA(double& r, double& g, double& b, double& a) const
     a = alpha() / 255.0;
 }
 
-}
+} // namespace WebCore
index a6fa86d0ec29e3ff66886c7d5ffa4ef5cda75dab..7e8e51ed40ec89352a60a938025347ea7ec63b0e 100644 (file)
@@ -53,27 +53,28 @@ int differenceSquared(const Color&, const Color&);
 
 class Color {
 public:
-    Color() : color(0), valid(false) { }
-    Color(RGBA32 col) : color(col), valid(true) { }
-    Color(int r, int g, int b) : color(makeRGB(r, g, b)), valid(true) { }
-    Color(int r, int g, int b, int a) : color(makeRGBA(r, g, b, a)), valid(true) { }
+    Color() : m_color(0), m_valid(false) { }
+    Color(RGBA32 col) : m_color(col), m_valid(true) { }
+    Color(int r, int g, int b) : m_color(makeRGB(r, g, b)), m_valid(true) { }
+    Color(int r, int g, int b, int a) : m_color(makeRGBA(r, g, b, a)), m_valid(true) { }
     explicit Color(const String&);
     explicit Color(const char*);
     
     String name() const;
     void setNamedColor(const String&);
 
-    bool isValid() const { return valid; }
+    bool isValid() const { return m_valid; }
 
     bool hasAlpha() const { return alpha() < 255; }
 
-    int red() const { return (color >> 16) & 0xFF; }
-    int green() const { return (color >> 8) & 0xFF; }
-    int blue() const { return color & 0xFF; }
-    int alpha() const { return (color >> 24) & 0xFF; }
-    RGBA32 rgb() const { return color; } // Preserve the alpha.
-    void setRgb(int r, int g, int b) { color = makeRGB(r, g, b); valid = true; }
-    void setRgb(RGBA32 rgb) { color = rgb; valid = true; }
+    int red() const { return (m_color >> 16) & 0xFF; }
+    int green() const { return (m_color >> 8) & 0xFF; }
+    int blue() const { return m_color & 0xFF; }
+    int alpha() const { return (m_color >> 24) & 0xFF; }
+    
+    RGBA32 rgb() const { return m_color; } // Preserve the alpha.
+    void setRGB(int r, int g, int b) { m_color = makeRGB(r, g, b); m_valid = true; }
+    void setRGB(RGBA32 rgb) { m_color = rgb; m_valid = true; }
     void getRGBA(float& r, float& g, float& b, float& a) const;
     void getRGBA(double& r, double& g, double& b, double& a) const;
 
@@ -90,16 +91,16 @@ public:
     static const RGBA32 transparent = 0x00000000;
     
 private:
-    RGBA32 color;
-    bool valid : 1;
+    RGBA32 m_color;
+    bool m_valid : 1;
 };
 
-inline bool operator==(const Color &a, const Color &b)
+inline bool operator==(const Color& a, const Color& b)
 {
     return a.rgb() == b.rgb() && a.isValid() == b.isValid();
 }
 
-inline bool operator!=(const Color &a, const Color &b)
+inline bool operator!=(const Color& a, const Color& b)
 {
     return !(a == b);
 }
@@ -112,6 +113,6 @@ NSColor* nsColor(const Color&);
 CGColorRef cgColor(const Color&);
 #endif
 
-}
+} // namespace WebCore
 
-#endif
+#endif // COLOR_H_
index 7efa4ccb21838e20d37126db330fda73719791bd..c218b700833814f272ee293ebc2565970f688642 100644 (file)
@@ -897,20 +897,18 @@ void RenderObject::drawBorder(GraphicsContext* p, int x1, int y1, int x2, int y2
                               BorderSide s, Color c, const Color& textcolor, EBorderStyle style,
                               int adjbw1, int adjbw2, bool invalidisInvert)
 {
-    int width = (s==BSTop||s==BSBottom?y2-y1:x2-x1);
+    int width = (s == BSTop || s == BSBottom ? y2 - y1 : x2 - x1);
 
-    if(style == DOUBLE && width < 3)
+    if (style == DOUBLE && width < 3)
         style = SOLID;
 
-    if(!c.isValid()) {
-        if(invalidisInvert)
-        {
+    if (!c.isValid()) {
+        if (invalidisInvert)
             // FIXME: The original KHTML did XOR here -- what do we want to do instead?
             c = Color::white;
-        }
         else {
             if (style == INSET || style == OUTSET || style == RIDGE || style == GROOVE)
-                c.setRgb(238, 238, 238);
+                c.setRGB(238, 238, 238);
             else
                 c = textcolor;
         }