gdiplus: Implement GdipGetPropertySize.

This commit is contained in:
Dmitry Timoshkov 2012-07-02 12:58:48 +09:00 committed by Alexandre Julliard
parent eb564a3160
commit 430355ef83
1 changed files with 51 additions and 6 deletions

View File

@ -2671,16 +2671,61 @@ GpStatus WINGDIPAPI GdipGetPropertyItem(GpImage *image, PROPID propid, UINT size
return stat; return stat;
} }
GpStatus WINGDIPAPI GdipGetPropertySize(GpImage *image, UINT* size, UINT* num) GpStatus WINGDIPAPI GdipGetPropertySize(GpImage *image, UINT *size, UINT *count)
{ {
static int calls; HRESULT hr;
IWICMetadataReader *reader;
IWICEnumMetadataItem *enumerator;
UINT prop_count, prop_size, i;
PROPVARIANT id, value;
TRACE("(%p,%p,%p)\n", image, size, num); TRACE("(%p,%p,%p)\n", image, size, count);
if(!(calls++)) if (!image || !size || !count) return InvalidParameter;
FIXME("not implemented\n");
return InvalidParameter; if (image->type != ImageTypeBitmap)
{
FIXME("Not implemented for type %d\n", image->type);
return NotImplemented;
}
reader = ((GpBitmap *)image)->metadata_reader;
if (!reader) return PropertyNotFound;
hr = IWICMetadataReader_GetCount(reader, &prop_count);
if (FAILED(hr)) return hresult_to_status(hr);
hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
if (FAILED(hr)) return hresult_to_status(hr);
IWICEnumMetadataItem_Reset(enumerator);
prop_size = 0;
PropVariantInit(&id);
PropVariantInit(&value);
for (i = 0; i < prop_count; i++)
{
UINT items_returned, item_size;
hr = IWICEnumMetadataItem_Next(enumerator, 1, NULL, &id, &value, &items_returned);
if (hr != S_OK) break;
item_size = propvariant_size(&value);
if (item_size) prop_size += sizeof(PropertyItem) + item_size;
PropVariantClear(&id);
PropVariantClear(&value);
}
IWICEnumMetadataItem_Release(enumerator);
if (hr != S_OK) return PropertyNotFound;
*count = prop_count;
*size = prop_size;
return Ok;
} }
struct image_format_dimension struct image_format_dimension