|
|
/*****************************************************************************
* * (C) COPYRIGHT MICROSOFT CORPORATION, 1999 - 2000 * * TITLE: image.h * * VERSION: 1.0 * * AUTHOR: RickTu * * DATE: 9/16/99 * * DESCRIPTION: CImage class for WIA still from video driver. Encapsulate * saved images into a class (one instace for each class) * *****************************************************************************/
#ifndef __WIA_STILL_DRIVER_IMAGE_H_
#define __WIA_STILL_DRIVER_IMAGE_H_
#define THUMB_WIDTH 80
#define THUMB_HEIGHT 60
#define THUMB_BPP 3
#define THUMB_SIZE_BYTES (THUMB_WIDTH * THUMB_HEIGHT * THUMB_BPP)
extern CLSID g_clsidBMPEncoder;
class CImage { public: CImage(LPCTSTR pszStillPath, BSTR bstrRootFullItemName, LPCTSTR pszPath, LPCTSTR pszName, LONG FolderType);
~CImage();
//
// Methods
//
STDMETHOD(InitImageInformation)(BYTE *pWiasContext,LONG *plDevErrVal); STDMETHOD(SetItemSize)(BYTE *pWiasContext, MINIDRV_TRANSFER_CONTEXT * pDrvTranCtx); STDMETHOD(LoadThumbnail)(BYTE *pWiasContext); STDMETHOD(LoadImageInfo)(BYTE *pWiasContext);
void GetImageTimeStamp( SYSTEMTIME * pst ); void GetImageSizes(); LPCTSTR ActualImagePath(); HRESULT DoDelete();
//
// "Properties" -- still methods but just returning information
//
BSTR bstrItemName(); BSTR bstrFullItemName(); LONG ThumbWidth(); LONG ThumbHeight();
private: CSimpleString m_strRootPath; CSimpleString m_strPathItem; CSimpleString m_strName; CSimpleBStr m_bstrRootFullItemName; CSimpleBStr m_bstrFullItemName; CSimpleBStr m_bstrItemName; LONG m_FolderType; SYSTEMTIME m_ImageTime; BOOL m_bImageTimeValid; CRITICAL_SECTION m_cs; PBYTE m_pThumb; };
typedef struct _STILLCAM_IMAGE_CONTEXT { CImage * pImage;
} STILLCAM_IMAGE_CONTEXT,*PSTILLCAM_IMAGE_CONTEXT;
class CMappedView {
private: BYTE * m_pBits; HANDLE m_hFile; HANDLE m_hMap; LONG m_lSize;
public: CMappedView( LPCTSTR pszFile, LONG lSize, DWORD dwOpen ) : m_pBits(NULL), m_hFile(INVALID_HANDLE_VALUE), m_hMap(NULL), m_lSize(lSize) { m_hFile = CreateFile( pszFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, dwOpen, FILE_ATTRIBUTE_NORMAL, NULL );
if (m_hFile == INVALID_HANDLE_VALUE) { WIA_ERROR((TEXT("CreateFile failed w/GLE = %d"),GetLastError())); }
WIA_TRACE((TEXT("CMappedView(0x%x) for %s"),m_hFile,pszFile));
DoCreateFileMapping(); }
CMappedView( HANDLE hFile, LONG lSize ) : m_pBits(NULL), m_hFile(hFile), m_hMap(INVALID_HANDLE_VALUE), m_lSize(lSize) { WIA_TRACE((TEXT("CMappedView(0x%x)"),m_hFile));
DoCreateFileMapping(); }
void DoCreateFileMapping() { if (m_hFile != INVALID_HANDLE_VALUE) { m_hMap = CreateFileMapping( m_hFile, NULL, PAGE_READWRITE, 0, m_lSize, NULL );
if (m_hMap) { m_pBits = (PBYTE)MapViewOfFileEx( m_hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0, NULL ); } else { WIA_ERROR((TEXT("CreateFileMapping failed w/GLE = %d"),GetLastError())); } } }
LARGE_INTEGER FileSize() { WIA_TRACE((TEXT("CMappedView::FileSize")));
LARGE_INTEGER li;
li.QuadPart = 0;
#ifdef WINNT
GetFileSizeEx( m_hFile, &li ); #else
DWORD LowPart = 0;
LowPart = GetFileSize( m_hFile, (DWORD *)&li.HighPart );
if (LowPart != -1) { li.LowPart = LowPart; } #endif
return li; }
void CloseAndRelease() { WIA_TRACE((TEXT("CMappedView::CloseAndRelease()")));
if (m_pBits) { if (!UnmapViewOfFile( m_pBits )) { WIA_ERROR((TEXT("UnmapViewOfFile failed w/GLE = %d"),GetLastError())); } m_pBits = NULL; }
if (m_hMap) { if (!CloseHandle( m_hMap )) { WIA_ERROR((TEXT("CloseHandle( m_hMap ) failed w/GLE = %s"),GetLastError())); } m_hMap = NULL; }
if (m_hFile != INVALID_HANDLE_VALUE) { WIA_TRACE((TEXT("Closing file handle (0x%x)"),m_hFile));
if (!CloseHandle( m_hFile )) { WIA_ERROR((TEXT("CloseHandle( m_hFile ) failed w/GLE = %s"),GetLastError())); } m_hFile = INVALID_HANDLE_VALUE; } }
~CMappedView() { WIA_TRACE((TEXT("~CMappedView"))); CloseAndRelease(); }
PBYTE Bits() { return m_pBits; }
};
#endif
|