/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: GPHELPER.H * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 10/11/1999 * * DESCRIPTION: Encapsulation of common GDI plus operationss * *******************************************************************************/ #ifndef __GPHELPER_H_INCLUDED #define __GPHELPER_H_INCLUDED #include #include #include #include #include class CGdiPlusInit { ULONG_PTR m_pGdiplusToken; public: CGdiPlusInit(); ~CGdiPlusInit(); }; class CGdiPlusHelper { private: CGdiPlusInit m_Init; Gdiplus::ImageCodecInfo *m_pImageEncoderInfo; UINT m_nImageEncoderCount; Gdiplus::ImageCodecInfo *m_pImageDecoderInfo; UINT m_nImageDecoderCount; private: CGdiPlusHelper( const CGdiPlusHelper & ); CGdiPlusHelper &operator=( const CGdiPlusHelper & ); public: CGdiPlusHelper(void); ~CGdiPlusHelper(void); protected: HRESULT Initialize(void); static HRESULT ConstructCodecExtensionSearchStrings( CSimpleString &strExtensions, Gdiplus::ImageCodecInfo *pImageCodecInfo, UINT nImageCodecCount ); void Destroy(void); public: bool IsValid(void) const; HRESULT ConstructDecoderExtensionSearchStrings( CSimpleString &strExtensions ); HRESULT ConstructEncoderExtensionSearchStrings( CSimpleString &strExtensions ); HRESULT GetClsidOfEncoder( const GUID &guidFormatId, CLSID &clsidFormat ) const; HRESULT GetClsidOfDecoder( const GUID &guidFormatId, CLSID &clsidFormat ) const; HRESULT Convert( LPCWSTR pszInputFilename, LPCWSTR pszOutputFilename, const CLSID &guidOutputFormat ) const; HRESULT Rotate( LPCWSTR pszInputFilename, LPCWSTR pszOutputFilename, int nRotationAngle, const CLSID &guidOutputFormat ) const; HRESULT Rotate( HBITMAP hSourceBitmap, HBITMAP &hTargetBitmap, int nRotation ) const; HRESULT LoadAndScale( HBITMAP &hTargetBitmap, LPCTSTR pszFilename, UINT nMaxWidth=0, UINT nMaxHeight=0, bool bStretchSmallImages=false ); HRESULT LoadAndScale( HBITMAP &hTargetBitmap, IStream *pStream, UINT nMaxWidth=0, UINT nMaxHeight=0, bool bStretchSmallImages=false ); HRESULT SaveMultipleImagesAsMultiPage( const CSimpleDynamicArray &Filenames, const CSimpleStringWide &strFilename, const CLSID &guidOutputFormat ); HRESULT SetBrightnessAndContrast( HBITMAP hSourceBitmap, HBITMAP &hTargetBitmap, BYTE nBrightness, BYTE nContrast ); HRESULT SetThreshold( HBITMAP hSourceBitmap, HBITMAP &hTargetBitmap, BYTE nThreshold ); static Gdiplus::EncoderParameters *AppendEncoderParameter( Gdiplus::EncoderParameters *pEncoderParameters, const GUID &guidProp, ULONG nType, PVOID pVoid ); static inline GDISTATUS_TO_HRESULT(Gdiplus::Status status) { // // Default to turning GDI+ errors into generic failures // HRESULT hr = E_FAIL; switch( status ) { case Gdiplus::Ok: hr = S_OK; break; case Gdiplus::InvalidParameter: hr = E_INVALIDARG; break; case Gdiplus::OutOfMemory: hr = E_OUTOFMEMORY; break; case Gdiplus::InsufficientBuffer: hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); break; case Gdiplus::Aborted: hr = E_ABORT; break; case Gdiplus::ObjectBusy: hr = E_PENDING; break; case Gdiplus::FileNotFound: hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); break; case Gdiplus::AccessDenied: hr = E_ACCESSDENIED; break; case Gdiplus::UnknownImageFormat: hr = HRESULT_FROM_WIN32(ERROR_INVALID_PIXEL_FORMAT); break; case Gdiplus::NotImplemented: hr = E_NOTIMPL; break; case Gdiplus::Win32Error: hr = HRESULT_FROM_WIN32(GetLastError()); break; case Gdiplus::ValueOverflow: case Gdiplus::FontFamilyNotFound: case Gdiplus::FontStyleNotFound: case Gdiplus::NotTrueTypeFont: case Gdiplus::UnsupportedGdiplusVersion: case Gdiplus::GdiplusNotInitialized: case Gdiplus::WrongState: break; } return hr; } }; class CImageFileFormatVerifier { private: // // Internal class used to store the file signatures // class CImageFileFormatVerifierItem { private: PBYTE m_pSignature; PBYTE m_pMask; int m_nLength; GUID m_guidFormat; CLSID m_clsidDecoder; public: // // Constructors, assignment operator and destructor // CImageFileFormatVerifierItem(void); CImageFileFormatVerifierItem( const PBYTE pSignature, const PBYTE pMask, int nLength, const GUID &guidFormat, const CLSID &guidDecoder ); CImageFileFormatVerifierItem( const CImageFileFormatVerifierItem &other ); CImageFileFormatVerifierItem &operator=( const CImageFileFormatVerifierItem &other ); CImageFileFormatVerifierItem &Assign( const PBYTE pSignature, const PBYTE pMask, int nLength, const GUID &Format, const CLSID &guidDecoder ); ~CImageFileFormatVerifierItem(void); protected: void Destroy(void); public: // // Accessor functions // PBYTE Signature(void) const; PBYTE Mask(void) const; int Length(void) const; GUID Format(void) const; CLSID Decoder(void) const; // // Does this stream of bytes match this format? // bool Match( PBYTE pBytes, int nLen ) const; }; private: CSimpleDynamicArray m_FileFormatVerifierList; int m_nMaxSignatureLength; PBYTE m_pSignatureBuffer; private: CImageFileFormatVerifier( const CImageFileFormatVerifier & ); CImageFileFormatVerifier &operator=( const CImageFileFormatVerifier & ); public: CImageFileFormatVerifier(void); ~CImageFileFormatVerifier(void); void Destroy(void); bool IsValid(void) const; bool IsImageFile( LPCTSTR pszFilename ); bool IsSupportedImageFromStream( IStream * pStream, GUID * pGuidOfFormat = NULL ); GUID GetImageType( IStream * pStream ); }; #endif