Rico Schüller : d3dx9: Implement ID3DXBaseEffect:: GetParameterByName().
Alexandre Julliard
julliard at winehq.org
Thu Apr 21 11:17:46 CDT 2011
Module: wine
Branch: master
Commit: b483ab8200afe5eac60c74b6cfa2b96ab6ee61a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b483ab8200afe5eac60c74b6cfa2b96ab6ee61a7
Author: Rico Schüller <kgbricola at 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)
More information about the wine-cvs
mailing list