| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
| 15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
| 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
| 18 * | 18 * |
| 19 */ | 19 */ |
| 20 | 20 |
| 21 #ifndef InlineFlowBox_h | 21 #ifndef InlineFlowBox_h |
| 22 #define InlineFlowBox_h | 22 #define InlineFlowBox_h |
| 23 | 23 |
| 24 #include "core/rendering/FloatToLayoutUnit.h" |
| 24 #include "core/rendering/InlineBox.h" | 25 #include "core/rendering/InlineBox.h" |
| 25 #include "core/rendering/RenderObjectInlines.h" | 26 #include "core/rendering/RenderObjectInlines.h" |
| 26 #include "core/rendering/RenderOverflow.h" | 27 #include "core/rendering/RenderOverflow.h" |
| 27 #include "core/rendering/style/ShadowData.h" | 28 #include "core/rendering/style/ShadowData.h" |
| 28 | 29 |
| 29 namespace blink { | 30 namespace blink { |
| 30 | 31 |
| 31 class HitTestRequest; | 32 class HitTestRequest; |
| 32 class HitTestResult; | 33 class HitTestResult; |
| 33 class InlineTextBox; | 34 class InlineTextBox; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 { | 99 { |
| 99 InlineBox::setConstructed(); | 100 InlineBox::setConstructed(); |
| 100 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()
) | 101 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()
) |
| 101 child->setConstructed(); | 102 child->setConstructed(); |
| 102 } | 103 } |
| 103 | 104 |
| 104 void addToLine(InlineBox* child); | 105 void addToLine(InlineBox* child); |
| 105 virtual void deleteLine() override final; | 106 virtual void deleteLine() override final; |
| 106 virtual void extractLine() override final; | 107 virtual void extractLine() override final; |
| 107 virtual void attachLine() override final; | 108 virtual void attachLine() override final; |
| 108 virtual void adjustPosition(float dx, float dy) override; | 109 virtual void adjustPosition(FloatWillBeLayoutUnit dx, FloatWillBeLayoutUnit
dy) override; |
| 109 | 110 |
| 110 virtual void extractLineBoxFromRenderObject(); | 111 virtual void extractLineBoxFromRenderObject(); |
| 111 virtual void attachLineBoxToRenderObject(); | 112 virtual void attachLineBoxToRenderObject(); |
| 112 virtual void removeLineBoxFromRenderObject(); | 113 virtual void removeLineBoxFromRenderObject(); |
| 113 | 114 |
| 114 virtual void clearTruncation() override; | 115 virtual void clearTruncation() override; |
| 115 | 116 |
| 116 IntRect roundedFrameRect() const; | 117 IntRect roundedFrameRect() const; |
| 117 | 118 |
| 118 virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, Layou
tUnit lineBottom) override; | 119 virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, Layou
tUnit lineBottom) override; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 bool includeLogicalRightEdge() const { return m_includeLogicalRightEdge; } | 167 bool includeLogicalRightEdge() const { return m_includeLogicalRightEdge; } |
| 167 void setEdges(bool includeLeft, bool includeRight) | 168 void setEdges(bool includeLeft, bool includeRight) |
| 168 { | 169 { |
| 169 m_includeLogicalLeftEdge = includeLeft; | 170 m_includeLogicalLeftEdge = includeLeft; |
| 170 m_includeLogicalRightEdge = includeRight; | 171 m_includeLogicalRightEdge = includeRight; |
| 171 } | 172 } |
| 172 | 173 |
| 173 // Helper functions used during line construction and placement. | 174 // Helper functions used during line construction and placement. |
| 174 void determineSpacingForFlowBoxes(bool lastLine, bool isLogicallyLastRunWrap
ped, RenderObject* logicallyLastRunRenderer); | 175 void determineSpacingForFlowBoxes(bool lastLine, bool isLogicallyLastRunWrap
ped, RenderObject* logicallyLastRunRenderer); |
| 175 LayoutUnit getFlowSpacingLogicalWidth(); | 176 LayoutUnit getFlowSpacingLogicalWidth(); |
| 176 float placeBoxesInInlineDirection(float logicalLeft, bool& needsWordSpacing)
; | 177 FloatWillBeLayoutUnit placeBoxesInInlineDirection(FloatWillBeLayoutUnit logi
calLeft, bool& needsWordSpacing); |
| 177 float placeBoxRangeInInlineDirection(InlineBox* firstChild, InlineBox* lastC
hild, | 178 FloatWillBeLayoutUnit placeBoxRangeInInlineDirection(InlineBox* firstChild,
InlineBox* lastChild, |
| 178 float& logicalLeft, float& minLogicalLeft, float& maxLogicalRight, bool&
needsWordSpacing); | 179 FloatWillBeLayoutUnit& logicalLeft, FloatWillBeLayoutUnit& minLogicalLef
t, FloatWillBeLayoutUnit& maxLogicalRight, bool& needsWordSpacing); |
| 179 void beginPlacingBoxRangesInInlineDirection(float logicalLeft) { setLogicalL
eft(logicalLeft); } | 180 void beginPlacingBoxRangesInInlineDirection(FloatWillBeLayoutUnit logicalLef
t) { setLogicalLeft(logicalLeft); } |
| 180 void endPlacingBoxRangesInInlineDirection(float logicalLeft, float logicalRi
ght, float minLogicalLeft, float maxLogicalRight) | 181 void endPlacingBoxRangesInInlineDirection(FloatWillBeLayoutUnit logicalLeft,
FloatWillBeLayoutUnit logicalRight, FloatWillBeLayoutUnit minLogicalLeft, Float
WillBeLayoutUnit maxLogicalRight) |
| 181 { | 182 { |
| 182 setLogicalWidth(logicalRight - logicalLeft); | 183 setLogicalWidth(logicalRight - logicalLeft); |
| 183 if (knownToHaveNoOverflow() && (minLogicalLeft < logicalLeft || maxLogic
alRight > logicalRight)) | 184 if (knownToHaveNoOverflow() && (minLogicalLeft < logicalLeft || maxLogic
alRight > logicalRight)) |
| 184 clearKnownToHaveNoOverflow(); | 185 clearKnownToHaveNoOverflow(); |
| 185 } | 186 } |
| 186 | 187 |
| 187 void computeLogicalBoxHeights(RootInlineBox*, LayoutUnit& maxPositionTop, La
youtUnit& maxPositionBottom, | 188 void computeLogicalBoxHeights(RootInlineBox*, LayoutUnit& maxPositionTop, La
youtUnit& maxPositionBottom, |
| 188 int& maxAscent, int& maxDescent, bool& setMaxA
scent, bool& setMaxDescent, | 189 int& maxAscent, int& maxDescent, bool& setMaxA
scent, bool& setMaxDescent, |
| 189 bool strictMode, GlyphOverflowAndFallbackFonts
Map&, FontBaseline, VerticalPositionCache&); | 190 bool strictMode, GlyphOverflowAndFallbackFonts
Map&, FontBaseline, VerticalPositionCache&); |
| 190 void adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent, | 191 void adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent, |
| 191 int maxPositionTop, int maxPositionBottom); | 192 int maxPositionTop, int maxPositionBottom); |
| 192 void placeBoxesInBlockDirection(LayoutUnit logicalTop, LayoutUnit maxHeight,
int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom, La
youtUnit& selectionBottom, bool& setLineTop, | 193 void placeBoxesInBlockDirection(LayoutUnit logicalTop, LayoutUnit maxHeight,
int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom, La
youtUnit& selectionBottom, bool& setLineTop, |
| 193 LayoutUnit& lineTopIncludingMargins, LayoutU
nit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool& hasAnnotation
sAfter, FontBaseline); | 194 LayoutUnit& lineTopIncludingMargins, LayoutU
nit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool& hasAnnotation
sAfter, FontBaseline); |
| 194 void flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lineBottom); | 195 void flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lineBottom); |
| 195 bool requiresIdeographicBaseline(const GlyphOverflowAndFallbackFontsMap&) co
nst; | 196 bool requiresIdeographicBaseline(const GlyphOverflowAndFallbackFontsMap&) co
nst; |
| 196 | 197 |
| 197 LayoutUnit computeOverAnnotationAdjustment(LayoutUnit allowedPosition) const
; | 198 LayoutUnit computeOverAnnotationAdjustment(LayoutUnit allowedPosition) const
; |
| 198 LayoutUnit computeUnderAnnotationAdjustment(LayoutUnit allowedPosition) cons
t; | 199 LayoutUnit computeUnderAnnotationAdjustment(LayoutUnit allowedPosition) cons
t; |
| 199 | 200 |
| 200 void computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, GlyphOverflo
wAndFallbackFontsMap&); | 201 void computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, GlyphOverflo
wAndFallbackFontsMap&); |
| 201 | 202 |
| 202 void removeChild(InlineBox* child, MarkLineBoxes); | 203 void removeChild(InlineBox* child, MarkLineBoxes); |
| 203 | 204 |
| 204 virtual RenderObject::SelectionState selectionState() const override; | 205 virtual RenderObject::SelectionState selectionState() const override; |
| 205 | 206 |
| 206 virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWid
th) const override final; | 207 virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWid
th) const override final; |
| 207 virtual float placeEllipsisBox(bool ltr, float blockLeftEdge, float blockRig
htEdge, float ellipsisWidth, float &truncatedWidth, bool&) override; | 208 virtual FloatWillBeLayoutUnit placeEllipsisBox(bool ltr, FloatWillBeLayoutUn
it blockLeftEdge, FloatWillBeLayoutUnit blockRightEdge, FloatWillBeLayoutUnit el
lipsisWidth, FloatWillBeLayoutUnit &truncatedWidth, bool&) override; |
| 208 | 209 |
| 209 bool hasTextChildren() const { return m_hasTextChildren; } | 210 bool hasTextChildren() const { return m_hasTextChildren; } |
| 210 bool hasTextDescendants() const { return m_hasTextDescendants; } | 211 bool hasTextDescendants() const { return m_hasTextDescendants; } |
| 211 void setHasTextDescendants() { m_hasTextDescendants = true; } | 212 void setHasTextDescendants() { m_hasTextDescendants = true; } |
| 212 | 213 |
| 213 void checkConsistency() const; | 214 void checkConsistency() const; |
| 214 void setHasBadChildList(); | 215 void setHasBadChildList(); |
| 215 | 216 |
| 216 // Line visual and layout overflow are in the coordinate space of the block.
This means that they aren't purely physical directions. | 217 // Line visual and layout overflow are in the coordinate space of the block.
This means that they aren't purely physical directions. |
| 217 // For horizontal-tb and vertical-lr they will match physical directions, bu
t for horizontal-bt and vertical-rl, the top/bottom and left/right | 218 // For horizontal-tb and vertical-lr they will match physical directions, bu
t for horizontal-bt and vertical-rl, the top/bottom and left/right |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 LayoutRect logicalVisualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBott
om) const | 262 LayoutRect logicalVisualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBott
om) const |
| 262 { | 263 { |
| 263 LayoutRect result = visualOverflowRect(lineTop, lineBottom); | 264 LayoutRect result = visualOverflowRect(lineTop, lineBottom); |
| 264 if (!renderer().isHorizontalWritingMode()) | 265 if (!renderer().isHorizontalWritingMode()) |
| 265 result = result.transposedRect(); | 266 result = result.transposedRect(); |
| 266 return result; | 267 return result; |
| 267 } | 268 } |
| 268 | 269 |
| 269 void setOverflowFromLogicalRects(const LayoutRect& logicalLayoutOverflow, co
nst LayoutRect& logicalVisualOverflow, LayoutUnit lineTop, LayoutUnit lineBottom
); | 270 void setOverflowFromLogicalRects(const LayoutRect& logicalLayoutOverflow, co
nst LayoutRect& logicalVisualOverflow, LayoutUnit lineTop, LayoutUnit lineBottom
); |
| 270 | 271 |
| 271 FloatRect frameRectIncludingLineHeight(LayoutUnit lineTop, LayoutUnit lineBo
ttom) const | 272 FloatRectWillBeLayoutRect frameRectIncludingLineHeight(LayoutUnit lineTop, L
ayoutUnit lineBottom) const |
| 272 { | 273 { |
| 273 if (isHorizontal()) | 274 if (isHorizontal()) |
| 274 return FloatRect(m_topLeft.x(), lineTop.toFloat(), width(), (lineBot
tom - lineTop).toFloat()); | 275 return FloatRectWillBeLayoutRect(m_topLeft.x(), lineTop.toFloat(), w
idth(), (lineBottom - lineTop).toFloat()); |
| 275 return FloatRect(lineTop.toFloat(), m_topLeft.y(), (lineBottom - lineTop
).toFloat(), height()); | 276 return FloatRectWillBeLayoutRect(lineTop.toFloat(), m_topLeft.y(), (line
Bottom - lineTop).toFloat(), height()); |
| 276 } | 277 } |
| 277 | 278 |
| 278 FloatRect logicalFrameRectIncludingLineHeight(LayoutUnit lineTop, LayoutUnit
lineBottom) const | 279 FloatRectWillBeLayoutRect logicalFrameRectIncludingLineHeight(LayoutUnit lin
eTop, LayoutUnit lineBottom) const |
| 279 { | 280 { |
| 280 return FloatRect(logicalLeft(), lineTop.toFloat(), logicalWidth(), (line
Bottom - lineTop).toFloat()); | 281 return FloatRectWillBeLayoutRect(logicalLeft(), lineTop.toFloat(), logic
alWidth(), (lineBottom - lineTop).toFloat()); |
| 281 } | 282 } |
| 282 | 283 |
| 283 bool descendantsHaveSameLineHeightAndBaseline() const { return m_descendants
HaveSameLineHeightAndBaseline; } | 284 bool descendantsHaveSameLineHeightAndBaseline() const { return m_descendants
HaveSameLineHeightAndBaseline; } |
| 284 void clearDescendantsHaveSameLineHeightAndBaseline() | 285 void clearDescendantsHaveSameLineHeightAndBaseline() |
| 285 { | 286 { |
| 286 m_descendantsHaveSameLineHeightAndBaseline = false; | 287 m_descendantsHaveSameLineHeightAndBaseline = false; |
| 287 if (parent() && parent()->descendantsHaveSameLineHeightAndBaseline()) | 288 if (parent() && parent()->descendantsHaveSameLineHeightAndBaseline()) |
| 288 parent()->clearDescendantsHaveSameLineHeightAndBaseline(); | 289 parent()->clearDescendantsHaveSameLineHeightAndBaseline(); |
| 289 } | 290 } |
| 290 | 291 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 304 virtual bool isInlineFlowBox() const override final { return true; } | 305 virtual bool isInlineFlowBox() const override final { return true; } |
| 305 | 306 |
| 306 InlineBox* m_firstChild; | 307 InlineBox* m_firstChild; |
| 307 InlineBox* m_lastChild; | 308 InlineBox* m_lastChild; |
| 308 | 309 |
| 309 InlineFlowBox* m_prevLineBox; // The previous box that also uses our RenderO
bject | 310 InlineFlowBox* m_prevLineBox; // The previous box that also uses our RenderO
bject |
| 310 InlineFlowBox* m_nextLineBox; // The next box that also uses our RenderObjec
t | 311 InlineFlowBox* m_nextLineBox; // The next box that also uses our RenderObjec
t |
| 311 | 312 |
| 312 // Maximum logicalTop among all children of an InlineFlowBox. Used to | 313 // Maximum logicalTop among all children of an InlineFlowBox. Used to |
| 313 // calculate the offset for TextUnderlinePositionUnder. | 314 // calculate the offset for TextUnderlinePositionUnder. |
| 314 void computeMaxLogicalTop(float& maxLogicalTop) const; | 315 void computeMaxLogicalTop(FloatWillBeLayoutUnit& maxLogicalTop) const; |
| 315 | 316 |
| 316 private: | 317 private: |
| 317 unsigned m_includeLogicalLeftEdge : 1; | 318 unsigned m_includeLogicalLeftEdge : 1; |
| 318 unsigned m_includeLogicalRightEdge : 1; | 319 unsigned m_includeLogicalRightEdge : 1; |
| 319 unsigned m_hasTextChildren : 1; | 320 unsigned m_hasTextChildren : 1; |
| 320 unsigned m_hasTextDescendants : 1; | 321 unsigned m_hasTextDescendants : 1; |
| 321 unsigned m_descendantsHaveSameLineHeightAndBaseline : 1; | 322 unsigned m_descendantsHaveSameLineHeightAndBaseline : 1; |
| 322 | 323 |
| 323 protected: | 324 protected: |
| 324 // The following members are only used by RootInlineBox but moved here to ke
ep the bits packed. | 325 // The following members are only used by RootInlineBox but moved here to ke
ep the bits packed. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } | 359 } |
| 359 | 360 |
| 360 } // namespace blink | 361 } // namespace blink |
| 361 | 362 |
| 362 #ifndef NDEBUG | 363 #ifndef NDEBUG |
| 363 // Outside the WebCore namespace for ease of invocation from gdb. | 364 // Outside the WebCore namespace for ease of invocation from gdb. |
| 364 void showTree(const blink::InlineFlowBox*); | 365 void showTree(const blink::InlineFlowBox*); |
| 365 #endif | 366 #endif |
| 366 | 367 |
| 367 #endif // InlineFlowBox_h | 368 #endif // InlineFlowBox_h |
| OLD | NEW |