diff options
Diffstat (limited to 'linden/indra')
-rw-r--r-- | linden/indra/llrender/llimagegl.cpp | 23 | ||||
-rw-r--r-- | linden/indra/llrender/llimagegl.h | 1 |
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: | |||
190 | private: | 190 | private: |
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; |