Module: wine Branch: master Commit: b483ab8200afe5eac60c74b6cfa2b96ab6ee61a7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b483ab8200afe5eac60c74b6cf...
Author: Rico Schüller kgbricola@web.de Date: Wed Apr 20 21:55:37 2011 +0200
d3dx9: Implement ID3DXBaseEffect::GetParameterByName().
---
dlls/d3dx9_36/effect.c | 171 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 169 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c index 081da31..30f533f 100644 --- a/dlls/d3dx9_36/effect.c +++ b/dlls/d3dx9_36/effect.c @@ -436,6 +436,159 @@ static void free_effect_compiler(struct ID3DXEffectCompilerImpl *compiler) } }
+static LPSTR get_partial_string(LPCSTR name, char initial, char final) +{ + UINT length; + LPCSTR begin; + LPSTR part; + + TRACE("name %s, initial %c, final %c\n", debugstr_a(name), initial, final); + + begin = initial ? (strchr(name, initial) + 1) : name; + length = strchr(name, final) - begin; + if (length < 1) + { + WARN("Invalied argument specified.\n"); + return NULL; + } + + part = HeapAlloc(GetProcessHeap(), 0, length + 1); + if (!part) + { + ERR("Out of memory\n"); + return NULL; + } + memcpy(part, begin, length); + part[length] = 0; + + TRACE("part %s\n", debugstr_a(part)); + return part; +} + +static struct d3dx_parameter *get_parameter_by_name(struct ID3DXBaseEffectImpl *base, struct d3dx_parameter *parameter, LPCSTR name, BOOL is_annotation) +{ + unsigned int i; + struct d3dx_parameter *temp_parameter; + LPSTR part; + + TRACE("base %p, parameter %p, name %s, is_annotation %s\n", base, parameter, debugstr_a(name), is_annotation ? "YES" : "NO"); + + if (!name) return NULL; + + /* members */ + if (strchr(name, '.')) + { + part = get_partial_string(name, 0, '.'); + temp_parameter = get_parameter_by_name(base, parameter, part, is_annotation); + HeapFree(GetProcessHeap(), 0, part); + + if (temp_parameter) + { + temp_parameter = get_parameter_by_name(base, temp_parameter, strchr(name, '.') + 1, FALSE); + TRACE("Returning sub parameter %p\n", temp_parameter); + return temp_parameter; + } + + TRACE("Sub parameter not found\n"); + return NULL; + } + + /* annotations */ + if (strchr(name, '@')) + { + part = get_partial_string(name, 0, '@'); + temp_parameter = get_parameter_by_name(base, parameter, part, is_annotation); + HeapFree(GetProcessHeap(), 0, part); + + if (temp_parameter) + { + temp_parameter = get_parameter_by_name(base, temp_parameter, strchr(name, '@') + 1, TRUE); + TRACE("Returning sub parameter %p\n", temp_parameter); + return temp_parameter; + } + + TRACE("Sub parameter not found\n"); + return NULL; + } + + /* elements */ + if (strchr(name, '[')) + { + part = get_partial_string(name, 0, '['); + temp_parameter = get_parameter_by_name(base, parameter, part, is_annotation); + HeapFree(GetProcessHeap(), 0, part); + + if (temp_parameter) + { + unsigned int index; + + part = get_partial_string(name, '[', ']'); + index = atoi(part); + HeapFree(GetProcessHeap(), 0, part); + + if (index < temp_parameter->element_count) + { + TRACE("Returning sub parameter %p\n", get_parameter_struct(temp_parameter->member_handles[index])); + return get_parameter_struct(temp_parameter->member_handles[index]); + } + } + + TRACE("Sub parameter not found\n"); + return NULL; + } + + if (!parameter) + { + for (i=0; i < base->parameter_count; i++) + { + temp_parameter = get_parameter_struct(base->parameter_handles[i]); + + if (!strcmp(temp_parameter->name, name)) + { + TRACE("Returning parameter %p\n", temp_parameter); + return temp_parameter; + } + } + } + else + { + if (is_annotation) + { + for (i = 0; i < parameter->annotation_count; i++) + { + temp_parameter = get_parameter_struct(parameter->annotation_handles[i]); + + if (!strcmp(temp_parameter->name, name)) + { + TRACE("Returning parameter %p\n", temp_parameter); + return temp_parameter; + } + } + } + else + { + unsigned int count; + + if (parameter->element_count) count = parameter->element_count; + else count = parameter->member_count; + + for (i = 0; i < count; i++) + { + temp_parameter = get_parameter_struct(parameter->member_handles[i]); + + if (!strcmp(temp_parameter->name, name)) + { + TRACE("Returning parameter %p\n", temp_parameter); + return temp_parameter; + } + } + } + } + + TRACE("Parameter not found\n"); + return NULL; +} + static inline DWORD d3dx9_effect_version(DWORD major, DWORD minor) { return (0xfeff0000 | ((major) << 8) | (minor)); @@ -595,10 +748,24 @@ static D3DXHANDLE WINAPI ID3DXBaseEffectImpl_GetParameter(ID3DXBaseEffect *iface static D3DXHANDLE WINAPI ID3DXBaseEffectImpl_GetParameterByName(ID3DXBaseEffect *iface, D3DXHANDLE parameter, LPCSTR name) { struct ID3DXBaseEffectImpl *This = impl_from_ID3DXBaseEffect(iface); + struct d3dx_parameter *param = is_valid_parameter(This, parameter); + D3DXHANDLE handle;
- FIXME("iface %p, parameter %p, name %s stub\n", This, parameter, debugstr_a(name)); + TRACE("iface %p, parameter %p, name %s\n", This, parameter, debugstr_a(name));
- return NULL; + if (!param) param = get_parameter_by_name(This, NULL, parameter, FALSE); + + if (!name) + { + handle = get_parameter_handle(param); + TRACE("Returning parameter %p\n", handle); + return handle; + } + + handle = get_parameter_handle(get_parameter_by_name(This, param, name, FALSE)); + TRACE("Returning parameter %p\n", handle); + + return handle; }
static D3DXHANDLE WINAPI ID3DXBaseEffectImpl_GetParameterBySemantic(ID3DXBaseEffect *iface, D3DXHANDLE parameter, LPCSTR semantic)