From 2084e073f898b0c22b336159f345058adb67b6ce Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Wed, 20 Dec 2006 01:23:45 +0000 Subject: [PATCH] Eliminate nsStyleBorderPadding and add margin/padding/content rect APIs to nsIFrame. b=332922 r+sr=roc --- .../html/content/src/nsGenericHTMLElement.cpp | 7 +-- .../html/content/src/nsHTMLImageElement.cpp | 7 +-- content/html/document/src/nsImageDocument.cpp | 16 +++---- layout/forms/nsButtonFrameRenderer.cpp | 38 ++++++---------- layout/forms/nsGfxCheckboxControlFrame.cpp | 4 +- layout/generic/nsFrame.cpp | 44 +++++++++++++++++++ layout/generic/nsIFrame.h | 14 ++++++ layout/printing/nsPrintEngine.cpp | 5 +-- layout/style/nsComputedDOMStyle.cpp | 18 +++----- layout/style/nsStyleContext.cpp | 10 ----- layout/style/nsStyleContext.h | 2 - layout/style/nsStyleStruct.h | 26 ----------- layout/xul/base/src/nsListBoxBodyFrame.cpp | 13 +++--- layout/xul/base/src/nsTextBoxFrame.cpp | 7 +-- .../xul/base/src/tree/src/nsTreeBodyFrame.cpp | 8 ++-- 15 files changed, 99 insertions(+), 120 deletions(-) diff --git a/content/html/content/src/nsGenericHTMLElement.cpp b/content/html/content/src/nsGenericHTMLElement.cpp index 71e2a6351350..6d6eb08daad6 100644 --- a/content/html/content/src/nsGenericHTMLElement.cpp +++ b/content/html/content/src/nsGenericHTMLElement.cpp @@ -1149,12 +1149,7 @@ nsGenericHTMLElement::GetScrollWidth(PRInt32* aScrollWidth) const nsSize nsGenericHTMLElement::GetClientAreaSize(nsIFrame *aFrame) { - nsRect rect = aFrame->GetRect(); - nsMargin border_size = aFrame->GetUsedBorder(); - - rect.Deflate(border_size); - - return nsSize(rect.width, rect.height); + return aFrame->GetPaddingRect().Size(); } nsresult diff --git a/content/html/content/src/nsHTMLImageElement.cpp b/content/html/content/src/nsHTMLImageElement.cpp index 4d856a2524fc..6a8a25eb319a 100644 --- a/content/html/content/src/nsHTMLImageElement.cpp +++ b/content/html/content/src/nsHTMLImageElement.cpp @@ -346,12 +346,7 @@ nsHTMLImageElement::GetWidthHeight() if (frame) { // XXX we could put an accessor on nsIImageFrame to return its // mComputedSize..... - size = frame->GetSize(); - - nsMargin margin = frame->GetUsedBorderAndPadding(); - - size.height -= margin.top + margin.bottom; - size.width -= margin.left + margin.right; + size = frame->GetContentRect().Size(); nsPresContext *context = GetPresContext(); if (context) { diff --git a/content/html/document/src/nsImageDocument.cpp b/content/html/document/src/nsImageDocument.cpp index 8a78146ad5c3..301dc813d531 100644 --- a/content/html/document/src/nsImageDocument.cpp +++ b/content/html/document/src/nsImageDocument.cpp @@ -616,15 +616,13 @@ nsImageDocument::CheckOverflowing(PRBool changeState) nsRefPtr styleContext = context->StyleSet()->ResolveStyleFor(content, nsnull); - const nsStyleMargin* marginData = styleContext->GetStyleMargin(); - nsMargin margin; - marginData->GetMargin(margin); - visibleArea.Deflate(margin); - - nsStyleBorderPadding bPad; - styleContext->GetBorderPaddingFor(bPad); - bPad.GetBorderPadding(margin); - visibleArea.Deflate(margin); + nsMargin m; + if (styleContext->GetStyleMargin()->GetMargin(m)) + visibleArea.Deflate(m); + m = styleContext->GetStyleBorder()->GetBorder(); + visibleArea.Deflate(m); + if (styleContext->GetStylePadding()->GetPadding(m)) + visibleArea.Deflate(m); float t2p; t2p = context->TwipsToPixels(); diff --git a/layout/forms/nsButtonFrameRenderer.cpp b/layout/forms/nsButtonFrameRenderer.cpp index 3bc74a91378b..ae4634eec574 100644 --- a/layout/forms/nsButtonFrameRenderer.cpp +++ b/layout/forms/nsButtonFrameRenderer.cpp @@ -269,31 +269,22 @@ nsButtonFrameRenderer::GetButtonContentRect(const nsRect& aRect, nsRect& r) nsMargin nsButtonFrameRenderer::GetButtonOuterFocusBorderAndPadding() { - nsMargin focusBorderAndPadding(0,0,0,0); + nsMargin result(0,0,0,0); if (mOuterFocusStyle) { - nsStyleBorderPadding bPad; - mOuterFocusStyle->GetBorderPaddingFor(bPad); - if (!bPad.GetBorderPadding(focusBorderAndPadding)) { - NS_NOTYETIMPLEMENTED("percentage border"); + if (!mOuterFocusStyle->GetStylePadding()->GetPadding(result)) { + NS_NOTYETIMPLEMENTED("percentage padding"); } + result += mOuterFocusStyle->GetStyleBorder()->GetBorder(); } - return focusBorderAndPadding; + return result; } nsMargin nsButtonFrameRenderer::GetButtonBorderAndPadding() { - nsStyleContext* context = mFrame->GetStyleContext(); - - nsMargin innerFocusBorderAndPadding(0,0,0,0); - nsStyleBorderPadding bPad; - context->GetBorderPaddingFor(bPad); - if (!bPad.GetBorderPadding(innerFocusBorderAndPadding)) { - NS_NOTYETIMPLEMENTED("percentage border"); - } - return innerFocusBorderAndPadding; + return mFrame->GetUsedBorderAndPadding(); } /** @@ -305,9 +296,10 @@ nsButtonFrameRenderer::GetButtonInnerFocusMargin() nsMargin innerFocusMargin(0,0,0,0); if (mInnerFocusStyle) { - // get the outer focus border and padding const nsStyleMargin* margin = mInnerFocusStyle->GetStyleMargin(); - margin->GetMargin(innerFocusMargin); + if (!margin->GetMargin(innerFocusMargin)) { + NS_NOTYETIMPLEMENTED("percentage margin"); + } } return innerFocusMargin; @@ -316,18 +308,16 @@ nsButtonFrameRenderer::GetButtonInnerFocusMargin() nsMargin nsButtonFrameRenderer::GetButtonInnerFocusBorderAndPadding() { - nsMargin innerFocusBorderAndPadding(0,0,0,0); + nsMargin result(0,0,0,0); if (mInnerFocusStyle) { - // get the outer focus border and padding - nsStyleBorderPadding bPad; - mInnerFocusStyle->GetBorderPaddingFor(bPad); - if (!bPad.GetBorderPadding(innerFocusBorderAndPadding)) { - NS_NOTYETIMPLEMENTED("percentage border"); + if (!mInnerFocusStyle->GetStylePadding()->GetPadding(result)) { + NS_NOTYETIMPLEMENTED("percentage padding"); } + result += mInnerFocusStyle->GetStyleBorder()->GetBorder(); } - return innerFocusBorderAndPadding; + return result; } nsMargin diff --git a/layout/forms/nsGfxCheckboxControlFrame.cpp b/layout/forms/nsGfxCheckboxControlFrame.cpp index 8a8545927a31..870625a4c6ab 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.cpp +++ b/layout/forms/nsGfxCheckboxControlFrame.cpp @@ -216,10 +216,8 @@ nsGfxCheckboxControlFrame::PaintCheckBox(nsIRenderingContext& aRenderingContext, { // REVIEW: moved the mAppearance test out so we avoid constructing // a display item if it's not needed - nsMargin borderPadding = GetUsedBorderAndPadding(); - nsRect checkRect(aPt, mRect.Size()); - checkRect.Deflate(borderPadding); + checkRect.Deflate(GetUsedBorderAndPadding()); const nsStyleColor* color = GetStyleColor(); aRenderingContext.SetColor(color->mColor); diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index b8643fee146a..a111b4d64252 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -736,6 +736,50 @@ nsIFrame::GetUsedPadding() const return padding; } +void +nsIFrame::ApplySkipSides(nsMargin& aMargin) const +{ + PRIntn skipSides = GetSkipSides(); + if (skipSides & (1 << NS_SIDE_TOP)) + aMargin.top = 0; + if (skipSides & (1 << NS_SIDE_RIGHT)) + aMargin.right = 0; + if (skipSides & (1 << NS_SIDE_BOTTOM)) + aMargin.bottom = 0; + if (skipSides & (1 << NS_SIDE_LEFT)) + aMargin.left = 0; +} + +nsRect +nsIFrame::GetMarginRect() const +{ + nsMargin m(GetUsedMargin()); + ApplySkipSides(m); + nsRect r(mRect); + r.Inflate(m); + return r; +} + +nsRect +nsIFrame::GetPaddingRect() const +{ + nsMargin b(GetUsedBorder()); + ApplySkipSides(b); + nsRect r(mRect); + r.Deflate(b); + return r; +} + +nsRect +nsIFrame::GetContentRect() const +{ + nsMargin bp(GetUsedBorderAndPadding()); + ApplySkipSides(bp); + nsRect r(mRect); + r.Deflate(bp); + return r; +} + nsStyleContext* nsFrame::GetAdditionalStyleContext(PRInt32 aIndex) const { diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 805bb99a9f39..b7dac8615211 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -698,6 +698,20 @@ public: return GetUsedBorder() + GetUsedPadding(); } + /** + * Apply the result of GetSkipSides() on this frame to an nsMargin by + * setting to zero any sides that are skipped. + */ + void ApplySkipSides(nsMargin& aMargin) const; + + /** + * Like the frame's rect (see |GetRect|), which is the border rect, + * other rectangles of the frame, in twips, relative to the parent. + */ + nsRect GetMarginRect() const; + nsRect GetPaddingRect() const; + nsRect GetContentRect() const; + /** * Used to iterate the list of additional child list names. Returns the atom * name for the additional child list at the specified 0-based index, or a diff --git a/layout/printing/nsPrintEngine.cpp b/layout/printing/nsPrintEngine.cpp index 69a2026d153a..ef4d11395178 100644 --- a/layout/printing/nsPrintEngine.cpp +++ b/layout/printing/nsPrintEngine.cpp @@ -2066,10 +2066,7 @@ nsPrintEngine::ReflowPrintObject(nsPrintObject * aPO) if (!frame) return NS_OK; - nsMargin borderPadding = frame->GetUsedBorderAndPadding(); - nsRect rect(frame->GetRect()); - rect.Deflate(borderPadding); - adjSize = rect.Size(); + adjSize = frame->GetContentRect().Size(); documentIsTopLevel = PR_FALSE; // presshell exists because parent is printable } else { diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index feaccf6b56df..80bfcfc02fec 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -2650,10 +2650,7 @@ nsComputedDOMStyle::GetHeight(nsIFrame *aFrame, } if (calcHeight) { - nsMargin bp = aFrame->GetUsedBorderAndPadding(); - nsSize size = aFrame->GetSize(); - - val->SetTwips(size.height - bp.TopBottom()); + val->SetTwips(aFrame->GetContentRect().height); } else { // Just return the value in the style context const nsStylePosition* positionData = GetStylePosition(aFrame); @@ -2701,9 +2698,7 @@ nsComputedDOMStyle::GetWidth(nsIFrame *aFrame, } if (calcWidth) { - nsSize size = aFrame->GetSize(); - nsMargin bp = aFrame->GetUsedBorderAndPadding(); - val->SetTwips(size.width - bp.LeftRight()); + val->SetTwips(aFrame->GetContentRect().width); } else { // Just return the value in the style context const nsStylePosition *positionData = GetStylePosition(aFrame); @@ -3082,14 +3077,11 @@ nsComputedDOMStyle::GetRelativeOffset(PRUint8 aSide, nsIFrame* aFrame, case eStyleUnit_Percent: container = GetContainingBlockFor(aFrame); if (container) { - nsMargin bp = container->GetUsedBorderAndPadding(); - nsSize size = container->GetSize(); + nsSize size = container->GetContentRect().Size(); if (aSide == NS_SIDE_LEFT || aSide == NS_SIDE_RIGHT) { - val->SetTwips(sign * coord.GetPercentValue() * - (size.width - bp.LeftRight())); + val->SetTwips(sign * coord.GetPercentValue() * size.width); } else { - val->SetTwips(sign * coord.GetPercentValue() * - (size.height - bp.TopBottom())); + val->SetTwips(sign * coord.GetPercentValue() * size.height); } } else { // XXX no containing block. diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp index 8e82fe4c6bc5..918d793470fc 100644 --- a/layout/style/nsStyleContext.cpp +++ b/layout/style/nsStyleContext.cpp @@ -245,16 +245,6 @@ inline const nsStyleStruct* nsStyleContext::PeekStyleData(nsStyleStructID aSID) return mRuleNode->GetStyleData(aSID, this, PR_FALSE); // Our rule node will take care of it for us. } -void -nsStyleContext::GetBorderPaddingFor(nsStyleBorderPadding& aBorderPadding) -{ - nsMargin padding; - if (GetStylePadding()->GetPadding(padding)) { - padding += GetStyleBorder()->GetBorder(); - aBorderPadding.SetBorderPadding(padding); - } -} - // This is an evil evil function, since it forces you to alloc your own separate copy of // style data! Do not use this function unless you absolutely have to! You should avoid // this at all costs! -dwh diff --git a/layout/style/nsStyleContext.h b/layout/style/nsStyleContext.h index ed8bb8221a48..a2ad518a6e4a 100644 --- a/layout/style/nsStyleContext.h +++ b/layout/style/nsStyleContext.h @@ -109,8 +109,6 @@ public: NS_HIDDEN_(PRBool) Equals(const nsStyleContext* aOther) const; PRBool HasTextDecorations() { return mBits & NS_STYLE_HAS_TEXT_DECORATIONS; }; - NS_HIDDEN_(void) GetBorderPaddingFor(nsStyleBorderPadding& aBorderPadding); - NS_HIDDEN_(void) SetStyle(nsStyleStructID aSID, nsStyleStruct* aStruct); nsRuleNode* GetRuleNode() { return mRuleNode; } diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 145107c7c014..ad54ad6b88d8 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -478,32 +478,6 @@ protected: }; -struct nsStyleBorderPadding: public nsStyleStruct { - nsStyleBorderPadding(void) { mHasCachedBorderPadding = PR_FALSE; }; - ~nsStyleBorderPadding(void) {}; - - // No accessor for this struct, since it's not a real struct. At - // least not for now... - - PRBool GetBorderPadding(nsMargin& aBorderPadding) const { - if (mHasCachedBorderPadding) { - aBorderPadding = mCachedBorderPadding; - return PR_TRUE; - } - return PR_FALSE; - } - - void SetBorderPadding(nsMargin aBorderPadding) { - mCachedBorderPadding = aBorderPadding; - mHasCachedBorderPadding = PR_TRUE; - } - -protected: - nsMargin mCachedBorderPadding; - PRPackedBool mHasCachedBorderPadding; -}; - - struct nsStyleOutline: public nsStyleStruct { nsStyleOutline(nsPresContext* aPresContext); nsStyleOutline(const nsStyleOutline& aOutline); diff --git a/layout/xul/base/src/nsListBoxBodyFrame.cpp b/layout/xul/base/src/nsListBoxBodyFrame.cpp index b556a934c9ac..1464136ed7c8 100644 --- a/layout/xul/base/src/nsListBoxBodyFrame.cpp +++ b/layout/xul/base/src/nsListBoxBodyFrame.cpp @@ -781,14 +781,11 @@ nsListBoxBodyFrame::ComputeIntrinsicWidth(nsBoxLayoutState& aBoxLayoutState) nscoord width = 0; nsMargin margin(0,0,0,0); - nsStyleBorderPadding bPad; - styleContext->GetBorderPaddingFor(bPad); - bPad.GetBorderPadding(margin); - - width += (margin.left + margin.right); - - styleContext->GetStyleMargin()->GetMargin(margin); - width += (margin.left + margin.right); + if (styleContext->GetStylePadding()->GetPadding(margin)) + width += margin.LeftRight(); + width += styleContext->GetStyleBorder()->GetBorder().LeftRight(); + if (styleContext->GetStyleMargin()->GetMargin(margin)) + width += margin.LeftRight(); nsIContent* listbox = mContent->GetBindingParent(); NS_ENSURE_TRUE(listbox, largestWidth); diff --git a/layout/xul/base/src/nsTextBoxFrame.cpp b/layout/xul/base/src/nsTextBoxFrame.cpp index e8216e857de2..34e99cf20fe8 100644 --- a/layout/xul/base/src/nsTextBoxFrame.cpp +++ b/layout/xul/base/src/nsTextBoxFrame.cpp @@ -322,13 +322,8 @@ nsTextBoxFrame::PaintTitle(nsIRenderingContext& aRenderingContext, if (mTitle.IsEmpty()) return; - nsStyleBorderPadding bPad; - mStyleContext->GetBorderPaddingFor(bPad); - nsMargin border(0,0,0,0); - bPad.GetBorderPadding(border); - nsRect textRect(aPt, GetSize()); - textRect.Deflate(border); + textRect.Deflate(GetUsedBorderAndPadding()); // determine (cropped) title and underline position nsPresContext* presContext = GetPresContext(); diff --git a/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp b/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp index 8f08a65824fc..8f38786796de 100644 --- a/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp +++ b/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp @@ -187,9 +187,11 @@ nsTreeBodyFrame::Release(void) static void GetBorderPadding(nsStyleContext* aContext, nsMargin& aMargin) { - nsStyleBorderPadding borderPaddingStyle; - aContext->GetBorderPaddingFor(borderPaddingStyle); - borderPaddingStyle.GetBorderPadding(aMargin); + aMargin.SizeTo(0, 0, 0, 0); + if (!aContext->GetStylePadding()->GetPadding(aMargin)) { + NS_NOTYETIMPLEMENTED("percentage padding"); + } + aMargin += aContext->GetStyleBorder()->GetBorder(); } static void