diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebCore/rendering/RenderTextTrackCue.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebCore/rendering/RenderTextTrackCue.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderTextTrackCue.cpp | 361 |
1 files changed, 0 insertions, 361 deletions
diff --git a/Source/WebCore/rendering/RenderTextTrackCue.cpp b/Source/WebCore/rendering/RenderTextTrackCue.cpp deleted file mode 100644 index fd88b77ad..000000000 --- a/Source/WebCore/rendering/RenderTextTrackCue.cpp +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2012 Victor Carbune (victor@rosedu.org) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" - -#if ENABLE(VIDEO_TRACK) - -#include "RenderTextTrackCue.h" - -#include "TextTrackCue.h" -#include "TextTrackCueGeneric.h" -#include <wtf/StackStats.h> - -namespace WebCore { - -RenderTextTrackCue::RenderTextTrackCue(TextTrackCueBox* element) - : RenderBlock(element) - , m_cue(element->getCue()) -{ -} - -void RenderTextTrackCue::layout() -{ - StackStats::LayoutCheckPoint layoutCheckPoint; - RenderBlock::layout(); - - LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode()); - - if (m_cue->cueType()== TextTrackCue::WebVTT) { - if (m_cue->snapToLines()) - repositionCueSnapToLinesSet(); - else - repositionCueSnapToLinesNotSet(); - } else - repositionGenericCue(); - - statePusher.pop(); -} - -bool RenderTextTrackCue::initializeLayoutParameters(InlineFlowBox*& firstLineBox, LayoutUnit& step, LayoutUnit& position) -{ - ASSERT(firstChild()); - - RenderBlock* parentBlock = containingBlock(); - firstLineBox = toRenderInline(firstChild())->firstLineBox(); - - // 1. 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() == TextTrackCue::Horizontal ? firstLineBox->height() : firstLineBox->width(); - - // 2. 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(); - - // 4. Vertical Growing Left: Add one to line position then negate it. - if (m_cue->getWritingDirection() == TextTrackCue::VerticalGrowingLeft) - linePosition = -(linePosition + 1); - - // 5. 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 - // bounding box of the boxes in boxes, then increase position by step. - if (m_cue->getWritingDirection() == TextTrackCue::VerticalGrowingLeft) { - position -= width(); - position += step; - } - - // 7. If line position is less than zero... - if (linePosition < 0) { - // Horizontal / Vertical: ... then increase position by the - // height / width of the video's rendering area ... - position += m_cue->getWritingDirection() == TextTrackCue::Horizontal ? parentBlock->height() : parentBlock->width(); - - // ... and negate step. - step = -step; - } - - return true; -} - -void RenderTextTrackCue::placeBoxInDefaultPosition(LayoutUnit position, bool& switched) -{ - // 8. Move all boxes in boxes ... - if (m_cue->getWritingDirection() == TextTrackCue::Horizontal) - // Horizontal: ... down by the distance given by position - setY(y() + position); - else - // Vertical: ... right by the distance given by position - setX(x() + position); - - // 9. Default: Remember the position of all the boxes in boxes as their - // default position. - m_fallbackPosition = FloatPoint(x(), y()); - - // 10. Let switched be false. - switched = false; -} - -bool RenderTextTrackCue::isOutside() const -{ - return !rectIsWithinContainer(absoluteContentBox()); -} - -bool RenderTextTrackCue::rectIsWithinContainer(const IntRect& rect) const -{ - return containingBlock()->absoluteBoundingBoxRect().contains(rect); -} - - -bool RenderTextTrackCue::isOverlapping() const -{ - return overlappingObject(); -} - -RenderObject* RenderTextTrackCue::overlappingObject() const -{ - return overlappingObjectForRect(absoluteBoundingBoxRect()); -} - -RenderObject* RenderTextTrackCue::overlappingObjectForRect(const IntRect& rect) const -{ - for (RenderObject* box = previousSibling(); box; box = box->previousSibling()) { - IntRect boxRect = box->absoluteBoundingBoxRect(); - - if (rect.intersects(boxRect)) - return box; - } - - return 0; -} - -bool RenderTextTrackCue::shouldSwitchDirection(InlineFlowBox* firstLineBox, LayoutUnit step) const -{ - LayoutUnit top = y(); - LayoutUnit left = x(); - LayoutUnit bottom = top + firstLineBox->height(); - LayoutUnit right = left + firstLineBox->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. - LayoutUnit parentHeight = containingBlock()->height(); - if (m_cue->getWritingDirection() == TextTrackCue::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. - LayoutUnit parentWidth = containingBlock()->width(); - if (m_cue->getWritingDirection() != TextTrackCue::Horizontal && ((step < 0 && left < 0) || (step > 0 && right > parentWidth))) - return true; - - return false; -} - -void RenderTextTrackCue::moveBoxesByStep(LayoutUnit step) -{ - // 13. 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() == TextTrackCue::Horizontal) - setY(y() + step); - - // 13. 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(x() + step); -} - -bool RenderTextTrackCue::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. - setX(m_fallbackPosition.x()); - setY(m_fallbackPosition.y()); - - // 16. If switched is true, jump to the step labeled done - // positioning below. - if (switched) - return false; - - // 17. Negate step. - step = -step; - - // 18. Set switched to true. - switched = true; - return true; -} - -void RenderTextTrackCue::moveIfNecessaryToKeepWithinContainer() -{ - IntRect containerRect = containingBlock()->absoluteBoundingBoxRect(); - IntRect cueRect = absoluteBoundingBoxRect(); - - int topOverflow = cueRect.y() - containerRect.y(); - int bottomOverflow = containerRect.maxY() - cueRect.maxY(); - - int verticalAdjustment = 0; - if (topOverflow < 0) - verticalAdjustment = -topOverflow; - else if (bottomOverflow < 0) - verticalAdjustment = bottomOverflow; - - if (verticalAdjustment) - setY(y() + verticalAdjustment); - - int leftOverflow = cueRect.x() - containerRect.x(); - int rightOverflow = containerRect.maxX() - cueRect.maxX(); - - int horizontalAdjustment = 0; - if (leftOverflow < 0) - horizontalAdjustment = -leftOverflow; - else if (rightOverflow < 0) - horizontalAdjustment = rightOverflow; - - if (horizontalAdjustment) - setX(x() + horizontalAdjustment); -} - -bool RenderTextTrackCue::findNonOverlappingPosition(int& newX, int& newY) const -{ - newX = x(); - newY = y(); - IntRect srcRect = absoluteBoundingBoxRect(); - IntRect destRect = srcRect; - - // Move the box up, looking for a non-overlapping position: - while (RenderObject* box = overlappingObjectForRect(destRect)) { - if (m_cue->getWritingDirection() == TextTrackCue::Horizontal) - destRect.setY(box->absoluteBoundingBoxRect().y() - destRect.height()); - else - destRect.setX(box->absoluteBoundingBoxRect().x() - destRect.width()); - } - - if (rectIsWithinContainer(destRect)) { - newX += destRect.x() - srcRect.x(); - newY += destRect.y() - srcRect.y(); - return true; - } - - destRect = srcRect; - - // Move the box down, looking for a non-overlapping position: - while (RenderObject* box = overlappingObjectForRect(destRect)) { - if (m_cue->getWritingDirection() == TextTrackCue::Horizontal) - destRect.setY(box->absoluteBoundingBoxRect().maxY()); - else - destRect.setX(box->absoluteBoundingBoxRect().maxX()); - } - - if (rectIsWithinContainer(destRect)) { - newX += destRect.x() - srcRect.x(); - newY += destRect.y() - srcRect.y(); - return true; - } - - return false; -} - -void RenderTextTrackCue::repositionCueSnapToLinesSet() -{ - InlineFlowBox* firstLineBox; - 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. - while (isOutside() || isOverlapping()) { - if (!shouldSwitchDirection(firstLineBox, step)) - // 13. Move all the boxes in boxes ... - // 14. Jump back to the step labeled step loop. - moveBoxesByStep(step); - else if (!switchDirection(switched, step)) - break; - - // 19. 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()) - moveIfNecessaryToKeepWithinContainer(); -} - -void RenderTextTrackCue::repositionGenericCue() -{ - ASSERT(firstChild()); - InlineFlowBox* firstLineBox = toRenderInline(firstChild())->firstLineBox(); - if (static_cast<TextTrackCueGeneric*>(m_cue)->useDefaultPosition() && firstLineBox) { - LayoutUnit parentWidth = containingBlock()->logicalWidth(); - LayoutUnit width = firstLineBox->width(); - LayoutUnit right = (parentWidth / 2) - (width / 2); - setX(right); - } - repositionCueSnapToLinesNotSet(); -} - -void RenderTextTrackCue::repositionCueSnapToLinesNotSet() -{ - // 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. - if (!isOutside() && !isOverlapping()) - return; - - // 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. - moveIfNecessaryToKeepWithinContainer(); - int x = 0; - int y = 0; - if (!findNonOverlappingPosition(x, y)) - return; - - setX(x); - setY(y); -} - -} // namespace WebCore - -#endif |