Jacek Caban : mshtml: Correctly parse color strings.

Alexandre Julliard julliard at winehq.org
Mon Dec 28 09:16:05 CST 2009


Module: wine
Branch: master
Commit: 0f0cb60592ecdff99faf5ad021b10cd5737b8dca
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0f0cb60592ecdff99faf5ad021b10cd5737b8dca

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Dec 27 00:49:46 2009 +0100

mshtml: Correctly parse color strings.

---

 dlls/mshtml/htmlbody.c |   56 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index f0d4cbe..8daace1 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -83,15 +83,58 @@ static const struct {
     {yellowW,   0xffff00}
 };
 
+static int comp_value(const WCHAR *ptr, int dpc)
+{
+    int ret = 0;
+    WCHAR ch;
+
+    if(dpc > 2)
+        dpc = 2;
+
+    while(dpc--) {
+        if(!*ptr)
+            ret *= 16;
+        else if(isdigitW(ch = *ptr++))
+            ret = ret*16 + (ch-'0');
+        else if('a' <= ch && ch <= 'f')
+            ret = ret*16 + (ch-'a') + 10;
+        else if('A' <= ch && ch <= 'F')
+            ret = ret*16 + (ch-'A') + 10;
+        else
+            ret *= 16;
+    }
+
+    return ret;
+}
+
+/* Based on Gecko NS_LooseHexToRGB */
+static int loose_hex_to_rgb(const WCHAR *hex)
+{
+    int len, dpc;
+
+    len = strlenW(hex);
+    if(*hex == '#') {
+        hex++;
+        len--;
+    }
+    if(len <= 3)
+        return 0;
+
+    dpc = min(len/3 + (len%3 ? 1 : 0), 4);
+    return (comp_value(hex, dpc) << 16)
+        | (comp_value(hex+dpc, dpc) << 8)
+        | comp_value(hex+2*dpc, dpc);
+}
+
 static HRESULT nscolor_to_str(LPCWSTR color, BSTR *ret)
 {
     int i, rgb = -1;
 
     static const WCHAR formatW[] = {'#','%','0','2','x','%','0','2','x','%','0','2','x',0};
 
-    if(!color || *color == '#') {
-        *ret = SysAllocString(color);
-        return *ret ? S_OK : E_OUTOFMEMORY;
+    if(!color || !*color) {
+        *ret = NULL;
+        return S_OK;
     }
 
     if(*color != '#') {
@@ -100,11 +143,8 @@ static HRESULT nscolor_to_str(LPCWSTR color, BSTR *ret)
                 rgb = keyword_table[i].rgb;
         }
     }
-    if(rgb == -1) {
-        WARN("unknown color %s\n", debugstr_w(color));
-        *ret = SysAllocString(color);
-        return *ret ? S_OK : E_OUTOFMEMORY;
-    }
+    if(rgb == -1)
+        rgb = loose_hex_to_rgb(color);
 
     *ret = SysAllocStringLen(NULL, 7);
     if(!*ret)




More information about the wine-cvs mailing list