Bug 1224230 - Explicitly store the lineContainer's writing mode in InlineIntrinsicISizeData. r=dbaron

This commit is contained in:
Jonathan Kew 2015-11-14 08:46:11 +00:00
parent 02699453d1
commit 6382809727
6 changed files with 45 additions and 26 deletions

View File

@ -728,7 +728,7 @@ nsBlockFrame::GetMinISize(nsRenderingContext *aRenderingContext)
// XXX Bug NNNNNN Should probably handle percentage text-indent.
data.line = &line;
data.lineContainer = curFrame;
data.SetLineContainer(curFrame);
nsIFrame *kid = line->mFirstChild;
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
++i, kid = kid->GetNextSibling()) {
@ -813,7 +813,7 @@ nsBlockFrame::GetPrefISize(nsRenderingContext *aRenderingContext)
// XXX Bug NNNNNN Should probably handle percentage text-indent.
data.line = &line;
data.lineContainer = curFrame;
data.SetLineContainer(curFrame);
nsIFrame *kid = line->mFirstChild;
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
++i, kid = kid->GetNextSibling()) {
@ -887,7 +887,7 @@ nsBlockFrame::GetPrefWidthTightBounds(nsRenderingContext* aRenderingContext,
// XXX Bug NNNNNN Should probably handle percentage text-indent.
data.line = &line;
data.lineContainer = curFrame;
data.SetLineContainer(curFrame);
nsIFrame *kid = line->mFirstChild;
for (int32_t i = 0, i_end = line->GetChildCount(); i != i_end;
++i, kid = kid->GetNextSibling()) {

View File

@ -850,7 +850,7 @@ nsContainerFrame::DoInlineIntrinsicISize(nsRenderingContext *aRenderingContext,
}
const nsLineList_iterator* savedLine = aData->line;
nsIFrame* const savedLineContainer = aData->lineContainer;
nsIFrame* const savedLineContainer = aData->LineContainer();
nsContainerFrame *lastInFlow;
for (nsContainerFrame *nif = this; nif;
@ -870,13 +870,13 @@ nsContainerFrame::DoInlineIntrinsicISize(nsRenderingContext *aRenderingContext,
// After we advance to our next-in-flow, the stored line and line container
// may no longer be correct. Just forget them.
aData->line = nullptr;
aData->lineContainer = nullptr;
aData->SetLineContainer(nullptr);
lastInFlow = nif;
}
aData->line = savedLine;
aData->lineContainer = savedLineContainer;
aData->SetLineContainer(savedLineContainer);
// This goes at the end no matter how things are broken and how
// messy the bidi situations are, since per CSS2.1 section 8.6

View File

@ -4115,12 +4115,10 @@ nsIFrame::InlinePrefISizeData::ForceBreak(nsRenderingContext *aRenderingContext)
floats_cur_left = 0,
floats_cur_right = 0;
WritingMode wm = lineContainer->GetWritingMode();
for (uint32_t i = 0, i_end = floats.Length(); i != i_end; ++i) {
const FloatInfo& floatInfo = floats[i];
const nsStyleDisplay *floatDisp = floatInfo.Frame()->StyleDisplay();
uint8_t breakType = floatDisp->PhysicalBreakType(wm);
uint8_t breakType = floatDisp->PhysicalBreakType(lineContainerWM);
if (breakType == NS_STYLE_CLEAR_LEFT ||
breakType == NS_STYLE_CLEAR_RIGHT ||
breakType == NS_STYLE_CLEAR_BOTH) {
@ -4137,7 +4135,7 @@ nsIFrame::InlinePrefISizeData::ForceBreak(nsRenderingContext *aRenderingContext)
}
}
uint8_t floatStyle = floatDisp->PhysicalFloats(wm);
uint8_t floatStyle = floatDisp->PhysicalFloats(lineContainerWM);
nscoord& floats_cur = floatStyle == NS_STYLE_FLOAT_LEFT
? floats_cur_left : floats_cur_right;
nscoord floatWidth = floatInfo.Width();

View File

@ -1563,17 +1563,34 @@ public:
, lineContainer(nullptr)
, prevLines(0)
, currentLine(0)
, skipWhitespace(true)
, trailingWhitespace(0)
, skipWhitespace(true)
{}
// The line. This may be null if the inlines are not associated with
// a block or if we just don't know the line.
const nsLineList_iterator* line;
// The line container.
// The line container. Private, to ensure we always use SetLineContainer
// to update it (so that we have a chance to store the lineContainerWM).
//
// Note that nsContainerFrame::DoInlineIntrinsicISize will clear the
// |line| and |lineContainer| fields when following a next-in-flow link,
// so we must not assume these can always be dereferenced.
private:
nsIFrame* lineContainer;
// Setter and getter for the lineContainer field:
public:
void SetLineContainer(nsIFrame* aLineContainer)
{
lineContainer = aLineContainer;
if (lineContainer) {
lineContainerWM = lineContainer->GetWritingMode();
}
}
nsIFrame* LineContainer() const { return lineContainer; }
// The maximum intrinsic width for all previous lines.
nscoord prevLines;
@ -1582,14 +1599,18 @@ public:
// the caller should call |Break()|.
nscoord currentLine;
// This contains the width of the trimmable whitespace at the end of
// |currentLine|; it is zero if there is no such whitespace.
nscoord trailingWhitespace;
// True if initial collapsable whitespace should be skipped. This
// should be true at the beginning of a block, after hard breaks
// and when the last text ended with whitespace.
bool skipWhitespace;
// This contains the width of the trimmable whitespace at the end of
// |currentLine|; it is zero if there is no such whitespace.
nscoord trailingWhitespace;
// Writing mode of the line container (stored here so that we don't
// lose track of it if the lineContainer field is reset).
mozilla::WritingMode lineContainerWM;
// Floats encountered in the lines.
class FloatInfo {

View File

@ -148,13 +148,13 @@ CalculateColumnPrefISize(nsRenderingContext* aRenderingContext,
if (frame) {
nsIFrame::InlinePrefISizeData data;
if (i == 0) {
data.lineContainer = aBaseISizeData->lineContainer;
data.SetLineContainer(aBaseISizeData->LineContainer());
data.skipWhitespace = aBaseISizeData->skipWhitespace;
data.trailingWhitespace = aBaseISizeData->trailingWhitespace;
} else {
// The line container of ruby text frames is their parent,
// ruby text container frame.
data.lineContainer = frame->GetParent();
data.SetLineContainer(frame->GetParent());
}
frame->AddInlinePrefISize(aRenderingContext, &data);
MOZ_ASSERT(data.prevLines == 0, "Shouldn't have prev lines");
@ -182,7 +182,7 @@ nsRubyBaseContainerFrame::AddInlineMinISize(
// Since spans are not breakable internally, use our pref isize
// directly if there is any span.
nsIFrame::InlinePrefISizeData data;
data.lineContainer = aData->lineContainer;
data.SetLineContainer(aData->LineContainer());
data.skipWhitespace = aData->skipWhitespace;
data.trailingWhitespace = aData->trailingWhitespace;
AddInlinePrefISize(aRenderingContext, &data);

View File

@ -7643,7 +7643,7 @@ nsTextFrame::AddInlineMinISizeForFlow(nsRenderingContext *aRenderingContext,
uint32_t flowEndInTextRun;
gfxContext* ctx = aRenderingContext->ThebesContext();
gfxSkipCharsIterator iter =
EnsureTextRun(aTextRunType, ctx, aData->lineContainer,
EnsureTextRun(aTextRunType, ctx, aData->LineContainer(),
aData->line, &flowEndInTextRun);
gfxTextRun *textRun = GetTextRun(aTextRunType);
if (!textRun)
@ -7792,12 +7792,12 @@ nsTextFrame::AddInlineMinISize(nsRenderingContext *aRenderingContext,
// lastTextRun will only be null for the first text frame.
if (f == this || f->GetTextRun(trtype) != lastTextRun) {
nsIFrame* lc;
if (aData->lineContainer &&
aData->lineContainer != (lc = FindLineContainer(f))) {
if (aData->LineContainer() &&
aData->LineContainer() != (lc = FindLineContainer(f))) {
NS_ASSERTION(f != this, "wrong InlineMinISizeData container"
" for first continuation");
aData->line = nullptr;
aData->lineContainer = lc;
aData->SetLineContainer(lc);
}
// This will process all the text frames that share the same textrun as f.
@ -7817,7 +7817,7 @@ nsTextFrame::AddInlinePrefISizeForFlow(nsRenderingContext *aRenderingContext,
uint32_t flowEndInTextRun;
gfxContext* ctx = aRenderingContext->ThebesContext();
gfxSkipCharsIterator iter =
EnsureTextRun(aTextRunType, ctx, aData->lineContainer,
EnsureTextRun(aTextRunType, ctx, aData->LineContainer(),
aData->line, &flowEndInTextRun);
gfxTextRun *textRun = GetTextRun(aTextRunType);
if (!textRun)
@ -7930,12 +7930,12 @@ nsTextFrame::AddInlinePrefISize(nsRenderingContext *aRenderingContext,
// lastTextRun will only be null for the first text frame.
if (f == this || f->GetTextRun(trtype) != lastTextRun) {
nsIFrame* lc;
if (aData->lineContainer &&
aData->lineContainer != (lc = FindLineContainer(f))) {
if (aData->LineContainer() &&
aData->LineContainer() != (lc = FindLineContainer(f))) {
NS_ASSERTION(f != this, "wrong InlinePrefISizeData container"
" for first continuation");
aData->line = nullptr;
aData->lineContainer = lc;
aData->SetLineContainer(lc);
}
// This will process all the text frames that share the same textrun as f.