From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/wintypes/main.c | 34 +++++++++++++++++++++++++++++++++- dlls/wintypes/tests/wintypes.c | 3 +++ 2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/dlls/wintypes/main.c b/dlls/wintypes/main.c index a04ac7706bc..41d58e08b29 100644 --- a/dlls/wintypes/main.c +++ b/dlls/wintypes/main.c @@ -401,6 +401,7 @@ struct property_value IReference_BYTE byte_iface; IReference_UINT32 uint32_iface; IReference_boolean boolean_iface; + IReference_FLOAT float_iface; IReference_DOUBLE double_iface; IReference_HSTRING hstring_iface; } irefs; @@ -483,6 +484,12 @@ static HRESULT STDMETHODCALLTYPE property_value_QueryInterface(IPropertyValue *i *out = &impl->irefs.boolean_iface; return S_OK; } + else if (IsEqualIID(riid, &IID_IReference_FLOAT) && impl->type == PropertyType_Single) + { + IReference_FLOAT_AddRef(&impl->irefs.float_iface); + *out = &impl->irefs.float_iface; + return S_OK; + } else if (IsEqualIID(riid, &IID_IReference_DOUBLE) && impl->type == PropertyType_Double) { IReference_DOUBLE_AddRef(&impl->irefs.double_iface); @@ -986,6 +993,31 @@ static const struct IReference_HSTRINGVtbl iref_hstring_vtbl = iref_hstring_get_Value, };
+DEFINE_IINSPECTABLE_(iref_float, IReference_FLOAT, struct property_value, + impl_from_IReference_FLOAT, irefs.float_iface, &impl->IPropertyValue_iface); + +static HRESULT STDMETHODCALLTYPE iref_float_get_Value(IReference_FLOAT *iface, FLOAT *value) +{ + struct property_value *impl = impl_from_IReference_FLOAT(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + return property_value_GetSingle(&impl->IPropertyValue_iface, value); +} + +static const struct IReference_FLOATVtbl iref_float_vtbl = +{ + iref_float_QueryInterface, + iref_float_AddRef, + iref_float_Release, + /* IInspectable methods */ + iref_float_GetIids, + iref_float_GetRuntimeClassName, + iref_float_GetTrustLevel, + /* IReference<FLOAT> methods */ + iref_float_get_Value, +}; + DEFINE_IINSPECTABLE_(iref_double, IReference_DOUBLE, struct property_value, impl_from_IReference_DOUBLE, irefs.double_iface, &impl->IPropertyValue_iface);
@@ -1078,7 +1110,7 @@ static HRESULT STDMETHODCALLTYPE property_value_statics_CreateSingle(IPropertyVa FLOAT value, IInspectable **property_value) { TRACE("iface %p, value %f, property_value %p.\n", iface, value, property_value); - return create_primitive_property_value(PropertyType_Single); + create_primitive_property_value_iref(PropertyType_Single, irefs.float_iface.lpVtbl, iref_float_vtbl); }
static HRESULT STDMETHODCALLTYPE property_value_statics_CreateDouble(IPropertyValueStatics *iface, diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index f4799151df1..acf1e949787 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -740,6 +740,7 @@ static void test_IPropertyValueStatics(void) IReference_UINT32 *iref_uint32; IReference_boolean *iref_boolean; IReference_HSTRING *iref_hstring; + IReference_FLOAT *iref_float; IReference_DOUBLE *iref_double; IPropertyValue *value = NULL; enum PropertyType type; @@ -747,6 +748,7 @@ static void test_IPropertyValueStatics(void) BYTE byte, *ptr_byte; HSTRING str, ret_str; UINT32 ret_uint32; + FLOAT ret_float; DOUBLE ret_double; boolean ret; HRESULT hr; @@ -1003,6 +1005,7 @@ static void test_IPropertyValueStatics(void) TEST_PROPERTY_VALUE_IREFERENCE(UInt32, IReference_UINT32, uint32_value, iref_uint32, ret_uint32) TEST_PROPERTY_VALUE_IREFERENCE(Boolean, IReference_boolean, boolean_value, iref_boolean, ret) TEST_PROPERTY_VALUE_IREFERENCE(String, IReference_HSTRING, str, iref_hstring, ret_str) + TEST_PROPERTY_VALUE_IREFERENCE(Single, IReference_FLOAT, float_value, iref_float, ret_float) TEST_PROPERTY_VALUE_IREFERENCE(Double, IReference_DOUBLE, double_value, iref_double, ret_double)
#undef TEST_PROPERTY_VALUE_IREFERENCE