#ifndef __1fe1d0e2_d009_4c25_a3bc_d0620c61ed8d__ #define __1fe1d0e2_d009_4c25_a3bc_d0620c61ed8d__ #include #include "simstr.h" #include #include "simarray.h" // // We will define this when explicit initialization is implemented correctly // #define GDIPLUSHELPER_EXPLICIT_INITIALIZATION #if defined(GDIPLUSHELPER_EXPLICIT_INITIALIZATION) #include #endif class CGdiPlusHelper { private: Gdiplus::ImageCodecInfo *m_pImageEncoderInfo; UINT m_nImageEncoderCount; Gdiplus::ImageCodecInfo *m_pImageDecoderInfo; UINT m_nImageDecoderCount; #if defined(GDIPLUSHELPER_EXPLICIT_INITIALIZATION) // // GDI+ Initialization stuff // ULONG_PTR m_pGdiplusToken; bool m_bGdiplusInitialized; #endif 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 LoadAndScale( HBITMAP &hTargetBitmap, LPCTSTR pszFilename, UINT nMaxWidth, UINT nMaxHeight, bool bStretchSmallImages ); HRESULT SaveMultipleImagesAsMultiPage( const CSimpleDynamicArray &Filenames, const CSimpleStringWide &strFilename, const CLSID &guidOutputFormat ); static Gdiplus::EncoderParameters *AppendEncoderParameter( Gdiplus::EncoderParameters *pEncoderParameters, const GUID &guidProp, ULONG nType, PVOID pVoid ); static inline GDISTATUS_TO_HRESULT(Gdiplus::Status status) { return (status == Gdiplus::Ok) ? S_OK : E_FAIL; } }; 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 ); GUID GetImageType( LPCTSTR pszFilename ); }; #endif