aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMcCabe Maxsted2010-03-05 23:24:28 -0700
committerJacek Antonelli2010-03-11 19:15:18 -0600
commit35639a0a77b76987187dd6fc1568dae4ffc7f5a6 (patch)
treee188eee1bccbe2985d4dbec1c6d5e6145b159f60
parentApplied SaveTextureAsFileExtension patch from Cool Viewer. (diff)
downloadmeta-impy-35639a0a77b76987187dd6fc1568dae4ffc7f5a6.zip
meta-impy-35639a0a77b76987187dd6fc1568dae4ffc7f5a6.tar.gz
meta-impy-35639a0a77b76987187dd6fc1568dae4ffc7f5a6.tar.bz2
meta-impy-35639a0a77b76987187dd6fc1568dae4ffc7f5a6.tar.xz
Applied ImageGLPickMaskCrashFix patch from Cool Viewer.
Fixes a bug in v1.23 that sometimes crashes the viewer when touching (or camming on) an object which is being rezzed. Patch by Henri Beauchamp. (slviewer-0-v12350-ImageGLPickMaskCrashFix.patch)
-rw-r--r--linden/indra/llrender/llimagegl.cpp23
-rw-r--r--linden/indra/llrender/llimagegl.h1
2 files changed, 18 insertions, 6 deletions
diff --git a/linden/indra/llrender/llimagegl.cpp b/linden/indra/llrender/llimagegl.cpp
index 544eb80..2a8fe01 100644
--- a/linden/indra/llrender/llimagegl.cpp
+++ b/linden/indra/llrender/llimagegl.cpp
@@ -369,6 +369,7 @@ LLImageGL::~LLImageGL()
369 sImageList.erase(this); 369 sImageList.erase(this);
370 delete [] mPickMask; 370 delete [] mPickMask;
371 mPickMask = NULL; 371 mPickMask = NULL;
372 mPickMaskSize = 0;
372 sCount--; 373 sCount--;
373} 374}
374 375
@@ -379,6 +380,7 @@ void LLImageGL::init(BOOL usemipmaps)
379#endif 380#endif
380 381
381 mPickMask = NULL; 382 mPickMask = NULL;
383 mPickMaskSize = 0;
382 mTextureState = NO_DELETE ; 384 mTextureState = NO_DELETE ;
383 mTextureMemory = 0; 385 mTextureMemory = 0;
384 mLastBindTime = 0.f; 386 mLastBindTime = 0.f;
@@ -1567,20 +1569,21 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
1567 //cannot generate a pick mask for this texture 1569 //cannot generate a pick mask for this texture
1568 delete [] mPickMask; 1570 delete [] mPickMask;
1569 mPickMask = NULL; 1571 mPickMask = NULL;
1572 mPickMaskSize = 0;
1570 return; 1573 return;
1571 } 1574 }
1572 1575
1573 U32 pick_width = width/2; 1576 U32 pick_width = width/2;
1574 U32 pick_height = height/2; 1577 U32 pick_height = height/2;
1575 1578
1576 U32 size = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1); 1579 mPickMaskSize = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1);
1577 1580
1578 size = size/8 + 1; 1581 mPickMaskSize = mPickMaskSize/8 + 1;
1579 1582
1580 delete[] mPickMask; 1583 delete[] mPickMask;
1581 mPickMask = new U8[size]; 1584 mPickMask = new U8[mPickMaskSize];
1582 1585
1583 memset(mPickMask, 0, sizeof(U8) * size); 1586 memset(mPickMask, 0, sizeof(U8) * mPickMaskSize);
1584 1587
1585 U32 pick_bit = 0; 1588 U32 pick_bit = 0;
1586 1589
@@ -1594,7 +1597,7 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
1594 { 1597 {
1595 U32 pick_idx = pick_bit/8; 1598 U32 pick_idx = pick_bit/8;
1596 U32 pick_offset = pick_bit%8; 1599 U32 pick_offset = pick_bit%8;
1597 if (pick_idx >= size) 1600 if (pick_idx >= mPickMaskSize)
1598 { 1601 {
1599 llerrs << "WTF?" << llendl; 1602 llerrs << "WTF?" << llendl;
1600 } 1603 }
@@ -1631,7 +1634,15 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
1631 S32 idx = y*width+x; 1634 S32 idx = y*width+x;
1632 S32 offset = idx%8; 1635 S32 offset = idx%8;
1633 1636
1634 res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE; 1637 if (idx / 8 < (S32)mPickMaskSize)
1638 {
1639 res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE;
1640 }
1641 else
1642 {
1643 llwarns << "Index out of range for mPickMask !" << llendl;
1644 return FALSE;
1645 }
1635 } 1646 }
1636 1647
1637 return res; 1648 return res;
diff --git a/linden/indra/llrender/llimagegl.h b/linden/indra/llrender/llimagegl.h
index c8df101..c7114c3 100644
--- a/linden/indra/llrender/llimagegl.h
+++ b/linden/indra/llrender/llimagegl.h
@@ -190,6 +190,7 @@ public:
190private: 190private:
191 LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL 191 LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL
192 U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel 192 U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel
193 U32 mPickMaskSize;
193 S8 mUseMipMaps; 194 S8 mUseMipMaps;
194 S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents) 195 S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents)
195 S8 mAutoGenMips; 196 S8 mAutoGenMips;