1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 // vim:cindent:ts=2:et:sw=2:
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 /* class that a parent frame uses to reflow a block frame */
8 
9 #ifndef nsBlockReflowContext_h___
10 #define nsBlockReflowContext_h___
11 
12 #include "nsIFrame.h"
13 #include "mozilla/ReflowOutput.h"
14 
15 class nsLineBox;
16 class nsPresContext;
17 namespace mozilla {
18 class BlockReflowInput;
19 } // namespace mozilla
20 
21 /**
22  * An encapsulation of the state and algorithm for reflowing block frames.
23  */
24 class nsBlockReflowContext {
25   using BlockReflowInput = mozilla::BlockReflowInput;
26   using ReflowInput = mozilla::ReflowInput;
27   using ReflowOutput = mozilla::ReflowOutput;
28 
29 public:
30   nsBlockReflowContext(nsPresContext* aPresContext,
31                        const ReflowInput& aParentRS);
~nsBlockReflowContext()32   ~nsBlockReflowContext() { }
33 
34   void ReflowBlock(const mozilla::LogicalRect& aSpace,
35                    bool                        aApplyBStartMargin,
36                    nsCollapsingMargin&         aPrevMargin,
37                    nscoord                     aClearance,
38                    bool                        aIsAdjacentWithBStart,
39                    nsLineBox*                  aLine,
40                    ReflowInput&          aReflowInput,
41                    nsReflowStatus&             aReflowStatus,
42                    BlockReflowInput&         aState);
43 
44   bool PlaceBlock(const ReflowInput& aReflowInput,
45                   bool                     aForceFit,
46                   nsLineBox*               aLine,
47                   nsCollapsingMargin&      aBEndMarginResult /* out */,
48                   nsOverflowAreas&         aOverflowAreas,
49                   nsReflowStatus           aReflowStatus);
50 
GetCarriedOutBEndMargin()51   nsCollapsingMargin& GetCarriedOutBEndMargin() {
52     return mMetrics.mCarriedOutBEndMargin;
53   }
54 
GetMetrics()55   const ReflowOutput& GetMetrics() const {
56     return mMetrics;
57   }
58 
59   /**
60    * Computes the collapsed block-start margin (in the context's parent's
61    * writing mode) for a block whose reflow state is in aRI.
62    * The computed margin is added into aMargin, whose writing mode is the
63    * parent's mode as found in mMetrics.GetWritingMode(); note this may not be
64    * the block's own writing mode as found in aRI.
65    * If aClearanceFrame is null then this is the first optimistic pass which
66    * shall assume that no frames have clearance, and we clear the HasClearance
67    * on all frames encountered.
68    * If non-null, this is the second pass and the caller has decided
69    * aClearanceFrame needs clearance (and we will therefore stop collapsing
70    * there); also, this function is responsible for marking it with
71    * SetHasClearance.
72    * If in the optimistic pass any frame is encountered that might possibly
73    * need clearance (i.e., if we really needed the optimism assumption) then
74    * we set aMayNeedRetry to true.
75    * We return true if we changed the clearance state of any line and marked it
76    * dirty.
77    */
78   bool ComputeCollapsedBStartMargin(const ReflowInput& aRI,
79                                     nsCollapsingMargin* aMargin,
80                                     nsIFrame* aClearanceFrame,
81                                     bool* aMayNeedRetry,
82                                     bool* aIsEmpty = nullptr);
83 
84 protected:
85   nsPresContext* mPresContext;
86   const ReflowInput& mOuterReflowInput;
87 
88   nsIFrame* mFrame;
89   mozilla::LogicalRect mSpace;
90 
91   nscoord mICoord, mBCoord;
92   nsSize mContainerSize;
93   mozilla::WritingMode mWritingMode;
94   ReflowOutput mMetrics;
95   nsCollapsingMargin mBStartMargin;
96 };
97 
98 #endif /* nsBlockReflowContext_h___ */
99