Bug 755971 - Add methods to nsLayoutUtils to calculate the padding boxes. r=bz

This commit is contained in:
Kartikaya Gupta 2012-06-21 09:35:17 -04:00
parent 761fd3103f
commit 9568f79303
2 changed files with 56 additions and 6 deletions

View File

@ -1926,21 +1926,25 @@ nsLayoutUtils::GetAllInFlowBoxes(nsIFrame* aFrame, BoxCallback* aCallback)
}
}
struct BoxToBorderRect : public nsLayoutUtils::BoxCallback {
struct BoxToRect : public nsLayoutUtils::BoxCallback {
typedef nsSize (*GetRectFromFrameFun)(nsIFrame*);
nsIFrame* mRelativeTo;
nsLayoutUtils::RectCallback* mCallback;
PRUint32 mFlags;
GetRectFromFrameFun mRectFromFrame;
BoxToBorderRect(nsIFrame* aRelativeTo, nsLayoutUtils::RectCallback* aCallback,
PRUint32 aFlags)
: mRelativeTo(aRelativeTo), mCallback(aCallback), mFlags(aFlags) {}
BoxToRect(nsIFrame* aRelativeTo, nsLayoutUtils::RectCallback* aCallback,
PRUint32 aFlags, GetRectFromFrameFun aRectFromFrame)
: mRelativeTo(aRelativeTo), mCallback(aCallback), mFlags(aFlags),
mRectFromFrame(aRectFromFrame) {}
virtual void AddBox(nsIFrame* aFrame) {
nsRect r;
nsIFrame* outer = nsSVGUtils::GetOuterSVGFrameAndCoveredRegion(aFrame, &r);
if (!outer) {
outer = aFrame;
r = nsRect(nsPoint(0, 0), aFrame->GetSize());
r = nsRect(nsPoint(0, 0), mRectFromFrame(aFrame));
}
if (mFlags & nsLayoutUtils::RECTS_ACCOUNT_FOR_TRANSFORMS) {
r = nsLayoutUtils::TransformFrameRectToAncestor(outer, r, mRelativeTo);
@ -1951,11 +1955,31 @@ struct BoxToBorderRect : public nsLayoutUtils::BoxCallback {
}
};
static nsSize
GetFrameBorderSize(nsIFrame* aFrame)
{
return aFrame->GetSize();
}
void
nsLayoutUtils::GetAllInFlowRects(nsIFrame* aFrame, nsIFrame* aRelativeTo,
RectCallback* aCallback, PRUint32 aFlags)
{
BoxToBorderRect converter(aRelativeTo, aCallback, aFlags);
BoxToRect converter(aRelativeTo, aCallback, aFlags, &GetFrameBorderSize);
GetAllInFlowBoxes(aFrame, &converter);
}
static nsSize
GetFramePaddingSize(nsIFrame* aFrame)
{
return aFrame->GetPaddingRect().Size();
}
void
nsLayoutUtils::GetAllInFlowPaddingRects(nsIFrame* aFrame, nsIFrame* aRelativeTo,
RectCallback* aCallback, PRUint32 aFlags)
{
BoxToRect converter(aRelativeTo, aCallback, aFlags, &GetFramePaddingSize);
GetAllInFlowBoxes(aFrame, &converter);
}
@ -1993,6 +2017,17 @@ nsLayoutUtils::GetAllInFlowRectsUnion(nsIFrame* aFrame, nsIFrame* aRelativeTo,
: accumulator.mResultRect;
}
nsRect
nsLayoutUtils::GetAllInFlowPaddingRectsUnion(nsIFrame* aFrame,
nsIFrame* aRelativeTo,
PRUint32 aFlags)
{
RectAccumulator accumulator;
GetAllInFlowPaddingRects(aFrame, aRelativeTo, &accumulator, aFlags);
return accumulator.mResultRect.IsEmpty() ? accumulator.mFirstRect
: accumulator.mResultRect;
}
nsRect
nsLayoutUtils::GetTextShadowRectsUnion(const nsRect& aTextAndDecorationsRect,
nsIFrame* aFrame,

View File

@ -729,6 +729,13 @@ public:
*/
static void GetAllInFlowRects(nsIFrame* aFrame, nsIFrame* aRelativeTo,
RectCallback* aCallback, PRUint32 aFlags = 0);
/**
* The same as GetAllInFlowRects, but it collects the CSS padding-boxes
* rather than the CSS border-boxes. SVG frames are handled the same way
* as in GetAllInFlowRects.
*/
static void GetAllInFlowPaddingRects(nsIFrame* aFrame, nsIFrame* aRelativeTo,
RectCallback* aCallback, PRUint32 aFlags = 0);
/**
* Computes the union of all rects returned by GetAllInFlowRects. If
@ -740,6 +747,14 @@ public:
static nsRect GetAllInFlowRectsUnion(nsIFrame* aFrame, nsIFrame* aRelativeTo,
PRUint32 aFlags = 0);
/**
* The same as GetAllInFlowRectsUnion, but it computes the union of the
* rects returned by GetAllInFlowPaddingRects.
*/
static nsRect GetAllInFlowPaddingRectsUnion(nsIFrame* aFrame,
nsIFrame* aRelativeTo,
PRUint32 aFlags = 0);
enum {
EXCLUDE_BLUR_SHADOWS = 0x01
};