欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

源代码研究之CIMAGE;我们可以直接使用来创建纹理。

程序员文章站 2022-03-03 13:54:00
...
\
biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight 
inline void GetColor( unsigned int x, unsigned  int y, unsigned char* ucpRed, unsigned char* ucpGreen, unsigned char* ucpBlue )//==============================================================
//==============================================================
//= image.h ====================================================
//= Original coders: Trent Polack ([email protected]) and	   =
//-					 Evan Pipho	  ([email protected])		   =
//==============================================================
//= Image/texture loadings ops								   =
//==============================================================
//==============================================================
#ifndef __IMAGE_H__
#define __IMAGE_H__


//--------------------------------------------------------------
//--------------------------------------------------------------
//- HEADERS AND LIBRARIES --------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
#include <windows.h>

#include <gl/gl.h>
#include <gl/glu.h>


//--------------------------------------------------------------
//--------------------------------------------------------------
//- CONSTANTS --------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
#define BITMAP_ID 0x4D42


//--------------------------------------------------------------
//--------------------------------------------------------------
//- STRUCTURES -------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
struct TGAInformationHeader
{
	unsigned char m_ucHeader[6];
	unsigned int  m_uiBytesPerPixel;
	unsigned int  m_uiImageSize;
	unsigned int  m_uiTemp;
	unsigned int  m_uiType;	
	unsigned int  m_uiHeight;
	unsigned int  m_uiWidth;
	unsigned int  m_uiBPP;
};
//设置1字节对齐,入栈push1
#pragma pack( push, 1 )

struct BMPFileHeader
{
	unsigned short usType; //2位
    unsigned int uiSize; //4位
    unsigned short usReserved1;//2位 
    unsigned short usReserved2; //2位
    unsigned int uiOffBits; //4位
};
//取消1字节对齐,pop 1..出栈
#pragma pack( pop )

struct BMPInfoHeader
{
	unsigned int  uiSize; 
    long   lWidth; 
    long   lHeight; 
    unsigned short usPlanes; 
    unsigned short usBitCount; 
    unsigned int uiCompression; 
    unsigned int uiSizeImage; 
    long lXPelsPerMeter; 
    long lYPelsPerMeter; 
    unsigned int uiClrUsed; 
    unsigned int uiClrImportant; 
};

//--------------------------------------------------------------
//--------------------------------------------------------------
//- GLOBALS ----------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
extern unsigned char g_ucUTGAcompare[12];
extern unsigned char g_ucCTGAcompare[12];


//--------------------------------------------------------------
//--------------------------------------------------------------
//- CLASS ------------------------------------------------------
//--------------------------------------------------------------
//--------------------------------------------------------------
class CIMAGE
{
	private:
		unsigned char* m_ucpData;
		unsigned int   m_uiWidth;
		unsigned int   m_uiHeight;
		unsigned int   m_uiBPP;
		unsigned int   m_ID;

		bool m_bIsLoaded;

	bool LoadBMP( void );
	bool SaveBMP( char* szFilename );

	bool LoadCompressedTGA( void );
	bool LoadUncompressedTGA( void );

	public:


	bool Create( unsigned int uiWidth, unsigned int uiHeight, unsigned int uiBPP );

	bool LoadData( char* a_szFilename );

