diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index cf62cb9706c..f0d4cbe87b5 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -63,45 +63,57 @@ static const WCHAR yellowW[] = {'y','e','l','l','o','w',0}; static const struct { LPCWSTR keyword; - const WCHAR hexstr[8]; + DWORD rgb; } keyword_table[] = { - {aquaW, {'#','0','0','f','f','f','f',0}}, - {blackW, {'#','0','0','0','0','0','0',0}}, - {blueW, {'#','0','0','0','0','f','f',0}}, - {fuchsiaW, {'#','f','f','0','0','f','f',0}}, - {grayW, {'#','8','0','8','0','8','0',0}}, - {greenW, {'#','0','0','8','0','0','0',0}}, - {limeW, {'#','0','0','f','f','0','0',0}}, - {maroonW, {'#','8','0','0','0','0','0',0}}, - {navyW, {'#','0','0','0','0','8','0',0}}, - {oliveW, {'#','8','0','8','0','0','0',0}}, - {purpleW, {'#','8','0','0','0','8','0',0}}, - {redW, {'#','f','f','0','0','0','0',0}}, - {silverW, {'#','c','0','c','0','c','0',0}}, - {tealW, {'#','0','0','8','0','8','0',0}}, - {whiteW, {'#','f','f','f','f','f','f',0}}, - {yellowW, {'#','f','f','f','f','0','0',0}} + {aquaW, 0x00ffff}, + {blackW, 0x000000}, + {blueW, 0x0000ff}, + {fuchsiaW, 0xff00ff}, + {grayW, 0x808080}, + {greenW, 0x008000}, + {limeW, 0x00ff00}, + {maroonW, 0x800000}, + {navyW, 0x000080}, + {oliveW, 0x808000}, + {purpleW, 0x800080}, + {redW, 0xff0000}, + {silverW, 0xc0c0c0}, + {tealW, 0x008080}, + {whiteW, 0xffffff}, + {yellowW, 0xffff00} }; static HRESULT nscolor_to_str(LPCWSTR color, BSTR *ret) { - int i; + 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; } - for(i=0; i < sizeof(keyword_table)/sizeof(keyword_table[0]); i++) { - if(!strcmpiW(color, keyword_table[i].keyword)) { - *ret = SysAllocString(keyword_table[i].hexstr); - return *ret ? S_OK : E_OUTOFMEMORY; + if(*color != '#') { + for(i=0; i < sizeof(keyword_table)/sizeof(keyword_table[0]); i++) { + if(!strcmpiW(color, keyword_table[i].keyword)) + 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; + } - WARN("unknown color %s\n", debugstr_w(color)); - *ret = SysAllocString(color); - return *ret ? S_OK : E_OUTOFMEMORY; + *ret = SysAllocStringLen(NULL, 7); + if(!*ret) + return E_OUTOFMEMORY; + + sprintfW(*ret, formatW, rgb>>16, (rgb>>8)&0xff, rgb&0xff); + + TRACE("%s -> %s\n", debugstr_w(color), debugstr_w(*ret)); + return S_OK; } static BOOL variant_to_nscolor(const VARIANT *v, nsAString *nsstr)