oleaut32: Add tests for metafiles, make them pass under Wine.
This commit is contained in:
parent
096991428f
commit
a03cc957e1
@ -5,6 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright 2000 Huw D M Davies for CodeWeavers.
|
* Copyright 2000 Huw D M Davies for CodeWeavers.
|
||||||
* Copyright 2001 Marcus Meissner
|
* Copyright 2001 Marcus Meissner
|
||||||
|
* Copyright 2008 Kirill K. Smirnov
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -1686,39 +1687,24 @@ static HRESULT OLEPictureImpl_LoadIcon(OLEPictureImpl *This, BYTE *xbuf, ULONG x
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT OLEPictureImpl_LoadMetafile(OLEPictureImpl *This,
|
static HRESULT OLEPictureImpl_LoadEnhMetafile(OLEPictureImpl *This,
|
||||||
const BYTE *data, ULONG size)
|
const BYTE *data, ULONG size)
|
||||||
{
|
{
|
||||||
HMETAFILE hmf;
|
|
||||||
HENHMETAFILE hemf;
|
HENHMETAFILE hemf;
|
||||||
|
ENHMETAHEADER hdr;
|
||||||
/* SetMetaFileBitsEx performs data check on its own */
|
|
||||||
hmf = SetMetaFileBitsEx(size, data);
|
|
||||||
if (hmf)
|
|
||||||
{
|
|
||||||
This->desc.picType = PICTYPE_METAFILE;
|
|
||||||
This->desc.u.wmf.hmeta = hmf;
|
|
||||||
This->desc.u.wmf.xExt = 0;
|
|
||||||
This->desc.u.wmf.yExt = 0;
|
|
||||||
|
|
||||||
This->origWidth = 0;
|
|
||||||
This->origHeight = 0;
|
|
||||||
This->himetricWidth = 0;
|
|
||||||
This->himetricHeight = 0;
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
hemf = SetEnhMetaFileBits(size, data);
|
hemf = SetEnhMetaFileBits(size, data);
|
||||||
if (!hemf) return E_FAIL;
|
if (!hemf) return E_FAIL;
|
||||||
|
|
||||||
|
GetEnhMetaFileHeader(hemf, sizeof(hdr), &hdr);
|
||||||
|
|
||||||
This->desc.picType = PICTYPE_ENHMETAFILE;
|
This->desc.picType = PICTYPE_ENHMETAFILE;
|
||||||
This->desc.u.emf.hemf = hemf;
|
This->desc.u.emf.hemf = hemf;
|
||||||
|
|
||||||
This->origWidth = 0;
|
This->origWidth = 0;
|
||||||
This->origHeight = 0;
|
This->origHeight = 0;
|
||||||
This->himetricWidth = 0;
|
This->himetricWidth = hdr.rclFrame.right - hdr.rclFrame.left;
|
||||||
This->himetricHeight = 0;
|
This->himetricHeight = hdr.rclFrame.bottom - hdr.rclFrame.top;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@ -1727,16 +1713,24 @@ static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This,
|
|||||||
const BYTE *data, ULONG size)
|
const BYTE *data, ULONG size)
|
||||||
{
|
{
|
||||||
APM_HEADER *header = (APM_HEADER *)data;
|
APM_HEADER *header = (APM_HEADER *)data;
|
||||||
HRESULT hr;
|
HMETAFILE hmf;
|
||||||
|
|
||||||
if (size < sizeof(APM_HEADER))
|
if (size < sizeof(APM_HEADER))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
if (header->key != 0x9ac6cdd7)
|
if (header->key != 0x9ac6cdd7)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
if ((hr = OLEPictureImpl_LoadMetafile(This, data + sizeof(APM_HEADER), size - sizeof(*header))) != S_OK)
|
/* SetMetaFileBitsEx performs data check on its own */
|
||||||
return hr;
|
hmf = SetMetaFileBitsEx(size - sizeof(*header), data + sizeof(*header));
|
||||||
|
if (!hmf) return E_FAIL;
|
||||||
|
|
||||||
|
This->desc.picType = PICTYPE_METAFILE;
|
||||||
|
This->desc.u.wmf.hmeta = hmf;
|
||||||
|
This->desc.u.wmf.xExt = 0;
|
||||||
|
This->desc.u.wmf.yExt = 0;
|
||||||
|
|
||||||
|
This->origWidth = 0;
|
||||||
|
This->origHeight = 0;
|
||||||
This->himetricWidth = MulDiv((INT)header->right - header->left, 2540, header->inch);
|
This->himetricWidth = MulDiv((INT)header->right - header->left, 2540, header->inch);
|
||||||
This->himetricHeight = MulDiv((INT)header->bottom - header->top, 2540, header->inch);
|
This->himetricHeight = MulDiv((INT)header->bottom - header->top, 2540, header->inch);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -1924,8 +1918,8 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
|
|||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* let's see if it's a metafile */
|
/* let's see if it's a EMF */
|
||||||
hr = OLEPictureImpl_LoadMetafile(This, xbuf, xread);
|
hr = OLEPictureImpl_LoadEnhMetafile(This, xbuf, xread);
|
||||||
if (hr == S_OK) break;
|
if (hr == S_OK) break;
|
||||||
|
|
||||||
FIXME("Unknown magic %04x, %d read bytes:\n",magic,xread);
|
FIXME("Unknown magic %04x, %d read bytes:\n",magic,xread);
|
||||||
@ -2687,8 +2681,15 @@ HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
|
|||||||
*ppvObj = NULL;
|
*ppvObj = NULL;
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
IPersistStream_Load(ps,lpstream);
|
hr = IPersistStream_Load(ps,lpstream);
|
||||||
IPersistStream_Release(ps);
|
IPersistStream_Release(ps);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
ERR("IPersistStream_Load failed\n");
|
||||||
|
IPicture_Release(newpic);
|
||||||
|
*ppvObj = NULL;
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
hr = IPicture_QueryInterface(newpic,riid,ppvObj);
|
hr = IPicture_QueryInterface(newpic,riid,ppvObj);
|
||||||
if (hr)
|
if (hr)
|
||||||
FIXME("Failed to get interface %s from IPicture.\n",debugstr_guid(riid));
|
FIXME("Failed to get interface %s from IPicture.\n",debugstr_guid(riid));
|
||||||
|
@ -121,6 +121,53 @@ static const unsigned char apmdata[] = {
|
|||||||
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
|
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* MF_TEXTOUT_ON_PATH_BITS from gdi32/tests/metafile.c */
|
||||||
|
static const unsigned char metafile[] = {
|
||||||
|
0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x19, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x0a,
|
||||||
|
0x16, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x54, 0x65, 0x73, 0x74, 0x03, 0x00, 0x05, 0x00,
|
||||||
|
0x08, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EMF_TEXTOUT_ON_PATH_BITS from gdi32/tests/metafile.c */
|
||||||
|
static const unsigned char enhmetafile[] = {
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xe7, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, 0xff,
|
||||||
|
0x20, 0x45, 0x4d, 0x46, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xf4, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
|
||||||
|
0x40, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x04, 0x00,
|
||||||
|
0x80, 0xa9, 0x03, 0x00, 0x3b, 0x00, 0x00, 0x00,
|
||||||
|
0x08, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
|
||||||
|
0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xc8, 0x41, 0x00, 0x80, 0xbb, 0x41,
|
||||||
|
0x0b, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00,
|
||||||
|
0x54, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
|
||||||
|
0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
||||||
|
0x3c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
|
||||||
|
0x14, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct NoStatStreamImpl
|
struct NoStatStreamImpl
|
||||||
{
|
{
|
||||||
const IStreamVtbl *lpVtbl;
|
const IStreamVtbl *lpVtbl;
|
||||||
@ -478,6 +525,67 @@ static void test_apm()
|
|||||||
ole_expect(IPicture_get_hPal(pict, &handle), E_FAIL);
|
ole_expect(IPicture_get_hPal(pict, &handle), E_FAIL);
|
||||||
IPicture_Release(pict);
|
IPicture_Release(pict);
|
||||||
IStream_Release(stream);
|
IStream_Release(stream);
|
||||||
|
GlobalUnlock(hglob);
|
||||||
|
GlobalFree(hglob);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_metafile(void)
|
||||||
|
{
|
||||||
|
LPSTREAM stream;
|
||||||
|
IPicture *pict;
|
||||||
|
HGLOBAL hglob;
|
||||||
|
LPBYTE *data;
|
||||||
|
|
||||||
|
hglob = GlobalAlloc (0, sizeof(metafile));
|
||||||
|
data = GlobalLock(hglob);
|
||||||
|
memcpy(data, metafile, sizeof(metafile));
|
||||||
|
|
||||||
|
ole_check(CreateStreamOnHGlobal(hglob, TRUE, &stream));
|
||||||
|
/* Windows does not load simple metafiles */
|
||||||
|
ole_expect(OleLoadPictureEx(stream, sizeof(metafile), TRUE, &IID_IPicture, 100, 100, 0, (LPVOID *)&pict), E_FAIL);
|
||||||
|
|
||||||
|
IStream_Release(stream);
|
||||||
|
GlobalUnlock(hglob);
|
||||||
|
GlobalFree(hglob);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_enhmetafile(void)
|
||||||
|
{
|
||||||
|
OLE_HANDLE handle;
|
||||||
|
LPSTREAM stream;
|
||||||
|
IPicture *pict;
|
||||||
|
HGLOBAL hglob;
|
||||||
|
LPBYTE *data;
|
||||||
|
LONG cxy;
|
||||||
|
BOOL keep;
|
||||||
|
short type;
|
||||||
|
|
||||||
|
hglob = GlobalAlloc (0, sizeof(enhmetafile));
|
||||||
|
data = GlobalLock(hglob);
|
||||||
|
memcpy(data, enhmetafile, sizeof(enhmetafile));
|
||||||
|
|
||||||
|
ole_check(CreateStreamOnHGlobal(hglob, TRUE, &stream));
|
||||||
|
ole_check(OleLoadPictureEx(stream, sizeof(enhmetafile), TRUE, &IID_IPicture, 10, 10, 0, (LPVOID *)&pict));
|
||||||
|
|
||||||
|
ole_check(IPicture_get_Handle(pict, &handle));
|
||||||
|
ok(handle != 0, "handle is null\n");
|
||||||
|
|
||||||
|
ole_check(IPicture_get_Type(pict, &type));
|
||||||
|
expect_eq(type, PICTYPE_ENHMETAFILE, short, "%d");
|
||||||
|
|
||||||
|
ole_check(IPicture_get_Height(pict, &cxy));
|
||||||
|
expect_eq(cxy, -23, LONG, "%d");
|
||||||
|
|
||||||
|
ole_check(IPicture_get_Width(pict, &cxy));
|
||||||
|
expect_eq(cxy, -25, LONG, "%d");
|
||||||
|
|
||||||
|
ole_check(IPicture_get_KeepOriginalFormat(pict, &keep));
|
||||||
|
todo_wine expect_eq(keep, FALSE, LONG, "%d");
|
||||||
|
|
||||||
|
IPicture_Release(pict);
|
||||||
|
IStream_Release(stream);
|
||||||
|
GlobalUnlock(hglob);
|
||||||
|
GlobalFree(hglob);
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(olepicture)
|
START_TEST(olepicture)
|
||||||
@ -501,6 +609,8 @@ START_TEST(olepicture)
|
|||||||
test_empty_image();
|
test_empty_image();
|
||||||
test_empty_image_2();
|
test_empty_image_2();
|
||||||
test_apm();
|
test_apm();
|
||||||
|
test_metafile();
|
||||||
|
test_enhmetafile();
|
||||||
|
|
||||||
test_Invoke();
|
test_Invoke();
|
||||||
test_OleCreatePictureIndirect();
|
test_OleCreatePictureIndirect();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user