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

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: Add/update tests and simplify added code. 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 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 offset.move(absPos.x(), absPos.y()); 697 offset.move(absPos.x(), absPos.y());
698 return toIntSize(offset); 698 return toIntSize(offset);
699 } 699 }
700 700
701 FloatQuad LayoutBox::absoluteContentQuad() const 701 FloatQuad LayoutBox::absoluteContentQuad() const
702 { 702 {
703 LayoutRect rect = contentBoxRect(); 703 LayoutRect rect = contentBoxRect();
704 return localToAbsoluteQuad(FloatRect(rect)); 704 return localToAbsoluteQuad(FloatRect(rect));
705 } 705 }
706 706
707 LayoutRect LayoutBox::backgroundClipRect() const 707 LayoutRect LayoutBox::backgroundRect(BackgroundRectOpacity rectOpacity) const
trchen 2016/08/13 00:14:08 I'm worried about the semantic of this function be
flackr 2016/08/16 17:52:51 When called with OpaqueBackgroundRect from backgro
trchen 2016/08/17 01:22:55 Great idea. It totally sounds clearer!
708 { 708 {
709 // TODO(flackr): Check for the maximum background clip rect. 709 EFillBox backgroundBox = TextFillBox;
710 switch (style()->backgroundClip()) { 710 // Find the largest background rect of the given opaqueness.
711 if (const FillLayer* current = &(style()->backgroundLayers())) {
712 do {
713 const FillLayer* cur = current;
714 current = current->next();
715 if (rectOpacity == OpaqueBackgroundRect) {
716 if (cur->blendMode() != WebBlendModeNormal || cur->composite() ! = CompositeSourceOver)
717 continue;
chrishtr 2016/08/12 17:03:00 Indentation.
flackr 2016/08/16 17:52:51 Done.
718 // Check if the image or color has alpha.
719 if (const StyleImage* image = cur->image()) {
720 if (!image->knownToBeOpaque(*this))
721 continue;
722 } else {
trchen 2016/08/13 00:06:42 } if (!current->next()) { 1. A layer with translu
flackr 2016/08/16 17:52:51 Yes, that is why we continue to the next layer if
trchen 2016/08/17 01:22:55 The background color is always applicable even if
flackr 2016/08/17 18:20:55 Thanks for the clarification. Done, but needed to
723 Color backgroundColor = resolveColor(CSSPropertyBackgroundCo lor);
724 if (backgroundColor.hasAlpha())
725 continue;
726 }
727 }
728 EFillBox currentClip = cur->clip();
729 // Adjust clip if attachment is local.
730 if (currentClip == BorderFillBox && cur->attachment() == LocalBackgr oundAttachment)
731 currentClip = PaddingFillBox;
732 backgroundBox = enclosingFillBox(backgroundBox, currentClip);
trchen 2016/08/13 00:06:42 I'm worried about this line, because the unscrolle
flackr 2016/08/16 17:52:51 Right, I think we should treat background-attachme
trchen 2016/08/17 01:22:55 Agreed. We can do that plus a comment to explain.
flackr 2016/08/17 18:20:55 Done, and added a test for this case.
733 } while (current);
734 }
735 switch (backgroundBox) {
711 case BorderFillBox: 736 case BorderFillBox:
712 // A 'border-box' clip on scrollable elements local attachment is treate d as 'padding-box'.
713 // https://www.w3.org/TR/css3-background/#the-background-attachment
714 if (!style()->isOverflowVisible() && style()->backgroundLayers().attachm ent() == LocalBackgroundAttachment)
chrishtr 2016/08/12 17:03:00 Why can you remove this?
trchen 2016/08/13 00:06:42 The matching logic is in line 730 on the right sid
715 return paddingBoxRect();
716 return borderBoxRect(); 737 return borderBoxRect();
717 break; 738 break;
718 case PaddingFillBox: 739 case PaddingFillBox:
719 return paddingBoxRect(); 740 return paddingBoxRect();
720 break; 741 break;
721 case ContentFillBox: 742 case ContentFillBox:
722 return contentBoxRect(); 743 return contentBoxRect();
723 break; 744 break;
724 default: 745 default:
725 break; 746 break;
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 return false; 1390 return false;
1370 paintedExtent = LayoutRect(geometry.destRect()); 1391 paintedExtent = LayoutRect(geometry.destRect());
1371 return true; 1392 return true;
1372 } 1393 }
1373 1394
1374 bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c onst 1395 bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c onst
1375 { 1396 {
1376 if (isDocumentElement() || backgroundStolenForBeingBody()) 1397 if (isDocumentElement() || backgroundStolenForBeingBody())
1377 return false; 1398 return false;
1378 1399
1379 Color backgroundColor = resolveColor(CSSPropertyBackgroundColor);
1380 if (backgroundColor.hasAlpha())
1381 return false;
1382
1383 // If the element has appearance, it might be painted by theme. 1400 // If the element has appearance, it might be painted by theme.
1384 // We cannot be sure if theme paints the background opaque. 1401 // We cannot be sure if theme paints the background opaque.
1385 // In this case it is safe to not assume opaqueness. 1402 // In this case it is safe to not assume opaqueness.
1386 // FIXME: May be ask theme if it paints opaque. 1403 // FIXME: May be ask theme if it paints opaque.
1387 if (style()->hasAppearance()) 1404 if (style()->hasAppearance())
1388 return false; 1405 return false;
1389 // FIXME: Check the opaqueness of background images. 1406 // FIXME: Check the opaqueness of background images.
1390 1407
1391 // FIXME: Use rounded rect if border radius is present. 1408 // FIXME: Use rounded rect if border radius is present.
1392 if (style()->hasBorderRadius()) 1409 if (style()->hasBorderRadius())
1393 return false; 1410 return false;
1394 if (hasClipPath()) 1411 if (hasClipPath())
1395 return false; 1412 return false;
1396 // FIXME: The background color clip is defined by the last layer. 1413 if (style()->hasBlendMode())
1397 if (style()->backgroundLayers().next())
1398 return false; 1414 return false;
1399 return backgroundClipRect().contains(localRect); 1415 return backgroundRect(OpaqueBackgroundRect).contains(localRect);
1400 } 1416 }
1401 1417
1402 static bool isCandidateForOpaquenessTest(const LayoutBox& childBox) 1418 static bool isCandidateForOpaquenessTest(const LayoutBox& childBox)
1403 { 1419 {
1404 const ComputedStyle& childStyle = childBox.styleRef(); 1420 const ComputedStyle& childStyle = childBox.styleRef();
1405 if (childStyle.position() != StaticPosition && childBox.containingBlock() != childBox.parent()) 1421 if (childStyle.position() != StaticPosition && childBox.containingBlock() != childBox.parent())
1406 return false; 1422 return false;
1407 if (childStyle.visibility() != EVisibility::Visible || childStyle.shapeOutsi de()) 1423 if (childStyle.visibility() != EVisibility::Visible || childStyle.shapeOutsi de())
1408 return false; 1424 return false;
1409 if (childBox.size().isZero()) 1425 if (childBox.size().isZero())
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 LayoutBoxModelObject::mapLocalToAncestor(ancestor, transformState, mode); 1778 LayoutBoxModelObject::mapLocalToAncestor(ancestor, transformState, mode);
1763 } 1779 }
1764 1780
1765 void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, Transfo rmState& transformState, MapCoordinatesFlags mode) const 1781 void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, Transfo rmState& transformState, MapCoordinatesFlags mode) const
1766 { 1782 {
1767 if (this == ancestor) 1783 if (this == ancestor)
1768 return; 1784 return;
1769 1785
1770 bool isFixedPos = style()->position() == FixedPosition; 1786 bool isFixedPos = style()->position() == FixedPosition;
1771 1787
1772 if (style()->canContainFixedPositionObjects() && !isFixedPos) { 1788 // If this box has a transform or contains paint, it acts as a fixed positio n container for fixed descendants,
1773 // If this box has a transform or contains paint, it acts as a fixed pos ition container for fixed descendants, 1789 // and may itself also be fixed position. So propagate 'fixed' up only if th is box is fixed position.
1774 // and may itself also be fixed position. So propagate 'fixed' up only i f this box is fixed position. 1790 if (style()->canContainFixedPositionObjects() && !isFixedPos)
1775 mode &= ~IsFixed; 1791 mode &= ~IsFixed;
1776 } else if (isFixedPos) { 1792 else if (isFixedPos)
1777 mode |= IsFixed; 1793 mode |= IsFixed;
1778 }
1779 1794
1780 LayoutBoxModelObject::mapAncestorToLocal(ancestor, transformState, mode); 1795 LayoutBoxModelObject::mapAncestorToLocal(ancestor, transformState, mode);
1781 } 1796 }
1782 1797
1783 LayoutSize LayoutBox::offsetFromContainer(const LayoutObject* o) const 1798 LayoutSize LayoutBox::offsetFromContainer(const LayoutObject* o) const
1784 { 1799 {
1785 ASSERT(o == container()); 1800 ASSERT(o == container());
1786 1801
1787 LayoutSize offset; 1802 LayoutSize offset;
1788 if (isInFlowPositioned()) 1803 if (isInFlowPositioned())
(...skipping 3205 matching lines...) Expand 10 before | Expand all | Expand 10 after
4994 m_rareData->m_snapAreas->remove(&snapArea); 5009 m_rareData->m_snapAreas->remove(&snapArea);
4995 } 5010 }
4996 } 5011 }
4997 5012
4998 SnapAreaSet* LayoutBox::snapAreas() const 5013 SnapAreaSet* LayoutBox::snapAreas() const
4999 { 5014 {
5000 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; 5015 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr;
5001 } 5016 }
5002 5017
5003 } // namespace blink 5018 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698