diff options
Diffstat (limited to 'layout/generic/nsBlockReflowContext.h')
-rw-r--r-- | layout/generic/nsBlockReflowContext.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/layout/generic/nsBlockReflowContext.h b/layout/generic/nsBlockReflowContext.h new file mode 100644 index 000000000..4d5541ff6 --- /dev/null +++ b/layout/generic/nsBlockReflowContext.h @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +// vim:cindent:ts=2:et:sw=2: +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* class that a parent frame uses to reflow a block frame */ + +#ifndef nsBlockReflowContext_h___ +#define nsBlockReflowContext_h___ + +#include "nsIFrame.h" +#include "mozilla/ReflowOutput.h" + +class nsLineBox; +class nsPresContext; +namespace mozilla { +class BlockReflowInput; +} // namespace mozilla + +/** + * An encapsulation of the state and algorithm for reflowing block frames. + */ +class nsBlockReflowContext { + using BlockReflowInput = mozilla::BlockReflowInput; + using ReflowInput = mozilla::ReflowInput; + using ReflowOutput = mozilla::ReflowOutput; + +public: + nsBlockReflowContext(nsPresContext* aPresContext, + const ReflowInput& aParentRS); + ~nsBlockReflowContext() { } + + void ReflowBlock(const mozilla::LogicalRect& aSpace, + bool aApplyBStartMargin, + nsCollapsingMargin& aPrevMargin, + nscoord aClearance, + bool aIsAdjacentWithBStart, + nsLineBox* aLine, + ReflowInput& aReflowInput, + nsReflowStatus& aReflowStatus, + BlockReflowInput& aState); + + bool PlaceBlock(const ReflowInput& aReflowInput, + bool aForceFit, + nsLineBox* aLine, + nsCollapsingMargin& aBEndMarginResult /* out */, + nsOverflowAreas& aOverflowAreas, + nsReflowStatus aReflowStatus); + + nsCollapsingMargin& GetCarriedOutBEndMargin() { + return mMetrics.mCarriedOutBEndMargin; + } + + const ReflowOutput& GetMetrics() const { + return mMetrics; + } + + /** + * Computes the collapsed block-start margin (in the context's parent's + * writing mode) for a block whose reflow state is in aRI. + * The computed margin is added into aMargin, whose writing mode is the + * parent's mode as found in mMetrics.GetWritingMode(); note this may not be + * the block's own writing mode as found in aRI. + * If aClearanceFrame is null then this is the first optimistic pass which + * shall assume that no frames have clearance, and we clear the HasClearance + * on all frames encountered. + * If non-null, this is the second pass and the caller has decided + * aClearanceFrame needs clearance (and we will therefore stop collapsing + * there); also, this function is responsible for marking it with + * SetHasClearance. + * If in the optimistic pass any frame is encountered that might possibly + * need clearance (i.e., if we really needed the optimism assumption) then + * we set aMayNeedRetry to true. + * We return true if we changed the clearance state of any line and marked it + * dirty. + */ + bool ComputeCollapsedBStartMargin(const ReflowInput& aRI, + nsCollapsingMargin* aMargin, + nsIFrame* aClearanceFrame, + bool* aMayNeedRetry, + bool* aIsEmpty = nullptr); + +protected: + nsPresContext* mPresContext; + const ReflowInput& mOuterReflowInput; + + nsIFrame* mFrame; + mozilla::LogicalRect mSpace; + + nscoord mICoord, mBCoord; + nsSize mContainerSize; + mozilla::WritingMode mWritingMode; + ReflowOutput mMetrics; + nsCollapsingMargin mBStartMargin; +}; + +#endif /* nsBlockReflowContext_h___ */ |