 
         // Compute the truncation line.
         truncLineIndex = computeLastAllowedLineIndex(height, lineCountLimit);
-        // add extra line in case we wordwrapped some characters
-        // onto extra lines, but don't go off the end
-        truncLineIndex = Math.min(truncLineIndex + 1, textLines.length - 1);
-                                     
+        
+        // Add extra line in case we wordwrapped some characters
+        // onto extra lines.  If we truncate in the middle of the last word
+        // it may then fit on the line above.
+        var extraLine:Boolean;
+        if (truncLineIndex + 1 < textLines.length)
+        {
+            truncLineIndex++;
+            extraLine = true;
+        }
+                                             
         if (truncLineIndex >= 0)
         {
             // Estimate the initial truncation position using the following 

        while (charPosition < line.textBlockBeginIndex + line.rawTextLength)
        {
            var atomIndex:int = line.getAtomIndexAtCharIndex(charPosition);
            var atomBounds:Rectangle = line.getAtomBounds(atomIndex); 
            consumedWidth += atomBounds.width;
            if (consumedWidth > allowedWidth)
                break;
                
            charPosition = line.getAtomTextBlockEndIndex(atomIndex);
        }
        

                // 4. Get the initial truncation position on the target 
                // line given this allowed width. 
                var truncateAtCharPosition:int = getTruncationPosition(
                    TextLine(textLines[truncLineIndex]), allowedWidth, extraLine);

                // The following loop executes repeatedly composing text until 
                // it fits.  In each iteration, an atoms's worth of characters 
