You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.2 KiB
128 lines
4.2 KiB
//////////////////////////////////////////////////////////////////// |
|
// Image.h |
|
// |
|
// Copyright 2007 cDc@seacave |
|
// Distributed under the Boost Software License, Version 1.0 |
|
// (See http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef __SEACAVE_IMAGE_H__ |
|
#define __SEACAVE_IMAGE_H__ |
|
|
|
|
|
// I N C L U D E S ///////////////////////////////////////////////// |
|
|
|
|
|
// D E F I N E S /////////////////////////////////////////////////// |
|
|
|
#define LT_IMAGE CImage::ms_nLogType |
|
|
|
|
|
namespace SEACAVE { |
|
|
|
// S T R U C T S /////////////////////////////////////////////////// |
|
|
|
// All formats are listed from left to right, most-significant bit to least-significant bit. |
|
// For example, PF_A8R8G8B8 is ordered from the most-significant bit channel A (alpha), |
|
// to the least-significant bit channel B (blue). When traversing image data, the data is |
|
// stored in memory on a little-endian machine from least-significant bit to most-significant bit, |
|
// which means that the channel order in memory is from least-significant bit (blue) to |
|
// most-significant bit (alpha). |
|
typedef enum PIXELFORMAT_TYPE { |
|
PF_UNKNOWN = 0, |
|
// gray |
|
PF_A8, |
|
PF_GRAY8, |
|
// uncompressed RGB |
|
PF_R5G6B5, |
|
PF_R8G8B8, |
|
PF_R8G8B8A8, |
|
PF_A8R8G8B8, |
|
// uncompressed BGR |
|
PF_B8G8R8, |
|
PF_B8G8R8A8, |
|
PF_A8B8G8R8, |
|
// compressed |
|
PF_DXT1 = 128, |
|
PF_DXT2, |
|
PF_DXT3, |
|
PF_DXT4, |
|
PF_DXT5, |
|
PF_3DC, |
|
} PIXELFORMAT; |
|
|
|
class IO_API CImage |
|
{ |
|
DECLARE_LOG(); |
|
|
|
public: |
|
enum IMCREATE { |
|
READ, |
|
WRITE |
|
}; |
|
typedef uint32_t Size; |
|
|
|
CImage() {} |
|
virtual ~CImage() {} |
|
|
|
virtual HRESULT Reset(Size width, Size height, PIXELFORMAT pixFormat, Size levels = 1, bool bAllocate = false); |
|
virtual HRESULT Reset(LPCTSTR szFileName, IMCREATE mode); |
|
virtual HRESULT Reset(IOSTREAMPTR& pStream); |
|
virtual void Close(); |
|
|
|
virtual HRESULT ReadHeader(); |
|
virtual HRESULT ReadData(void*, PIXELFORMAT, Size nStride, Size lineWidth); |
|
|
|
virtual HRESULT WriteHeader(PIXELFORMAT, Size width, Size height, BYTE numLevels); |
|
virtual HRESULT WriteData(void*, PIXELFORMAT, Size nStride, Size lineWidth); |
|
|
|
const IOSTREAMPTR& GetStream() const { return m_pStream; } |
|
IOSTREAMPTR& GetStream() { return m_pStream; } |
|
BYTE* GetData() const { return m_data; } |
|
BYTE*& GetData() { return m_data; } |
|
size_t GetDataSize() const { return m_lineWidth * m_dataHeight; } |
|
Size GetWidth() const { return m_width; } |
|
Size GetHeight() const { return m_height; } |
|
Size GetDataWidth() const { return m_dataWidth; } |
|
Size GetDataHeight() const { return m_dataHeight; } |
|
Size GetStride() const { return m_stride; } |
|
Size GetLineWidth() const { return m_lineWidth; } |
|
BYTE GetNumLevels() const { return m_numLevels; } |
|
PIXELFORMAT GetFormat() const { return m_format; } |
|
bool FormatHasAlpha() const { return FormatHasAlpha(m_format); } |
|
const String& GetFileName() const { return m_fileName; } |
|
String& GetFileName() { return m_fileName; } |
|
|
|
Size GetDataSizes(Size mipLevel, Size& width, Size& height) const; |
|
|
|
static Size GetStride(PIXELFORMAT); //in bits |
|
static bool FormatHasAlpha(PIXELFORMAT); |
|
static bool FilterFormat(void*, PIXELFORMAT, Size, const void*, PIXELFORMAT, Size, Size nSzize); |
|
static void FlipRB24(uint8_t* data, Size size, Size stride); |
|
static void CopyFlipRB24(uint8_t* pDst, const uint8_t* pSrc, Size size, Size strideDst, Size strideSrc); |
|
|
|
static CImage* Create(LPCTSTR szName, IMCREATE mode); |
|
|
|
#ifndef _RELEASE |
|
void Dump(LPCTSTR szFileName); |
|
#endif |
|
|
|
protected: |
|
IOSTREAMPTR m_pStream; // stream used to read/write the image data |
|
CAutoPtrArr<BYTE> m_data; // image's data buffer |
|
Size m_width; // image width in pixels |
|
Size m_height; // image height in pixels |
|
Size m_dataWidth; // image's data width including mipmaps |
|
Size m_dataHeight; // image's data height |
|
Size m_stride; // bytes per pixel |
|
Size m_lineWidth; // image canvas width in bytes |
|
PIXELFORMAT m_format; // image format (pixel type) |
|
BYTE m_numLevels; // number of mipmap levels (0 = auto-generate) |
|
BYTE m_level; // index of the mipmap level currently reading |
|
String m_fileName; // image's file name |
|
}; // class CImage |
|
typedef CSharedPtr<CImage> IMAGEPTR; |
|
/*----------------------------------------------------------------*/ |
|
|
|
} // namespace SEACAVE |
|
|
|
#endif // __SEACAVE_IMAGE_H__
|
|
|