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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lluiimage.cpp
  3.  * @brief UI implementation
  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. // Utilities functions the user interface needs
  33. //#include "llviewerprecompiledheaders.h"
  34. #include "linden_common.h"
  35. // Project includes
  36. #include "lluiimage.h"
  37. #include "llui.h"
  38. LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image)
  39. : mName(name),
  40. mImage(image),
  41. mScaleRegion(0.f, 1.f, 1.f, 0.f),
  42. mClipRegion(0.f, 1.f, 1.f, 0.f),
  43. mUniformScaling(TRUE),
  44. mNoClip(TRUE),
  45. mImageLoaded(NULL)
  46. {
  47. }
  48. LLUIImage::~LLUIImage()
  49. {
  50. delete mImageLoaded;
  51. }
  52. void LLUIImage::setClipRegion(const LLRectf& region) 
  53. mClipRegion = region; 
  54. mNoClip = mClipRegion.mLeft == 0.f
  55. && mClipRegion.mRight == 1.f
  56. && mClipRegion.mBottom == 0.f
  57. && mClipRegion.mTop == 1.f;
  58. }
  59. void LLUIImage::setScaleRegion(const LLRectf& region) 
  60. mScaleRegion = region; 
  61. mUniformScaling = mScaleRegion.mLeft == 0.f
  62. && mScaleRegion.mRight == 1.f
  63. && mScaleRegion.mBottom == 0.f
  64. && mScaleRegion.mTop == 1.f;
  65. }
  66. //TODO: move drawing implementation inside class
  67. void LLUIImage::draw(S32 x, S32 y, const LLColor4& color) const
  68. {
  69. gl_draw_scaled_image(x, y, getWidth(), getHeight(), mImage, color, mClipRegion);
  70. }
  71. void LLUIImage::draw(S32 x, S32 y, S32 width, S32 height, const LLColor4& color) const
  72. {
  73. if (mUniformScaling)
  74. {
  75. gl_draw_scaled_image(x, y, width, height, mImage, color, mClipRegion);
  76. }
  77. else
  78. {
  79. gl_draw_scaled_image_with_border(
  80. x, y, 
  81. width, height, 
  82. mImage, 
  83. color,
  84. FALSE,
  85. mClipRegion,
  86. mScaleRegion);
  87. }
  88. }
  89. void LLUIImage::drawSolid(S32 x, S32 y, S32 width, S32 height, const LLColor4& color) const
  90. {
  91. gl_draw_scaled_image_with_border(
  92. x, y, 
  93. width, height, 
  94. mImage, 
  95. color, 
  96. TRUE,
  97. mClipRegion,
  98. mScaleRegion);
  99. }
  100. void LLUIImage::drawBorder(S32 x, S32 y, S32 width, S32 height, const LLColor4& color, S32 border_width) const
  101. {
  102. LLRect border_rect;
  103. border_rect.setOriginAndSize(x, y, width, height);
  104. border_rect.stretch(border_width, border_width);
  105. drawSolid(border_rect, color);
  106. }
  107. S32 LLUIImage::getWidth() const
  108. // return clipped dimensions of actual image area
  109. return llround((F32)mImage->getWidth(0) * mClipRegion.getWidth()); 
  110. }
  111. S32 LLUIImage::getHeight() const
  112. // return clipped dimensions of actual image area
  113. return llround((F32)mImage->getHeight(0) * mClipRegion.getHeight()); 
  114. }
  115. S32 LLUIImage::getTextureWidth() const
  116. {
  117. return mImage->getWidth(0);
  118. }
  119. S32 LLUIImage::getTextureHeight() const
  120. {
  121. return mImage->getHeight(0);
  122. }
  123. boost::signals2::connection LLUIImage::addLoadedCallback( const image_loaded_signal_t::slot_type& cb ) 
  124. {
  125. if (!mImageLoaded) 
  126. {
  127. mImageLoaded = new image_loaded_signal_t();
  128. }
  129. return mImageLoaded->connect(cb);
  130. }
  131. void LLUIImage::onImageLoaded()
  132. {
  133. if (mImageLoaded)
  134. {
  135. (*mImageLoaded)();
  136. }
  137. }
  138. namespace LLInitParam
  139. {
  140. void TypedParam<LLUIImage*>::setValueFromBlock() const
  141. {
  142. // The keyword "none" is specifically requesting a null image
  143. // do not default to current value. Used to overwrite template images. 
  144. if (name() == "none")
  145. {
  146. mData.mValue = NULL;
  147. return;
  148. }
  149. LLUIImage* imagep =  LLUI::getUIImage(name());
  150. if (imagep)
  151. {
  152. mData.mValue = imagep;
  153. }
  154. }
  155. void TypedParam<LLUIImage*>::setBlockFromValue()
  156. {
  157. if (mData.mValue == NULL)
  158. {
  159. name.set("none", false);
  160. }
  161. else
  162. {
  163. name.set(mData.mValue->getName(), false);
  164. }
  165. }
  166. bool ParamCompare<LLUIImage*, false>::equals(
  167. LLUIImage* const &a,
  168. LLUIImage* const &b)
  169. {
  170. // force all LLUIImages for XML UI export to be "non-default"
  171. if (!a && !b)
  172. return false;
  173. else
  174. return (a == b);
  175. }
  176. }