Backout of nsLineLayout changes; trying to fix luna orange

This commit is contained in:
roc+%cs.cmu.edu 2007-01-17 06:27:01 +00:00
Родитель 9ef783f360
Коммит 2235524e9e
7 изменённых файлов: 56 добавлений и 54 удалений

Просмотреть файл

@ -2421,11 +2421,20 @@ nsBlockFrame::AttributeChanged(PRInt32 aNameSpaceID,
else if (nsGkAtoms::value == aAttribute) {
const nsStyleDisplay* styleDisplay = GetStyleDisplay();
if (NS_STYLE_DISPLAY_LIST_ITEM == styleDisplay->mDisplay) {
nsIFrame* nextAncestor = mParent;
nsBlockFrame* blockParent = nsnull;
// Search for the closest ancestor that's a block frame. We
// make the assumption that all related list items share a
// common block parent.
// XXXldb I think that's a bad assumption.
nsBlockFrame* blockParent = nsLayoutUtils::FindNearestBlockAncestor(this);
while (nextAncestor) {
if (NS_OK == nextAncestor->QueryInterface(kBlockFrameCID,
(void**)&blockParent)) {
break;
}
nextAncestor = nextAncestor->GetParent();
}
// Tell the enclosing block frame to renumber list items within
// itself
@ -3101,7 +3110,7 @@ nsBlockFrame::ReflowInlineFrames(nsBlockReflowState& aState,
// no longer makes sense. Now we always allocate on the stack
nsLineLayout lineLayout(aState.mPresContext,
aState.mReflowState.mSpaceManager,
&aState.mReflowState, &aLine);
&aState.mReflowState);
lineLayout.Init(&aState, aState.mMinLineHeight, aState.mLineNumber);
if (forceBreakInContent) {
lineLayout.ForceBreakAtPosition(forceBreakInContent, forceBreakOffset);
@ -3313,11 +3322,8 @@ nsBlockFrame::DoReflowInlineFrames(nsBlockReflowState& aState,
}
if ((lineReflowStatus == LINE_REFLOW_STOP || lineReflowStatus == LINE_REFLOW_OK) &&
aLineLayout.NeedsBackup()) {
!aLineLayout.HaveForcedBreakPosition() && aLineLayout.NeedsBackup()) {
// We need to try backing up to before a text run
NS_ASSERTION(!aLineLayout.HaveForcedBreakPosition(),
"We shouldn't be backing up more than once! "
"Someone must have set a break opportunity beyond the available width");
PRInt32 offset;
nsIContent* breakContent = aLineLayout.GetLastOptionalBreakPosition(&offset);
if (breakContent) {
@ -3822,7 +3828,7 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
aLineLayout.AddBulletFrame(mBullet, metrics);
addedBullet = PR_TRUE;
}
aLineLayout.VerticalAlignLine();
aLineLayout.VerticalAlignLine(aLine);
// Our ascent is the ascent of our first line (but if this line is all
// whitespace we'll correct things in |ReflowBlockFrame|).
if (aLine == mLines.front()) {

Просмотреть файл

@ -255,7 +255,7 @@ nsFirstLetterFrame::Reflow(nsPresContext* aPresContext,
// only time that the first-letter-frame is not reflowing in a
// line context is when its floating.
nsHTMLReflowState rs(aPresContext, aReflowState, kid, availSize);
nsLineLayout ll(aPresContext, nsnull, &aReflowState, nsnull);
nsLineLayout ll(aPresContext, nsnull, &aReflowState);
ll.BeginLineReflow(0, 0, NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE,
PR_FALSE, PR_TRUE);
rs.mLineLayout = ≪

Просмотреть файл

@ -651,6 +651,24 @@ nsHTMLReflowState::CalculateHorizBorderPaddingMargin(nscoord aContainingBlockWid
margin.left + margin.right;
}
static nsIFrame*
FindImmediateChildOf(nsIFrame* aParent, nsIFrame* aDescendantFrame)
{
nsIFrame* result = aDescendantFrame;
while (result) {
nsIFrame* parent = result->GetParent();
if (parent == aParent) {
break;
}
// The frame is not an immediate child of aParent so walk up another level
result = parent;
}
return result;
}
/**
* Returns PR_TRUE iff a pre-order traversal of the normal child
* frames rooted at aFrame finds no non-empty frame before aDescendant.
@ -758,8 +776,7 @@ nsHTMLReflowState::CalculateHypotheticalBox(nsPresContext* aPresContext,
NS_REINTERPRET_CAST(void**, &blockFrame)))) {
// We need the immediate child of the block frame, and that may not be
// the placeholder frame
nsIFrame *blockChild =
nsLayoutUtils::FindChildContainingDescendant(blockFrame, aPlaceholderFrame);
nsIFrame *blockChild = FindImmediateChildOf(blockFrame, aPlaceholderFrame);
nsBlockFrame::line_iterator lineBox = blockFrame->FindLineFor(blockChild);
// How we determine the hypothetical box depends on whether the element

Просмотреть файл

@ -914,11 +914,7 @@ nsFirstLineFrame::Reflow(nsPresContext* aPresContext,
}
}
NS_ASSERTION(!aReflowState.mLineLayout->GetInFirstLine(),
"Nested first-line frames? BOGUS");
aReflowState.mLineLayout->SetInFirstLine(PR_TRUE);
rv = ReflowFrames(aPresContext, aReflowState, irs, aMetrics, aStatus);
aReflowState.mLineLayout->SetInFirstLine(PR_FALSE);
// Note: the line layout code will properly compute our overflow state for us

Просмотреть файл

@ -93,8 +93,7 @@
nsLineLayout::nsLineLayout(nsPresContext* aPresContext,
nsSpaceManager* aSpaceManager,
const nsHTMLReflowState* aOuterReflowState,
const nsLineList::iterator* aLine)
const nsHTMLReflowState* aOuterReflowState)
: mPresContext(aPresContext),
mSpaceManager(aSpaceManager),
mBlockReflowState(aOuterReflowState),
@ -134,11 +133,6 @@ nsLineLayout::nsLineLayout(nsPresContext* aPresContext,
mCurrentSpan = mRootSpan = nsnull;
mSpanDepth = 0;
if (aLine) {
SetFlag(LL_GOTLINEBOX, PR_TRUE);
mLineBox = *aLine;
}
mCompatMode = mPresContext->CompatibilityMode();
}
@ -814,6 +808,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
#endif // IBMBIDI
nsIAtom* frameType = aFrame->GetType();
PRInt32 savedOptionalBreakOffset;
nsIContent* savedOptionalBreakContent =
GetLastOptionalBreakPosition(&savedOptionalBreakOffset);
@ -1398,7 +1393,7 @@ PRBool IsPercentageAwareFrame(nsPresContext *aPresContext, nsIFrame *aFrame)
void
nsLineLayout::VerticalAlignLine()
nsLineLayout::VerticalAlignLine(nsLineBox* aLineBox)
{
// Synthesize a PerFrameData for the block frame
PerFrameData rootPFD;
@ -1407,6 +1402,7 @@ nsLineLayout::VerticalAlignLine()
rootPFD.mAscent = 0;
rootPFD.mDescent = 0;
mRootSpan->mFrame = &rootPFD;
mLineBox = aLineBox;
// Partially place the children of the block frame. The baseline for
// this operation is set to zero so that the y coordinates for all
@ -1511,31 +1507,32 @@ nsLineLayout::VerticalAlignLine()
}
// check to see if the frame is an inline replace element
// and if it is percent-aware. If so, mark the line.
if ((PR_FALSE==mLineBox->ResizeReflowOptimizationDisabled()) &&
if ((PR_FALSE==aLineBox->ResizeReflowOptimizationDisabled()) &&
pfd->mFrameType & NS_CSS_FRAME_TYPE_INLINE)
{
if (IsPercentageAwareFrame(mPresContext, pfd->mFrame))
mLineBox->DisableResizeReflowOptimization();
aLineBox->DisableResizeReflowOptimization();
}
}
// Fill in returned line-box and max-element-width data
mLineBox->mBounds.x = psd->mLeftEdge;
mLineBox->mBounds.y = mTopEdge;
mLineBox->mBounds.width = psd->mX - psd->mLeftEdge;
mLineBox->mBounds.height = lineHeight;
aLineBox->mBounds.x = psd->mLeftEdge;
aLineBox->mBounds.y = mTopEdge;
aLineBox->mBounds.width = psd->mX - psd->mLeftEdge;
aLineBox->mBounds.height = lineHeight;
mFinalLineHeight = lineHeight;
mLineBox->SetAscent(baselineY - mTopEdge);
aLineBox->SetAscent(baselineY - mTopEdge);
#ifdef NOISY_VERTICAL_ALIGN
printf(
" [line]==> bounds{x,y,w,h}={%d,%d,%d,%d} lh=%d a=%d\n",
mLineBox->mBounds.x, mLineBox->mBounds.y,
mLineBox->mBounds.width, mLineBox->mBounds.height,
mFinalLineHeight, mLineBox->GetAscent());
aLineBox->mBounds.x, aLineBox->mBounds.y,
aLineBox->mBounds.width, aLineBox->mBounds.height,
mFinalLineHeight, aLineBox->GetAscent());
#endif
// Undo root-span mFrame pointer to prevent brane damage later on...
mRootSpan->mFrame = nsnull;
mLineBox = nsnull;
}
void

Просмотреть файл

@ -66,8 +66,7 @@ class nsLineLayout {
public:
nsLineLayout(nsPresContext* aPresContext,
nsSpaceManager* aSpaceManager,
const nsHTMLReflowState* aOuterReflowState,
const nsLineList::iterator* aLine);
const nsHTMLReflowState* aOuterReflowState);
~nsLineLayout();
void Init(nsBlockReflowState* aState, nscoord aMinLineHeight,
@ -127,7 +126,7 @@ public:
PushFrame(aFrame);
}
void VerticalAlignLine();
void VerticalAlignLine(nsLineBox* aLineBox);
PRBool TrimTrailingWhiteSpace();
@ -162,9 +161,7 @@ protected:
#define LL_LINEENDSINSOFTBR 0x00000400
#define LL_NEEDBACKUP 0x00000800
#define LL_LASTTEXTFRAME_WRAPPINGENABLED 0x00001000
#define LL_INFIRSTLINE 0x00002000
#define LL_GOTLINEBOX 0x00004000
#define LL_LASTFLAG LL_GOTLINEBOX
#define LL_LASTFLAG LL_LASTTEXTFRAME_WRAPPINGENABLED
PRUint16 mFlags;
@ -277,7 +274,7 @@ public:
* @param aWrappingEnabled whether that text had word-wrapping enabled
* (white-space:normal or -moz-pre-wrap)
*/
nsIFrame* GetTrailingTextFrame(PRBool* aWrappingEnabled) const {
nsIFrame* GetTrailingTextFrame(PRBool* aWrappingEnabled) {
*aWrappingEnabled = GetFlag(LL_LASTTEXTFRAME_WRAPPINGENABLED);
return mTrailingTextFrame;
}
@ -301,14 +298,6 @@ public:
mFirstLetterFrame = aFrame;
}
PRBool GetInFirstLine() const {
return GetFlag(LL_INFIRSTLINE);
}
void SetInFirstLine(PRBool aSetting) {
SetFlag(LL_INFIRSTLINE, aSetting);
}
//----------------------------------------
static PRBool TreatFrameAsBlock(nsIFrame* aFrame);
@ -401,11 +390,8 @@ public:
* some other kind of frame when inline frames are reflowed in a non-block
* context (e.g. MathML).
*/
nsIFrame* GetLineContainerFrame() const { return mBlockReflowState->frame; }
const nsLineList::iterator* GetLine() const {
return GetFlag(LL_GOTLINEBOX) ? &mLineBox : nsnull;
}
nsIFrame* GetLineContainerFrame() { return mBlockReflowState->frame; }
protected:
// This state is constant for a given block frame doing line layout
nsSpaceManager* mSpaceManager;
@ -441,7 +427,7 @@ protected:
PRInt32 mTextJustificationNumSpaces;
PRInt32 mTextJustificationNumLetters;
nsLineList::iterator mLineBox;
nsLineBox* mLineBox;
PRInt32 mTotalPlacedFrames;

Просмотреть файл

@ -985,7 +985,7 @@ nsMathMLContainerFrame::ReflowForeignChild(nsIFrame* aChildFrame,
// provide a local, self-contained linelayout where to reflow the nsInlineFrame
nsSize availSize(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE);
nsLineLayout ll(aPresContext, aReflowState.mSpaceManager,
aReflowState.parentReflowState, nsnull);
aReflowState.parentReflowState);
ll.BeginLineReflow(0, 0, availSize.width, availSize.height, PR_FALSE, PR_FALSE);
PRBool pushedFrame;
ll.ReflowFrame(aChildFrame, aStatus, &aDesiredSize, pushedFrame);