static void applyClipRects(const ClipRectsContext& context, const LayoutObject& layoutObject, LayoutPoint offset, ClipRects& clipRects) { ASSERT(layoutObject.hasOverflowClip() || layoutObject.hasClip() || layoutObject.style()->containsPaint()); LayoutView* view = layoutObject.view(); ASSERT(view); if (clipRects.fixed() && context.rootLayer->layoutObject() == view) offset -= toIntSize(view->frameView()->scrollPosition()); if (layoutObject.hasOverflowClip() || layoutObject.style()->containsPaint()) { ClipRect newOverflowClip = toLayoutBox(layoutObject).overflowClipRect(offset, context.scrollbarRelevancy); newOverflowClip.setHasRadius(layoutObject.style()->hasBorderRadius()); clipRects.setOverflowClipRect(intersection(newOverflowClip, clipRects.overflowClipRect())); if (layoutObject.isPositioned()) clipRects.setPosClipRect(intersection(newOverflowClip, clipRects.posClipRect())); if (layoutObject.isLayoutView()) clipRects.setFixedClipRect(intersection(newOverflowClip, clipRects.fixedClipRect())); if (layoutObject.style()->containsPaint()) { clipRects.setPosClipRect(intersection(newOverflowClip, clipRects.posClipRect())); clipRects.setFixedClipRect(intersection(newOverflowClip, clipRects.fixedClipRect())); } } if (layoutObject.hasClip()) { LayoutRect newClip = toLayoutBox(layoutObject).clipRect(offset); clipRects.setPosClipRect(intersection(newClip, clipRects.posClipRect()).setIsClippedByClipCss()); clipRects.setOverflowClipRect(intersection(newClip, clipRects.overflowClipRect()).setIsClippedByClipCss()); clipRects.setFixedClipRect(intersection(newClip, clipRects.fixedClipRect()).setIsClippedByClipCss()); } }
static const DeprecatedPaintLayer* findParentLayerOnClippingContainerChain(const DeprecatedPaintLayer* layer) { LayoutObject* current = layer->layoutObject(); while (current) { if (current->style()->position() == FixedPosition) { for (current = current->parent(); current && !current->canContainFixedPositionObjects(); current = current->parent()) { // All types of clips apply to fixed-position descendants of other fixed-position elements. // Note: it's unclear whether this is what the spec says. Firefox does not clip, but Chrome does. if (current->style()->position() == FixedPosition && current->hasClipOrOverflowClip()) { ASSERT(current->hasLayer()); return static_cast<const LayoutBoxModelObject*>(current)->layer(); } // CSS clip applies to fixed position elements even for ancestors that are not what the // fixed element is positioned with respect to. if (current->hasClip()) { ASSERT(current->hasLayer()); return static_cast<const LayoutBoxModelObject*>(current)->layer(); } } } else { current = current->containingBlock(); } if (current->hasLayer()) return static_cast<const LayoutBoxModelObject*>(current)->layer(); // Having clip or overflow clip forces the LayoutObject to become a layer. ASSERT(!current->hasClipOrOverflowClip()); } ASSERT_NOT_REACHED(); return nullptr; }
void PaintPropertyTreeBuilder::updateCssClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context) { if (!object.hasClip()) return; ASSERT(object.canContainAbsolutePositionObjects()); // Create clip node for descendants that are not fixed position. // We don't have to setup context.clipForAbsolutePosition here because this object must be // a container for absolute position descendants, and will copy from in-flow context later // at updateOutOfFlowContext() step. LayoutRect clipRect = toLayoutBox(object).clipRect(context.paintOffset); RefPtr<ClipPaintPropertyNode> clipNode = ClipPaintPropertyNode::create( context.currentTransform, FloatRoundedRect(FloatRect(clipRect)), context.currentClip); context.currentClip = clipNode.get(); object.getMutableForPainting().ensureObjectPaintProperties().setCssClip(clipNode.release()); }
void PaintPropertyTreeBuilder::updateCssClip( const LayoutObject& object, PaintPropertyTreeBuilderContext& context) { if (object.hasClip()) { // Create clip node for descendants that are not fixed position. // We don't have to setup context.absolutePosition.clip here because this // object must be a container for absolute position descendants, and will // copy from in-flow context later at updateOutOfFlowContext() step. DCHECK(object.canContainAbsolutePositionObjects()); LayoutRect clipRect = toLayoutBox(object).clipRect(context.current.paintOffset); context.current.clip = object.getMutableForPainting().ensurePaintProperties().updateCssClip( context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect))); return; } if (auto* properties = object.getMutableForPainting().paintProperties()) properties->clearCssClip(); }