|
|
#include "stdafx.h"
#include "imgutil.h"
#include "cdithtbl.h"
#include "cddsurf.h"
// Get rid of "unused formal parameters warning"
#pragma warning(disable : 4100)
STDAPI DecodeImage( IStream* pStream, IMapMIMEToCLSID* pMap, IUnknown* pUnknownEventSink ) { USES_CONVERSION; HRESULT hResult; CComPtr< IStream > pSniffedStream; UINT nFormat; TCHAR szMIMEType[64]; LPCOLESTR pszMIMETypeO; CComPtr< IMapMIMEToCLSID > pActualMap; CComPtr< IImageDecodeFilter > pFilter; CComPtr< IImageDecodeEventSink > pEventSink; CLSID clsid; int nChars; if( pStream == NULL ) { return( E_INVALIDARG ); } if( pUnknownEventSink == NULL ) { return( E_INVALIDARG ); }
pUnknownEventSink->QueryInterface(IID_IImageDecodeEventSink, (void **)&pEventSink);
if (pEventSink == NULL) return E_INVALIDARG; if( pMap == NULL ) { hResult = CoCreateInstance( CLSID_CoMapMIMEToCLSID, NULL, CLSCTX_INPROC_SERVER, IID_IMapMIMEToCLSID, (void**)&pActualMap ); if( FAILED( hResult ) ) { return( hResult ); } } else { pActualMap = pMap; }
hResult = SniffStream( pStream, &nFormat, &pSniffedStream ); if( FAILED( hResult ) ) { return( hResult ); }
nChars = GetClipboardFormatName( nFormat, szMIMEType, 63 ); if( nChars == 0 ) { return( E_FAIL ); } if( nChars > 60 ) { return( E_FAIL ); }
pszMIMETypeO = T2COLE( szMIMEType ); hResult = pActualMap->MapMIMEToCLSID( pszMIMETypeO, &clsid ); if( FAILED( hResult ) ) { return( hResult ); } if( hResult == S_FALSE ) { return( E_FAIL ); }
hResult = CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IImageDecodeFilter, (void**)&pFilter ); if( FAILED( hResult ) ) { return( hResult ); }
hResult = pFilter->Initialize( pEventSink ); if( FAILED( hResult ) ) { return( hResult ); }
hResult = pFilter->Process( pSniffedStream );
pFilter->Terminate( hResult );
if( FAILED( hResult ) ) { return( hResult ); }
return( S_OK ); }
STDAPI CreateMIMEMap( IMapMIMEToCLSID** ppMap ) { if( ppMap == NULL ) { return( E_POINTER ); }
return( CoCreateInstance( CLSID_CoMapMIMEToCLSID, NULL, CLSCTX_INPROC_SERVER, IID_IMapMIMEToCLSID, (void**)ppMap ) ); }
STDAPI ComputeInvCMAP(const RGBQUAD *pRGBColors, ULONG nColors, BYTE *pInvTable, ULONG cbTable) { #ifndef MINSUPPORT
CDitherTable *pDitherTable; HRESULT hr; if (pRGBColors == NULL) return E_POINTER;
if (pInvTable == NULL) return E_POINTER;
if (nColors > 256) return E_INVALIDARG;
if (cbTable != 32768) return E_INVALIDARG;
pDitherTable = new CDitherTable; if (pDitherTable == NULL) return E_OUTOFMEMORY;
hr = pDitherTable->SetColors(nColors, pRGBColors); if (SUCCEEDED(hr)) memcpy(pInvTable, pDitherTable->m_abInverseMap, 32768);
delete pDitherTable; return hr; #else
return E_NOTIMPL; #endif
}
#ifdef MINSUPPORT
HRESULT DitherTo8( BYTE * pDestBits, LONG nDestPitch, BYTE * pSrcBits, LONG nSrcPitch, REFGUID bfidSrc, RGBQUAD * prgbDestColors, RGBQUAD * prgbSrcColors, BYTE * pbDestInvMap, LONG x, LONG y, LONG cx, LONG cy, LONG lDestTrans, LONG lSrcTrans) { return E_NOTIMPL; }
#endif
STDAPI CreateDDrawSurfaceOnDIB(HBITMAP hbmDib, IDirectDrawSurface **ppSurface) { #ifndef MINSUPPORT
if (hbmDib == NULL) return E_INVALIDARG;
if (ppSurface == NULL) return E_POINTER;
*ppSurface = (IDirectDrawSurface *)(new CDDrawWrapper(hbmDib));
return *ppSurface ? S_OK : E_OUTOFMEMORY; #else
return E_NOTIMPL; #endif
}
|