Jacek Caban : mshtml: Added simple filter parser to support opacity.
Alexandre Julliard
julliard at winehq.org
Mon Feb 28 11:02:12 CST 2011
Module: wine
Branch: master
Commit: f3d40454a920511aaf5643899088c8db708dceb8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3d40454a920511aaf5643899088c8db708dceb8
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Feb 28 13:13:37 2011 +0100
mshtml: Added simple filter parser to support opacity.
---
dlls/mshtml/htmlstyle.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++
dlls/mshtml/tests/dom.c | 2 +-
2 files changed, 106 insertions(+), 1 deletions(-)
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index c0074ca..e34f001 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -2545,6 +2545,109 @@ static HRESULT WINAPI HTMLStyle_get_clip(IHTMLStyle *iface, BSTR *p)
return E_NOTIMPL;
}
+static void set_opacity(HTMLStyle *This, const WCHAR *val)
+{
+ nsAString name_str, val_str, empty_str;
+ nsresult nsres;
+
+ static const WCHAR opacityW[] = {'o','p','a','c','i','t','y',0};
+
+ TRACE("%s\n", debugstr_w(val));
+
+ nsAString_InitDepend(&name_str, opacityW);
+ nsAString_InitDepend(&val_str, val);
+ nsAString_InitDepend(&empty_str, emptyW);
+
+ nsres = nsIDOMCSSStyleDeclaration_SetProperty(This->nsstyle, &name_str, &val_str, &empty_str);
+ if(NS_FAILED(nsres))
+ ERR("SetProperty failed: %08x\n", nsres);
+
+ nsAString_Finish(&name_str);
+ nsAString_Finish(&val_str);
+ nsAString_Finish(&empty_str);
+}
+
+static void update_filter(HTMLStyle *This)
+{
+ const WCHAR *ptr = This->filter, *ptr2;
+
+ static const WCHAR alphaW[] = {'a','l','p','h','a'};
+
+ if(!ptr) {
+ set_opacity(This, emptyW);
+ return;
+ }
+
+ while(1) {
+ while(isspaceW(*ptr))
+ ptr++;
+ if(!*ptr)
+ break;
+
+ ptr2 = ptr;
+ while(isalnumW(*ptr))
+ ptr++;
+ if(ptr == ptr2) {
+ WARN("unexpected char '%c'\n", *ptr);
+ break;
+ }
+ if(*ptr != '(') {
+ WARN("expected '('\n");
+ continue;
+ }
+
+ if(ptr2 + sizeof(alphaW)/sizeof(WCHAR) == ptr && !memcmp(ptr2, alphaW, sizeof(alphaW))) {
+ static const WCHAR formatW[] = {'%','f',0};
+ static const WCHAR opacityW[] = {'o','p','a','c','i','t','y','='};
+
+ ptr++;
+ do {
+ while(isspaceW(*ptr))
+ ptr++;
+
+ ptr2 = ptr;
+ while(*ptr && *ptr != ',' && *ptr != ')')
+ ptr++;
+ if(!*ptr) {
+ WARN("unexpected end of string\n");
+ break;
+ }
+
+ if(ptr-ptr2 > sizeof(opacityW)/sizeof(WCHAR) && !memcmp(ptr2, opacityW, sizeof(opacityW))) {
+ float fval = 0.0f, e = 0.1f;
+ WCHAR buf[32];
+
+ ptr2 += sizeof(opacityW)/sizeof(WCHAR);
+
+ while(isdigitW(*ptr2))
+ fval = fval*10.0f + (float)(*ptr2++ - '0');
+
+ if(*ptr2 == '.') {
+ while(isdigitW(*++ptr2)) {
+ fval += e * (float)(*ptr2++ - '0');
+ e *= 0.1f;
+ }
+ }
+
+ sprintfW(buf, formatW, fval * 0.01f);
+ set_opacity(This, buf);
+ }else {
+ FIXME("unknown param %s\n", debugstr_wn(ptr2, ptr-ptr2));
+ }
+
+ if(*ptr == ',')
+ ptr++;
+ }while(*ptr != ')');
+ }else {
+ FIXME("unknown filter %s\n", debugstr_wn(ptr2, ptr-ptr2));
+ ptr = strchrW(ptr, ')');
+ if(!ptr)
+ break;
+ ptr++;
+ }
+ }
+}
+
static HRESULT WINAPI HTMLStyle_put_filter(IHTMLStyle *iface, BSTR v)
{
HTMLStyle *This = impl_from_IHTMLStyle(iface);
@@ -2560,6 +2663,8 @@ static HRESULT WINAPI HTMLStyle_put_filter(IHTMLStyle *iface, BSTR v)
heap_free(This->filter);
This->filter = new_filter;
+
+ update_filter(This);
return S_OK;
}
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 0ecce41..b8e9f76 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -5608,7 +5608,7 @@ static void test_style_filters(IHTMLElement *elem)
ok(hres == S_OK, "get_style failed: %08x\n", hres);
test_style_filter(style, NULL);
- set_style_filter(style, "alpha(opacity=50.00000)");
+ set_style_filter(style, "alpha(opacity=50.0040)");
set_style_filter(style, "alpha(opacity=100)");
IHTMLStyle_Release(style);
More information about the wine-cvs
mailing list