129 lines
4.2 KiB
C++
129 lines
4.2 KiB
C++
////////////////////////////////////////////////////////////////////
|
|
// 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__
|