第二人生的源码分析(五十四)纹理图片的格式之LLImageTGA类

来源:互联网 发布:c语言入门自学书籍下载 编辑:程序博客网 时间:2024/05/23 21:52
前面介绍了JPEG2000的图片格式,下面介绍LLImageTGA类的格式。TGA(Tagged Graphics)文件是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现在已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga。TGA的结构比较简单,属于一种图形、图像数据的通用格式,目前大部分文件为24位或32位真彩色,在多媒体领域有着很大影响。由于Truevision公司推出TGA的目的是为了采集、输出电视图像,所以TGA文件总是按行存储、按行进行压缩的,这使得它同时也成为计算机生成图像向电视转换的一种首选格式。
 
LLImageTGA类声明如下:
#001 class LLImageTGA : public LLImageFormatted
#002 {
#003 protected:
#004      virtual ~LLImageTGA();
#005     
#006 public:
#007      LLImageTGA();
#008      LLImageTGA(const LLString& file_name);
#009 
 
下面是更新数据。
#010      /*virtual*/ BOOL updateData();
 
下面把TGA格式解码为RAW数据格式。
#011      /*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time=0.0);
 
下面把RAW格式的数据压缩成TGA的方式。
#012      /*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time=0.0);
#013 
#014      BOOL                  decodeAndProcess(LLImageRaw* raw_image, F32 domain, F32 weight);
#015     
#016 private:
 
下面不同的解码实现。
#017      BOOL                  decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
#018 
#019      BOOL                  decodeTruecolorRle8( LLImageRaw* raw_image );
#020      BOOL                  decodeTruecolorRle15( LLImageRaw* raw_image );
#021      BOOL                  decodeTruecolorRle24( LLImageRaw* raw_image );
#022      BOOL                  decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque );
#023 
#024      void               decodeTruecolorPixel15( U8* dst, const U8* src );
#025 
#026      BOOL                  decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque );
#027     
#028      BOOL                  decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
#029 
#030      void               decodeColorMapPixel8(U8* dst, const U8* src);
#031      void               decodeColorMapPixel15(U8* dst, const U8* src);
#032      void               decodeColorMapPixel24(U8* dst, const U8* src);
#033      void               decodeColorMapPixel32(U8* dst, const U8* src);
#034 
 
下面从磁盘加载TGA文件。
#035      bool                     loadFile(const LLString& file_name);
#036     
#037 private:
 
以下是压缩和解码使用到成员变量。
#038      // Class specific data
#039      U32 mDataOffset; // Offset from start of data to the actual header.
#040 
 
文件头的信息。
#041      // Data from header
#042      U8 mIDLength;            // Length of identifier string
#043      U8 mColorMapType;   // 0 = No Map
#044      U8 mImageType;         // Supported: 2 = Uncompressed true color, 3 = uncompressed monochrome without colormap
#045      U8 mColorMapIndexLo;      // First color map entry (low order byte)
#046      U8 mColorMapIndexHi;       // First color map entry (high order byte)
#047      U8 mColorMapLengthLo;   // Color map length (low order byte)
#048      U8 mColorMapLengthHi;    // Color map length (high order byte)
#049      U8 mColorMapDepth; // Size of color map entry (15, 16, 24, or 32 bits)
#050      U8 mXOffsetLo;           // X offset of image (low order byte)
#051      U8 mXOffsetHi;            // X offset of image (hi order byte)
#052      U8 mYOffsetLo;          // Y offset of image (low order byte)
#053      U8 mYOffsetHi;           // Y offset of image (hi order byte)
#054      U8 mWidthLo;             // Width (low order byte)
#055      U8 mWidthHi;              // Width (hi order byte)
#056      U8 mHeightLo;            // Height (low order byte)
#057      U8 mHeightHi;             // Height (hi order byte)
#058      U8 mPixelSize;            // 8, 16, 24, 32 bits per pixel
#059      U8 mAttributeBits;       // 4 bits: number of attributes per pixel
#060      U8 mOriginRightBit;    // 1 bit: origin, 0 = left, 1 = right
#061      U8 mOriginTopBit;      // 1 bit: origin, 0 = bottom, 1 = top
#062      U8 mInterleave;           // 2 bits: interleaved flag, 0 = none, 1 = interleaved 2, 2 = interleaved 4
#063 
#064      U8*         mColorMap;
#065      S32        mColorMapStart;
#066      S32        mColorMapLength;
#067      S32        mColorMapBytesPerEntry;
#068 
#069      BOOL    mIs15Bit;
#070 
#071      static const U8 s5to8bits[32];
#072 };
#073 
 
由于TGA格式是全部在第二人生里用程序实现的,并且压缩和解压的代码都比较大,这里就不一一列出来了。具体需要了解的,只要认真地读读代码就能看得很清楚了。当然在第二人生里支持的图片,不仅仅上面介绍的两种格式类,还有很多,比如:LLImageBMP类、LLImageJPEG类、LLImageDXT类、LLImagePNG类,实现这些类都是在工程llimage里。到这里就把纹理图片的格式介绍完了,下一次开始新内容的探索。