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 edda8e63357..4d16e8b21a5 100644 --- a/dlls/wintypes/main.c +++ b/dlls/wintypes/main.c @@ -410,6 +410,7 @@ struct property_value IReference_DateTime datetime_iface; IReference_GUID guid_iface; IReference_Point point_iface; + IReference_Rect rect_iface; IReference_HSTRING hstring_iface; } irefs; PropertyType type; @@ -545,6 +546,12 @@ static HRESULT STDMETHODCALLTYPE property_value_QueryInterface(IPropertyValue *i *out = &impl->irefs.point_iface; return S_OK; } + else if (IsEqualIID(riid, &IID_IReference_Rect) && impl->type == PropertyType_Rect) + { + IReference_Rect_AddRef(&impl->irefs.rect_iface); + *out = &impl->irefs.rect_iface; + return S_OK; + } else if (IsEqualIID(riid, &IID_IReference_HSTRING) && impl->type == PropertyType_String) { IReference_HSTRING_AddRef(&impl->irefs.hstring_iface); @@ -1267,6 +1274,31 @@ static const struct IReference_PointVtbl iref_point_vtbl = iref_point_get_Value, };
+DEFINE_IINSPECTABLE_(iref_rect, IReference_Rect, struct property_value, + impl_from_IReference_Rect, irefs.rect_iface, &impl->IPropertyValue_iface); + +static HRESULT STDMETHODCALLTYPE iref_rect_get_Value(IReference_Rect *iface, Rect *value) +{ + struct property_value *impl = impl_from_IReference_Rect(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + return property_value_GetRect(&impl->IPropertyValue_iface, value); +} + +static const struct IReference_RectVtbl iref_rect_vtbl = +{ + iref_rect_QueryInterface, + iref_rect_AddRef, + iref_rect_Release, + /* IInspectable methods */ + iref_rect_GetIids, + iref_rect_GetRuntimeClassName, + iref_rect_GetTrustLevel, + /* IReference<Rect> methods */ + iref_rect_get_Value, +}; + DEFINE_IINSPECTABLE(property_value_statics, IPropertyValueStatics, struct property_value_statics, IActivationFactory_iface)
static HRESULT STDMETHODCALLTYPE property_value_statics_CreateEmpty(IPropertyValueStatics *iface, @@ -1412,7 +1444,7 @@ static HRESULT STDMETHODCALLTYPE property_value_statics_CreateRect(IPropertyValu { TRACE("iface %p, value (%f, %f %fx%f), property_value %p.\n", iface, value.X, value.Y, value.Width, value.Height, property_value); - return create_primitive_property_value(PropertyType_Rect); + create_primitive_property_value_iref(PropertyType_Rect, irefs.rect_iface.lpVtbl, iref_rect_vtbl); }
static HRESULT STDMETHODCALLTYPE property_value_statics_CreateUInt8Array(IPropertyValueStatics *iface, diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index 0f1ef5d45b1..be2265ddc71 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -749,6 +749,7 @@ static void test_IPropertyValueStatics(void) IReference_DateTime *iref_datetime; IReference_GUID *iref_guid; IReference_Point *iref_point; + IReference_Rect *iref_rect; IPropertyValue *value = NULL; enum PropertyType type; unsigned int i, count; @@ -764,6 +765,7 @@ static void test_IPropertyValueStatics(void) struct DateTime ret_datetime; GUID ret_guid; struct Point ret_point; + struct Rect ret_rect; boolean ret; HRESULT hr;
@@ -1028,6 +1030,7 @@ static void test_IPropertyValueStatics(void) TEST_PROPERTY_VALUE_IREFERENCE(DateTime, IReference_DateTime, datetime_value, iref_datetime, ret_datetime) TEST_PROPERTY_VALUE_IREFERENCE(Guid, IReference_GUID, IID_IPropertyValue, iref_guid, ret_guid) TEST_PROPERTY_VALUE_IREFERENCE(Point, IReference_Point, point_value, iref_point, ret_point) + TEST_PROPERTY_VALUE_IREFERENCE(Rect, IReference_Rect, rect_value, iref_rect, ret_rect)
#undef TEST_PROPERTY_VALUE_IREFERENCE