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

游戏引擎

开发平台:

C++ Builder

  1. /*
  2.  * @file llimagepng.cpp
  3.  * @brief LLImageFormatted glue to encode / decode PNG files.
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-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. #include "linden_common.h"
  33. #include "stdtypes.h"
  34. #include "llerror.h"
  35. #include "llimage.h"
  36. #include "llpngwrapper.h"
  37. #include "llimagepng.h"
  38. // ---------------------------------------------------------------------------
  39. // LLImagePNG
  40. // ---------------------------------------------------------------------------
  41. LLImagePNG::LLImagePNG()
  42.     : LLImageFormatted(IMG_CODEC_PNG),
  43.   mTmpWriteBuffer(NULL)
  44. {
  45. }
  46. LLImagePNG::~LLImagePNG()
  47. {
  48. if (mTmpWriteBuffer)
  49. {
  50. delete[] mTmpWriteBuffer;
  51. }
  52. }
  53. // Virtual
  54. // Parse PNG image information and set the appropriate
  55. // width, height and component (channel) information.
  56. BOOL LLImagePNG::updateData()
  57. {
  58.     resetLastError();
  59.     // Check to make sure that this instance has been initialized with data
  60.     if (!getData() || (0 == getDataSize()))
  61.     {
  62.         setLastError("Uninitialized instance of LLImagePNG");
  63.         return FALSE;
  64.     }
  65. // Decode the PNG data and extract sizing information
  66. LLPngWrapper pngWrapper;
  67. LLPngWrapper::ImageInfo infop;
  68. if (! pngWrapper.readPng(getData(), NULL, &infop))
  69. {
  70. setLastError(pngWrapper.getErrorMessage());
  71. return FALSE;
  72. }
  73. setSize(infop.mWidth, infop.mHeight, infop.mComponents);
  74. return TRUE;
  75. }
  76. // Virtual
  77. // Decode an in-memory PNG image into the raw RGB or RGBA format
  78. // used within SecondLife.
  79. BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
  80. {
  81. llassert_always(raw_image);
  82.     resetLastError();
  83.     // Check to make sure that this instance has been initialized with data
  84.     if (!getData() || (0 == getDataSize()))
  85.     {
  86.         setLastError("LLImagePNG trying to decode an image with no data!");
  87.         return FALSE;
  88.     }
  89. // Decode the PNG data into the raw image
  90. LLPngWrapper pngWrapper;
  91. if (! pngWrapper.readPng(getData(), raw_image))
  92. {
  93. setLastError(pngWrapper.getErrorMessage());
  94. return FALSE;
  95. }
  96. return TRUE;
  97. }
  98. // Virtual
  99. // Encode the in memory RGB image into PNG format.
  100. BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
  101. {
  102. llassert_always(raw_image);
  103.     resetLastError();
  104. // Image logical size
  105. setSize(raw_image->getWidth(), raw_image->getHeight(), raw_image->getComponents());
  106. // Temporary buffer to hold the encoded image. Note: the final image
  107. // size should be much smaller due to compression.
  108. if (mTmpWriteBuffer)
  109. {
  110. delete[] mTmpWriteBuffer;
  111. }
  112. U32 bufferSize = getWidth() * getHeight() * getComponents() + 1024;
  113.     U8* mTmpWriteBuffer = new U8[ bufferSize ];
  114. // Delegate actual encoding work to wrapper
  115. LLPngWrapper pngWrapper;
  116. if (! pngWrapper.writePng(raw_image, mTmpWriteBuffer))
  117. {
  118. setLastError(pngWrapper.getErrorMessage());
  119. return FALSE;
  120. }
  121. // Resize internal buffer and copy from temp
  122. U32 encodedSize = pngWrapper.getFinalSize();
  123. allocateData(encodedSize);
  124. memcpy(getData(), mTmpWriteBuffer, encodedSize);
  125. delete[] mTmpWriteBuffer;
  126. return TRUE;
  127. }