Honor inflation during intrinsic width computation when needed. (Bug 706609, patch 6) r=roc

This is the second of two patches to honor inflation during intrinsic
width calculation (which we need to do to make some form controls
inflate correctly).
This commit is contained in:
L. David Baron 2012-01-24 17:21:29 -08:00
parent 5eb8920348
commit 21e38c2e03
2 changed files with 42 additions and 27 deletions

View File

@ -272,10 +272,22 @@ public:
nsOverflowAreas
RecomputeOverflow(const nsHTMLReflowState& aBlockReflowState);
enum TextRunType {
// Anything in reflow (but not intrinsic width calculation) or
// painting should use the inflated text run (i.e., with font size
// inflation applied).
eInflated,
// Intrinsic width calculation should use the non-inflated text run.
// When there is font size inflation, it will be different.
eNotInflated
};
void AddInlineMinWidthForFlow(nsRenderingContext *aRenderingContext,
nsIFrame::InlineMinWidthData *aData);
nsIFrame::InlineMinWidthData *aData,
float aInflation, TextRunType aTextRunType);
void AddInlinePrefWidthForFlow(nsRenderingContext *aRenderingContext,
InlinePrefWidthData *aData);
InlinePrefWidthData *aData,
float aInflation, TextRunType aTextRunType);
/**
* Calculate the horizontal bounds of the grapheme clusters that fit entirely
@ -369,16 +381,6 @@ public:
// boundary.
PRInt32 GetInFlowContentLength();
enum TextRunType {
// Anything in reflow (but not intrinsic width calculation) or
// painting should use the inflated text run (i.e., with font size
// inflation applied).
eInflated,
// Intrinsic width calculation should use the non-inflated text run.
// When there is font size inflation, it will be different.
eNotInflated
};
/**
* Acquires the text run for this content, if necessary.
* @param aRC the rendering context to use as a reference for creating

View File

@ -6569,14 +6569,16 @@ void nsTextFrame::MarkIntrinsicWidthsDirty()
// temporarily override the "current line ending" settings.
void
nsTextFrame::AddInlineMinWidthForFlow(nsRenderingContext *aRenderingContext,
nsIFrame::InlineMinWidthData *aData)
nsIFrame::InlineMinWidthData *aData,
float aInflation,
TextRunType aTextRunType)
{
PRUint32 flowEndInTextRun;
gfxContext* ctx = aRenderingContext->ThebesContext();
gfxSkipCharsIterator iter =
EnsureTextRun(nsTextFrame::eNotInflated, 1.0f, ctx, aData->lineContainer,
EnsureTextRun(aTextRunType, aInflation, ctx, aData->lineContainer,
aData->line, &flowEndInTextRun);
gfxTextRun *textRun = GetTextRun(nsTextFrame::eNotInflated);
gfxTextRun *textRun = GetTextRun(aTextRunType);
if (!textRun)
return;
@ -6598,7 +6600,7 @@ nsTextFrame::AddInlineMinWidthForFlow(nsRenderingContext *aRenderingContext,
tmp.ConvertSkippedToOriginal(flowEndInTextRun)) - iter.GetOriginalOffset();
}
PropertyProvider provider(textRun, textStyle, frag, this,
iter, len, nsnull, 0, nsTextFrame::eNotInflated);
iter, len, nsnull, 0, aTextRunType);
bool collapseWhitespace = !textStyle->WhiteSpaceIsSignificant();
bool preformatNewlines = textStyle->NewlineIsSignificant();
@ -6699,6 +6701,10 @@ nsTextFrame::AddInlineMinWidthForFlow(nsRenderingContext *aRenderingContext,
nsTextFrame::AddInlineMinWidth(nsRenderingContext *aRenderingContext,
nsIFrame::InlineMinWidthData *aData)
{
float inflation =
nsLayoutUtils::FontSizeInflationFor(this, nsLayoutUtils::eInReflow);
TextRunType trtype = (inflation == 1.0f) ? eNotInflated : eInflated;
nsTextFrame* f;
gfxTextRun* lastTextRun = nsnull;
// nsContinuingTextFrame does nothing for AddInlineMinWidth; all text frames
@ -6707,7 +6713,7 @@ nsTextFrame::AddInlineMinWidth(nsRenderingContext *aRenderingContext,
// f->GetTextRun(nsTextFrame::eNotInflated) could be null if we
// haven't set up textruns yet for f. Except in OOM situations,
// lastTextRun will only be null for the first text frame.
if (f == this || f->GetTextRun(nsTextFrame::eNotInflated) != lastTextRun) {
if (f == this || f->GetTextRun(trtype) != lastTextRun) {
nsIFrame* lc;
if (aData->lineContainer &&
aData->lineContainer != (lc = FindLineContainer(f))) {
@ -6718,8 +6724,9 @@ nsTextFrame::AddInlineMinWidth(nsRenderingContext *aRenderingContext,
}
// This will process all the text frames that share the same textrun as f.
f->AddInlineMinWidthForFlow(aRenderingContext, aData);
lastTextRun = f->GetTextRun(nsTextFrame::eNotInflated);
f->AddInlineMinWidthForFlow(aRenderingContext, aData,
inflation, trtype);
lastTextRun = f->GetTextRun(trtype);
}
}
}
@ -6728,14 +6735,16 @@ nsTextFrame::AddInlineMinWidth(nsRenderingContext *aRenderingContext,
// temporarily override the "current line ending" settings.
void
nsTextFrame::AddInlinePrefWidthForFlow(nsRenderingContext *aRenderingContext,
nsIFrame::InlinePrefWidthData *aData)
nsIFrame::InlinePrefWidthData *aData,
float aInflation,
TextRunType aTextRunType)
{
PRUint32 flowEndInTextRun;
gfxContext* ctx = aRenderingContext->ThebesContext();
gfxSkipCharsIterator iter =
EnsureTextRun(nsTextFrame::eNotInflated, 1.0f, ctx, aData->lineContainer,
EnsureTextRun(aTextRunType, aInflation, ctx, aData->lineContainer,
aData->line, &flowEndInTextRun);
gfxTextRun *textRun = GetTextRun(nsTextFrame::eNotInflated);
gfxTextRun *textRun = GetTextRun(aTextRunType);
if (!textRun)
return;
@ -6745,8 +6754,7 @@ nsTextFrame::AddInlinePrefWidthForFlow(nsRenderingContext *aRenderingContext,
const nsStyleText* textStyle = GetStyleText();
const nsTextFragment* frag = mContent->GetText();
PropertyProvider provider(textRun, textStyle, frag, this,
iter, PR_INT32_MAX, nsnull, 0,
nsTextFrame::eNotInflated);
iter, PR_INT32_MAX, nsnull, 0, aTextRunType);
bool collapseWhitespace = !textStyle->WhiteSpaceIsSignificant();
bool preformatNewlines = textStyle->NewlineIsSignificant();
@ -6826,6 +6834,10 @@ nsTextFrame::AddInlinePrefWidthForFlow(nsRenderingContext *aRenderingContext,
nsTextFrame::AddInlinePrefWidth(nsRenderingContext *aRenderingContext,
nsIFrame::InlinePrefWidthData *aData)
{
float inflation =
nsLayoutUtils::FontSizeInflationFor(this, nsLayoutUtils::eInReflow);
TextRunType trtype = (inflation == 1.0f) ? eNotInflated : eInflated;
nsTextFrame* f;
gfxTextRun* lastTextRun = nsnull;
// nsContinuingTextFrame does nothing for AddInlineMinWidth; all text frames
@ -6834,7 +6846,7 @@ nsTextFrame::AddInlinePrefWidth(nsRenderingContext *aRenderingContext,
// f->GetTextRun(nsTextFrame::eNotInflated) could be null if we
// haven't set up textruns yet for f. Except in OOM situations,
// lastTextRun will only be null for the first text frame.
if (f == this || f->GetTextRun(nsTextFrame::eNotInflated) != lastTextRun) {
if (f == this || f->GetTextRun(trtype) != lastTextRun) {
nsIFrame* lc;
if (aData->lineContainer &&
aData->lineContainer != (lc = FindLineContainer(f))) {
@ -6845,8 +6857,9 @@ nsTextFrame::AddInlinePrefWidth(nsRenderingContext *aRenderingContext,
}
// This will process all the text frames that share the same textrun as f.
f->AddInlinePrefWidthForFlow(aRenderingContext, aData);
lastTextRun = f->GetTextRun(nsTextFrame::eNotInflated);
f->AddInlinePrefWidthForFlow(aRenderingContext, aData,
inflation, trtype);
lastTextRun = f->GetTextRun(trtype);
}
}
}