Fixed bug where a bad access would occur when a string was exactly 1
character long and the code relies on CharCount for determining the string length. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1570 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -163,9 +163,12 @@ TextRect (PTEXT lpText, PRECT pRect, PBYTE pdelta)
|
||||
bot_y = 0;
|
||||
width = 0;
|
||||
pStr = lpText->pStr;
|
||||
if (num_chars > 0)
|
||||
{
|
||||
next_ch = getCharFromString (&pStr);
|
||||
if (next_ch == '\0')
|
||||
num_chars = 0;
|
||||
}
|
||||
while (num_chars--)
|
||||
{
|
||||
wchar_t ch;
|
||||
@@ -175,12 +178,15 @@ TextRect (PTEXT lpText, PRECT pRect, PBYTE pdelta)
|
||||
last_width = width;
|
||||
|
||||
ch = next_ch;
|
||||
if (num_chars > 0)
|
||||
{
|
||||
next_ch = getCharFromString (&pStr);
|
||||
if (next_ch == '\0')
|
||||
{
|
||||
lpText->CharCount -= num_chars;
|
||||
num_chars = 0;
|
||||
}
|
||||
}
|
||||
|
||||
charFrame = getCharFrame (FontPtr, ch);
|
||||
if (charFrame != NULL && GetFrameWidth (charFrame))
|
||||
@@ -241,32 +247,38 @@ _text_blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
||||
{
|
||||
FONTPTR FontPtr;
|
||||
|
||||
FontPtr = _CurFontPtr;
|
||||
if (FontPtr != 0)
|
||||
{
|
||||
COUNT num_chars;
|
||||
wchar_t next_ch;
|
||||
const unsigned char *pStr;
|
||||
TEXTPTR TextPtr;
|
||||
PRIMITIVE locPrim;
|
||||
TFB_Palette color;
|
||||
DWORD c32k;
|
||||
|
||||
FontPtr = _CurFontPtr;
|
||||
if (FontPtr == NULL)
|
||||
return;
|
||||
|
||||
if (FontEffect.Use)
|
||||
SetPrimType (&locPrim, STAMP_PRIM);
|
||||
else
|
||||
SetPrimType (&locPrim, STAMPFILL_PRIM);
|
||||
c32k = _get_context_fg_color () >> 8;
|
||||
|
||||
{
|
||||
DWORD c32k = _get_context_fg_color () >> 8;
|
||||
color.r = (UBYTE)((c32k >> (10 - (8 - 5))) & 0xF8);
|
||||
color.g = (UBYTE)((c32k >> (5 - (8 - 5))) & 0xF8);
|
||||
color.b = (UBYTE)((c32k << (8 - 5)) & 0xF8);
|
||||
}
|
||||
|
||||
TextPtr = &PrimPtr->Object.Text;
|
||||
locPrim.Object.Stamp.origin.x = _save_stamp.origin.x;
|
||||
locPrim.Object.Stamp.origin.y = TextPtr->baseline.y;
|
||||
num_chars = TextPtr->CharCount;
|
||||
if (num_chars == 0)
|
||||
return;
|
||||
|
||||
pStr = TextPtr->pStr;
|
||||
|
||||
next_ch = getCharFromString (&pStr);
|
||||
if (next_ch == '\0')
|
||||
num_chars = 0;
|
||||
@@ -275,9 +287,12 @@ _text_blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
||||
wchar_t ch;
|
||||
|
||||
ch = next_ch;
|
||||
if (num_chars > 0)
|
||||
{
|
||||
next_ch = getCharFromString (&pStr);
|
||||
if (next_ch == '\0')
|
||||
num_chars = 0;
|
||||
}
|
||||
|
||||
locPrim.Object.Stamp.frame = getCharFrame (FontPtr, ch);
|
||||
if (locPrim.Object.Stamp.frame != NULL &&
|
||||
@@ -319,7 +334,6 @@ _text_blt (PRECT pClipRect, PRIMITIVEPTR PrimPtr)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline FRAME_DESC *
|
||||
|
||||
Reference in New Issue
Block a user