protected static List<string> BreakLines(List<string> breaks, BaseFont font, float fontSize, float width)
{
List<string> lines = new List<string>();
StringBuilder buf = new StringBuilder();
for (int ck = 0; ck < breaks.Count; ++ck) {
buf.Length = 0;
float w = 0;
char[] cs = breaks[ck].ToCharArray();
int len = cs.Length;
// 0 inline first, 1 inline, 2 spaces
int state = 0;
int lastspace = -1;
char c = (char)0;
int refk = 0;
for (int k = 0; k < len; ++k) {
c = cs[k];
switch (state) {
case 0:
w += font.GetWidthPoint(c, fontSize);
buf.Append(c);
if (w > width) {
w = 0;
if (buf.Length > 1) {
--k;
buf.Length = buf.Length - 1;
}
lines.Add(buf.ToString());
buf.Length = 0;
refk = k;
if (c == ' ')
state = 2;
else
state = 1;
}
else {
if (c != ' ')
state = 1;
}
break;
case 1:
w += font.GetWidthPoint(c, fontSize);
buf.Append(c);
if (c == ' ')
lastspace = k;
if (w > width) {
w = 0;
if (lastspace >= 0) {
k = lastspace;
buf.Length = lastspace - refk;
TrimRight(buf);
lines.Add(buf.ToString());
buf.Length = 0;
refk = k;
lastspace = -1;
state = 2;
}
else {
if (buf.Length > 1) {
--k;
buf.Length = buf.Length - 1;
}
lines.Add(buf.ToString());
buf.Length = 0;
refk = k;
if (c == ' ')
state = 2;
}
}
break;
case 2:
if (c != ' ') {
w = 0;
--k;
state = 1;
}
break;
}
}
TrimRight(buf);
lines.Add(buf.ToString());
}
return lines;
}