mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-30 03:09:53 +02:00
Better text wrapping
This commit is contained in:
135
src/graphics.c
135
src/graphics.c
@@ -855,49 +855,65 @@ int drawtextwrap(pixel *vid, int x, int y, int w, const char *s, int r, int g, i
|
|||||||
int rh = 12;
|
int rh = 12;
|
||||||
int rw = 0;
|
int rw = 0;
|
||||||
int cw = x;
|
int cw = x;
|
||||||
for (; *s; s++)
|
int wordlen;
|
||||||
|
int charspace;
|
||||||
|
while (*s)
|
||||||
{
|
{
|
||||||
if (*s == '\n')
|
wordlen = strcspn(s," .,!?\n");
|
||||||
|
charspace = textwidthx(s, w-(x-cw));
|
||||||
|
if (charspace<wordlen && wordlen && w-(x-cw)<w/3)
|
||||||
{
|
{
|
||||||
x = sx;
|
x = sx;
|
||||||
rw = 0;
|
rw = 0;
|
||||||
y += FONT_H+2;
|
y+=FONT_H+2;
|
||||||
|
rh+=FONT_H+2;
|
||||||
}
|
}
|
||||||
else if (*s == '\b')
|
for (; *s && --wordlen>=-1; s++)
|
||||||
{
|
{
|
||||||
switch (s[1])
|
if (*s == '\n')
|
||||||
{
|
{
|
||||||
case 'w':
|
|
||||||
r = g = b = 255;
|
|
||||||
break;
|
|
||||||
case 'g':
|
|
||||||
r = g = b = 192;
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
r = 255;
|
|
||||||
g = 216;
|
|
||||||
b = 32;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
r = 255;
|
|
||||||
g = b = 0;
|
|
||||||
break;
|
|
||||||
case 'b':
|
|
||||||
r = g = 0;
|
|
||||||
b = 255;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (x-cw>=w) {
|
|
||||||
x = sx;
|
x = sx;
|
||||||
rw = 0;
|
rw = 0;
|
||||||
y+=FONT_H+2;
|
y += FONT_H+2;
|
||||||
rh+=FONT_H+2;
|
}
|
||||||
|
else if (*s == '\b')
|
||||||
|
{
|
||||||
|
switch (s[1])
|
||||||
|
{
|
||||||
|
case 'w':
|
||||||
|
r = g = b = 255;
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
r = g = b = 192;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
r = 255;
|
||||||
|
g = 216;
|
||||||
|
b = 32;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
r = 255;
|
||||||
|
g = b = 0;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
r = g = 0;
|
||||||
|
b = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (x-cw>=w)
|
||||||
|
{
|
||||||
|
x = sx;
|
||||||
|
rw = 0;
|
||||||
|
y+=FONT_H+2;
|
||||||
|
rh+=FONT_H+2;
|
||||||
|
}
|
||||||
|
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
||||||
}
|
}
|
||||||
x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1009,18 +1025,29 @@ void textnpos(char *s, int n, int w, int *cx, int *cy)
|
|||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
//TODO: Implement Textnheight for wrapped text
|
int wordlen, charspace;
|
||||||
for (; *s; s++)
|
while (*s&&n)
|
||||||
{
|
{
|
||||||
if (!n) {
|
wordlen = strcspn(s," .,!?\n");
|
||||||
break;
|
charspace = textwidthx(s, w-x);
|
||||||
}
|
if (charspace<wordlen && wordlen && w-x<w/3)
|
||||||
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
{
|
||||||
if (x>=w) {
|
|
||||||
x = 0;
|
x = 0;
|
||||||
y += FONT_H+2;
|
y += FONT_H+2;
|
||||||
}
|
}
|
||||||
n--;
|
for (; *s && --wordlen>=-1; s++)
|
||||||
|
{
|
||||||
|
if (!n) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x += font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
|
if (x>=w)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
y += FONT_H+2;
|
||||||
|
}
|
||||||
|
n--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*cx = x-1;
|
*cx = x-1;
|
||||||
*cy = y;
|
*cy = y;
|
||||||
@@ -1041,18 +1068,28 @@ int textwidthx(char *s, int w)
|
|||||||
}
|
}
|
||||||
int textposxy(char *s, int width, int w, int h)
|
int textposxy(char *s, int width, int w, int h)
|
||||||
{
|
{
|
||||||
int x=0,y=0,n=0,cw;
|
int x=0,y=0,n=0,cw, wordlen, charspace;
|
||||||
for (; *s; s++)
|
while (*s)
|
||||||
{
|
{
|
||||||
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
wordlen = strcspn(s," .,!?\n");
|
||||||
if (x+(cw/2) >= w && y+6 >= h)
|
charspace = textwidthx(s, width-x);
|
||||||
break;
|
if (charspace<wordlen && wordlen && width-x<width/3)
|
||||||
x += cw;
|
{
|
||||||
if (x>=width) {
|
|
||||||
x = 0;
|
x = 0;
|
||||||
y += FONT_H+2;
|
y += FONT_H+2;
|
||||||
}
|
}
|
||||||
n++;
|
for (; *s && --wordlen>=-1; s++)
|
||||||
|
{
|
||||||
|
cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]];
|
||||||
|
if ((x+(cw/2) >= w && y+6 >= h)||(y+6 >= h+FONT_H+2))
|
||||||
|
return n++;
|
||||||
|
x += cw;
|
||||||
|
if (x>=width) {
|
||||||
|
x = 0;
|
||||||
|
y += FONT_H+2;
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user