constructBitmapArray Alpha fix
by Jeremiah Fulbright · 11/13/2006 (4:43 pm) · 1 comments
I was doing some GUI Texture changes and kept getting crashes in construction of my bitmap arrays. I finally narrowed it down to variances in the Alpha value in a few places thus causing the routine to detect a difference and not separate the bitmap out.
This is a minor change to just force the Alpha of the color that is returned from getColor to 0.
In guiTypes.cpp - Line 259 or so
Before:
After:
There may be another way to do this, but this was quickest and easiest for us. I would imagine something like this should just be put into Head eventually, unless there is a real reason to differentiate against Alpha when constructing the bitmap array.
This is a minor change to just force the Alpha of the color that is returned from getColor to 0.
In guiTypes.cpp - Line 259 or so
Before:
S32 GuiControlProfile::constructBitmapArray()
{
if(mBitmapArrayRects.size())
return mBitmapArrayRects.size();
GBitmap *bmp = mTextureObject->getBitmap();
//get the separator color
ColorI sepColor;
if ( !bmp || !bmp->getColor( 0, 0, sepColor ) )
{
Con::errorf("Failed to create bitmap array from %s for profile %s - couldn't ascertain seperator color!", mBitmapName, getName());
AssertFatal( false, avar("Failed to create bitmap array from %s for profile %s - couldn't ascertain seperator color!", mBitmapName, getName()));
return 0;
}
//now loop through all the scroll pieces, and find the bounding rectangle for each piece in each state
S32 curY = 0;
// ascertain the height of this row...
ColorI color;
mBitmapArrayRects.clear();
while(curY < bmp->getHeight())
{
// skip any sep colors
bmp->getColor( 0, curY, color);
if(color == sepColor)
{
curY++;
continue;
}
// ok, process left to right, grabbing bitmaps as we go...
S32 curX = 0;
while(curX < bmp->getWidth())
{
bmp->getColor(curX, curY, color);
if(color == sepColor)
{
curX++;
continue;
}
S32 startX = curX;
while(curX < bmp->getWidth())
{
bmp->getColor(curX, curY, color);
if(color == sepColor)
break;
curX++;
}
S32 stepY = curY;
while(stepY < bmp->getHeight())
{
bmp->getColor(startX, stepY, color);
if(color == sepColor)
break;
stepY++;
}
mBitmapArrayRects.push_back(RectI(startX, curY, curX - startX, stepY - curY));
}
// ok, now skip to the next seperation color on column 0
while(curY < bmp->getHeight())
{
bmp->getColor(0, curY, color);
if(color == sepColor)
break;
curY++;
}
}
return mBitmapArrayRects.size();
}After:
S32 GuiControlProfile::constructBitmapArray()
{
if(mBitmapArrayRects.size())
return mBitmapArrayRects.size();
GBitmap *bmp = mTextureObject->getBitmap();
//get the separator color
ColorI sepColor;
if ( !bmp || !bmp->getColor( 0, 0, sepColor ) )
{
Con::errorf("Failed to create bitmap array from %s for profile %s - couldn't ascertain seperator color!", mBitmapName, getName());
AssertFatal( false, avar("Failed to create bitmap array from %s for profile %s - couldn't ascertain seperator color!", mBitmapName, getName()));
return 0;
}
[b]
// Nada. Zilch.. Bye Alpha
sepColor.alpha = 0;
[/b]
//now loop through all the scroll pieces, and find the bounding rectangle for each piece in each state
S32 curY = 0;
// ascertain the height of this row...
ColorI color;
mBitmapArrayRects.clear();
while(curY < bmp->getHeight())
{
// skip any sep colors
bmp->getColor( 0, curY, color);
[b]
// fix Alpha
color.alpha = 0;
[/b]
if(color == sepColor)
{
curY++;
continue;
}
// ok, process left to right, grabbing bitmaps as we go...
S32 curX = 0;
while(curX < bmp->getWidth())
{
bmp->getColor(curX, curY, color);
[b]
// fix Alpha
color.alpha = 0;
[/b]
if(color == sepColor)
{
curX++;
continue;
}
S32 startX = curX;
while(curX < bmp->getWidth())
{
bmp->getColor(curX, curY, color);
[b]
// fix Alpha
color.alpha = 0;
[/b]
if(color == sepColor)
break;
curX++;
}
S32 stepY = curY;
while(stepY < bmp->getHeight())
{
bmp->getColor(startX, stepY, color);
[b]
// fix Alpha
color.alpha = 0;
[/b]
if(color == sepColor)
break;
stepY++;
}
mBitmapArrayRects.push_back(RectI(startX, curY, curX - startX, stepY - curY));
}
// ok, now skip to the next seperation color on column 0
while(curY < bmp->getHeight())
{
bmp->getColor(0, curY, color);
[b]
// fix Alpha
color.alpha = 0;
[/b]
if(color == sepColor)
break;
curY++;
}
}
return mBitmapArrayRects.size();
}There may be another way to do this, but this was quickest and easiest for us. I would imagine something like this should just be put into Head eventually, unless there is a real reason to differentiate against Alpha when constructing the bitmap array.

Torque Owner Pauliver
OMG OMG OMG