Changeset 245207 in webkit


Ignore:
Timestamp:
May 11, 2019 3:05:37 PM (5 years ago)
Author:
Simon Fraser
Message:

Translucent gradient rendering bug due to will-change transform
https://bugs.webkit.org/show_bug.cgi?id=197654
<rdar://problem/50547664>

Reviewed by Dean Jackson.
Source/WebCore:

We failed to re-evaluate 'contentsOpaque' when a background changed, because this
happened in updateGeometry() and that doesn't run for background changes.

However, 'contentsOpaque' also requires knowing about geometry because we have to
turn it off when there's subpixel positioning, and updateConfiguration()
runs before updateGeometry().

So compute m_hasSubpixelRounding in updateGeometry() and set contentsOpaque in
updateAfterDescendants().

Test: compositing/contents-opaque/background-change-to-transparent.html

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::updateConfiguration):
(WebCore::RenderLayerBacking::updateGeometry):
(WebCore::RenderLayerBacking::updateAfterDescendants):

  • rendering/RenderLayerBacking.h:

LayoutTests:

  • compositing/contents-opaque/background-change-to-transparent-expected.txt: Added.
  • compositing/contents-opaque/background-change-to-transparent.html: Added.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r245206 r245207  
     12019-05-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Translucent gradient rendering bug due to will-change transform
     4        https://bugs.webkit.org/show_bug.cgi?id=197654
     5        <rdar://problem/50547664>
     6
     7        Reviewed by Dean Jackson.
     8
     9        * compositing/contents-opaque/background-change-to-transparent-expected.txt: Added.
     10        * compositing/contents-opaque/background-change-to-transparent.html: Added.
     11
    1122019-05-11  Simon Fraser  <simon.fraser@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r245206 r245207  
     12019-05-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Translucent gradient rendering bug due to will-change transform
     4        https://bugs.webkit.org/show_bug.cgi?id=197654
     5        <rdar://problem/50547664>
     6
     7        Reviewed by Dean Jackson.
     8       
     9        We failed to re-evaluate 'contentsOpaque' when a background changed, because this
     10        happened in updateGeometry() and that doesn't run for background changes.
     11       
     12        However, 'contentsOpaque' also requires knowing about geometry because we have to
     13        turn it off when there's subpixel positioning, and updateConfiguration()
     14        runs before updateGeometry().
     15       
     16        So compute m_hasSubpixelRounding in updateGeometry() and set contentsOpaque in
     17        updateAfterDescendants().
     18
     19        Test: compositing/contents-opaque/background-change-to-transparent.html
     20
     21        * rendering/RenderLayerBacking.cpp:
     22        (WebCore::RenderLayerBacking::updateConfiguration):
     23        (WebCore::RenderLayerBacking::updateGeometry):
     24        (WebCore::RenderLayerBacking::updateAfterDescendants):
     25        * rendering/RenderLayerBacking.h:
     26
    1272019-05-11  Simon Fraser  <simon.fraser@apple.com>
    228
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r245205 r245207  
    820820
    821821    updateEventRegion();
    822    
     822
    823823    // Requires layout.
    824824    if (contentsInfo.isDirectlyCompositedImage())
     
    11131113    primaryGraphicsLayerOffsetFromRenderer = computeOffsetFromRenderer(-rendererOffset.fromPrimaryGraphicsLayer(), deviceScaleFactor());
    11141114    m_subpixelOffsetFromRenderer = primaryGraphicsLayerOffsetFromRenderer.m_subpixelOffset;
     1115    m_hasSubpixelRounding = !m_subpixelOffsetFromRenderer.isZero() || compositedBounds().size() != primaryGraphicsLayerRect.size();
    11151116
    11161117    if (primaryGraphicsLayerOffsetFromRenderer.m_devicePixelOffset != m_graphicsLayer->offsetFromRenderer()) {
    11171118        m_graphicsLayer->setOffsetFromRenderer(primaryGraphicsLayerOffsetFromRenderer.m_devicePixelOffset);
    11181119        positionOverflowControlsLayers();
    1119     }
    1120 
    1121     if (!m_isMainFrameRenderViewLayer && !m_isFrameLayerWithTiledBacking && !m_requiresBackgroundLayer) {
    1122         // For non-root layers, background is always painted by the primary graphics layer.
    1123         ASSERT(!m_backgroundLayer);
    1124         // Subpixel offset from graphics layer or size changed.
    1125         bool hadSubpixelRounding = !m_subpixelOffsetFromRenderer.isZero() || compositedBounds().size() != primaryGraphicsLayerRect.size();
    1126         m_graphicsLayer->setContentsOpaque(!hadSubpixelRounding && m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds()));
    11271120    }
    11281121
     
    13261319
    13271320    updateDrawsContent(contentsInfo);
     1321
     1322    if (!m_isMainFrameRenderViewLayer && !m_isFrameLayerWithTiledBacking && !m_requiresBackgroundLayer) {
     1323        // For non-root layers, background is always painted by the primary graphics layer.
     1324        ASSERT(!m_backgroundLayer);
     1325        m_graphicsLayer->setContentsOpaque(!m_hasSubpixelRounding && m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds()));
     1326    }
    13281327
    13291328    m_graphicsLayer->setContentsVisible(m_owningLayer.hasVisibleContent() || hasVisibleNonCompositedDescendants());
  • trunk/Source/WebCore/rendering/RenderLayerBacking.h

    r245170 r245207  
    435435    bool m_backgroundLayerPaintsFixedRootBackground { false };
    436436    bool m_requiresBackgroundLayer { false };
     437    bool m_hasSubpixelRounding { false };
    437438    bool m_paintsSubpixelAntialiasedText { false }; // This is for logging only.
    438439};
Note: See TracChangeset for help on using the changeset viewer.