internal PdfChunk Truncate(float width)
{
if (image != null) {
if (image.ScaledWidth > width) {
// Image does not fit the line, resize if requested
if (image.ScaleToFitLineWhenOverflow) {
float scalePercent = width / image.Width * 100;
image.ScalePercent(scalePercent);
return null;
}
PdfChunk pc = new PdfChunk("", this);
value = "";
attributes.Remove(Chunk.IMAGE);
image = null;
font = PdfFont.DefaultFont;
return pc;
}
else
return null;
}
int currentPosition = 0;
float currentWidth = 0;
// it's no use trying to split if there isn't even enough place for a space
if (width < font.Width()) {
string returnValue = value.Substring(1);
value = value.Substring(0, 1);
PdfChunk pc = new PdfChunk(returnValue, this);
return pc;
}
// loop over all the characters of a string
// or until the totalWidth is reached
int length = value.Length;
bool surrogate = false;
while (currentPosition < length) {
// the width of every character is added to the currentWidth
surrogate = Utilities.IsSurrogatePair(value, currentPosition);
if (surrogate)
currentWidth += GetCharWidth(Utilities.ConvertToUtf32(value, currentPosition));
else
currentWidth += GetCharWidth(value[currentPosition]);
if (currentWidth > width)
break;
if (surrogate)
currentPosition++;
currentPosition++;
}
// if all the characters fit in the total width, null is returned (there is no overflow)
if (currentPosition == length) {
return null;
}
// otherwise, the string has to be truncated
//currentPosition -= 2;
// we have to chop off minimum 1 character from the chunk
if (currentPosition == 0) {
currentPosition = 1;
if (surrogate)
++currentPosition;
}
string retVal = value.Substring(currentPosition);
value = value.Substring(0, currentPosition);
PdfChunk tmp = new PdfChunk(retVal, this);
return tmp;
}