	bool Load( char* a_szFilename, float a_fMinFilter, float a_fMaxFilter, bool a_bMipmap= false );
	void Unload( void );
	bool Save( char* szFilename );

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetColor - public
	// Description:		Get the color (RGB triplet) from a texture pixel
	// Arguments:		-x, y: position to get color from
	//					-ucpRed, ucpGreen, ucpBlue: place to store the RGB
	//					 values that are extracted from the texture
	// Return Value:	None
	//--------------------------------------------------------------
	inline void GetColor( unsigned int x, unsigned  int y, unsigned char* ucpRed, unsigned char* ucpGreen, unsigned char* ucpBlue )
	{
		unsigned int uiBPP= m_uiBPP/8;

		if( ( x<m_uiWidth ) && ( y<m_uiHeight ) )
		{
			*ucpRed  = m_ucpData[( ( y*m_uiHeight )+x )*uiBPP];
			*ucpGreen= m_ucpData[( ( y*m_uiHeight )+x )*uiBPP+1];
			*ucpBlue = m_ucpData[( ( y*m_uiHeight )+x )*uiBPP+2];
		}
	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::SetColor - public
	// Description:		Set the color (RGB triplet) for a texture pixel
	// Arguments:		-x, y: position to set color at
	//					-ucpRed, ucpGreen, ucpBlue: color to set at pixel
	// Return Value:	None
	//--------------------------------------------------------------
	inline void SetColor( unsigned int x, unsigned  int y, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue )
	{
		unsigned int uiBPP= m_uiBPP/8;

		if( ( x<m_uiWidth ) && ( y<m_uiHeight ) )
		{
			m_ucpData[( ( y*m_uiHeight )+x )*uiBPP]  = ucRed;
			m_ucpData[( ( y*m_uiHeight )+x )*uiBPP+1]= ucGreen;
			m_ucpData[( ( y*m_uiHeight )+x )*uiBPP+2]= ucBlue;
		}
	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetData - public
	// Description:		Get a pointer to the image's data buffer
	// Arguments:		None
	// Return Value:	An unsigned char buffer (the texture's data)
	//--------------------------------------------------------------
	inline unsigned char* GetData( void )
	{	return m_ucpData;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetWidth - public
	// Description:		Get the texture's width (size along the x-axis)
	// Arguments:		None
	// Return Value:	An unsigned int value: the texture's size along the x-axis
	//--------------------------------------------------------------
	inline unsigned int GetWidth( void )
	{	return m_uiWidth;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetHeight - public
	// Description:		Get the texture's height (size along the y-axis)
	// Arguments:		None
	// Return Value:	An unsigned int value: the texture's size along the y-axis
	//--------------------------------------------------------------
	inline unsigned int GetHeight( void )
	{	return m_uiHeight;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetBPP - public
	// Description:		Get the texture's number of bits per pixel
	// Arguments:		None
	// Return Value:	An unsigned int value: the texture's bits per pixel
	//--------------------------------------------------------------
	inline unsigned int GetBPP( void )
	{	return m_uiBPP;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::GetID - public
	// Description:		Get the texture's identifying ID (use with OpenGL)
	// Arguments:		None
	// Return Value:	An unsigned int value: the texture's ID
	//--------------------------------------------------------------
	inline unsigned int GetID( void )
	{	return m_ID;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::SetID - public
	// Description:		Set the texture's identifying ID (use with OpenGL)
	// Arguments:		-uiID: the texture's soon-to-be ID
	// Return Value:	None
	//--------------------------------------------------------------
	inline void SetID( unsigned int uiID )
	{	m_ID= uiID;	}

	//--------------------------------------------------------------
	// Name:			CIMAGE::IsLoaded - public
	// Description:		Find out if the texture has been loaded or not
	// Arguments:		None
	// Return Value:	A boolean value: -true: a texture has been loaded
	//									 -false: a texture hasn't been loaded
	//--------------------------------------------------------------
	inline bool IsLoaded( void )
	{	return m_bIsLoaded;	}
};


#endif	//__IMAGE_H__

 //首先,我们关心的是它的接口:

 

 

inline bool IsLoaded( void )

 

inline void SetID( unsigned int uiID )

 

inline unsigned int GetID( void )

 

inline unsigned int GetBPP( void )

 

 inline unsigned int GetHeight( void )

 

 inline unsigned int GetWidth( void )

 

 inline unsigned char* GetData( void )

 

inline void SetColor( unsigned int x, unsigned  int y, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue )

 

 inline void GetColor( unsigned int x, unsigned  int y, unsigned char* ucpRed, unsigned char* ucpGreen, unsigned char* ucpBlue )

 

 

 

 

 

就这么多。。。。。。。

 

它对应于一个文件。。

 

 

前面n多是GetSet方法。。。。关键是如何实现的Load和LoadData;;

 

 

//创建一个新的BMP(在内存中的)『实际上是个二维数组。。。』

 bool Create( unsigned int uiWidth, unsigned int uiHeight, unsigned int uiBPP );

//这个函数用指定的filename来保存此对象中的数据。

 bool Save( char* szFilename );

//卸载Load进来的数据。

 

 void Unload( void );

 

 //这个函数用来加载BMP文件并且制作纹理,纹理ID可以通过

 // inline unsigned int GetID( void ) 得到

//如果用这个函数,那么纹理ID已经设好。。。。。。。。。。。。一定不能再去SetID

 bool Load( char* a_szFilename, float a_fMinFilter, float a_fMaxFilter, bool a_bMipmap= false );

 //纯粹的把BMP内容加载进来

 

//下面这个函数没有纹理ID,因此,必须手动设置纹理ID。

 

 bool LoadData( char* a_szFilename );

 

 

 

 

 

相关标签: Windows