Prevent duplicate entries in the line-break array. Bug 404204, b+r+sr=roc

This commit is contained in:
smontagu@smontagu.org 2007-11-26 00:27:06 -08:00
parent 9c8e59ce28
commit 5e7ee1a7dc
3 changed files with 14 additions and 12 deletions

View File

@ -1322,14 +1322,6 @@ GetFontMetrics(gfxFontGroup* aFontGroup)
return font->GetMetrics();
}
static void
AppendLineBreakOffset(nsTArray<PRUint32>* aArray, PRUint32 aOffset)
{
if (aArray->Length() > 0 && (*aArray)[aArray->Length() - 1] == aOffset)
return;
aArray->AppendElement(aOffset);
}
void
BuildTextRunsScanner::BuildTextRunForFrames(void* aTextBuffer)
{
@ -1532,11 +1524,12 @@ BuildTextRunsScanner::BuildTextRunForFrames(void* aTextBuffer)
gfxSkipCharsIterator iter(skipChars);
nsAutoTArray<PRUint32,50> textBreakPointsAfterTransform;
for (i = 0; i < textBreakPoints.Length(); ++i) {
AppendLineBreakOffset(&textBreakPointsAfterTransform,
nsTextFrameUtils::AppendLineBreakOffset(&textBreakPointsAfterTransform,
iter.ConvertOriginalToSkipped(textBreakPoints[i]));
}
if (mStartOfLine) {
AppendLineBreakOffset(&textBreakPointsAfterTransform, transformedLength);
nsTextFrameUtils::AppendLineBreakOffset(&textBreakPointsAfterTransform,
transformedLength);
}
// Setup factory chain

View File

@ -113,6 +113,15 @@ public:
PRPackedBool* aIncomingWhitespace,
gfxSkipCharsBuilder* aSkipChars,
PRUint32* aAnalysisFlags);
static void
AppendLineBreakOffset(nsTArray<PRUint32>* aArray, PRUint32 aOffset)
{
if (aArray->Length() > 0 && (*aArray)[aArray->Length() - 1] == aOffset)
return;
aArray->AppendElement(aOffset);
}
};
class nsSkipCharsRunIterator {

View File

@ -106,14 +106,14 @@ nsTransformedTextRun::SetLineBreaks(PRUint32 aStart, PRUint32 aLength,
changed = PR_TRUE;
}
if (aLineBreakBefore) {
newBreaks.AppendElement(aStart);
nsTextFrameUtils::AppendLineBreakOffset(&newBreaks, aStart);
}
if (aLineBreakAfter != (i + 1 < mLineBreaks.Length() &&
mLineBreaks[i + 1] == aStart + aLength)) {
changed = PR_TRUE;
}
if (aLineBreakAfter) {
newBreaks.AppendElement(aStart + aLength);
nsTextFrameUtils::AppendLineBreakOffset(&newBreaks, aStart + aLength);
}
for (; i < mLineBreaks.Length(); ++i) {
if (mLineBreaks[i] > aStart + aLength)