ole32: Make the synthesize helpers return a STGMEDIUM.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
f186114676
commit
251e6edae5
|
@ -958,12 +958,12 @@ static HRESULT copy_stg_medium(CLIPFORMAT cf, STGMEDIUM *dest_stgm,
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HGLOBAL synthesize_dib( HBITMAP bm )
|
static HRESULT synthesize_dib( HBITMAP bm, STGMEDIUM *med )
|
||||||
{
|
{
|
||||||
HDC hdc = GetDC( 0 );
|
HDC hdc = GetDC( 0 );
|
||||||
BITMAPINFOHEADER header;
|
BITMAPINFOHEADER header;
|
||||||
BITMAPINFO *bmi;
|
BITMAPINFO *bmi;
|
||||||
HGLOBAL ret = 0;
|
HRESULT hr = E_FAIL;
|
||||||
DWORD header_size;
|
DWORD header_size;
|
||||||
|
|
||||||
memset( &header, 0, sizeof(header) );
|
memset( &header, 0, sizeof(header) );
|
||||||
|
@ -971,55 +971,64 @@ static HGLOBAL synthesize_dib( HBITMAP bm )
|
||||||
if (!GetDIBits( hdc, bm, 0, 0, NULL, (BITMAPINFO *)&header, DIB_RGB_COLORS )) goto done;
|
if (!GetDIBits( hdc, bm, 0, 0, NULL, (BITMAPINFO *)&header, DIB_RGB_COLORS )) goto done;
|
||||||
|
|
||||||
header_size = bitmap_info_size( (BITMAPINFO *)&header, DIB_RGB_COLORS );
|
header_size = bitmap_info_size( (BITMAPINFO *)&header, DIB_RGB_COLORS );
|
||||||
if (!(ret = GlobalAlloc( GMEM_MOVEABLE, header_size + header.biSizeImage ))) goto done;
|
if (!(med->u.hGlobal = GlobalAlloc( GMEM_MOVEABLE, header_size + header.biSizeImage ))) goto done;
|
||||||
bmi = GlobalLock( ret );
|
bmi = GlobalLock( med->u.hGlobal );
|
||||||
memset( bmi, 0, header_size );
|
memset( bmi, 0, header_size );
|
||||||
memcpy( bmi, &header, header.biSize );
|
memcpy( bmi, &header, header.biSize );
|
||||||
GetDIBits( hdc, bm, 0, abs(header.biHeight), (char *)bmi + header_size, bmi, DIB_RGB_COLORS );
|
GetDIBits( hdc, bm, 0, abs(header.biHeight), (char *)bmi + header_size, bmi, DIB_RGB_COLORS );
|
||||||
GlobalUnlock( ret );
|
GlobalUnlock( med->u.hGlobal );
|
||||||
|
med->tymed = TYMED_HGLOBAL;
|
||||||
|
med->pUnkForRelease = NULL;
|
||||||
|
hr = S_OK;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
ReleaseDC( 0, hdc );
|
ReleaseDC( 0, hdc );
|
||||||
return ret;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HBITMAP synthesize_bitmap( HGLOBAL dib )
|
static HRESULT synthesize_bitmap( HGLOBAL dib, STGMEDIUM *med )
|
||||||
{
|
{
|
||||||
HBITMAP ret = 0;
|
HRESULT hr = E_FAIL;
|
||||||
BITMAPINFO *bmi;
|
BITMAPINFO *bmi;
|
||||||
HDC hdc = GetDC( 0 );
|
HDC hdc = GetDC( 0 );
|
||||||
|
|
||||||
if ((bmi = GlobalLock( dib )))
|
if ((bmi = GlobalLock( dib )))
|
||||||
{
|
{
|
||||||
/* FIXME: validate data size */
|
/* FIXME: validate data size */
|
||||||
ret = CreateDIBitmap( hdc, &bmi->bmiHeader, CBM_INIT,
|
med->u.hBitmap = CreateDIBitmap( hdc, &bmi->bmiHeader, CBM_INIT,
|
||||||
(char *)bmi + bitmap_info_size( bmi, DIB_RGB_COLORS ),
|
(char *)bmi + bitmap_info_size( bmi, DIB_RGB_COLORS ),
|
||||||
bmi, DIB_RGB_COLORS );
|
bmi, DIB_RGB_COLORS );
|
||||||
GlobalUnlock( dib );
|
GlobalUnlock( dib );
|
||||||
|
med->tymed = TYMED_GDI;
|
||||||
|
med->pUnkForRelease = NULL;
|
||||||
|
hr = S_OK;
|
||||||
}
|
}
|
||||||
ReleaseDC( 0, hdc );
|
ReleaseDC( 0, hdc );
|
||||||
return ret;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HENHMETAFILE synthesize_emf( HMETAFILEPICT data )
|
static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
|
||||||
{
|
{
|
||||||
METAFILEPICT *pict;
|
METAFILEPICT *pict;
|
||||||
HENHMETAFILE emf = 0;
|
HRESULT hr = E_FAIL;
|
||||||
UINT size;
|
UINT size;
|
||||||
void *bits;
|
void *bits;
|
||||||
|
|
||||||
if (!(pict = GlobalLock( data ))) return 0;
|
if (!(pict = GlobalLock( data ))) return hr;
|
||||||
|
|
||||||
size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
|
size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
|
||||||
if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
|
if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
|
||||||
{
|
{
|
||||||
GetMetaFileBitsEx( pict->hMF, size, bits );
|
GetMetaFileBitsEx( pict->hMF, size, bits );
|
||||||
emf = SetWinMetaFileBits( size, bits, NULL, pict );
|
med->u.hEnhMetaFile = SetWinMetaFileBits( size, bits, NULL, pict );
|
||||||
HeapFree( GetProcessHeap(), 0, bits );
|
HeapFree( GetProcessHeap(), 0, bits );
|
||||||
|
med->tymed = TYMED_ENHMF;
|
||||||
|
med->pUnkForRelease = NULL;
|
||||||
|
hr = S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalUnlock( data );
|
GlobalUnlock( data );
|
||||||
return emf;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
|
static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
|
||||||
|
@ -1028,6 +1037,7 @@ static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
|
||||||
BOOL fRelease)
|
BOOL fRelease)
|
||||||
{
|
{
|
||||||
STGMEDIUM copy;
|
STGMEDIUM copy;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
if ((!cache_entry->fmtetc.cfFormat && !formatetc->cfFormat) ||
|
if ((!cache_entry->fmtetc.cfFormat && !formatetc->cfFormat) ||
|
||||||
(cache_entry->fmtetc.tymed == TYMED_NULL && formatetc->tymed == TYMED_NULL) ||
|
(cache_entry->fmtetc.tymed == TYMED_NULL && formatetc->tymed == TYMED_NULL) ||
|
||||||
|
@ -1042,17 +1052,16 @@ static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
|
||||||
|
|
||||||
if (formatetc->cfFormat == CF_BITMAP)
|
if (formatetc->cfFormat == CF_BITMAP)
|
||||||
{
|
{
|
||||||
copy.tymed = TYMED_HGLOBAL;
|
hr = synthesize_dib( stgmedium->u.hBitmap, © );
|
||||||
copy.u.hGlobal = synthesize_dib( stgmedium->u.hBitmap );
|
if (FAILED(hr)) return hr;
|
||||||
copy.pUnkForRelease = NULL;
|
|
||||||
if (fRelease) ReleaseStgMedium(stgmedium);
|
if (fRelease) ReleaseStgMedium(stgmedium);
|
||||||
stgmedium = ©
|
stgmedium = ©
|
||||||
fRelease = TRUE;
|
fRelease = TRUE;
|
||||||
}
|
}
|
||||||
else if (formatetc->cfFormat == CF_METAFILEPICT && cache_entry->fmtetc.cfFormat == CF_ENHMETAFILE)
|
else if (formatetc->cfFormat == CF_METAFILEPICT && cache_entry->fmtetc.cfFormat == CF_ENHMETAFILE)
|
||||||
{
|
{
|
||||||
copy.tymed = TYMED_ENHMF;
|
hr = synthesize_emf( stgmedium->u.hMetaFilePict, © );
|
||||||
copy.u.hEnhMetaFile = synthesize_emf( stgmedium->u.hMetaFilePict );
|
if (FAILED(hr)) return hr;
|
||||||
if (fRelease) ReleaseStgMedium(stgmedium);
|
if (fRelease) ReleaseStgMedium(stgmedium);
|
||||||
stgmedium = ©
|
stgmedium = ©
|
||||||
fRelease = TRUE;
|
fRelease = TRUE;
|
||||||
|
@ -1079,12 +1088,8 @@ static HRESULT DataCacheEntry_GetData(DataCacheEntry *cache_entry, FORMATETC *fm
|
||||||
return OLE_E_BLANK;
|
return OLE_E_BLANK;
|
||||||
|
|
||||||
if (fmt->cfFormat == CF_BITMAP)
|
if (fmt->cfFormat == CF_BITMAP)
|
||||||
{
|
return synthesize_bitmap( cache_entry->stgmedium.u.hGlobal, stgmedium );
|
||||||
stgmedium->tymed = TYMED_GDI;
|
|
||||||
stgmedium->u.hBitmap = synthesize_bitmap( cache_entry->stgmedium.u.hGlobal );
|
|
||||||
stgmedium->pUnkForRelease = NULL;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
return copy_stg_medium(cache_entry->fmtetc.cfFormat, stgmedium, &cache_entry->stgmedium);
|
return copy_stg_medium(cache_entry->fmtetc.cfFormat, stgmedium, &cache_entry->stgmedium);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue