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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llimagetga.cpp
  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. #include "linden_common.h"
  32. #include "llimagetga.h"
  33. #include "lldir.h"
  34. #include "llerror.h"
  35. #include "llmath.h"
  36. #include "llpointer.h"
  37. // For expanding 5-bit pixel values to 8-bit with best rounding
  38. // static
  39. const U8 LLImageTGA::s5to8bits[32] = 
  40. {
  41. 0,   8,  16,  25,  33,  41,  49,  58,
  42.    66,  74,  82,  90,  99, 107, 115, 123,
  43.   132, 140, 148, 156, 165, 173, 181, 189,
  44.   197, 206, 214, 222, 230, 239, 247, 255
  45. };
  46. inline void LLImageTGA::decodeTruecolorPixel15( U8* dst, const U8* src )
  47. {
  48.     // We expand 5 bit data to 8 bit sample width.
  49.     // The format of the 16-bit (LSB first) input word is
  50.     // xRRRRRGGGGGBBBBB
  51. U32 t = U32(src[0]) + (U32(src[1]) << 8);
  52.     dst[2] = s5to8bits[t & 0x1F];  // blue
  53.     t >>= 5;
  54.     dst[1] = s5to8bits[t & 0x1F];  // green
  55.     t >>= 5;
  56.     dst[0] = s5to8bits[t & 0x1F];  // red
  57. }
  58. LLImageTGA::LLImageTGA() 
  59. : LLImageFormatted(IMG_CODEC_TGA),
  60.   mColorMap( NULL ),
  61.   mColorMapStart( 0 ),
  62.   mColorMapLength( 0 ),
  63.   mColorMapBytesPerEntry( 0 ),
  64.   mIs15Bit( FALSE ),
  65.   mAttributeBits(0),
  66.   mColorMapDepth(0),
  67.   mColorMapIndexHi(0),
  68.   mColorMapIndexLo(0),
  69.   mColorMapLengthHi(0),
  70.   mColorMapLengthLo(0),
  71.   mColorMapType(0),
  72.   mDataOffset(0),
  73.   mHeightHi(0),
  74.   mHeightLo(0),
  75.   mIDLength(0),
  76.   mImageType(0),
  77.   mInterleave(0),
  78.   mOriginRightBit(0),
  79.   mOriginTopBit(0),
  80.   mPixelSize(0),
  81.   mWidthHi(0),
  82.   mWidthLo(0),
  83.   mXOffsetHi(0),
  84.   mXOffsetLo(0),
  85.   mYOffsetHi(0),
  86.   mYOffsetLo(0)
  87. {
  88. }
  89. LLImageTGA::LLImageTGA(const std::string& file_name) 
  90. : LLImageFormatted(IMG_CODEC_TGA),
  91.   mColorMap( NULL ),
  92.   mColorMapStart( 0 ),
  93.   mColorMapLength( 0 ),
  94.   mColorMapBytesPerEntry( 0 ),
  95.   mIs15Bit( FALSE )
  96. {
  97. loadFile(file_name);
  98. }
  99. LLImageTGA::~LLImageTGA()
  100. {
  101. delete [] mColorMap;
  102. }
  103. BOOL LLImageTGA::updateData()
  104. {
  105. resetLastError();
  106. // Check to make sure that this instance has been initialized with data
  107. if (!getData() || (0 == getDataSize()))
  108. {
  109. setLastError("LLImageTGA uninitialized");
  110. return FALSE;
  111. }
  112. // Pull image information from the header...
  113. U8 flags;
  114. U8 junk[256];
  115. /****************************************************************************
  116. **
  117. ** For more information about the original Truevision TGA(tm) file format,
  118. ** or for additional information about the new extensions to the
  119. ** Truevision TGA file, refer to the "Truevision TGA File Format
  120. ** Specification Version 2.0" available from Truevision or your
  121. ** Truevision dealer.
  122. **
  123. **  FILE STRUCTURE FOR THE ORIGINAL TRUEVISION TGA FILE
  124. **   FIELD 1 : NUMBER OF CHARACTERS IN ID FIELD (1 BYTES)
  125. **   FIELD 2 : COLOR MAP TYPE (1 BYTES)
  126. **   FIELD 3 : IMAGE TYPE CODE (1 BYTES)
  127. ** = 0 NO IMAGE DATA INCLUDED
  128. ** = 1 UNCOMPRESSED, COLOR-MAPPED IMAGE
  129. ** = 2 UNCOMPRESSED, TRUE-COLOR IMAGE
  130. ** = 3 UNCOMPRESSED, BLACK AND WHITE IMAGE
  131. ** = 9 RUN-LENGTH ENCODED COLOR-MAPPED IMAGE
  132. ** = 10 RUN-LENGTH ENCODED TRUE-COLOR IMAGE
  133. ** = 11 RUN-LENGTH ENCODED BLACK AND WHITE IMAGE
  134. **   FIELD 4 : COLOR MAP SPECIFICATION (5 BYTES)
  135. ** 4.1 : COLOR MAP ORIGIN (2 BYTES)
  136. ** 4.2 : COLOR MAP LENGTH (2 BYTES)
  137. ** 4.3 : COLOR MAP ENTRY SIZE (2 BYTES)
  138. **   FIELD 5 : IMAGE SPECIFICATION (10 BYTES)
  139. ** 5.1 : X-ORIGIN OF IMAGE (2 BYTES)
  140. ** 5.2 : Y-ORIGIN OF IMAGE (2 BYTES)
  141. ** 5.3 : WIDTH OF IMAGE (2 BYTES)
  142. ** 5.4 : HEIGHT OF IMAGE (2 BYTES)
  143. ** 5.5 : IMAGE PIXEL SIZE (1 BYTE)
  144. ** 5.6 : IMAGE DESCRIPTOR BYTE (1 BYTE) 
  145. **   FIELD 6 : IMAGE ID FIELD (LENGTH SPECIFIED BY FIELD 1)
  146. **   FIELD 7 : COLOR MAP DATA (BIT WIDTH SPECIFIED BY FIELD 4.3 AND
  147. ** NUMBER OF COLOR MAP ENTRIES SPECIFIED IN FIELD 4.2)
  148. **   FIELD 8 : IMAGE DATA FIELD (WIDTH AND HEIGHT SPECIFIED IN
  149. ** FIELD 5.3 AND 5.4)
  150. ****************************************************************************/
  151. mDataOffset = 0;
  152. mIDLength = *(getData()+mDataOffset++);
  153. mColorMapType = *(getData()+mDataOffset++);
  154. mImageType = *(getData()+mDataOffset++);
  155. mColorMapIndexLo = *(getData()+mDataOffset++);
  156. mColorMapIndexHi = *(getData()+mDataOffset++);
  157. mColorMapLengthLo = *(getData()+mDataOffset++);
  158. mColorMapLengthHi = *(getData()+mDataOffset++);
  159. mColorMapDepth = *(getData()+mDataOffset++);
  160. mXOffsetLo = *(getData()+mDataOffset++);
  161. mXOffsetHi = *(getData()+mDataOffset++);
  162. mYOffsetLo = *(getData()+mDataOffset++);
  163. mYOffsetHi = *(getData()+mDataOffset++);
  164. mWidthLo = *(getData()+mDataOffset++);
  165. mWidthHi = *(getData()+mDataOffset++);
  166. mHeightLo = *(getData()+mDataOffset++);
  167. mHeightHi = *(getData()+mDataOffset++);
  168. mPixelSize = *(getData()+mDataOffset++);
  169. flags = *(getData()+mDataOffset++);
  170. mAttributeBits = flags & 0xf;
  171. mOriginRightBit = (flags & 0x10) >> 4;
  172. mOriginTopBit = (flags & 0x20) >> 5;
  173. mInterleave = (flags & 0xc0) >> 6;
  174. switch( mImageType )
  175. {
  176. case 0:
  177. // No image data included in file
  178. setLastError("Unable to load file.  TGA file contains no image data.");
  179. return FALSE;
  180. case 1:
  181. // Colormapped uncompressed
  182. if( 8 != mPixelSize )
  183. {
  184. setLastError("Unable to load file.  Colormapped images must have 8 bits per pixel.");
  185. return FALSE;
  186. }
  187. break;
  188. case 2:
  189. // Truecolor uncompressed
  190. break;
  191. case 3:
  192. // Monochrome uncompressed
  193. if( 8 != mPixelSize )
  194. {
  195. setLastError("Unable to load file.  Monochrome images must have 8 bits per pixel.");
  196. return FALSE;
  197. }
  198. break;
  199. case 9:
  200. // Colormapped, RLE
  201. break;
  202. case 10:
  203. // Truecolor, RLE
  204. break;
  205. case 11:
  206. // Monochrome, RLE
  207. if( 8 != mPixelSize )
  208. {
  209. setLastError("Unable to load file.  Monochrome images must have 8 bits per pixel.");
  210. return FALSE;
  211. }
  212. break;
  213. default:
  214. setLastError("Unable to load file.  Unrecoginzed TGA image type.");
  215. return FALSE;
  216. }
  217. // discard the ID field, if any
  218. if (mIDLength)
  219. {
  220. memcpy(junk, getData()+mDataOffset, mIDLength); /* Flawfinder: ignore */
  221. mDataOffset += mIDLength;
  222. }
  223. // check to see if there's a colormap since even rgb files can have them
  224. S32 color_map_bytes = 0;
  225. if( (1 == mColorMapType) && (mColorMapDepth > 0) )
  226. {
  227. mColorMapStart = (S32(mColorMapIndexHi) << 8) + mColorMapIndexLo;
  228. mColorMapLength = (S32(mColorMapLengthHi) << 8) + mColorMapLengthLo;
  229. if( mColorMapDepth > 24 )
  230. {
  231. mColorMapBytesPerEntry = 4;
  232. }
  233. else
  234. if( mColorMapDepth > 16 )
  235. {
  236. mColorMapBytesPerEntry = 3;
  237. }
  238. else
  239. if( mColorMapDepth > 8 )
  240. {
  241. mColorMapBytesPerEntry = 2;
  242. }
  243. else
  244. {
  245. mColorMapBytesPerEntry = 1;
  246. }
  247. color_map_bytes = mColorMapLength * mColorMapBytesPerEntry;
  248. // Note: although it's legal for TGA files to have color maps and not use them
  249. // (some programs actually do this and use the color map for other ends), we'll
  250. // only allocate memory for one if _we_ intend to use it.
  251. if ( (1 == mImageType) || (9 == mImageType)  )
  252. {
  253. mColorMap = new U8[ color_map_bytes ];  
  254. if (!mColorMap)
  255. {
  256. llerrs << "Out of Memory in BOOL LLImageTGA::updateData()" << llendl;
  257. return FALSE;
  258. }
  259. memcpy( mColorMap, getData() + mDataOffset, color_map_bytes ); /* Flawfinder: ignore */
  260. }
  261. mDataOffset += color_map_bytes;
  262. }
  263. // heights are read as bytes to prevent endian problems
  264. S32 height = (S32(mHeightHi) << 8) + mHeightLo;
  265. S32 width = (S32(mWidthHi) << 8) + mWidthLo;
  266. // make sure that it's a pixel format that we understand
  267. S32 bits_per_pixel;
  268. if( mColorMap )
  269. {
  270. bits_per_pixel = mColorMapDepth;
  271. }
  272. else
  273. {
  274. bits_per_pixel = mPixelSize;
  275. }
  276. S32 components;
  277. switch(bits_per_pixel)
  278. {
  279. case 24:
  280. components = 3;
  281. break;
  282. case 32:
  283. components = 4;
  284. // Don't enforce this.  ACDSee doesn't bother to set the attributes bits correctly. Arrgh!
  285. // if( mAttributeBits != 8 )
  286. // {
  287. // setLastError("Unable to load file. 32 bit TGA image does not have 8 bits of alpha.");
  288. // return FALSE;
  289. // }
  290. mAttributeBits = 8;
  291. break;
  292. case 15:
  293. case 16:
  294. components = 3;
  295. mIs15Bit = TRUE;  // 16th bit is used for Targa hardware interupts and is ignored.
  296. break;
  297. case 8:
  298. components = 1;
  299. break;
  300. default:
  301. setLastError("Unable to load file. Unknown pixel size.");
  302. return FALSE;
  303. }
  304. setSize(width, height, components);
  305. return TRUE;
  306. }
  307. BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
  308. {
  309. llassert_always(raw_image);
  310. // Check to make sure that this instance has been initialized with data
  311. if (!getData() || (0 == getDataSize()))
  312. {
  313. setLastError("LLImageTGA trying to decode an image with no data!");
  314. return FALSE;
  315. }
  316. // Copy everything after the header.
  317. raw_image->resize(getWidth(), getHeight(), getComponents());
  318. if( (getComponents() != 1) &&
  319. (getComponents() != 3) &&
  320. (getComponents() != 4) )
  321. {
  322. setLastError("TGA images with a number of components other than 1, 3, and 4 are not supported.");
  323. return FALSE;
  324. }
  325. if( mOriginRightBit )
  326. {
  327. setLastError("TGA images with origin on right side are not supported.");
  328. return FALSE;
  329. }
  330. BOOL flipped = (mOriginTopBit != 0);
  331. BOOL rle_compressed = ((mImageType & 0x08) != 0);
  332. if( mColorMap )
  333. {
  334. return decodeColorMap( raw_image, rle_compressed, flipped );
  335. }
  336. else
  337. {
  338. return decodeTruecolor( raw_image, rle_compressed, flipped );
  339. }
  340. }
  341. BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
  342. {
  343. BOOL success = FALSE;
  344. BOOL alpha_opaque = FALSE;
  345. if( rle )
  346. {
  347. switch( getComponents() )
  348. {
  349. case 1:
  350. success = decodeTruecolorRle8( raw_image );
  351. break;
  352. case 3:
  353. if( mIs15Bit )
  354. {
  355. success = decodeTruecolorRle15( raw_image );
  356. }
  357. else
  358. {
  359. success = decodeTruecolorRle24( raw_image );
  360. }
  361. break;
  362. case 4:
  363. success = decodeTruecolorRle32( raw_image, alpha_opaque );
  364. if (alpha_opaque)
  365. {
  366. // alpha was entirely opaque
  367. // convert to 24 bit image
  368. LLPointer<LLImageRaw> compacted_image = new LLImageRaw(raw_image->getWidth(), raw_image->getHeight(), 3);
  369. compacted_image->copy(raw_image);
  370. raw_image->resize(raw_image->getWidth(), raw_image->getHeight(), 3);
  371. raw_image->copy(compacted_image);
  372. }
  373. break;
  374. }
  375. }
  376. else
  377. {
  378. BOOL alpha_opaque;
  379. success = decodeTruecolorNonRle( raw_image, alpha_opaque );
  380. if (alpha_opaque && raw_image->getComponents() == 4)
  381. {
  382. // alpha was entirely opaque
  383. // convert to 24 bit image
  384. LLPointer<LLImageRaw> compacted_image = new LLImageRaw(raw_image->getWidth(), raw_image->getHeight(), 3);
  385. compacted_image->copy(raw_image);
  386. raw_image->resize(raw_image->getWidth(), raw_image->getHeight(), 3);
  387. raw_image->copy(compacted_image);
  388. }
  389. }
  390. if( success && flipped )
  391. {
  392. // This works because the Targa definition requires that RLE blocks never
  393. // encode pixels from more than one scanline.
  394. // (On the other hand, it's not as fast as writing separate flipped versions as 
  395. // we did with TruecolorNonRle.)
  396. raw_image->verticalFlip();
  397. }
  398. return success;
  399. }
  400. BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque )
  401. {
  402. alpha_opaque = TRUE;
  403. // Origin is the bottom left
  404. U8* dst = raw_image->getData();
  405. U8* src = getData() + mDataOffset;
  406. S32 pixels = getWidth() * getHeight();
  407. if (getComponents() == 4)
  408. {
  409. while( pixels-- )
  410. {
  411. // Our data is stored in RGBA.  TGA stores them as BGRA (little-endian ARGB)
  412. dst[0] = src[2]; // Red
  413. dst[1] = src[1]; // Green
  414. dst[2] = src[0]; // Blue
  415. dst[3] = src[3]; // Alpha
  416. if (dst[3] != 255)
  417. {
  418. alpha_opaque = FALSE;
  419. }
  420. dst += 4;
  421. src += 4;
  422. }
  423. }
  424. else if (getComponents() == 3)
  425. {
  426. if( mIs15Bit )
  427. {
  428. while( pixels-- )
  429. {
  430. decodeTruecolorPixel15( dst, src );
  431. dst += 3;
  432. src += 2;
  433. }
  434. }
  435. else
  436. {
  437. while( pixels-- )
  438. {
  439. dst[0] = src[2]; // Red
  440. dst[1] = src[1]; // Green
  441. dst[2] = src[0]; // Blue
  442. dst += 3;
  443. src += 3;
  444. }
  445. }
  446. }
  447. else if (getComponents() == 1)
  448. {
  449. memcpy(dst, src, pixels); /* Flawfinder: ignore */
  450. }
  451. return TRUE;
  452. }
  453. void LLImageTGA::decodeColorMapPixel8( U8* dst, const U8* src )
  454. {
  455. S32 index = llclamp( *src - mColorMapStart, 0, mColorMapLength - 1 );
  456. dst[0] = mColorMap[ index ];
  457. }
  458. void LLImageTGA::decodeColorMapPixel15( U8* dst, const U8* src )
  459. {
  460. S32 index = llclamp( *src - mColorMapStart, 0, mColorMapLength - 1 );
  461. decodeTruecolorPixel15( dst, mColorMap + 2 * index );
  462. }
  463. void LLImageTGA::decodeColorMapPixel24( U8* dst, const U8* src )
  464. {
  465. S32 index = 3 * llclamp( *src - mColorMapStart, 0, mColorMapLength - 1 );
  466. dst[0] = mColorMap[ index + 2 ]; // Red
  467. dst[1] = mColorMap[ index + 1 ]; // Green
  468. dst[2] = mColorMap[ index + 0 ]; // Blue
  469. }
  470. void LLImageTGA::decodeColorMapPixel32( U8* dst, const U8* src )
  471. {
  472. S32 index = 4 * llclamp( *src - mColorMapStart, 0, mColorMapLength - 1 );
  473. dst[0] = mColorMap[ index + 2 ]; // Red
  474. dst[1] = mColorMap[ index + 1 ]; // Green
  475. dst[2] = mColorMap[ index + 0 ]; // Blue
  476. dst[3] = mColorMap[ index + 3 ]; // Alpha
  477. }
  478. BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
  479. {
  480. // If flipped, origin is the top left.  Need to reverse the order of the rows.
  481. // Otherwise the origin is the bottom left.
  482. if( 8 != mPixelSize )
  483. {
  484. return FALSE;
  485. }
  486. U8* src = getData() + mDataOffset;
  487. U8* dst = raw_image->getData(); // start from the top
  488. void (LLImageTGA::*pixel_decoder)( U8*, const U8* );
  489. switch( mColorMapBytesPerEntry )
  490. {
  491. case 1: pixel_decoder = &LLImageTGA::decodeColorMapPixel8;  break;
  492. case 2: pixel_decoder = &LLImageTGA::decodeColorMapPixel15; break;
  493. case 3: pixel_decoder = &LLImageTGA::decodeColorMapPixel24; break;
  494. case 4: pixel_decoder = &LLImageTGA::decodeColorMapPixel32; break;
  495. default: llassert(0); return FALSE;
  496. }
  497. if( rle )
  498. {
  499. U8* last_dst = dst + getComponents() * (getHeight() * getWidth() - 1);
  500. while( dst <= last_dst )
  501. {
  502. // Read RLE block header
  503. U8 block_header_byte = *src;
  504. src++;
  505. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  506. if( block_header_byte & 0x80 )
  507. {
  508. // Encoded (duplicate-pixel) block
  509. do
  510. {
  511. (this->*pixel_decoder)( dst, src );
  512. dst += getComponents();
  513. block_pixel_count--;
  514. }
  515. while( block_pixel_count > 0 );
  516. src++;
  517. }
  518. else 
  519. {
  520. // Unencoded block
  521. do
  522. {
  523. (this->*pixel_decoder)( dst, src );
  524. dst += getComponents();
  525. src++;
  526. block_pixel_count--;
  527. }
  528. while( block_pixel_count > 0 );
  529. }
  530. }
  531. raw_image->verticalFlip();
  532. }
  533. else
  534. {
  535. S32 src_row_bytes = getWidth();
  536. S32 dst_row_bytes = getWidth() * getComponents();
  537. if( flipped )
  538. {
  539. U8* src_last_row_start = src + (getHeight() - 1) * src_row_bytes;
  540. src = src_last_row_start; // start from the bottom
  541. src_row_bytes *= -1;
  542. }
  543. S32 i;
  544. S32 j;
  545. for( S32 row = 0; row < getHeight(); row++ )
  546. {
  547. for( i = 0, j = 0; j < getWidth(); i += getComponents(), j++ )
  548. {
  549. (this->*pixel_decoder)( dst + i, src + j );
  550. }
  551. dst += dst_row_bytes;
  552. src += src_row_bytes;
  553. }
  554. }
  555. return TRUE;
  556. }
  557. BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
  558. {
  559. llassert_always(raw_image);
  560. deleteData();
  561. setSize(raw_image->getWidth(), raw_image->getHeight(), raw_image->getComponents());
  562. // Data from header
  563. mIDLength = 0; // Length of identifier string
  564. mColorMapType = 0; // 0 = No Map
  565. // Supported: 2 = Uncompressed true color, 3 = uncompressed monochrome without colormap
  566. switch( getComponents() )
  567. {
  568. case 1:
  569. mImageType = 3;
  570. break;
  571. case 2:  // Interpret as intensity plus alpha
  572. case 3:
  573. case 4:
  574. mImageType = 2;
  575. break;
  576. default:
  577. return FALSE;
  578. }
  579. // Color map stuff (unsupported)
  580. mColorMapIndexLo = 0; // First color map entry (low order byte)
  581. mColorMapIndexHi = 0; // First color map entry (high order byte)
  582. mColorMapLengthLo = 0; // Color map length (low order byte)
  583. mColorMapLengthHi = 0; // Color map length (high order byte)
  584. mColorMapDepth = 0; // Size of color map entry (15, 16, 24, or 32 bits)
  585. // Image offset relative to origin.
  586. mXOffsetLo = 0; // X offset from origin (low order byte)
  587. mXOffsetHi = 0; // X offset from origin (hi order byte)
  588. mYOffsetLo = 0; // Y offset from origin (low order byte)
  589. mYOffsetHi = 0; // Y offset from origin (hi order byte)
  590. // Height and width
  591. mWidthLo = U8(getWidth() & 0xFF); // Width (low order byte)
  592. mWidthHi = U8((getWidth() >> 8) & 0xFF); // Width (hi order byte)
  593. mHeightLo = U8(getHeight() & 0xFF); // Height (low order byte)
  594. mHeightHi = U8((getHeight() >> 8) & 0xFF); // Height (hi order byte)
  595. S32 bytes_per_pixel;
  596. switch( getComponents() )
  597. {
  598. case 1:
  599. bytes_per_pixel = 1;
  600. break;
  601. case 3:
  602. bytes_per_pixel = 3;
  603. break;
  604. case 2:  // Interpret as intensity plus alpha.  Store as RGBA.
  605. case 4:
  606. bytes_per_pixel = 4;
  607. break;
  608. default:
  609. return FALSE;
  610. }
  611. mPixelSize = U8(bytes_per_pixel * 8); // 8, 16, 24, 32 bits per pixel
  612. mAttributeBits = (4 == bytes_per_pixel) ? 8 : 0; // 4 bits: number of attribute bits (alpha) per pixel
  613. mOriginRightBit = 0; // 1 bit: origin, 0 = left, 1 = right
  614. mOriginTopBit = 0; // 1 bit: origin, 0 = bottom, 1 = top
  615. mInterleave = 0; // 2 bits: interleaved flag, 0 = none, 1 = interleaved 2, 2 = interleaved 4
  616. const S32 TGA_HEADER_SIZE = 18;
  617. const S32 COLOR_MAP_SIZE = 0;
  618. mDataOffset = TGA_HEADER_SIZE + mIDLength + COLOR_MAP_SIZE; // Offset from start of data to the actual header.
  619. S32 pixels = getWidth() * getHeight();
  620. S32 datasize = mDataOffset + bytes_per_pixel * pixels;
  621. U8* dst = allocateData(datasize);
  622. // Write header
  623. *(dst++) = mIDLength;
  624. *(dst++) = mColorMapType;
  625. *(dst++) = mImageType;
  626. *(dst++) = mColorMapIndexLo;
  627. *(dst++) = mColorMapIndexHi;
  628. *(dst++) = mColorMapLengthLo;
  629. *(dst++) = mColorMapLengthHi;
  630. *(dst++) = mColorMapDepth;
  631. *(dst++) = mXOffsetLo;
  632. *(dst++) = mXOffsetHi;
  633. *(dst++) = mYOffsetLo;
  634. *(dst++) = mYOffsetHi;
  635. *(dst++) = mWidthLo;
  636. *(dst++) = mWidthHi;
  637. *(dst++) = mHeightLo;
  638. *(dst++) = mHeightHi;
  639. *(dst++) = mPixelSize;
  640. *(dst++) =
  641. ((mInterleave & 3) << 5) |
  642. ((mOriginTopBit & 1) << 4) |
  643. ((mOriginRightBit & 1) << 3) |
  644. ((mAttributeBits & 0xF) << 0);
  645. // Write pixels
  646. const U8* src = raw_image->getData();
  647. llassert( dst == getData() + mDataOffset );
  648. S32 i = 0;
  649. S32 j = 0;
  650. switch( getComponents() )
  651. {
  652. case 1:
  653. memcpy( dst, src, bytes_per_pixel * pixels ); /* Flawfinder: ignore */
  654. break;
  655. case 2:
  656. while( pixels-- )
  657. {
  658. dst[i + 0] = src[j + 0]; // intensity
  659. dst[i + 1] = src[j + 0]; // intensity
  660. dst[i + 2] = src[j + 0]; // intensity
  661. dst[i + 3] = src[j + 1]; // alpha
  662. i += 4;
  663. j += 2;
  664. }
  665. break;
  666. case 3:
  667. while( pixels-- )
  668. {
  669. dst[i + 0] = src[i + 2]; // blue
  670. dst[i + 1] = src[i + 1]; // green
  671. dst[i + 2] = src[i + 0]; // red
  672. i += 3;
  673. }
  674. break;
  675. case 4:
  676. while( pixels-- )
  677. {
  678. dst[i + 0] = src[i + 2]; // blue
  679. dst[i + 1] = src[i + 1]; // green
  680. dst[i + 2] = src[i + 0]; // red
  681. dst[i + 3] = src[i + 3]; // alpha
  682. i += 4;
  683. }
  684. break;
  685. }
  686. return TRUE;
  687. }
  688. BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque )
  689. {
  690. llassert( getComponents() == 4 );
  691. alpha_opaque = TRUE;
  692. U8* dst = raw_image->getData();
  693. U32* dst_pixels = (U32*) dst;
  694. U8* src = getData() + mDataOffset;
  695. U8* last_src = src + getDataSize();
  696. U32 rgba;
  697. U8* rgba_byte_p = (U8*) &rgba;
  698. U32* last_dst_pixel = dst_pixels + getHeight() * getWidth() - 1;
  699. while( dst_pixels <= last_dst_pixel )
  700. {
  701. // Read RLE block header
  702. if (src >= last_src)
  703. return FALSE;
  704. U8 block_header_byte = *src;
  705. src++;
  706. U32 block_pixel_count = (block_header_byte & 0x7F) + 1;
  707. if( block_header_byte & 0x80 )
  708. {
  709. // Encoded (duplicate-pixel) block
  710. if (src + 3 >= last_src)
  711. return FALSE;
  712. rgba_byte_p[0] = src[2];
  713. rgba_byte_p[1] = src[1];
  714. rgba_byte_p[2] = src[0];
  715. rgba_byte_p[3] = src[3];
  716. if (rgba_byte_p[3] != 255)
  717. {
  718. alpha_opaque = FALSE;
  719. }
  720. src += 4;
  721. register U32 value = rgba;
  722. do
  723. {
  724. *dst_pixels = value;
  725. dst_pixels++;
  726. block_pixel_count--;
  727. }
  728. while( block_pixel_count > 0 );
  729. }
  730. else 
  731. {
  732. // Unencoded block
  733. do
  734. {
  735. if (src + 3 >= last_src)
  736. return FALSE;
  737. ((U8*)dst_pixels)[0] = src[2];
  738. ((U8*)dst_pixels)[1] = src[1];
  739. ((U8*)dst_pixels)[2] = src[0];
  740. ((U8*)dst_pixels)[3] = src[3];
  741. if (src[3] != 255)
  742. {
  743. alpha_opaque = FALSE;
  744. }
  745. src += 4;
  746. dst_pixels++;
  747. block_pixel_count--;
  748. }
  749. while( block_pixel_count > 0 );
  750. }
  751. }
  752. return TRUE; 
  753. }
  754. BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
  755. {
  756. llassert( getComponents() == 3 );
  757. llassert( mIs15Bit );
  758. U8* dst = raw_image->getData();
  759. U8* src = getData() + mDataOffset;
  760. U8* last_src = src + getDataSize();
  761. U8* last_dst = dst + getComponents() * (getHeight() * getWidth() - 1);
  762. while( dst <= last_dst )
  763. {
  764. // Read RLE block header
  765. if (src >= last_src)
  766. return FALSE;
  767. U8 block_header_byte = *src;
  768. src++;
  769. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  770. if( block_header_byte & 0x80 )
  771. {
  772. // Encoded (duplicate-pixel) block
  773. do
  774. {
  775. if (src + 2 >= last_src)
  776. return FALSE;
  777. decodeTruecolorPixel15( dst, src );   // slow
  778. dst += 3;
  779. block_pixel_count--;
  780. }
  781. while( block_pixel_count > 0 );
  782. src += 2;
  783. }
  784. else 
  785. {
  786. // Unencoded block
  787. do
  788. {
  789. if (src + 2 >= last_src)
  790. return FALSE;
  791. decodeTruecolorPixel15( dst, src );
  792. dst += 3;
  793. src += 2;
  794. block_pixel_count--;
  795. }
  796. while( block_pixel_count > 0 );
  797. }
  798. }
  799. return TRUE;
  800. }
  801. BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
  802. {
  803. llassert( getComponents() == 3 );
  804. U8* dst = raw_image->getData();
  805. U8* src = getData() + mDataOffset;
  806. U8* last_src = src + getDataSize();
  807. U8* last_dst = dst + getComponents() * (getHeight() * getWidth() - 1);
  808. while( dst <= last_dst )
  809. {
  810. // Read RLE block header
  811. if (src >= last_src)
  812. return FALSE;
  813. U8 block_header_byte = *src;
  814. src++;
  815. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  816. if( block_header_byte & 0x80 )
  817. {
  818. // Encoded (duplicate-pixel) block
  819. do
  820. {
  821. if (src + 2 >= last_src)
  822. return FALSE;
  823. dst[0] = src[2];
  824. dst[1] = src[1];
  825. dst[2] = src[0];
  826. dst += 3;
  827. block_pixel_count--;
  828. }
  829. while( block_pixel_count > 0 );
  830. src += 3;
  831. }
  832. else 
  833. {
  834. // Unencoded block
  835. do
  836. {
  837. if (src + 2 >= last_src)
  838. return FALSE;
  839. dst[0] = src[2];
  840. dst[1] = src[1];
  841. dst[2] = src[0];
  842. dst += 3;
  843. src += 3;
  844. block_pixel_count--;
  845. }
  846. while( block_pixel_count > 0 );
  847. }
  848. }
  849. return TRUE;
  850. }
  851. BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
  852. {
  853. llassert( getComponents() == 1 );
  854. U8* dst = raw_image->getData();
  855. U8* src = getData() + mDataOffset;
  856. U8* last_src = src + getDataSize();
  857. U8* last_dst = dst + getHeight() * getWidth() - 1;
  858. while( dst <= last_dst )
  859. {
  860. // Read RLE block header
  861. if (src >= last_src)
  862. return FALSE;
  863. U8 block_header_byte = *src;
  864. src++;
  865. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  866. if( block_header_byte & 0x80 )
  867. {
  868. if (src >= last_src)
  869. return FALSE;
  870. // Encoded (duplicate-pixel) block
  871. memset( dst, *src, block_pixel_count );
  872. dst += block_pixel_count;
  873. src++;
  874. }
  875. else 
  876. {
  877. // Unencoded block
  878. do
  879. {
  880. if (src >= last_src)
  881. return FALSE;
  882. *dst = *src;
  883. dst++;
  884. src++;
  885. block_pixel_count--;
  886. }
  887. while( block_pixel_count > 0 );
  888. }
  889. }
  890. return TRUE;
  891. }
  892. // Decoded and process the image for use in avatar gradient masks.
  893. // Processing happens during the decode for speed.
  894. BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight )
  895. {
  896. llassert_always(raw_image);
  897. // "Domain" isn't really the right word.  It refers to the width of the 
  898. // ramp portion of the function that relates input and output pixel values.
  899. // A domain of 0 gives a step function.
  900. // 
  901. //   |                      /----------------
  902. //  O|                     / |
  903. //  u|                    /  |
  904. //  t|                   /   |
  905. // p|------------------/    |
  906. //  u|                  |    | 
  907. //  t|<---------------->|<-->|
  908. //  |  "offset"         "domain"
  909. //   |
  910. // --+---Input--------------------------------
  911. //   |
  912. if (!getData() || (0 == getDataSize()))
  913. {
  914. setLastError("LLImageTGA trying to decode an image with no data!");
  915. return FALSE;
  916. }
  917. // Only works for unflipped monochrome RLE images
  918. if( (getComponents() != 1) || (mImageType != 11) || mOriginTopBit || mOriginRightBit ) 
  919. {
  920. llerrs << "LLImageTGA trying to alpha-gradient process an image that's not a standard RLE, one component image" << llendl;
  921. return FALSE;
  922. }
  923. raw_image->resize(getWidth(), getHeight(), getComponents());
  924. U8* dst = raw_image->getData();
  925. U8* src = getData() + mDataOffset;
  926. U8* last_dst = dst + getHeight() * getWidth() - 1;
  927. if( domain > 0 )
  928. {
  929. // Process using a look-up table (lut)
  930. const S32 LUT_LEN = 256;
  931. U8 lut[LUT_LEN];
  932. S32 i;
  933. F32 scale = 1.f / domain;
  934. F32 offset = (1.f - domain) * llclampf( 1.f - weight );
  935. F32 bias = -(scale * offset);
  936. for( i = 0; i < LUT_LEN; i++ )
  937. {
  938. lut[i] = (U8)llclampb( 255.f * ( i/255.f * scale + bias ) );
  939. }
  940. while( dst <= last_dst )
  941. {
  942. // Read RLE block header
  943. U8 block_header_byte = *src;
  944. src++;
  945. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  946. if( block_header_byte & 0x80 )
  947. {
  948. // Encoded (duplicate-pixel) block
  949. memset( dst, lut[ *src ], block_pixel_count );
  950. dst += block_pixel_count;
  951. src++;
  952. }
  953. else 
  954. {
  955. // Unencoded block
  956. do
  957. {
  958. *dst = lut[ *src ];
  959. dst++;
  960. src++;
  961. block_pixel_count--;
  962. }
  963. while( block_pixel_count > 0 );
  964. }
  965. }
  966. }
  967. else
  968. {
  969. // Process using a simple comparison agains a threshold
  970. const U8 threshold = (U8)(0xFF * llclampf( 1.f - weight ));
  971. while( dst <= last_dst )
  972. {
  973. // Read RLE block header
  974. U8 block_header_byte = *src;
  975. src++;
  976. U8 block_pixel_count = (block_header_byte & 0x7F) + 1;
  977. if( block_header_byte & 0x80 )
  978. {
  979. // Encoded (duplicate-pixel) block
  980. memset( dst, ((*src >= threshold) ? 0xFF : 0), block_pixel_count );
  981. dst += block_pixel_count;
  982. src++;
  983. }
  984. else 
  985. {
  986. // Unencoded block
  987. do
  988. {
  989. *dst = (*src >= threshold) ? 0xFF : 0;
  990. dst++;
  991. src++;
  992. block_pixel_count--;
  993. }
  994. while( block_pixel_count > 0 );
  995. }
  996. }
  997. }
  998. return TRUE;
  999. }
  1000. // Reads a .tga file and creates an LLImageTGA with its data.
  1001. bool LLImageTGA::loadFile( const std::string& path )
  1002. {
  1003. S32 len = path.size();
  1004. if( len < 5 )
  1005. {
  1006. return false;
  1007. }
  1008. std::string extension = gDirUtilp->getExtension(path);
  1009. if( "tga" != extension )
  1010. {
  1011. return false;
  1012. }
  1013. LLFILE* file = LLFile::fopen(path, "rb"); /* Flawfinder: ignore */
  1014. if( !file )
  1015. {
  1016. llwarns << "Couldn't open file " << path << llendl;
  1017. return false;
  1018. }
  1019. S32 file_size = 0;
  1020. if (!fseek(file, 0, SEEK_END))
  1021. {
  1022. file_size = ftell(file);
  1023. fseek(file, 0, SEEK_SET);
  1024. }
  1025. U8* buffer = allocateData(file_size);
  1026. S32 bytes_read = fread(buffer, 1, file_size, file);
  1027. if( bytes_read != file_size )
  1028. {
  1029. deleteData();
  1030. llwarns << "Couldn't read file " << path << llendl;
  1031. return false;
  1032. }
  1033. fclose( file );
  1034. if( !updateData() )
  1035. {
  1036. llwarns << "Couldn't decode file " << path << llendl;
  1037. deleteData();
  1038. return false;
  1039. }
  1040. return true;
  1041. }