OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003-2013 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003-2013 Apple Inc. All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * Copyright (C) 2013 Google Inc. All rights reserved. | 7 * Copyright (C) 2013 Google Inc. All rights reserved. |
8 * | 8 * |
9 * Redistribution and use in source and binary forms, with or without | 9 * Redistribution and use in source and binary forms, with or without |
10 * modification, are permitted provided that the following conditions are | 10 * modification, are permitted provided that the following conditions are |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 #ifndef RenderBlockFlow_h | 36 #ifndef RenderBlockFlow_h |
37 #define RenderBlockFlow_h | 37 #define RenderBlockFlow_h |
38 | 38 |
39 #include "core/rendering/RenderBlock.h" | 39 #include "core/rendering/RenderBlock.h" |
40 #include "core/rendering/line/TrailingObjects.h" | 40 #include "core/rendering/line/TrailingObjects.h" |
41 #include "core/rendering/style/RenderStyleConstants.h" | 41 #include "core/rendering/style/RenderStyleConstants.h" |
42 | 42 |
43 namespace blink { | 43 namespace blink { |
44 | 44 |
45 class MarginInfo; | |
46 class LineBreaker; | 45 class LineBreaker; |
47 class LineWidth; | 46 class LineWidth; |
48 class FloatingObject; | 47 class FloatingObject; |
49 | 48 |
50 class RenderBlockFlow : public RenderBlock { | 49 class RenderBlockFlow : public RenderBlock { |
51 public: | 50 public: |
52 explicit RenderBlockFlow(ContainerNode*); | 51 explicit RenderBlockFlow(ContainerNode*); |
53 virtual ~RenderBlockFlow(); | 52 virtual ~RenderBlockFlow(); |
54 virtual void trace(Visitor*) override; | |
55 | 53 |
56 static RenderBlockFlow* createAnonymous(Document*); | 54 static RenderBlockFlow* createAnonymous(Document*); |
57 | 55 |
58 virtual bool isRenderBlockFlow() const override final { return true; } | 56 virtual bool isRenderBlockFlow() const override final { return true; } |
59 | 57 |
60 virtual void layoutBlock(bool relayoutChildren) override; | 58 virtual void layoutBlock(bool relayoutChildren) override; |
61 | 59 |
62 virtual void deleteLineBoxTree() override final; | 60 virtual void deleteLineBoxTree() override final; |
63 | 61 |
64 LayoutUnit availableLogicalWidthForLine(LayoutUnit position, bool shouldInde
ntText, LayoutUnit logicalHeight = 0) const | 62 LayoutUnit availableLogicalWidthForLine(LayoutUnit position, bool shouldInde
ntText, LayoutUnit logicalHeight = 0) const |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 } | 132 } |
135 | 133 |
136 virtual bool updateLogicalWidthAndColumnWidth() override; | 134 virtual bool updateLogicalWidthAndColumnWidth() override; |
137 | 135 |
138 void determineLogicalLeftPositionForChild(RenderBox* child); | 136 void determineLogicalLeftPositionForChild(RenderBox* child); |
139 | 137 |
140 private: | 138 private: |
141 void layoutBlockFlow(bool relayoutChildren, SubtreeLayoutScope&); | 139 void layoutBlockFlow(bool relayoutChildren, SubtreeLayoutScope&); |
142 void layoutBlockChildren(bool relayoutChildren, SubtreeLayoutScope&, LayoutU
nit beforeEdge, LayoutUnit afterEdge); | 140 void layoutBlockChildren(bool relayoutChildren, SubtreeLayoutScope&, LayoutU
nit beforeEdge, LayoutUnit afterEdge); |
143 | 141 |
144 void layoutBlockChild(RenderBox* child, MarginInfo&); | 142 void layoutBlockChild(RenderBox* child); |
145 void adjustPositionedBlock(RenderBox* child, const MarginInfo&); | 143 void adjustPositionedBlock(RenderBox* child); |
146 | 144 |
147 virtual bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitT
estLocation& locationInContainer, const LayoutPoint& accumulatedOffset) override
final; | 145 virtual bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitT
estLocation& locationInContainer, const LayoutPoint& accumulatedOffset) override
final; |
148 | 146 |
149 virtual void invalidatePaintForOverflow() override final; | 147 virtual void invalidatePaintForOverflow() override final; |
150 virtual void paintFloats(PaintInfo&, const LayoutPoint&, bool preservePhase
= false) override final; | 148 virtual void paintFloats(PaintInfo&, const LayoutPoint&, bool preservePhase
= false) override final; |
151 | 149 |
152 LayoutUnit logicalRightFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit
fixedOffset, LayoutUnit logicalHeight) const; | 150 LayoutUnit logicalRightFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit
fixedOffset, LayoutUnit logicalHeight) const; |
153 LayoutUnit logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit f
ixedOffset, LayoutUnit logicalHeight) const; | 151 LayoutUnit logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit f
ixedOffset, LayoutUnit logicalHeight) const; |
154 | 152 |
155 LayoutUnit logicalRightOffsetForPositioningFloat(LayoutUnit logicalTop, Layo
utUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining) const; | 153 LayoutUnit logicalRightOffsetForPositioningFloat(LayoutUnit logicalTop, Layo
utUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining) const; |
(...skipping 13 matching lines...) Expand all Loading... |
169 , rect(LayoutRect(f->x() - f->marginLeft(), f->y() - f->marginTop(),
f->width() + f->marginWidth(), f->height() + f->marginHeight())) | 167 , rect(LayoutRect(f->x() - f->marginLeft(), f->y() - f->marginTop(),
f->width() + f->marginWidth(), f->height() + f->marginHeight())) |
170 , everHadLayout(f->everHadLayout()) | 168 , everHadLayout(f->everHadLayout()) |
171 { | 169 { |
172 } | 170 } |
173 | 171 |
174 RenderBox* object; | 172 RenderBox* object; |
175 LayoutRect rect; | 173 LayoutRect rect; |
176 bool everHadLayout; | 174 bool everHadLayout; |
177 }; | 175 }; |
178 | 176 |
179 class MarginValues { | |
180 public: | |
181 MarginValues(LayoutUnit beforePos, LayoutUnit beforeNeg, LayoutUnit afte
rPos, LayoutUnit afterNeg) | |
182 : m_positiveMarginBefore(beforePos) | |
183 , m_negativeMarginBefore(beforeNeg) | |
184 , m_positiveMarginAfter(afterPos) | |
185 , m_negativeMarginAfter(afterNeg) | |
186 { } | |
187 | |
188 LayoutUnit positiveMarginBefore() const { return m_positiveMarginBefore;
} | |
189 LayoutUnit negativeMarginBefore() const { return m_negativeMarginBefore;
} | |
190 LayoutUnit positiveMarginAfter() const { return m_positiveMarginAfter; } | |
191 LayoutUnit negativeMarginAfter() const { return m_negativeMarginAfter; } | |
192 | |
193 void setPositiveMarginBefore(LayoutUnit pos) { m_positiveMarginBefore =
pos; } | |
194 void setNegativeMarginBefore(LayoutUnit neg) { m_negativeMarginBefore =
neg; } | |
195 void setPositiveMarginAfter(LayoutUnit pos) { m_positiveMarginAfter = po
s; } | |
196 void setNegativeMarginAfter(LayoutUnit neg) { m_negativeMarginAfter = ne
g; } | |
197 | |
198 private: | |
199 LayoutUnit m_positiveMarginBefore; | |
200 LayoutUnit m_negativeMarginBefore; | |
201 LayoutUnit m_positiveMarginAfter; | |
202 LayoutUnit m_negativeMarginAfter; | |
203 }; | |
204 MarginValues marginValuesForChild(RenderBox* child) const; | |
205 | |
206 // Allocated only when some of these fields have non-default values | |
207 struct RenderBlockFlowRareData : public DummyBase<RenderBlockFlowRareData> { | |
208 WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED_W
ILL_BE_REMOVED; | |
209 public: | |
210 RenderBlockFlowRareData(const RenderBlockFlow* block) | |
211 : m_margins(positiveMarginBeforeDefault(block), negativeMarginBefore
Default(block), positiveMarginAfterDefault(block), negativeMarginAfterDefault(bl
ock)) | |
212 , m_discardMarginBefore(false) | |
213 , m_discardMarginAfter(false) | |
214 { | |
215 } | |
216 void trace(Visitor*); | |
217 | |
218 static LayoutUnit positiveMarginBeforeDefault(const RenderBlockFlow* blo
ck) | |
219 { | |
220 return std::max<LayoutUnit>(block->marginBefore(), 0); | |
221 } | |
222 static LayoutUnit negativeMarginBeforeDefault(const RenderBlockFlow* blo
ck) | |
223 { | |
224 return std::max<LayoutUnit>(-block->marginBefore(), 0); | |
225 } | |
226 static LayoutUnit positiveMarginAfterDefault(const RenderBlockFlow* bloc
k) | |
227 { | |
228 return std::max<LayoutUnit>(block->marginAfter(), 0); | |
229 } | |
230 static LayoutUnit negativeMarginAfterDefault(const RenderBlockFlow* bloc
k) | |
231 { | |
232 return std::max<LayoutUnit>(-block->marginAfter(), 0); | |
233 } | |
234 | |
235 MarginValues m_margins; | |
236 bool m_discardMarginBefore : 1; | |
237 bool m_discardMarginAfter : 1; | |
238 }; | |
239 LayoutUnit marginOffsetForSelfCollapsingBlock(); | |
240 | |
241 protected: | 177 protected: |
242 LayoutUnit maxPositiveMarginBefore() const { return m_rareData ? m_rareData-
>m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBefor
eDefault(this); } | |
243 LayoutUnit maxNegativeMarginBefore() const { return m_rareData ? m_rareData-
>m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBefor
eDefault(this); } | |
244 LayoutUnit maxPositiveMarginAfter() const { return m_rareData ? m_rareData->
m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDe
fault(this); } | |
245 LayoutUnit maxNegativeMarginAfter() const { return m_rareData ? m_rareData->
m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDe
fault(this); } | |
246 | |
247 void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg); | |
248 void setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg); | |
249 | |
250 void setMustDiscardMarginBefore(bool = true); | |
251 void setMustDiscardMarginAfter(bool = true); | |
252 | |
253 bool mustDiscardMarginBefore() const; | |
254 bool mustDiscardMarginAfter() const; | |
255 | |
256 bool mustDiscardMarginBeforeForChild(const RenderBox*) const; | |
257 bool mustDiscardMarginAfterForChild(const RenderBox*) const; | |
258 | |
259 bool mustSeparateMarginBeforeForChild(const RenderBox*) const; | |
260 bool mustSeparateMarginAfterForChild(const RenderBox*) const; | |
261 | |
262 void initMaxMarginValues() | |
263 { | |
264 if (m_rareData) { | |
265 m_rareData->m_margins = MarginValues(RenderBlockFlowRareData::positi
veMarginBeforeDefault(this) , RenderBlockFlowRareData::negativeMarginBeforeDefau
lt(this), | |
266 RenderBlockFlowRareData::positiveMarginAfterDefault(this), Rende
rBlockFlowRareData::negativeMarginAfterDefault(this)); | |
267 | |
268 m_rareData->m_discardMarginBefore = false; | |
269 m_rareData->m_discardMarginAfter = false; | |
270 } | |
271 } | |
272 | |
273 virtual ETextAlign textAlignmentForLine(bool endsWithSoftBreak) const; | 178 virtual ETextAlign textAlignmentForLine(bool endsWithSoftBreak) const; |
274 private: | 179 private: |
275 virtual LayoutUnit collapsedMarginBefore() const override final { return max
PositiveMarginBefore() - maxNegativeMarginBefore(); } | |
276 virtual LayoutUnit collapsedMarginAfter() const override final { return maxP
ositiveMarginAfter() - maxNegativeMarginAfter(); } | |
277 | |
278 LayoutUnit collapseMargins(RenderBox* child, MarginInfo&, bool childIsSelfCo
llapsing); | |
279 LayoutUnit estimateLogicalTopPosition(RenderBox* child, const MarginInfo&); | |
280 void marginBeforeEstimateForChild(RenderBox*, LayoutUnit&, LayoutUnit&, bool
&) const; | |
281 void handleAfterSideOfBlock(RenderBox* lastChild, LayoutUnit top, LayoutUnit
bottom, MarginInfo&); | |
282 void setCollapsedBottomMargin(const MarginInfo&); | |
283 | |
284 RenderBlockFlowRareData& ensureRareData(); | |
285 | |
286 LayoutUnit m_paintInvalidationLogicalTop; | 180 LayoutUnit m_paintInvalidationLogicalTop; |
287 LayoutUnit m_paintInvalidationLogicalBottom; | 181 LayoutUnit m_paintInvalidationLogicalBottom; |
288 | 182 |
289 virtual bool isSelfCollapsingBlock() const override; | |
290 | |
291 protected: | 183 protected: |
292 OwnPtr<RenderBlockFlowRareData> m_rareData; | |
293 | |
294 friend class BreakingContext; // FIXME: It uses insertFloatingObject and pos
itionNewFloatOnLine, if we move those out from the private scope/add a helper to
LineBreaker, we can remove this friend | 184 friend class BreakingContext; // FIXME: It uses insertFloatingObject and pos
itionNewFloatOnLine, if we move those out from the private scope/add a helper to
LineBreaker, we can remove this friend |
295 friend class MarginInfo; | |
296 friend class LineBreaker; | 185 friend class LineBreaker; |
297 | 186 |
298 // FIXME-BLOCKFLOW: These methods have implementations in | 187 // FIXME-BLOCKFLOW: These methods have implementations in |
299 // RenderBlockLineLayout. They should be moved to the proper header once the | 188 // RenderBlockLineLayout. They should be moved to the proper header once the |
300 // line layout code is separated from RenderBlock and RenderBlockFlow. | 189 // line layout code is separated from RenderBlock and RenderBlockFlow. |
301 // START METHODS DEFINED IN RenderBlockLineLayout | 190 // START METHODS DEFINED IN RenderBlockLineLayout |
302 private: | 191 private: |
303 InlineFlowBox* createLineBoxes(RenderObject*, const LineInfo&, InlineBox* ch
ildBox); | 192 InlineFlowBox* createLineBoxes(RenderObject*, const LineInfo&, InlineBox* ch
ildBox); |
304 RootInlineBox* constructLine(BidiRunList<BidiRun>&, const LineInfo&); | 193 RootInlineBox* constructLine(BidiRunList<BidiRun>&, const LineInfo&); |
305 void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&,
BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAnd
FallbackFontsMap&, VerticalPositionCache&, WordMeasurements&); | 194 void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&,
BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAnd
FallbackFontsMap&, VerticalPositionCache&, WordMeasurements&); |
(...skipping 20 matching lines...) Expand all Loading... |
326 | 215 |
327 // END METHODS DEFINED IN RenderBlockLineLayout | 216 // END METHODS DEFINED IN RenderBlockLineLayout |
328 | 217 |
329 }; | 218 }; |
330 | 219 |
331 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderBlockFlow, isRenderBlockFlow()); | 220 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderBlockFlow, isRenderBlockFlow()); |
332 | 221 |
333 } // namespace blink | 222 } // namespace blink |
334 | 223 |
335 #endif // RenderBlockFlow_h | 224 #endif // RenderBlockFlow_h |
OLD | NEW |