Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2068723002: Paint local attachment backgrounds into composited scrolling contents layer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 offset.move(absPos.x(), absPos.y()); 700 offset.move(absPos.x(), absPos.y());
701 return toIntSize(offset); 701 return toIntSize(offset);
702 } 702 }
703 703
704 FloatQuad LayoutBox::absoluteContentQuad() const 704 FloatQuad LayoutBox::absoluteContentQuad() const
705 { 705 {
706 LayoutRect rect = contentBoxRect(); 706 LayoutRect rect = contentBoxRect();
707 return localToAbsoluteQuad(FloatRect(rect)); 707 return localToAbsoluteQuad(FloatRect(rect));
708 } 708 }
709 709
710 LayoutRect LayoutBox::backgroundClipRect() const 710 LayoutRect LayoutBox::backgroundRect(BackgroundRectType rectOpacity) const
711 { 711 {
712 // TODO(flackr): Check for the maximum background clip rect. 712 EFillBox backgroundBox = TextFillBox;
713 switch (style()->backgroundClip()) { 713 // Find the largest background rect of the given opaqueness.
714 if (const FillLayer* current = &(style()->backgroundLayers())) {
715 do {
716 const FillLayer* cur = current;
717 current = current->next();
718 if (rectOpacity == BackgroundKnownOpaqueRect) {
719 if (cur->blendMode() != WebBlendModeNormal || cur->composite() ! = CompositeSourceOver)
720 continue;
721 // Check if the image or color has alpha.
722 if (const StyleImage* image = cur->image()) {
723 if (!image->knownToBeOpaque(*this))
724 continue;
725 } else if (!cur->next()) {
726 Color backgroundColor = resolveColor(CSSPropertyBackgroundCo lor);
727 if (backgroundColor.hasAlpha())
728 continue;
729 } else {
730 continue;
731 }
732 }
733 EFillBox currentClip = cur->clip();
734 // Adjust clip if attachment is local.
735 if (currentClip == BorderFillBox && cur->attachment() == LocalBackgr oundAttachment)
736 currentClip = PaddingFillBox;
737 backgroundBox = enclosingFillBox(backgroundBox, currentClip);
738 } while (current);
739 }
740 switch (backgroundBox) {
714 case BorderFillBox: 741 case BorderFillBox:
715 // A 'border-box' clip on scrollable elements local attachment is treate d as 'padding-box'.
716 // https://www.w3.org/TR/css3-background/#the-background-attachment
717 if (!style()->isOverflowVisible() && style()->backgroundLayers().attachm ent() == LocalBackgroundAttachment)
718 return paddingBoxRect();
719 return borderBoxRect(); 742 return borderBoxRect();
720 break; 743 break;
721 case PaddingFillBox: 744 case PaddingFillBox:
722 return paddingBoxRect(); 745 return paddingBoxRect();
723 break; 746 break;
724 case ContentFillBox: 747 case ContentFillBox:
725 return contentBoxRect(); 748 return contentBoxRect();
726 break; 749 break;
727 default: 750 default:
728 break; 751 break;
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 return false; 1395 return false;
1373 paintedExtent = LayoutRect(geometry.destRect()); 1396 paintedExtent = LayoutRect(geometry.destRect());
1374 return true; 1397 return true;
1375 } 1398 }
1376 1399
1377 bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c onst 1400 bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c onst
1378 { 1401 {
1379 if (isDocumentElement() || backgroundStolenForBeingBody()) 1402 if (isDocumentElement() || backgroundStolenForBeingBody())
1380 return false; 1403 return false;
1381 1404
1382 Color backgroundColor = resolveColor(CSSPropertyBackgroundColor);
1383 if (backgroundColor.hasAlpha())
1384 return false;
1385
1386 // If the element has appearance, it might be painted by theme. 1405 // If the element has appearance, it might be painted by theme.
1387 // We cannot be sure if theme paints the background opaque. 1406 // We cannot be sure if theme paints the background opaque.
1388 // In this case it is safe to not assume opaqueness. 1407 // In this case it is safe to not assume opaqueness.
1389 // FIXME: May be ask theme if it paints opaque. 1408 // FIXME: May be ask theme if it paints opaque.
1390 if (style()->hasAppearance()) 1409 if (style()->hasAppearance())
1391 return false; 1410 return false;
1392 // FIXME: Check the opaqueness of background images. 1411 // FIXME: Check the opaqueness of background images.
1393 1412
1394 // FIXME: Use rounded rect if border radius is present. 1413 // FIXME: Use rounded rect if border radius is present.
1395 if (style()->hasBorderRadius()) 1414 if (style()->hasBorderRadius())
1396 return false; 1415 return false;
1397 if (hasClipPath()) 1416 if (hasClipPath())
1398 return false; 1417 return false;
1399 // FIXME: The background color clip is defined by the last layer. 1418 if (style()->hasBlendMode())
1400 if (style()->backgroundLayers().next())
1401 return false; 1419 return false;
1402 return backgroundClipRect().contains(localRect); 1420 return backgroundRect(BackgroundKnownOpaqueRect).contains(localRect);
1403 } 1421 }
1404 1422
1405 static bool isCandidateForOpaquenessTest(const LayoutBox& childBox) 1423 static bool isCandidateForOpaquenessTest(const LayoutBox& childBox)
1406 { 1424 {
1407 const ComputedStyle& childStyle = childBox.styleRef(); 1425 const ComputedStyle& childStyle = childBox.styleRef();
1408 if (childStyle.position() != StaticPosition && childBox.containingBlock() != childBox.parent()) 1426 if (childStyle.position() != StaticPosition && childBox.containingBlock() != childBox.parent())
1409 return false; 1427 return false;
1410 if (childStyle.visibility() != EVisibility::Visible || childStyle.shapeOutsi de()) 1428 if (childStyle.visibility() != EVisibility::Visible || childStyle.shapeOutsi de())
1411 return false; 1429 return false;
1412 if (childBox.size().isZero()) 1430 if (childBox.size().isZero())
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 LayoutBoxModelObject::mapLocalToAncestor(ancestor, transformState, mode); 1766 LayoutBoxModelObject::mapLocalToAncestor(ancestor, transformState, mode);
1749 } 1767 }
1750 1768
1751 void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, Transfo rmState& transformState, MapCoordinatesFlags mode) const 1769 void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, Transfo rmState& transformState, MapCoordinatesFlags mode) const
1752 { 1770 {
1753 if (this == ancestor) 1771 if (this == ancestor)
1754 return; 1772 return;
1755 1773
1756 bool isFixedPos = style()->position() == FixedPosition; 1774 bool isFixedPos = style()->position() == FixedPosition;
1757 1775
1758 if (style()->canContainFixedPositionObjects() && !isFixedPos) { 1776 // If this box has a transform or contains paint, it acts as a fixed positio n container for fixed descendants,
1759 // If this box has a transform or contains paint, it acts as a fixed pos ition container for fixed descendants, 1777 // and may itself also be fixed position. So propagate 'fixed' up only if th is box is fixed position.
1760 // and may itself also be fixed position. So propagate 'fixed' up only i f this box is fixed position. 1778 if (style()->canContainFixedPositionObjects() && !isFixedPos)
1761 mode &= ~IsFixed; 1779 mode &= ~IsFixed;
1762 } else if (isFixedPos) { 1780 else if (isFixedPos)
1763 mode |= IsFixed; 1781 mode |= IsFixed;
1764 }
1765 1782
1766 LayoutBoxModelObject::mapAncestorToLocal(ancestor, transformState, mode); 1783 LayoutBoxModelObject::mapAncestorToLocal(ancestor, transformState, mode);
1767 } 1784 }
1768 1785
1769 LayoutSize LayoutBox::offsetFromContainer(const LayoutObject* o) const 1786 LayoutSize LayoutBox::offsetFromContainer(const LayoutObject* o) const
1770 { 1787 {
1771 ASSERT(o == container()); 1788 ASSERT(o == container());
1772 1789
1773 LayoutSize offset; 1790 LayoutSize offset;
1774 if (isInFlowPositioned()) 1791 if (isInFlowPositioned())
(...skipping 2993 matching lines...) Expand 10 before | Expand all | Expand 10 after
4768 m_rareData->m_snapAreas->remove(&snapArea); 4785 m_rareData->m_snapAreas->remove(&snapArea);
4769 } 4786 }
4770 } 4787 }
4771 4788
4772 SnapAreaSet* LayoutBox::snapAreas() const 4789 SnapAreaSet* LayoutBox::snapAreas() const
4773 { 4790 {
4774 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; 4791 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr;
4775 } 4792 }
4776 4793
4777 } // namespace blink 4794 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698