llimagedxt.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llimagedxt.h
  3.  *
  4.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2001-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #ifndef LL_LLIMAGEDXT_H
  32. #define LL_LLIMAGEDXT_H
  33. #include "llimage.h"
  34. #include "llpointer.h"
  35. // This class decodes and encodes LL DXT files (which may unclude uncompressed RGB or RGBA mipped data)
  36. class LLImageDXT : public LLImageFormatted
  37. {
  38. public:
  39. enum EFileFormat
  40. FORMAT_UNKNOWN = 0,
  41. FORMAT_I8 = 1,
  42. FORMAT_A8,
  43. FORMAT_RGB8,
  44. FORMAT_RGBA8,
  45. FORMAT_DXT1,
  46. FORMAT_DXT2,
  47. FORMAT_DXT3,
  48. FORMAT_DXT4,
  49. FORMAT_DXT5,
  50. FORMAT_DXR1,
  51. FORMAT_DXR2,
  52. FORMAT_DXR3,
  53. FORMAT_DXR4,
  54. FORMAT_DXR5,
  55. FORMAT_NOFILE = 0xff,
  56. };
  57. struct dxtfile_header_old_t
  58. {
  59. S32 format;
  60. S32 maxlevel;
  61. S32 maxwidth;
  62. S32 maxheight;
  63. };
  64. struct dxtfile_header_t
  65. {
  66. S32 fourcc;
  67. // begin DDSURFACEDESC2 struct
  68. S32 header_size; // size of the header
  69. S32 flags; // flags - unused
  70. S32 maxheight;
  71. S32 maxwidth;
  72. S32 image_size; // size of the compressed image
  73. S32 depth;
  74. S32 num_mips;
  75. S32 reserved[11];
  76. struct pixel_format
  77. {
  78. S32 struct_size; // size of this structure
  79. S32 flags;
  80. S32 fourcc;
  81. S32 bit_count;
  82. S32 r_mask;
  83. S32 g_mask;
  84. S32 b_mask;
  85. S32 a_mask;
  86. } pixel_fmt;
  87. S32 caps[4];
  88. S32 reserved2;
  89. };
  90. protected:
  91. /*virtual*/ ~LLImageDXT();
  92. private:
  93. BOOL encodeDXT(const LLImageRaw* raw_image, F32 decode_time, bool explicit_mips);
  94. public:
  95. LLImageDXT();
  96. /*virtual*/ std::string getExtension() { return std::string("dxt"); }
  97. /*virtual*/ BOOL updateData();
  98. /*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
  99. /*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
  100. /*virtual*/ S32 calcHeaderSize();
  101. /*virtual*/ S32 calcDataSize(S32 discard_level = 0);
  102. BOOL getMipData(LLPointer<LLImageRaw>& raw, S32 discard=-1);
  103. void setFormat();
  104. S32 getMipOffset(S32 discard);
  105. EFileFormat getFileFormat() { return mFileFormat; }
  106. bool isCompressed() { return (mFileFormat >= FORMAT_DXT1 && mFileFormat <= FORMAT_DXR5); }
  107. bool convertToDXR(); // convert from DXT to DXR
  108. static void checkMinWidthHeight(EFileFormat format, S32& width, S32& height);
  109. static S32 formatBits(EFileFormat format);
  110. static S32 formatBytes(EFileFormat format, S32 width, S32 height);
  111. static S32 formatOffset(EFileFormat format, S32 width, S32 height, S32 max_width, S32 max_height);
  112. static S32 formatComponents(EFileFormat format);
  113. static EFileFormat getFormat(S32 fourcc);
  114. static S32 getFourCC(EFileFormat format);
  115. static void calcDiscardWidthHeight(S32 discard_level, EFileFormat format, S32& width, S32& height);
  116. static S32 calcNumMips(S32 width, S32 height);
  117. private:
  118. static void extractMip(const U8 *indata, U8* mipdata, int width, int height,
  119.    int mip_width, int mip_height, EFileFormat format);
  120. private:
  121. EFileFormat mFileFormat;
  122. S32 mHeaderSize;
  123. };
  124. #endif