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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llimage.h
  3.  * @brief Object for managing images and their textures.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLIMAGE_H
  33. #define LL_LLIMAGE_H
  34. #include "lluuid.h"
  35. #include "llstring.h"
  36. //#include "llmemory.h"
  37. #include "llthread.h"
  38. #include "llmemtype.h"
  39. const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2
  40. const S32 MAX_IMAGE_MIP = 11; // 2048x2048
  41. const S32 MAX_DISCARD_LEVEL = 5;
  42. const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2
  43. const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048
  44. const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE;
  45. const S32 MAX_IMAGE_AREA = MAX_IMAGE_SIZE * MAX_IMAGE_SIZE;
  46. const S32 MAX_IMAGE_COMPONENTS = 8;
  47. const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS;
  48. // Note!  These CANNOT be changed without modifying simulator code
  49. // *TODO: change both to 1024 when SIM texture fetching is deprecated
  50. const S32 FIRST_PACKET_SIZE = 600;
  51. const S32 MAX_IMG_PACKET_SIZE = 1000;
  52. // Base classes for images.
  53. // There are two major parts for the image:
  54. // The compressed representation, and the decompressed representation.
  55. class LLImageFormatted;
  56. class LLImageRaw;
  57. class LLColor4U;
  58. typedef enum e_image_codec
  59. {
  60. IMG_CODEC_INVALID  = 0,
  61. IMG_CODEC_RGB  = 1,
  62. IMG_CODEC_J2C  = 2,
  63. IMG_CODEC_BMP  = 3,
  64. IMG_CODEC_TGA  = 4,
  65. IMG_CODEC_JPEG = 5,
  66. IMG_CODEC_DXT  = 6,
  67. IMG_CODEC_PNG  = 7,
  68. IMG_CODEC_EOF  = 8
  69. } EImageCodec;
  70. //============================================================================
  71. // library initialization class
  72. class LLImage
  73. {
  74. public:
  75. static void initClass();
  76. static void cleanupClass();
  77. static const std::string& getLastError();
  78. static void setLastError(const std::string& message);
  79. protected:
  80. static LLMutex* sMutex;
  81. static std::string sLastErrorMessage;
  82. };
  83. //============================================================================
  84. // Image base class
  85. class LLImageBase : public LLThreadSafeRefCount
  86. {
  87. protected:
  88. virtual ~LLImageBase();
  89. public:
  90. LLImageBase();
  91. enum
  92. {
  93. TYPE_NORMAL = 0,
  94. TYPE_AVATAR_BAKE = 1,
  95. };
  96. virtual void deleteData();
  97. virtual U8* allocateData(S32 size = -1);
  98. virtual U8* reallocateData(S32 size = -1);
  99. virtual void dump();
  100. virtual void sanityCheck();
  101. U16 getWidth() const { return mWidth; }
  102. U16 getHeight() const { return mHeight; }
  103. S8 getComponents() const { return mComponents; }
  104. S32 getDataSize() const { return mDataSize; }
  105. const U8 *getData() const ;
  106. U8 *getData() ;
  107. BOOL isBufferInvalid() ;
  108. void setSize(S32 width, S32 height, S32 ncomponents);
  109. U8* allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 size = -1); // setSize() + allocateData()
  110. protected:
  111. // special accessor to allow direct setting of mData and mDataSize by LLImageFormatted
  112. void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }
  113. public:
  114. static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
  115. // Function for calculating the download priority for textures
  116. // <= 0 priority means that there's no need for more data.
  117. static F32 calc_download_priority(F32 virtual_size, F32 visible_area, S32 bytes_sent);
  118. static void setSizeOverride(BOOL enabled) { sSizeOverride = enabled; }
  119. static EImageCodec getCodecFromExtension(const std::string& exten);
  120. private:
  121. U8 *mData;
  122. S32 mDataSize;
  123. U16 mWidth;
  124. U16 mHeight;
  125. S8 mComponents;
  126. BOOL mBadBufferAllocation ;
  127. public:
  128. LLMemType::DeclareMemType& mMemType; // debug
  129. static BOOL sSizeOverride;
  130. };
  131. // Raw representation of an image (used for textures, and other uncompressed formats
  132. class LLImageRaw : public LLImageBase
  133. {
  134. protected:
  135. /*virtual*/ ~LLImageRaw();
  136. public:
  137. LLImageRaw();
  138. LLImageRaw(U16 width, U16 height, S8 components);
  139. LLImageRaw(U8 *data, U16 width, U16 height, S8 components);
  140. // Construct using createFromFile (used by tools)
  141. LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
  142. /*virtual*/ void deleteData();
  143. /*virtual*/ U8* allocateData(S32 size = -1);
  144. /*virtual*/ U8* reallocateData(S32 size);
  145. BOOL resize(U16 width, U16 height, S8 components);
  146. U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;
  147. BOOL setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
  148.  const U8 *data, U32 stride = 0, BOOL reverse_y = FALSE);
  149. void clear(U8 r=0, U8 g=0, U8 b=0, U8 a=255);
  150. void verticalFlip();
  151. void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
  152. void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
  153. void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
  154. BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
  155. BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;
  156. // Fill the buffer with a constant color
  157. void fill( const LLColor4U& color );
  158. // Copy operations
  159. // Src and dst can be any size.  Src and dst can each have 3 or 4 components.
  160. void copy( LLImageRaw* src );
  161. // Src and dst are same size.  Src and dst have same number of components.
  162. void copyUnscaled( LLImageRaw* src );
  163. // Src and dst are same size.  Src has 4 components.  Dst has 3 components.
  164. void copyUnscaled4onto3( LLImageRaw* src );
  165. // Src and dst are same size.  Src has 3 components.  Dst has 4 components.
  166. void copyUnscaled3onto4( LLImageRaw* src );
  167. // Src and dst can be any size.  Src and dst have same number of components.
  168. void copyScaled( LLImageRaw* src );
  169. // Src and dst can be any size.  Src has 3 components.  Dst has 4 components.
  170. void copyScaled3onto4( LLImageRaw* src );
  171. // Src and dst can be any size.  Src has 4 components.  Dst has 3 components.
  172. void copyScaled4onto3( LLImageRaw* src );
  173. // Composite operations
  174. // Src and dst can be any size.  Src and dst can each have 3 or 4 components.
  175. void composite( LLImageRaw* src );
  176. // Src and dst can be any size.  Src has 4 components.  Dst has 3 components.
  177. void compositeScaled4onto3( LLImageRaw* src );
  178. // Src and dst are same size.  Src has 4 components.  Dst has 3 components.
  179. void compositeUnscaled4onto3( LLImageRaw* src );
  180. protected:
  181. // Create an image from a local file (generally used in tools)
  182. bool createFromFile(const std::string& filename, bool j2c_lowest_mip_only = false);
  183. void copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step );
  184. void compositeRowScaled4onto3( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len );
  185. U8 fastFractionalMult(U8 a,U8 b);
  186. void setDataAndSize(U8 *data, S32 width, S32 height, S8 components) ;
  187. public:
  188. static S32 sGlobalRawMemory;
  189. static S32 sRawImageCount;
  190. };
  191. // Compressed representation of image.
  192. // Subclass from this class for the different representations (J2C, bmp)
  193. class LLImageFormatted : public LLImageBase
  194. {
  195. public:
  196. static LLImageFormatted* createFromType(S8 codec);
  197. static LLImageFormatted* createFromExtension(const std::string& instring);
  198. protected:
  199. /*virtual*/ ~LLImageFormatted();
  200. public:
  201. LLImageFormatted(S8 codec);
  202. // LLImageBase
  203. /*virtual*/ void deleteData();
  204. /*virtual*/ U8* allocateData(S32 size = -1);
  205. /*virtual*/ U8* reallocateData(S32 size);
  206. /*virtual*/ void dump();
  207. /*virtual*/ void sanityCheck();
  208. // New methods
  209. // subclasses must return a prefered file extension (lowercase without a leading dot)
  210. virtual std::string getExtension() = 0;
  211. // calcHeaderSize() returns the maximum size of header;
  212. //   0 indicates we don't know have a header and have to lead the entire file
  213. virtual S32 calcHeaderSize() { return 0; };
  214. // calcDataSize() returns how many bytes to read to load discard_level (including header)
  215. virtual S32 calcDataSize(S32 discard_level);
  216. // calcDiscardLevelBytes() returns the smallest valid discard level based on the number of input bytes
  217. virtual S32 calcDiscardLevelBytes(S32 bytes);
  218. // getRawDiscardLevel()by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
  219. virtual S8  getRawDiscardLevel() { return mDiscardLevel; }
  220. BOOL load(const std::string& filename);
  221. BOOL save(const std::string& filename);
  222. virtual BOOL updateData() = 0; // pure virtual
  223.   void setData(U8 *data, S32 size);
  224.   void appendData(U8 *data, S32 size);
  225. // Loads first 4 channels.
  226. virtual BOOL decode(LLImageRaw* raw_image, F32 decode_time) = 0;  
  227. // Subclasses that can handle more than 4 channels should override this function.
  228. virtual BOOL decodeChannels(LLImageRaw* raw_image, F32 decode_time, S32 first_channel, S32 max_channel);
  229. virtual BOOL encode(const LLImageRaw* raw_image, F32 encode_time) = 0;
  230. S8 getCodec() const;
  231. BOOL isDecoding() const { return mDecoding ? TRUE : FALSE; }
  232. BOOL isDecoded()  const { return mDecoded ? TRUE : FALSE; }
  233. void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; }
  234. S8 getDiscardLevel() const { return mDiscardLevel; }
  235. // setLastError needs to be deferred for J2C images since it may be called from a DLL
  236. virtual void resetLastError();
  237. virtual void setLastError(const std::string& message, const std::string& filename = std::string());
  238. protected:
  239. BOOL copyData(U8 *data, S32 size); // calls updateData()
  240. protected:
  241. S8 mCodec;
  242. S8 mDecoding;
  243. S8 mDecoded;  // unused, but changing LLImage layout requires recompiling static Mac/Linux libs. 2009-01-30 JC
  244. S8 mDiscardLevel;
  245. public:
  246. static S32 sGlobalFormattedMemory;
  247. };
  248. #endif