Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2018
- 90 participants
- 1704 messages
[PATCH v2 5/5] ole32/tests: Add tests for loading from presentation streams to data cache.
by Sergio Gómez Del Real
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/ole32/tests/ole2.c | 165 ++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 145 insertions(+), 20 deletions(-)
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 3bd4acce92..da9c5ff070 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -4078,6 +4078,74 @@ static void check_storage_contents(IStorage *stg, const struct storage_def *stg_
}
}
+static HRESULT check_medium_contents(const STGMEDIUM *stgmed_def, STGMEDIUM *stgmed_ld, FORMATETC *fmt)
+{
+ BYTE *data_def, *data_ld;
+ int i;
+ int data_size = 0, data_size_def, data_size_ld;
+
+ if (stgmed_def->tymed != stgmed_ld->tymed)
+ return E_FAIL;
+
+ if (fmt->cfFormat == CF_METAFILEPICT)
+ {
+ METAFILEPICT *mfpict_def = GlobalLock(U(stgmed_def)->hMetaFilePict);
+ METAFILEPICT *mfpict_ld = GlobalLock(U(stgmed_ld)->hMetaFilePict);
+
+ data_size_def = GetMetaFileBitsEx(mfpict_def->hMF, 0, NULL);
+ data_size_ld = GetMetaFileBitsEx(mfpict_ld->hMF, 0, NULL);
+ if (data_size_def == data_size_ld)
+ {
+ data_def = HeapAlloc(GetProcessHeap(), 0, data_size_def);
+ data_ld = HeapAlloc(GetProcessHeap(), 0, data_size_ld);
+ GetMetaFileBitsEx(mfpict_def->hMF, data_size_def, data_def);
+ GetMetaFileBitsEx(mfpict_ld->hMF, data_size_ld, data_ld);
+ data_size = data_size_def;
+ }
+ else return E_FAIL;
+ }
+ else if (fmt->cfFormat == CF_ENHMETAFILE)
+ {
+ data_size_def = GetEnhMetaFileBits(stgmed_def->hEnhMetaFile, 0, NULL);
+ data_size_ld = GetEnhMetaFileBits(stgmed_ld->hEnhMetaFile, 0, NULL);
+ if (data_size_def == data_size_ld)
+ {
+ data_def = HeapAlloc(GetProcessHeap(), 0, data_size_def);
+ data_ld = HeapAlloc(GetProcessHeap(), 0, data_size_ld);
+ GetEnhMetaFileBits(stgmed_def->hEnhMetaFile, data_size_def, data_def);
+ GetEnhMetaFileBits(stgmed_ld->hEnhMetaFile, data_size_ld, data_ld);
+ data_size = data_size_def;
+ }
+ else return E_FAIL;
+ }
+ else if (fmt->cfFormat == CF_DIB)
+ {
+ data_def = GlobalLock(stgmed_def->hGlobal);
+ data_ld = GlobalLock(stgmed_ld->hGlobal);
+ data_size = sizeof(dib);
+ }
+ else
+ return E_NOTIMPL;
+
+ for (i = 0; i < data_size; i++)
+ {
+ if (data_def[i] != data_ld[i]) return E_FAIL;
+ }
+
+ if (fmt->cfFormat == CF_DIB)
+ {
+ GlobalUnlock(stgmed_def->hGlobal);
+ GlobalUnlock(stgmed_ld->hGlobal);
+ }
+ else if (fmt->cfFormat == CF_METAFILEPICT)
+ {
+ GlobalUnlock(U(stgmed_def)->hMetaFilePict);
+ GlobalUnlock(U(stgmed_ld)->hMetaFilePict);
+ }
+
+ return S_OK;
+}
+
static IStorage *create_storage_from_def(const struct storage_def *stg_def)
{
HRESULT hr;
@@ -4250,6 +4318,7 @@ static void test_data_cache_save_data(void)
IStorage *doc;
IOleCache2 *cache;
IPersistStorage *persist;
+ IDataObject *odata;
int enumerated_streams, matched_streams, i;
DWORD dummy;
struct tests_data_cache
@@ -4258,6 +4327,7 @@ static void test_data_cache_save_data(void)
int num_fmts, num_set;
const CLSID *clsid;
struct storage_def stg_def;
+ STGMEDIUM stgmed_def[MAX_FMTS];
};
static struct tests_data_cache *pdata, data[] =
@@ -4274,8 +4344,9 @@ static void test_data_cache_save_data(void)
&CLSID_WineTestOld, 4, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
{ "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
{ "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 },
- { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } }
- }
+ { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
/* without setting data */
{
@@ -4288,8 +4359,9 @@ static void test_data_cache_save_data(void)
{
&CLSID_WineTestOld, 3, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
{ "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
- { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } }
- }
+ { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
/* static picture clsids */
{
@@ -4298,8 +4370,9 @@ static void test_data_cache_save_data(void)
},
1, 1, &CLSID_Picture_Dib,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
{
{
@@ -4307,8 +4380,9 @@ static void test_data_cache_save_data(void)
},
1, 1, &CLSID_Picture_Metafile,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
{
{
@@ -4316,8 +4390,9 @@ static void test_data_cache_save_data(void)
},
1, 1, &CLSID_Picture_EnhMetafile,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
/* static picture clsids without setting any data */
{
@@ -4326,8 +4401,9 @@ static void test_data_cache_save_data(void)
},
1, 0, &CLSID_Picture_Dib,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
{
{
@@ -4335,8 +4411,9 @@ static void test_data_cache_save_data(void)
},
1, 0, &CLSID_Picture_Metafile,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
{
{
@@ -4344,8 +4421,9 @@ static void test_data_cache_save_data(void)
},
1, 0, &CLSID_Picture_EnhMetafile,
{
- &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
- }
+ &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+ },
+ { { 0 } }
},
{
{
@@ -4366,9 +4444,9 @@ static void test_data_cache_save_data(void)
ok(SUCCEEDED(hr), "unexpected %#x\n", hr);
if (i < pdata->num_set)
{
- get_stgmedium(pdata->fmts[i].cfFormat, &stgmed);
- get_stgdef(&pdata->stg_def, pdata->fmts[i].cfFormat, &stgmed, i);
- hr = IOleCache2_SetData(cache, &pdata->fmts[i], &stgmed, TRUE);
+ get_stgmedium(pdata->fmts[i].cfFormat, &pdata->stgmed_def[i]);
+ get_stgdef(&pdata->stg_def, pdata->fmts[i].cfFormat, &pdata->stgmed_def[i], i);
+ hr = IOleCache2_SetData(cache, &pdata->fmts[i], &pdata->stgmed_def[i], FALSE);
ok(hr == S_OK, "unexpected %#x\n", hr);
}
}
@@ -4399,12 +4477,59 @@ static void test_data_cache_save_data(void)
ok(enumerated_streams == pdata->stg_def.stream_count, "created %d != def streams %d\n",
enumerated_streams, pdata->stg_def.stream_count);
+ IPersistStorage_Release(persist);
+ IOleCache2_Release(cache);
+
+ /* now test _Load/_GetData using the storage we used for _Save */
+ hr = CreateDataCache(NULL, pdata->clsid, &IID_IOleCache2, (void **)&cache);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&persist);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ for (i = 0; i < pdata->num_fmts; i++)
+ {
+ hr = IOleCache2_Cache(cache, &pdata->fmts[i], 0, &dummy);
+ ok(SUCCEEDED(hr), "unexpected %#x\n", hr);
+ }
+
+ if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_Dib))
+ {
+ hr = IStorage_SetClass(doc, &CLSID_Picture_Dib);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ }
+ else if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_Metafile))
+ {
+ hr = IStorage_SetClass(doc, &CLSID_Picture_Metafile);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ }
+ else if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_EnhMetafile))
+ {
+ hr = IStorage_SetClass(doc, &CLSID_Picture_EnhMetafile);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ }
+ trace("IPersistStorage_Load\n");
+ hr = IPersistStorage_Load(persist, doc);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+
+ hr = IOleCache2_QueryInterface(cache, &IID_IDataObject, (void **)&odata);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
for (i = 0; i < pdata->num_set; i++)
- HeapFree(GetProcessHeap(), 0, (void *)pdata->stg_def.stream[i].data);
+ {
+ hr = IDataObject_GetData(odata, &pdata->fmts[i], &stgmed);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ hr = check_medium_contents(&pdata->stgmed_def[i], &stgmed, &pdata->fmts[i]);
+ ok(hr == S_OK, "unexpected %#x\n", hr);
+ ReleaseStgMedium(&stgmed);
+ ReleaseStgMedium(&pdata->stgmed_def[i]);
+ }
+
+ IDataObject_Release(odata);
IPersistStorage_Release(persist);
IStorage_Release(doc);
IOleCache2_Release(cache);
+ for (i = 0; i < pdata->num_set; i++)
+ HeapFree(GetProcessHeap(), 0, (void *)pdata->stg_def.stream[i].data);
+
}
}
--
2.14.1
March 30, 2018
[PATCH v2 4/5] ole32: Reset CLSID of datacache so that automatic entry is re-created on load.
by Sergio Gómez Del Real
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/ole32/datacache.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 0f23faf08c..452e171e4c 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -1862,6 +1862,7 @@ static HRESULT WINAPI DataCache_Load( IPersistStorage *iface, IStorage *stg )
DataCacheEntry_Destroy( This, entry );
ReadClassStg( stg, &clsid );
+ This->clsid = CLSID_NULL;
hr = create_automatic_entry( This, &clsid );
if (FAILED( hr )) return hr;
--
2.14.1
March 30, 2018
[PATCH v2 3/5] ole32: Add support for loading wmf from contents streams to data cache.
by Sergio Gómez Del Real
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/ole32/datacache.c | 71 +++++++++++++++++++++++++++++---------------------
1 file changed, 42 insertions(+), 29 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index e6cda331dd..0f23faf08c 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -609,6 +609,17 @@ static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
GlobalUnlock( data );
return hr;
}
+#include <pshpack2.h>
+struct meta_placeable
+{
+ DWORD key;
+ WORD hwmf;
+ WORD bounding_box[4];
+ WORD inch;
+ DWORD reserved;
+ WORD checksum;
+};
+#include <poppack.h>
static HRESULT read_pres_header( IStream *stm, DWORD *clip_format,
PresentationDataHeader *pres_hdr )
@@ -629,28 +640,34 @@ static HRESULT load_mf_pict( DataCacheEntry *cache_entry, IStream *stm )
HRESULT hr;
STATSTG stat;
ULARGE_INTEGER current_pos;
- void *bits;
+ void *bits, *hdr;
METAFILEPICT *mfpict;
HGLOBAL hmfpict;
- PresentationDataHeader header;
- CLIPFORMAT clipformat;
static const LARGE_INTEGER offset_zero;
- ULONG read;
-
- if (cache_entry->load_stream_num == STREAM_NUMBER_CONTENTS)
- {
- FIXME( "Unimplemented for CONTENTS stream\n" );
- return E_FAIL;
- }
+ ULONG read, hdr_size;
+ /* only standard clipformats */
+ struct {
+ DWORD cf[2];
+ PresentationDataHeader pres;
+ } pres_hdr;
+ struct meta_placeable meta_place_rec;
hr = IStream_Stat( stm, &stat, STATFLAG_NONAME );
if (FAILED( hr )) return hr;
- hr = read_clipformat( stm, &clipformat );
- if (FAILED( hr )) return hr;
+ if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
+ {
+ hdr_size = sizeof(pres_hdr);
+ hdr = &pres_hdr;
+ }
+ else
+ {
+ hdr_size = sizeof(struct meta_placeable);
+ hdr = &meta_place_rec;
+ }
- hr = IStream_Read( stm, &header, sizeof(header), &read );
- if (hr != S_OK || read != sizeof(header)) return E_FAIL;
+ hr = IStream_Read( stm, hdr, hdr_size, &read );
+ if (hr != S_OK || read != hdr_size) return E_FAIL;
hr = IStream_Seek( stm, offset_zero, STREAM_SEEK_CUR, ¤t_pos );
if (FAILED( hr )) return hr;
@@ -673,10 +690,18 @@ static HRESULT load_mf_pict( DataCacheEntry *cache_entry, IStream *stm )
if (SUCCEEDED( hr ))
{
- /* FIXME: get this from the stream */
mfpict->mm = MM_ANISOTROPIC;
- mfpict->xExt = header.dwObjectExtentX;
- mfpict->yExt = header.dwObjectExtentY;
+ /* FIXME: get this from the stream */
+ if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
+ {
+ mfpict->xExt = pres_hdr.pres.dwObjectExtentX;
+ mfpict->yExt = pres_hdr.pres.dwObjectExtentY;
+ }
+ else
+ {
+ mfpict->xExt = (meta_place_rec.bounding_box[2] * 2540) / meta_place_rec.inch;
+ mfpict->yExt = (meta_place_rec.bounding_box[3] * 2540) / meta_place_rec.inch;
+ }
mfpict->hMF = SetMetaFileBitsEx( stat.cbSize.u.LowPart, bits );
if (!mfpict->hMF)
hr = E_FAIL;
@@ -964,18 +989,6 @@ end:
return hr;
}
-#include <pshpack2.h>
-struct meta_placeable
-{
- DWORD key;
- WORD hwmf;
- WORD bounding_box[4];
- WORD inch;
- DWORD reserved;
- WORD checksum;
-};
-#include <poppack.h>
-
static HRESULT save_mfpict(DataCacheEntry *entry, BOOL contents, IStream *stream)
{
HRESULT hr = S_OK;
--
2.14.1
March 30, 2018
[PATCH v2 2/5] ole32: Add support for loading dibs from presentation streams to data cache.
by Sergio Gómez Del Real
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/ole32/datacache.c | 49 +++++++++++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 12 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 799e14a867..e6cda331dd 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -610,6 +610,20 @@ static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
return hr;
}
+static HRESULT read_pres_header( IStream *stm, DWORD *clip_format,
+ PresentationDataHeader *pres_hdr )
+{
+ ULONG read;
+ HRESULT hr;
+
+ hr = IStream_Read( stm, clip_format, sizeof(DWORD) * 2, &read );
+ if (hr != S_OK || read != sizeof(DWORD) * 2) return E_FAIL;
+ hr = IStream_Read( stm, pres_hdr, sizeof(PresentationDataHeader), &read );
+ if (hr != S_OK || read != sizeof(PresentationDataHeader)) return E_FAIL;
+
+ return S_OK;
+}
+
static HRESULT load_mf_pict( DataCacheEntry *cache_entry, IStream *stm )
{
HRESULT hr;
@@ -689,32 +703,42 @@ static HRESULT load_dib( DataCacheEntry *cache_entry, IStream *stm )
void *dib;
HGLOBAL hglobal;
ULONG read, info_size, bi_size;
- BITMAPFILEHEADER file;
BITMAPINFOHEADER *info;
-
- if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
- {
- FIXME( "Unimplemented for presentation stream\n" );
- return E_FAIL;
- }
+ /* only standard clipformats */
+ struct {
+ DWORD cf[2];
+ PresentationDataHeader pres;
+ } pres_hdr;
+ BITMAPFILEHEADER file;
hr = IStream_Stat( stm, &stat, STATFLAG_NONAME );
if (FAILED( hr )) return hr;
- if (stat.cbSize.QuadPart < sizeof(file) + sizeof(DWORD)) return E_FAIL;
- hr = IStream_Read( stm, &file, sizeof(file), &read );
- if (hr != S_OK || read != sizeof(file)) return E_FAIL;
- stat.cbSize.QuadPart -= sizeof(file);
+ if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
+ {
+ if (stat.cbSize.QuadPart < sizeof(pres_hdr)) return E_FAIL;
+ hr = read_pres_header( stm, &pres_hdr, &pres_hdr.pres );
+ if (FAILED( hr )) return hr;
+ stat.cbSize.QuadPart -= sizeof(pres_hdr);
+ }
+ else
+ {
+ if (stat.cbSize.QuadPart < sizeof(BITMAPFILEHEADER)) return E_FAIL;
+ hr = IStream_Read( stm, &file, sizeof(BITMAPFILEHEADER), &read );
+ stat.cbSize.QuadPart -= sizeof(BITMAPFILEHEADER);
+ }
hglobal = GlobalAlloc( GMEM_MOVEABLE, stat.cbSize.u.LowPart );
if (!hglobal) return E_OUTOFMEMORY;
dib = GlobalLock( hglobal );
+ /* read first DWORD of BITMAPINFOHEADER */
hr = IStream_Read( stm, dib, sizeof(DWORD), &read );
if (hr != S_OK || read != sizeof(DWORD)) goto fail;
bi_size = *(DWORD *)dib;
if (stat.cbSize.QuadPart < bi_size) goto fail;
+ /* read rest of BITMAPINFOHEADER */
hr = IStream_Read( stm, (char *)dib + sizeof(DWORD), bi_size - sizeof(DWORD), &read );
if (hr != S_OK || read != bi_size - sizeof(DWORD)) goto fail;
@@ -727,7 +751,8 @@ static HRESULT load_dib( DataCacheEntry *cache_entry, IStream *stm )
}
stat.cbSize.QuadPart -= info_size;
- if (file.bfOffBits)
+ /* set Stream pointer to beginning of bitmap bits */
+ if (cache_entry->load_stream_num == STREAM_NUMBER_CONTENTS && file.bfOffBits)
{
LARGE_INTEGER skip;
--
2.14.1
March 30, 2018
[PATCH v2 1/5] ole32: Add support for loading enhmetafiles from presentation and contents streams to data cache.
by Sergio Gómez Del Real
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/ole32/datacache.c | 185 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 122 insertions(+), 63 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 325a98b33b..799e14a867 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -459,6 +459,45 @@ static void DataCache_FireOnViewChange(
}
}
+/* helper for copying STGMEDIUM of type bitmap, MF, EMF or HGLOBAL.
+* does no checking of whether src_stgm has a supported tymed, so this should be
+* done in the caller */
+static HRESULT copy_stg_medium(CLIPFORMAT cf, STGMEDIUM *dest_stgm,
+ const STGMEDIUM *src_stgm)
+{
+ if (src_stgm->tymed == TYMED_MFPICT)
+ {
+ const METAFILEPICT *src_mfpict = GlobalLock(src_stgm->u.hMetaFilePict);
+ METAFILEPICT *dest_mfpict;
+
+ if (!src_mfpict)
+ return DV_E_STGMEDIUM;
+ dest_stgm->u.hMetaFilePict = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
+ dest_mfpict = GlobalLock(dest_stgm->u.hMetaFilePict);
+ if (!dest_mfpict)
+ {
+ GlobalUnlock(src_stgm->u.hMetaFilePict);
+ return E_OUTOFMEMORY;
+ }
+ *dest_mfpict = *src_mfpict;
+ dest_mfpict->hMF = CopyMetaFileW(src_mfpict->hMF, NULL);
+ GlobalUnlock(src_stgm->u.hMetaFilePict);
+ GlobalUnlock(dest_stgm->u.hMetaFilePict);
+ }
+ else if (src_stgm->tymed != TYMED_NULL)
+ {
+ dest_stgm->u.hGlobal = OleDuplicateData(src_stgm->u.hGlobal, cf,
+ GMEM_MOVEABLE);
+ if (!dest_stgm->u.hGlobal)
+ return E_OUTOFMEMORY;
+ }
+ dest_stgm->tymed = src_stgm->tymed;
+ dest_stgm->pUnkForRelease = src_stgm->pUnkForRelease;
+ if (dest_stgm->pUnkForRelease)
+ IUnknown_AddRef(dest_stgm->pUnkForRelease);
+ return S_OK;
+}
+
static HRESULT read_clipformat(IStream *stream, CLIPFORMAT *clipformat)
{
DWORD length;
@@ -547,6 +586,30 @@ static HRESULT open_pres_stream( IStorage *stg, int stream_number, IStream **stm
return IStorage_OpenStream( stg, name, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
}
+static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
+{
+ METAFILEPICT *pict;
+ HRESULT hr = E_FAIL;
+ UINT size;
+ void *bits;
+
+ if (!(pict = GlobalLock( data ))) return hr;
+
+ size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
+ if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
+ {
+ GetMetaFileBitsEx( pict->hMF, size, bits );
+ med->u.hEnhMetaFile = SetWinMetaFileBits( size, bits, NULL, pict );
+ HeapFree( GetProcessHeap(), 0, bits );
+ med->tymed = TYMED_ENHMF;
+ med->pUnkForRelease = NULL;
+ hr = S_OK;
+ }
+
+ GlobalUnlock( data );
+ return hr;
+}
+
static HRESULT load_mf_pict( DataCacheEntry *cache_entry, IStream *stm )
{
HRESULT hr;
@@ -701,7 +764,62 @@ fail:
GlobalUnlock( hglobal );
GlobalFree( hglobal );
return E_FAIL;
+}
+static HRESULT load_emf( DataCacheEntry *cache_entry, IStream *stm )
+{
+ HRESULT hr;
+
+ if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
+ {
+ STGMEDIUM stgmed;
+
+ hr = load_mf_pict( cache_entry, stm );
+ if (SUCCEEDED( hr ))
+ hr = synthesize_emf( cache_entry->stgmedium.u.hMetaFilePict, &stgmed );
+ if (SUCCEEDED( hr ))
+ {
+ ReleaseStgMedium( &cache_entry->stgmedium );
+ hr = copy_stg_medium( CF_ENHMETAFILE, &cache_entry->stgmedium, &stgmed );
+ ReleaseStgMedium( &stgmed );
+ }
+ }
+ else
+ {
+ STATSTG stat;
+ void *data;
+ DWORD size_bits;
+ ULONG read;
+
+ hr = IStream_Stat( stm, &stat, STATFLAG_NONAME );
+
+ if (SUCCEEDED( hr ))
+ {
+ data = HeapAlloc( GetProcessHeap(), 0, stat.cbSize.u.LowPart );
+ if (!data) return E_OUTOFMEMORY;
+
+ hr = IStream_Read( stm, data, stat.cbSize.u.LowPart, &read );
+ if (hr != S_OK || read != stat.cbSize.u.LowPart)
+ {
+ HeapFree( GetProcessHeap(), 0, data );
+ return E_FAIL;
+ }
+
+ size_bits = read - sizeof(DWORD) - sizeof(ENHMETAHEADER);
+ if (size_bits <= 0)
+ {
+ HeapFree( GetProcessHeap(), 0, data );
+ return E_FAIL;
+ }
+ cache_entry->stgmedium.u.hEnhMetaFile = SetEnhMetaFileBits( size_bits, (BYTE *)data + (read - size_bits) );
+ cache_entry->stgmedium.tymed = TYMED_ENHMF;
+ cache_entry->stgmedium.pUnkForRelease = NULL;
+
+ HeapFree( GetProcessHeap(), 0, data );
+ }
+ }
+
+ return hr;
}
/************************************************************************
@@ -736,6 +854,10 @@ static HRESULT DataCacheEntry_LoadData(DataCacheEntry *cache_entry, IStorage *st
hr = load_dib( cache_entry, stm );
break;
+ case CF_ENHMETAFILE:
+ hr = load_emf( cache_entry, stm );
+ break;
+
default:
FIXME( "Unimplemented clip format %x\n", cache_entry->fmtetc.cfFormat );
hr = E_NOTIMPL;
@@ -1030,45 +1152,6 @@ static HRESULT DataCacheEntry_Save(DataCacheEntry *cache_entry, IStorage *storag
return hr;
}
-/* helper for copying STGMEDIUM of type bitmap, MF, EMF or HGLOBAL.
-* does no checking of whether src_stgm has a supported tymed, so this should be
-* done in the caller */
-static HRESULT copy_stg_medium(CLIPFORMAT cf, STGMEDIUM *dest_stgm,
- const STGMEDIUM *src_stgm)
-{
- if (src_stgm->tymed == TYMED_MFPICT)
- {
- const METAFILEPICT *src_mfpict = GlobalLock(src_stgm->u.hMetaFilePict);
- METAFILEPICT *dest_mfpict;
-
- if (!src_mfpict)
- return DV_E_STGMEDIUM;
- dest_stgm->u.hMetaFilePict = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
- dest_mfpict = GlobalLock(dest_stgm->u.hMetaFilePict);
- if (!dest_mfpict)
- {
- GlobalUnlock(src_stgm->u.hMetaFilePict);
- return E_OUTOFMEMORY;
- }
- *dest_mfpict = *src_mfpict;
- dest_mfpict->hMF = CopyMetaFileW(src_mfpict->hMF, NULL);
- GlobalUnlock(src_stgm->u.hMetaFilePict);
- GlobalUnlock(dest_stgm->u.hMetaFilePict);
- }
- else if (src_stgm->tymed != TYMED_NULL)
- {
- dest_stgm->u.hGlobal = OleDuplicateData(src_stgm->u.hGlobal, cf,
- GMEM_MOVEABLE);
- if (!dest_stgm->u.hGlobal)
- return E_OUTOFMEMORY;
- }
- dest_stgm->tymed = src_stgm->tymed;
- dest_stgm->pUnkForRelease = src_stgm->pUnkForRelease;
- if (dest_stgm->pUnkForRelease)
- IUnknown_AddRef(dest_stgm->pUnkForRelease);
- return S_OK;
-}
-
static HRESULT synthesize_dib( HBITMAP bm, STGMEDIUM *med )
{
HDC hdc = GetDC( 0 );
@@ -1118,30 +1201,6 @@ static HRESULT synthesize_bitmap( HGLOBAL dib, STGMEDIUM *med )
return hr;
}
-static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
-{
- METAFILEPICT *pict;
- HRESULT hr = E_FAIL;
- UINT size;
- void *bits;
-
- if (!(pict = GlobalLock( data ))) return hr;
-
- size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
- if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
- {
- GetMetaFileBitsEx( pict->hMF, size, bits );
- med->u.hEnhMetaFile = SetWinMetaFileBits( size, bits, NULL, pict );
- HeapFree( GetProcessHeap(), 0, bits );
- med->tymed = TYMED_ENHMF;
- med->pUnkForRelease = NULL;
- hr = S_OK;
- }
-
- GlobalUnlock( data );
- return hr;
-}
-
static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
const FORMATETC *formatetc,
STGMEDIUM *stgmedium,
--
2.14.1
March 30, 2018
Re: [PATCH 2/2] windowscodecs: Cache component info objects.
by Vincent Povirk
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
March 30, 2018
Re: [PATCH 1/2] windowscodecs: Use common base structure for component info implementations.
by Vincent Povirk
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
March 30, 2018
[PATCH 5/5] wined3d: Add some traces to arbfp_blitter_blit().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 2c0a46f779a..d29264d6714 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7814,12 +7814,24 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
struct wined3d_blitter *next;
RECT s, d;
+ TRACE("blitter %p, op %#x, context %p, src_texture %p, src_sub_resource_idx %u, src_location %s, src_rect %s, "
+ "dst_texture %p, dst_sub_resource_idx %u, dst_location %s, dst_rect %s, colour_key %p, filter %s.\n",
+ blitter, op, context, src_texture, src_sub_resource_idx, wined3d_debug_location(src_location),
+ wine_dbgstr_rect(src_rect), dst_texture, dst_sub_resource_idx, wined3d_debug_location(dst_location),
+ wine_dbgstr_rect(dst_rect), color_key, debug_d3dtexturefiltertype(filter));
+
if (!arbfp_blit_supported(op, context, &src_texture->resource, src_location,
&dst_texture->resource, dst_location))
{
- if ((next = blitter->next))
- return next->ops->blitter_blit(next, op, context, src_texture, src_sub_resource_idx, src_location,
- src_rect, dst_texture, dst_sub_resource_idx, dst_location, dst_rect, color_key, filter);
+ if (!(next = blitter->next))
+ {
+ ERR("No blitter to handle blit op %#x.\n", op);
+ return dst_location;
+ }
+
+ TRACE("Forwarding to blitter %p.\n", next);
+ return next->ops->blitter_blit(next, op, context, src_texture, src_sub_resource_idx, src_location,
+ src_rect, dst_texture, dst_sub_resource_idx, dst_location, dst_rect, color_key, filter);
}
arbfp_blitter = CONTAINING_RECORD(blitter, struct wined3d_arbfp_blitter, blitter);
--
2.11.0
March 30, 2018
[PATCH 4/5] wined3d: Add some traces to fbo_blitter_blit().
by Henri Verbeet
For easier debugging.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/surface.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 8d7aaf24110..ee325a1af5b 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2192,6 +2192,12 @@ static DWORD fbo_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
struct wined3d_device *device;
struct wined3d_blitter *next;
+ TRACE("blitter %p, op %#x, context %p, src_texture %p, src_sub_resource_idx %u, src_location %s, src_rect %s, "
+ "dst_texture %p, dst_sub_resource_idx %u, dst_location %s, dst_rect %s, colour_key %p, filter %s.\n",
+ blitter, op, context, src_texture, src_sub_resource_idx, wined3d_debug_location(src_location),
+ wine_dbgstr_rect(src_rect), dst_texture, dst_sub_resource_idx, wined3d_debug_location(dst_location),
+ wine_dbgstr_rect(dst_rect), colour_key, debug_d3dtexturefiltertype(filter));
+
src_resource = &src_texture->resource;
dst_resource = &dst_texture->resource;
@@ -2208,9 +2214,15 @@ static DWORD fbo_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
if (!fbo_blitter_supported(blit_op, context->gl_info,
src_resource, src_location, dst_resource, dst_location))
{
- if ((next = blitter->next))
- return next->ops->blitter_blit(next, op, context, src_texture, src_sub_resource_idx, src_location,
- src_rect, dst_texture, dst_sub_resource_idx, dst_location, dst_rect, colour_key, filter);
+ if (!(next = blitter->next))
+ {
+ ERR("No blitter to handle blit op %#x.\n", op);
+ return dst_location;
+ }
+
+ TRACE("Forwarding to blitter %p.\n", next);
+ return next->ops->blitter_blit(next, op, context, src_texture, src_sub_resource_idx, src_location,
+ src_rect, dst_texture, dst_sub_resource_idx, dst_location, dst_rect, colour_key, filter);
}
if (blit_op == WINED3D_BLIT_OP_COLOR_BLIT)
--
2.11.0
March 30, 2018
[PATCH 3/5] wined3d: Avoid a FIXME about 0 back-buffer usage in wined3d_device_reset().
by Henri Verbeet
Since we use this for ddraw now.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/device.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index b17effefd5a..adaa4f10000 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4778,7 +4778,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
TRACE("refresh_rate %u\n", swapchain_desc->refresh_rate);
TRACE("auto_restore_display_mode %#x\n", swapchain_desc->auto_restore_display_mode);
- if (swapchain_desc->backbuffer_usage != WINED3DUSAGE_RENDERTARGET)
+ if (swapchain_desc->backbuffer_usage && swapchain_desc->backbuffer_usage != WINED3DUSAGE_RENDERTARGET)
FIXME("Got unexpected backbuffer usage %#x.\n", swapchain_desc->backbuffer_usage);
if (swapchain_desc->swap_effect != WINED3D_SWAP_EFFECT_DISCARD
--
2.11.0
March 30, 2018