IntRect RenderReplaced::selectionRect(bool clipToVisibleContent) { ASSERT(!needsLayout()); if (!isSelected()) return IntRect(); if (!m_inlineBoxWrapper) // We're a block-level replaced element. Just return our own dimensions. return absoluteBoundingBoxRect(); RenderBlock* cb = containingBlock(); if (!cb) return IntRect(); RootInlineBox* root = m_inlineBoxWrapper->root(); IntRect rect(0, root->selectionTop() - yPos(), width(), root->selectionHeight()); if (clipToVisibleContent) computeAbsoluteRepaintRect(rect); else { int absx, absy; absolutePositionForContent(absx, absy); rect.move(absx, absy); } return rect; }
IntRect RenderReplaced::selectionRect() { if (!isSelected()) return IntRect(); if (!m_inlineBoxWrapper) // We're a block-level replaced element. Just return our own dimensions. return absoluteBoundingBoxRect(); RenderBlock* cb = containingBlock(); if (!cb) return IntRect(); RootInlineBox* root = m_inlineBoxWrapper->root(); int selectionTop = root->selectionTop(); int selectionHeight = root->selectionHeight(); int selectionLeft = xPos(); int selectionRight = xPos() + width(); int absx, absy; cb->absolutePosition(absx, absy); if (cb->hasOverflowClip()) cb->layer()->subtractScrollOffset(absx, absy); return IntRect(selectionLeft + absx, selectionTop + absy, selectionRight - selectionLeft, selectionHeight); }
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 RenderVTTCue::isOverlapping() const { for (RenderObject* box = previousSibling(); box; box = box->previousSibling()) { IntRect boxRect = box->absoluteBoundingBoxRect(); if (absoluteBoundingBoxRect().intersects(boxRect)) return true; } return false; }
void RenderVTTCue::repositionCueSnapToLinesSet() { InlineFlowBox* firstLineBox; LayoutUnit step; LayoutUnit position; if (!findFirstLineBox(firstLineBox)) return; 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()) { 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(y() + adjustment); } }
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 LayoutVTTCue::adjustForTopAndBottomMarginBorderAndPadding() { // 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); }
RenderObject* RenderTextTrackCue::overlappingObject() const { return overlappingObjectForRect(absoluteBoundingBoxRect()); }