|
|
#pragma once
// forward declaration to make things easy
class CAnnotationSet;
typedef struct { SIZE szImage; ULONG xDPI; ULONG yDPI; DWORD dwDelay; } PageInfo;
typedef struct { DWORD dwID; RECT rc; HBITMAP hbm; HPALETTE hPal; HDC hdc; HPALETTE hPalOld; HBITMAP hbmOld; } Buffer;
void DeleteBuffer(Buffer * pBuf);
class CDecodeTask : public CRunnableTask { public: static HRESULT Create(IStream * pstrm, LPCWSTR pszFilename, UINT iItem, IShellImageDataFactory * pFactory, HWND hwnd, IRunnableTask ** pTask); STDMETHOD(RunInitRT)();
inline BOOL IsEditable() { return (_fEditable); } inline BOOL IsMultipage() { return (!_fAnimated && (_cImages > 1)); } inline BOOL IsFirstPage() { return (0==_iCurrent); } inline BOOL IsLastPage() { return (_iCurrent == _cImages-1); } inline BOOL IsAnimated() { return (_fAnimated); } inline BOOL IsExtendedPixelFmt () { return _fExtendedPF; }
LPCWSTR GetName() { return _pszFilename; } BOOL GetSize(SIZE * psz); BOOL GetResolution(ULONG * px, ULONG * py); DWORD GetDelay(); BOOL PrevPage(); BOOL NextPage(); BOOL NextFrame(); BOOL SelectPage(ULONG nPage); BOOL ChangePage(CAnnotationSet& pAnnotations); HRESULT Print(BOOL fShowUI, LPWSTR szPrinterName, HWND hwndOwner); HRESULT Rotate(DWORD dwAngle); HRESULT Lock(IShellImageData ** ppSID); HRESULT Unlock(); BOOL DisplayName(LPTSTR psz, UINT cch);
// general image data
ULONG _cImages; ULONG _iCurrent; BOOL _fAnimated; BOOL _fEditable; GUID _guidFormat; UINT _iItem; BOOL _fIsReadOnly; HRESULT _hr;
// properties of page _iCurrent
PageInfo * _ppi;
private: CDecodeTask(); ~CDecodeTask(); HRESULT _Initialize(IStream * pstrm, LPCWSTR pszFilename, UINT iItem, IShellImageDataFactory * pFactory, HWND hwnd);
// initialization info
IStream *_pstrm; LPWSTR _pszFilename; IShellImageDataFactory * _pfactory; HWND _hwndNotify;
// protected data
CRITICAL_SECTION _cs; IShellImageData *_pSID; SHFILEINFO _sfi; BOOL _fExtendedPF; };
class CDrawTask : public CRunnableTask, public IShellImageDataAbort { public: // CRunnableTask
static HRESULT Create(CDecodeTask * pImageData, COLORREF clr, RECT & rcSrc, RECT & rcDest, HWND hwnd, ULONG uMsg, IRunnableTask ** ppTask); STDMETHOD(RunInitRT)() { return S_OK; } STDMETHOD(InternalResumeRT)();
// *** IUnknown ***
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); STDMETHODIMP_(ULONG) AddRef(void) { return CRunnableTask::AddRef(); } STDMETHODIMP_(ULONG) Release(void) { return CRunnableTask::Release(); }
// *** IShellImageDataAbort ***
STDMETHOD(QueryAbort)();
private: CDrawTask(); ~CDrawTask(); HRESULT _Initialize(CDecodeTask * pImageData, COLORREF clr, RECT & rcSrc, RECT & rcDest, HWND hwnd, ULONG uMsg); static BOOL _Abort(void *pvRef);
CDecodeTask * _pImgData; DWORD _dwPage; COLORREF _clrBkgnd; RECT _rcSrc; Buffer * _pBuf; HWND _hwndNotify; ULONG _uMsgNotify; };
|