////////////////////////////////////////////////////////////////////////////// //文件 Texture.h //主要功能: // //程序编写: 2005-12-07 ///////////////////////////////////////////////////////////////////////////// //******************************************** // class CTexture //******************************************** // This object stores a bitmap image used as // an Coin3D texture. // Depth are currently 8 16 24 or 32 bits, // Modes are : L(Lighteness), LA, RGB, RGBA (Alpha layer). //******************************************** #ifndef _TEXTURE_ #define _TEXTURE_ #include "DrawImage\ImageBase.h" namespace NCube { class AFX_EXT_CLASS CTexture : public CObject { public : // Construction / destruction CTexture(); virtual ~CTexture(); // Memory int Create(int width, int height, int bpp); int CreateFrom(CImageBase& img); //输出图像 int ToImageBase(CImageBase& img); //绑定指针后,内部将自动删除该指针,绑定之前,内部将自动清空已有数据 int AttachBuffer(unsigned char *buffer, int width, int height, int bpp); //在Coin3D中使用该函数设置材质时,需要设置拷贝方式为SoSFImage::NO_COPY_AND_DELETE //以便让Coin3D使用delete函数释放内存 unsigned char* Detach(void); //在Coin3D中使用该函数设置材质时,需要设置拷贝方式为SoSFImage::COPY unsigned char* GetData(void) { return m_pData; } void Free(void); // File reading, writing void Serialize(CArchive& ar); int ReadImage(char *filename); int SaveImage(char *filename); void operator=(CTexture& ir); // Datas (explicit inline functions) unsigned char* GetData(int i, int j){ return m_pData + m_lineWidthBytes*j + i*m_nBpp/8; } int GetDataBytes() { return m_lineWidthBytes*m_nHeight; } int GetWidth(void) { return m_nWidth; } int GetHeight(void) { return m_nHeight;} int GetBPP(void) { return m_nBpp; } int GetBytesPerPixel() { return m_nBpp/8; } void SetPixel(int i, int j, RGBQUAD rgba); void SetPixel(int i, int j, COLORREF color); RGBQUAD GetPixel(int i, int j); // Misc int IsValid(); int BGRtoRGB(void); // Alpha,0为完全透明,255为不透明 int HasAlpha() { return (m_nBpp == 32 || m_nBpp == 16); } int AddAlphaLayer(unsigned char alpha); int SetAlphaLayer(unsigned char alpha); void SetAlpha(int i, int j, unsigned char alpha); //设置指定像素点的透明度 void SetColorAlpha(COLORREF color, unsigned char alpha);//设置指定颜色的透明度 int MirrorX(void); int MirrorY(void); // Members datas protected: //可包含4种长度的纹理数据: //单通道:1个字节,只包含亮度数据(0-255) //双通道:2个字节,包含亮度和透明度(alpha)数据,各占一个字节 //三通道:3个字节,包含红、绿、蓝三种颜色数据,各占一个字节 //四通道:4个字节,包含红、绿、蓝及透明度数据,各占一个字节 //提示:通常使用单、双通道纹理,因其需要比较少的计算量,快于三、四通道纹理 // 各个像素是按行连续存放,共width*height个像素 unsigned char* m_pData; // datas int m_nWidth; // width (pixels) int m_nHeight; // height (pixels) int m_nBpp; // bits per pixel,该类仅支持8、16、24、32四种 int m_lineWidthBytes; // width (in bytes, 一行像素的字节个数,没有进行32位对齐) }; }; using namespace NCube; #endif // _TEXTURE_