diff options
| -rw-r--r-- | indra/llimage/llimage.cpp | 11 | ||||
| -rw-r--r-- | indra/llimage/llimage.h | 4 | ||||
| -rw-r--r-- | indra/newview/lltexturecache.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.cpp | 13 | 
4 files changed, 29 insertions, 7 deletions
| diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index a88ac148ef..3f8d1baddd 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -666,8 +666,17 @@ void LLImageRaw::fill( const LLColor4U& color )  	}  } +LLPointer<LLImageRaw> LLImageRaw::duplicate() +{ +	if(getNumRefs() < 2) +	{ +		return this; //nobody else refences to this image, no need to duplicate. +	} - +	//make a duplicate +	LLPointer<LLImageRaw> dup = new LLImageRaw(getData(), getWidth(), getHeight(), getComponents()); +	return dup;  +}  // Src and dst can be any size.  Src and dst can each have 3 or 4 components.  void LLImageRaw::copy(LLImageRaw* src) diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 6cb1226da0..1d56411ae8 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -30,6 +30,7 @@  #include "lluuid.h"  #include "llstring.h"  #include "llthread.h" +#include "llpointer.h"  const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2  const S32 MAX_IMAGE_MIP = 11; // 2048x2048 @@ -214,6 +215,9 @@ public:  	// Copy operations +	//duplicate this raw image if refCount > 1. +	LLPointer<LLImageRaw> duplicate(); +  	// Src and dst can be any size.  Src and dst can each have 3 or 4 components.  	void copy( LLImageRaw* src ); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 305f6fca0f..102b97de30 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1912,10 +1912,10 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis  		h >>= i;  		if(w * h *c > 0) //valid  		{ -			LLPointer<LLImageRaw> newraw = new LLImageRaw(raw->getData(), raw->getWidth(), raw->getHeight(), raw->getComponents()); -			newraw->scale(w, h) ; -			raw = newraw; - +			//make a duplicate to keep the original raw image untouched. +			raw = raw->duplicate(); +			raw->scale(w, h) ; +			  			discardlevel += i ;  		}  	} diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 0d7616dc88..634ff1392e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1531,7 +1531,12 @@ void LLViewerFetchedTexture::addToCreateTexture()  							destroyRawImage();  							return ;  						} -						mRawImage->scale(w >> i, h >> i) ;					 + +						{ +							//make a duplicate in case somebody else is using this raw image +							mRawImage = mRawImage->duplicate();  +							mRawImage->scale(w >> i, h >> i) ;					 +						}  					}  				}  			} @@ -2899,7 +2904,11 @@ void LLViewerFetchedTexture::setCachedRawImage()  				--i ;  			} -			mRawImage->scale(w >> i, h >> i) ; +			{ +				//make a duplicate in case somebody else is using this raw image +				mRawImage = mRawImage->duplicate();  +				mRawImage->scale(w >> i, h >> i) ; +			}  		}  		mCachedRawImage = mRawImage ;  		mRawDiscardLevel += i ; | 
