| Index: Source/core/rendering/RenderVTTCue.cpp
|
| diff --git a/Source/core/rendering/RenderVTTCue.cpp b/Source/core/rendering/RenderVTTCue.cpp
|
| index 2bfd886e05db7d7140d830a34928f455aff2522e..5c3f3b9943d3cc5fdf6b32d2023ce3b7eca975ed 100644
|
| --- a/Source/core/rendering/RenderVTTCue.cpp
|
| +++ b/Source/core/rendering/RenderVTTCue.cpp
|
| @@ -57,6 +57,7 @@ void RenderVTTCue::layout()
|
|
|
| LayoutState state(*this, locationOffset());
|
|
|
| + // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13.
|
| if (m_cue->snapToLines())
|
| repositionCueSnapToLinesSet();
|
| else
|
| @@ -77,35 +78,36 @@ bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, Layou
|
| {
|
| ASSERT(firstChild());
|
|
|
| - RenderBlock* parentBlock = containingBlock();
|
| -
|
| - // 1. Horizontal: Let step be the height of the first line box in boxes.
|
| + // 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();
|
|
|
| - // 2. If step is zero, then jump to the step labeled done positioning below.
|
| + // 5. If step is zero, then jump to the step labeled done positioning below.
|
| if (!step)
|
| return false;
|
|
|
| - // 3. Let line position be the text track cue computed line position.
|
| - int linePosition = m_cue->calculateComputedLinePosition();
|
| + // 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);
|
|
|
| - // 4. Vertical Growing Left: Add one to line position then negate it.
|
| + // 8. Vertical Growing Left: Add one to line position then negate it.
|
| if (m_cue->getWritingDirection() == VTTCue::VerticalGrowingLeft)
|
| linePosition = -(linePosition + 1);
|
|
|
| - // 5. Let position be the result of multiplying step and line position.
|
| + // 9. Let position be the result of multiplying step and line position.
|
| position = step * linePosition;
|
|
|
| - // 6. Vertical Growing Left: Decrease position by the width of the
|
| + // 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();
|
| position += step;
|
| }
|
|
|
| - // 7. If line position is less than zero...
|
| + // 11. If line position is less than zero...
|
| if (linePosition < 0) {
|
| + RenderBlock* parentBlock = 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();
|
| @@ -113,13 +115,12 @@ bool RenderVTTCue::initializeLayoutParameters(InlineFlowBox* firstLineBox, Layou
|
| // ... and negate step.
|
| step = -step;
|
| }
|
| -
|
| return true;
|
| }
|
|
|
| void RenderVTTCue::placeBoxInDefaultPosition(LayoutUnit position, bool& switched)
|
| {
|
| - // 8. Move all boxes in boxes ...
|
| + // 12. Move all boxes in boxes ...
|
| if (m_cue->getWritingDirection() == VTTCue::Horizontal) {
|
| // Horizontal: ... down by the distance given by position
|
| setY(location().y() + position);
|
| @@ -128,11 +129,13 @@ void RenderVTTCue::placeBoxInDefaultPosition(LayoutUnit position, bool& switched
|
| setX(location().x() + position);
|
| }
|
|
|
| - // 9. Default: Remember the position of all the boxes in boxes as their
|
| - // default position.
|
| - m_defaultPosition = location();
|
| + // 13. Remember the position of all the boxes in boxes as their specified position.
|
| + m_specifiedPosition = 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.
|
|
|
| - // 10. Let switched be false.
|
| + // 16. Let switched be false.
|
| switched = false;
|
| }
|
|
|
| @@ -160,20 +163,19 @@ bool RenderVTTCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit
|
| LayoutUnit bottom = top + firstLineBox->size().height();
|
| LayoutUnit right = left + firstLineBox->size().width();
|
|
|
| - // 12. Horizontal: If step is negative and the top of the first line
|
| - // box in boxes is now above the top of the video's rendering area,
|
| - // or if step is positive and the bottom of the first line box in
|
| - // boxes is now below the bottom of the video's rendering area, jump
|
| - // to the step labeled switch direction.
|
| + // 21. Horizontal: If step is negative and the top of the first line box in
|
| + // 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)))
|
| return true;
|
|
|
| - // 12. Vertical: If step is negative and the left edge of the first line
|
| - // box in boxes is now to the left of the left edge of the video's
|
| - // rendering area, or 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 video's rendering area, jump to the step labeled switch direction.
|
| + // 21. Vertical: If step is negative and the left edge of the first line
|
| + // box in boxes is now to the left of the left edge of the title area, or
|
| + // 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)))
|
| return true;
|
| @@ -183,13 +185,13 @@ bool RenderVTTCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit
|
|
|
| void RenderVTTCue::moveBoxesByStep(LayoutUnit step)
|
| {
|
| - // 13. Horizontal: Move all the boxes in boxes down by the distance
|
| + // 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);
|
|
|
| - // 13. Vertical: Move all the boxes in boxes right by the distance
|
| + // 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
|
| @@ -198,51 +200,71 @@ void RenderVTTCue::moveBoxesByStep(LayoutUnit step)
|
|
|
| bool RenderVTTCue::switchDirection(bool& switched, LayoutUnit& step)
|
| {
|
| - // 15. Switch direction: Move all the boxes in boxes back to their
|
| - // default position as determined in the step above labeled default.
|
| - setLocation(m_defaultPosition);
|
| + // 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
|
| + // positioning below.
|
| +
|
| + // 25. Otherwise, move all the boxes in boxes back to their specified
|
| + // position as determined in the earlier step.
|
| + setLocation(m_specifiedPosition);
|
|
|
| - // 16. If switched is true, jump to the step labeled done
|
| + // XX. If switched is true, jump to the step labeled done
|
| // positioning below.
|
| if (switched)
|
| return false;
|
|
|
| - // 17. Negate step.
|
| + // 26. Negate step.
|
| step = -step;
|
|
|
| - // 18. Set switched to true.
|
| + // 27. Set switched to true.
|
| switched = true;
|
| return true;
|
| }
|
|
|
| void RenderVTTCue::repositionCueSnapToLinesSet()
|
| {
|
| - InlineFlowBox* firstLineBox;
|
| - LayoutUnit step;
|
| - LayoutUnit position;
|
| + // 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".
|
|
|
| + InlineFlowBox* firstLineBox;
|
| if (!findFirstLineBox(firstLineBox))
|
| return;
|
|
|
| + // Step 1 skipped.
|
| +
|
| + LayoutUnit step;
|
| + LayoutUnit position;
|
| if (!initializeLayoutParameters(firstLineBox, step, position))
|
| return;
|
|
|
| bool switched;
|
| placeBoxInDefaultPosition(position, switched);
|
|
|
| - // 11. Step loop: If none of the boxes in boxes would overlap any of the boxes
|
| - // in output and all the boxes in output are within the video's rendering area
|
| - // then jump to the step labeled done positioning.
|
| + // Step 17 skipped. (margin == 0; title area == video area)
|
| +
|
| + // 18. Step loop: If none of the boxes in boxes would overlap any of the
|
| + // boxes in output, and all of the boxes in output are entirely within the
|
| + // title area box, then jump to the step labeled done positioning below.
|
| while (isOutside() || isOverlapping()) {
|
| + // 19. Let current position score be the percentage of the area of the
|
| + // bounding box of the boxes in boxes that is outside the title area
|
| + // box.
|
| + // 20. If best position is null (i.e. this is the first run through
|
| + // this loop, switched is still false, the boxes in boxes are at their
|
| + // specified position, and best position score is still null), or if
|
| + // current position score is a lower percentage than that in best
|
| + // position score, then remember the position of all the boxes in boxes
|
| + // as their best position, and set best position score to current
|
| + // position score.
|
| if (!shouldSwitchDirection(firstLineBox, step)) {
|
| - // 13. Move all the boxes in boxes ...
|
| - // 14. Jump back to the step labeled step loop.
|
| + // 22. Move all the boxes in boxes ...
|
| moveBoxesByStep(step);
|
| + // 23. Jump back to the step labeled step loop.
|
| } else if (!switchDirection(switched, step)) {
|
| break;
|
| }
|
|
|
| - // 19. Jump back to the step labeled step loop.
|
| + // 28. Jump back to the step labeled step loop.
|
| }
|
|
|
| // Acommodate extra top and bottom padding, border or margin.
|
| @@ -268,6 +290,45 @@ void RenderVTTCue::repositionCueSnapToLinesSet()
|
| void RenderVTTCue::repositionCueSnapToLinesNotSet()
|
| {
|
| // FIXME: Implement overlapping detection when snap-to-lines is not set. http://wkb.ug/84296
|
| +
|
| + // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
|
| + // Step 13, "If cue's text track cue snap-to-lines flag is not set".
|
| +
|
| + // 1. Let bounding box be the bounding box of the boxes in boxes.
|
| +
|
| + // 2. Run the appropriate steps from the following list:
|
| + // If the text track cue writing direction is horizontal
|
| + // If the text track cue line alignment is middle alignment
|
| + // Move all the boxes in boxes up by half of the height of
|
| + // bounding box.
|
| + // If the text track cue line alignment is end alignment
|
| + // Move all the boxes in boxes up by the height of bounding box.
|
| + //
|
| + // If the text track cue writing direction is vertical growing left or
|
| + // vertical growing right
|
| + // If the text track cue line alignment is middle alignment
|
| + // Move all the boxes in boxes left by half of the width of
|
| + // bounding box.
|
| + // If the text track cue line alignment is end alignment
|
| + // Move all the boxes in boxes left by the width of bounding box.
|
| +
|
| + // 3. If none of the boxes in boxes would overlap any of the boxes in
|
| + // output, and all the boxes in output are within the video's rendering
|
| + // area, then jump to the step labeled done positioning below.
|
| +
|
| + // 4. If there is a position to which the boxes in boxes can be moved while
|
| + // maintaining the relative positions of the boxes in boxes to each other
|
| + // such that none of the boxes in boxes would overlap any of the boxes in
|
| + // output, and all the boxes in output would be within the video's
|
| + // rendering area, then move the boxes in boxes to the closest such
|
| + // position to their current position, and then jump to the step labeled
|
| + // done positioning below. If there are multiple such positions that are
|
| + // equidistant from their current position, use the highest one amongst
|
| + // them; if there are several at that height, then use the leftmost one
|
| + // amongst them.
|
| +
|
| + // 5. Otherwise, jump to the step labeled done positioning below. (The
|
| + // boxes will unfortunately overlap.)
|
| }
|
|
|
| } // namespace blink
|
|
|