mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-30 11:19:51 +02:00
Fix potential crash where strings fed into any of the text functions have a trailing '\b'/'\x08'
This commit is contained in:
@@ -439,8 +439,13 @@ int Graphics::textnwidth(char *s, int n)
|
|||||||
break;
|
break;
|
||||||
if(((char)*s)=='\b')
|
if(((char)*s)=='\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
s++;
|
s++;
|
||||||
continue;
|
continue;
|
||||||
|
} else if(*s == '\x0F') {
|
||||||
|
if(!s[1] || !s[2] || !s[3]) break;
|
||||||
|
s+=3;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
n--;
|
n--;
|
||||||
@@ -486,8 +491,14 @@ int Graphics::textwidthx(char *s, int w)
|
|||||||
{
|
{
|
||||||
if((char)*s == '\b')
|
if((char)*s == '\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
s++;
|
s++;
|
||||||
continue;
|
continue;
|
||||||
|
} else if (*s == '\x0F')
|
||||||
|
{
|
||||||
|
if(!s[1] || !s[2] || !s[3]) break;
|
||||||
|
s+=3;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
if (x+(cw/2) >= w)
|
if (x+(cw/2) >= w)
|
||||||
@@ -547,8 +558,14 @@ int Graphics::textwrapheight(char *s, int width)
|
|||||||
}
|
}
|
||||||
else if (*s == '\b')
|
else if (*s == '\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
else if (*s == '\x0F')
|
||||||
|
{
|
||||||
|
if(!s[1] || !s[2] || !s[3]) break;
|
||||||
|
s+=3;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
@@ -581,8 +598,14 @@ void Graphics::textsize(const char * s, int & width, int & height)
|
|||||||
cWidth = 0;
|
cWidth = 0;
|
||||||
cHeight += FONT_H+2;
|
cHeight += FONT_H+2;
|
||||||
}
|
}
|
||||||
|
else if (*s == '\x0F')
|
||||||
|
{
|
||||||
|
if(!s[1] || !s[2] || !s[1]) break;
|
||||||
|
s+=3;
|
||||||
|
}
|
||||||
else if (*s == '\b')
|
else if (*s == '\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -70,6 +70,7 @@ int Graphics::drawtext(int x, int y, const char *s, int r, int g, int b, int a)
|
|||||||
{
|
{
|
||||||
if(!strlen(s))
|
if(!strlen(s))
|
||||||
return 0;
|
return 0;
|
||||||
|
int oR = r, oG = g, oB = b;
|
||||||
int width, height;
|
int width, height;
|
||||||
Graphics::textsize(s, width, height);
|
Graphics::textsize(s, width, height);
|
||||||
VideoBuffer texture(width, height);
|
VideoBuffer texture(width, height);
|
||||||
@@ -82,8 +83,23 @@ int Graphics::drawtext(int x, int y, const char *s, int r, int g, int b, int a)
|
|||||||
characterX = startX;
|
characterX = startX;
|
||||||
characterY += FONT_H+2;
|
characterY += FONT_H+2;
|
||||||
}
|
}
|
||||||
|
else if (*s == '\x0F')
|
||||||
|
{
|
||||||
|
if(!s[1] || !s[2] || !s[3]) break;
|
||||||
|
r = s[1];
|
||||||
|
g = s[2];
|
||||||
|
b = s[3];
|
||||||
|
s += 3;
|
||||||
|
}
|
||||||
|
else if (*s == '\x0E')
|
||||||
|
{
|
||||||
|
r = oR;
|
||||||
|
g = oG;
|
||||||
|
b = oB;
|
||||||
|
}
|
||||||
else if (*s == '\b')
|
else if (*s == '\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
switch (s[1])
|
switch (s[1])
|
||||||
{
|
{
|
||||||
case 'w':
|
case 'w':
|
||||||
|
@@ -6,6 +6,7 @@ int PIXELMETHODS_CLASS::drawtext(int x, int y, const char *s, int r, int g, int
|
|||||||
return 0;
|
return 0;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
|
int oR = r, oG = g, oB = b;
|
||||||
int characterX = x, characterY = y;
|
int characterX = x, characterY = y;
|
||||||
int startX = characterX;
|
int startX = characterX;
|
||||||
for (; *s; s++)
|
for (; *s; s++)
|
||||||
@@ -15,8 +16,23 @@ int PIXELMETHODS_CLASS::drawtext(int x, int y, const char *s, int r, int g, int
|
|||||||
characterX = startX;
|
characterX = startX;
|
||||||
characterY += FONT_H+2;
|
characterY += FONT_H+2;
|
||||||
}
|
}
|
||||||
|
else if (*s == '\x0F')
|
||||||
|
{
|
||||||
|
if(!s[1] || !s[2] || !s[3]) break;
|
||||||
|
r = s[1];
|
||||||
|
g = s[2];
|
||||||
|
b = s[3];
|
||||||
|
s += 3;
|
||||||
|
}
|
||||||
|
else if (*s == '\x0E')
|
||||||
|
{
|
||||||
|
r = oR;
|
||||||
|
g = oG;
|
||||||
|
b = oB;
|
||||||
|
}
|
||||||
else if (*s == '\b')
|
else if (*s == '\b')
|
||||||
{
|
{
|
||||||
|
if(!s[1]) break;
|
||||||
switch (s[1])
|
switch (s[1])
|
||||||
{
|
{
|
||||||
case 'w':
|
case 'w':
|
||||||
|
Reference in New Issue
Block a user