Chromium Code Reviews| Index: Source/core/rendering/RenderVTTCue.cpp |
| diff --git a/Source/core/rendering/RenderVTTCue.cpp b/Source/core/rendering/RenderVTTCue.cpp |
| index 5c3f3b9943d3cc5fdf6b32d2023ce3b7eca975ed..5d20273e884c1250f0c8b33b183c48fef4f1e35f 100644 |
| --- a/Source/core/rendering/RenderVTTCue.cpp |
| +++ b/Source/core/rendering/RenderVTTCue.cpp |
| @@ -44,43 +44,53 @@ void RenderVTTCue::trace(Visitor* visitor) |
| RenderBlockFlow::trace(visitor); |
| } |
| -void RenderVTTCue::layout() |
| -{ |
| - RenderBlockFlow::layout(); |
| +class SnapToLinesLayouter { |
| + STACK_ALLOCATED(); |
| +public: |
| + SnapToLinesLayouter(RenderVTTCue& cueBox, VTTCue::WritingDirection writingDirection, float linePosition) |
| + : m_cueBox(cueBox) |
| + , m_cueWritingDirection(writingDirection) |
| + , m_linePosition(linePosition) |
| + { |
| + } |
| - // If WebVTT Regions are used, the regular WebVTT layout algorithm is no |
| - // longer necessary, since cues having the region parameter set do not have |
| - // any positioning parameters. Also, in this case, the regions themselves |
| - // have positioning information. |
| - if (!m_cue->regionId().isEmpty()) |
| - return; |
| + void layout(); |
| - LayoutState state(*this, locationOffset()); |
| +private: |
| + bool isOutside() const; |
| + bool isOverlapping() const; |
| + bool shouldSwitchDirection(InlineFlowBox*, LayoutUnit) const; |
| - // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13. |
| - if (m_cue->snapToLines()) |
| - repositionCueSnapToLinesSet(); |
| - else |
| - repositionCueSnapToLinesNotSet(); |
| -} |
| + void moveBoxesByStep(LayoutUnit); |
| + bool switchDirection(bool&, LayoutUnit&); |
| + |
| + bool findFirstLineBox(InlineFlowBox*&); |
| + bool initializeLayoutParameters(InlineFlowBox*, LayoutUnit&, LayoutUnit&); |
| + void placeBoxInDefaultPosition(LayoutUnit, bool&); |
| -bool RenderVTTCue::findFirstLineBox(InlineFlowBox*& firstLineBox) |
| + LayoutPoint m_specifiedPosition; |
| + RenderVTTCue& m_cueBox; |
| + VTTCue::WritingDirection m_cueWritingDirection; |
| + float m_linePosition; |
| +}; |
| + |
| +bool SnapToLinesLayouter::findFirstLineBox(InlineFlowBox*& firstLineBox) |
| { |
| - if (firstChild()->isRenderInline()) |
| - firstLineBox = toRenderInline(firstChild())->firstLineBox(); |
| + if (m_cueBox.firstChild()->isRenderInline()) |
| + firstLineBox = toRenderInline(m_cueBox.firstChild())->firstLineBox(); |
| else |
| return false; |
| return true; |
| } |
| -bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, LayoutUnit& step, LayoutUnit& position) |
| +bool SnapToLinesLayouter::initializeLayoutParameters(InlineFlowBox* firstLineBox, LayoutUnit& step, LayoutUnit& position) |
| { |
| - ASSERT(firstChild()); |
| + ASSERT(m_cueBox.firstChild()); |
| // 4. Horizontal: Let step be the height of the first line box in boxes. |
| // Vertical: Let step be the width of the first line box in boxes. |
| - step = m_cue->getWritingDirection() == VTTCue::Horizontal ? firstLineBox->size().height() : firstLineBox->size().width(); |
| + step = m_cueWritingDirection == VTTCue::Horizontal ? firstLineBox->size().height() : firstLineBox->size().width(); |
| // 5. If step is zero, then jump to the step labeled done positioning below. |
| if (!step) |
| @@ -88,10 +98,10 @@ bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, Layou |
| // 6. Let line position be the text track cue computed line position. |
| // 7. Round line position to an integer by adding 0.5 and then flooring it. |
| - LayoutUnit linePosition = floorf(m_cue->calculateComputedLinePosition() + 0.5f); |
| + LayoutUnit linePosition = floorf(m_linePosition + 0.5f); |
| // 8. Vertical Growing Left: Add one to line position then negate it. |
| - if (m_cue->getWritingDirection() == VTTCue::VerticalGrowingLeft) |
| + if (m_cueWritingDirection == VTTCue::VerticalGrowingLeft) |
| linePosition = -(linePosition + 1); |
| // 9. Let position be the result of multiplying step and line position. |
| @@ -99,18 +109,18 @@ bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, Layou |
| // 10. Vertical Growing Left: Decrease position by the width of the |
| // bounding box of the boxes in boxes, then increase position by step. |
| - if (m_cue->getWritingDirection() == VTTCue::VerticalGrowingLeft) { |
| - position -= size().width(); |
| + if (m_cueWritingDirection == VTTCue::VerticalGrowingLeft) { |
| + position -= m_cueBox.size().width(); |
| position += step; |
| } |
| // 11. If line position is less than zero... |
| if (linePosition < 0) { |
| - RenderBlock* parentBlock = containingBlock(); |
| + RenderBlock* parentBlock = m_cueBox.containingBlock(); |
| // Horizontal / Vertical: ... then increase position by the |
| // height / width of the video's rendering area ... |
| - position += m_cue->getWritingDirection() == VTTCue::Horizontal ? parentBlock->size().height() : parentBlock->size().width(); |
| + position += m_cueWritingDirection == VTTCue::Horizontal ? parentBlock->size().height() : parentBlock->size().width(); |
| // ... and negate step. |
| step = -step; |
| @@ -118,19 +128,19 @@ bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, Layou |
| return true; |
| } |
| -void RenderVTTCue::placeBoxInDefaultPosition(LayoutUnit position, bool& switched) |
| +void SnapToLinesLayouter::placeBoxInDefaultPosition(LayoutUnit position, bool& switched) |
| { |
| // 12. Move all boxes in boxes ... |
| - if (m_cue->getWritingDirection() == VTTCue::Horizontal) { |
| + if (m_cueWritingDirection == VTTCue::Horizontal) { |
| // Horizontal: ... down by the distance given by position |
| - setY(location().y() + position); |
| + m_cueBox.setY(m_cueBox.location().y() + position); |
| } else { |
| // Vertical: ... right by the distance given by position |
| - setX(location().x() + position); |
| + m_cueBox.setX(m_cueBox.location().x() + position); |
| } |
| // 13. Remember the position of all the boxes in boxes as their specified position. |
| - m_specifiedPosition = location(); |
| + m_specifiedPosition = m_cueBox.location(); |
| // 14. Let best position be null. It will hold a position for boxes, much like specified position in the previous step. |
| // 15. Let best position score be null. |
| @@ -139,27 +149,27 @@ void RenderVTTCue::placeBoxInDefaultPosition(LayoutUnit position, bool& switched |
| switched = false; |
| } |
| -bool RenderVTTCue::isOutside() const |
| +bool SnapToLinesLayouter::isOutside() const |
| { |
| - return !containingBlock()->absoluteBoundingBoxRect().contains(absoluteContentBox()); |
| + return !m_cueBox.containingBlock()->absoluteBoundingBoxRect().contains(m_cueBox.absoluteContentBox()); |
| } |
| -bool RenderVTTCue::isOverlapping() const |
| +bool SnapToLinesLayouter::isOverlapping() const |
| { |
| - for (RenderObject* box = previousSibling(); box; box = box->previousSibling()) { |
| + for (RenderObject* box = m_cueBox.previousSibling(); box; box = box->previousSibling()) { |
| IntRect boxRect = box->absoluteBoundingBoxRect(); |
| - if (absoluteBoundingBoxRect().intersects(boxRect)) |
| + if (m_cueBox.absoluteBoundingBoxRect().intersects(boxRect)) |
| return true; |
| } |
| return false; |
| } |
| -bool RenderVTTCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit step) const |
| +bool SnapToLinesLayouter::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit step) const |
| { |
| - LayoutUnit top = location().y(); |
| - LayoutUnit left = location().x(); |
| + LayoutUnit top = m_cueBox.location().y(); |
| + LayoutUnit left = m_cueBox.location().x(); |
| LayoutUnit bottom = top + firstLineBox->size().height(); |
| LayoutUnit right = left + firstLineBox->size().width(); |
| @@ -167,8 +177,8 @@ bool RenderVTTCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit |
| // boxes is now above the top of the title area, or if step is positive and |
| // the bottom of the first line box in boxes is now below the bottom of the |
| // title area, jump to the step labeled switch direction. |
| - LayoutUnit parentHeight = containingBlock()->size().height(); |
| - if (m_cue->getWritingDirection() == VTTCue::Horizontal && ((step < 0 && top < 0) || (step > 0 && bottom > parentHeight))) |
| + LayoutUnit parentHeight = m_cueBox.containingBlock()->size().height(); |
| + if (m_cueWritingDirection == VTTCue::Horizontal && ((step < 0 && top < 0) || (step > 0 && bottom > parentHeight))) |
| return true; |
| // 21. Vertical: If step is negative and the left edge of the first line |
| @@ -176,29 +186,29 @@ bool RenderVTTCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit |
| // if step is positive and the right edge of the first line box in boxes is |
| // now to the right of the right edge of the title area, jump to the step |
| // labeled switch direction. |
| - LayoutUnit parentWidth = containingBlock()->size().width(); |
| - if (m_cue->getWritingDirection() != VTTCue::Horizontal && ((step < 0 && left < 0) || (step > 0 && right > parentWidth))) |
| + LayoutUnit parentWidth = m_cueBox.containingBlock()->size().width(); |
| + if (m_cueWritingDirection != VTTCue::Horizontal && ((step < 0 && left < 0) || (step > 0 && right > parentWidth))) |
| return true; |
| return false; |
| } |
| -void RenderVTTCue::moveBoxesByStep(LayoutUnit step) |
| +void SnapToLinesLayouter::moveBoxesByStep(LayoutUnit step) |
| { |
| // 22. Horizontal: Move all the boxes in boxes down by the distance |
| // given by step. (If step is negative, then this will actually |
| // result in an upwards movement of the boxes in absolute terms.) |
| - if (m_cue->getWritingDirection() == VTTCue::Horizontal) |
| - setY(location().y() + step); |
| + if (m_cueWritingDirection == VTTCue::Horizontal) |
| + m_cueBox.setY(m_cueBox.location().y() + step); |
| // 22. Vertical: Move all the boxes in boxes right by the distance |
| // given by step. (If step is negative, then this will actually |
| // result in a leftwards movement of the boxes in absolute terms.) |
| else |
| - setX(location().x() + step); |
| + m_cueBox.setX(m_cueBox.location().x() + step); |
| } |
| -bool RenderVTTCue::switchDirection(bool& switched, LayoutUnit& step) |
| +bool SnapToLinesLayouter::switchDirection(bool& switched, LayoutUnit& step) |
| { |
| // 24. Switch direction: If switched is true, then move all the boxes in |
| // boxes back to their best position, and jump to the step labeled done |
| @@ -206,7 +216,7 @@ bool RenderVTTCue::switchDirection(bool& switched, LayoutUnit& step) |
| // 25. Otherwise, move all the boxes in boxes back to their specified |
| // position as determined in the earlier step. |
| - setLocation(m_specifiedPosition); |
| + m_cueBox.setLocation(m_specifiedPosition); |
| // XX. If switched is true, jump to the step labeled done |
| // positioning below. |
| @@ -221,7 +231,7 @@ bool RenderVTTCue::switchDirection(bool& switched, LayoutUnit& step) |
| return true; |
| } |
| -void RenderVTTCue::repositionCueSnapToLinesSet() |
| +void SnapToLinesLayouter::layout() |
| { |
| // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings |
| // Step 13, "If cue's text track cue snap-to-lines flag is set". |
| @@ -266,25 +276,6 @@ void RenderVTTCue::repositionCueSnapToLinesSet() |
| // 28. Jump back to the step labeled step loop. |
| } |
| - |
| - // Acommodate extra top and bottom padding, border or margin. |
| - // Note: this is supported only for internal UA styling, not through the cue selector. |
| - if (hasInlineDirectionBordersPaddingOrMargin()) { |
| - IntRect containerRect = containingBlock()->absoluteBoundingBoxRect(); |
| - IntRect cueRect = absoluteBoundingBoxRect(); |
| - |
| - int topOverflow = cueRect.y() - containerRect.y(); |
| - int bottomOverflow = containerRect.y() + containerRect.height() - cueRect.y() - cueRect.height(); |
| - |
| - int adjustment = 0; |
| - if (topOverflow < 0) |
| - adjustment = -topOverflow; |
| - else if (bottomOverflow < 0) |
| - adjustment = bottomOverflow; |
| - |
| - if (adjustment) |
| - setY(location().y() + adjustment); |
| - } |
| } |
| void RenderVTTCue::repositionCueSnapToLinesNotSet() |
| @@ -331,5 +322,52 @@ void RenderVTTCue::repositionCueSnapToLinesNotSet() |
| // boxes will unfortunately overlap.) |
| } |
| +void RenderVTTCue::adjustForTopAndBottomMarginBorderAndPadding() |
|
philipj_slow
2015/01/27 05:06:59
Does this bit make sense to you? It looks like it'
fs
2015/01/27 12:15:53
Not really, no.
|
| +{ |
| + // Accommodate extra top and bottom padding, border or margin. |
| + // Note: this is supported only for internal UA styling, not through the cue selector. |
| + if (!hasInlineDirectionBordersPaddingOrMargin()) |
| + return; |
| + IntRect containerRect = containingBlock()->absoluteBoundingBoxRect(); |
| + IntRect cueRect = absoluteBoundingBoxRect(); |
| + |
| + int topOverflow = cueRect.y() - containerRect.y(); |
| + int bottomOverflow = containerRect.y() + containerRect.height() - cueRect.y() - cueRect.height(); |
| + |
| + int adjustment = 0; |
| + if (topOverflow < 0) |
| + adjustment = -topOverflow; |
| + else if (bottomOverflow < 0) |
| + adjustment = bottomOverflow; |
| + |
| + if (!adjustment) |
| + return; |
| + |
| + setY(location().y() + adjustment); |
| +} |
| + |
| +void RenderVTTCue::layout() |
| +{ |
| + RenderBlockFlow::layout(); |
| + |
| + // If WebVTT Regions are used, the regular WebVTT layout algorithm is no |
| + // longer necessary, since cues having the region parameter set do not have |
| + // any positioning parameters. Also, in this case, the regions themselves |
| + // have positioning information. |
| + if (!m_cue->regionId().isEmpty()) |
| + return; |
| + |
| + LayoutState state(*this, locationOffset()); |
| + |
| + // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13. |
| + if (m_cue->snapToLines()) { |
| + SnapToLinesLayouter(*this, m_cue->getWritingDirection(), m_cue->calculateComputedLinePosition()).layout(); |
| + |
| + adjustForTopAndBottomMarginBorderAndPadding(); |
| + } else { |
| + repositionCueSnapToLinesNotSet(); |
| + } |
| +} |
| + |
| } // namespace blink |