Changeset 127162 in webkit


Ignore:
Timestamp:
Aug 30, 2012 11:02:52 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Add support for blendmode to webkit rendering engine
https://bugs.webkit.org/show_bug.cgi?id=95258

Patch by Rik Cabanier <cabanier@adobe.com> on 2012-08-30
Reviewed by Simon Fraser.

Source/WebCore:

This code adds support for blendmodes to the WebCore engine. The CSS parser already
supported this keyword but didn't pass it along. Support for rendering blending will
be provided in subsequent patches

Test: css3/compositing/should-have-compositing-layer.html

  • css/StyleBuilder.cpp:

(WebCore::StyleBuilder::StyleBuilder):

  • css/StyleResolver.cpp:

(WebCore::StyleResolver::collectMatchingRulesForList):

  • rendering/RenderBox.h:
  • rendering/RenderBoxModelObject.h:

(RenderBoxModelObject):
(WebCore::RenderBoxModelObject::requiresLayer):

  • rendering/RenderInline.h:

(WebCore::RenderInline::requiresLayer):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::RenderLayer):
(WebCore):
(WebCore::RenderLayer::updateBlendMode):
(WebCore::RenderLayer::ensureBacking):
(WebCore::RenderLayer::shouldBeNormalFlowOnly):
(WebCore::RenderLayer::styleChanged):

  • rendering/RenderLayer.h:

(RenderLayer):
(WebCore::RenderLayer::hasBlendMode):

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::requiresCompositingLayer):
(WebCore::RenderLayerCompositor::requiresOwnBackingStore):
(WebCore::RenderLayerCompositor::reasonForCompositing):
(WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason):
(WebCore::RenderLayerCompositor::requiresCompositingForBlending):
(WebCore):

  • rendering/RenderLayerCompositor.h:

(RenderLayerCompositor):

  • rendering/RenderObject.h:

(RenderObject):
(WebCore::RenderObject::hasBlendMode):
(WebCore::RenderObject::createsGroup):

  • rendering/RenderTableRow.h:
  • rendering/style/RenderStyle.h:

LayoutTests:

Enable test to verify that blending modes introduce a new compositing layer

  • css3/compositing/resources: Added.
  • css3/compositing/resources/reference.png: Added.
  • css3/compositing/should-have-compositing-layer-expected.txt: Added.
  • css3/compositing/should-have-compositing-layer.html: Added.
Location:
trunk
Files:
4 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r127159 r127162  
     12012-08-30  Rik Cabanier  <cabanier@adobe.com>
     2
     3        Add support for blendmode to webkit rendering engine
     4        https://bugs.webkit.org/show_bug.cgi?id=95258
     5
     6        Reviewed by Simon Fraser.
     7
     8        Enable test to verify that blending modes introduce a new compositing layer
     9
     10        * css3/compositing/resources: Added.
     11        * css3/compositing/resources/reference.png: Added.
     12        * css3/compositing/should-have-compositing-layer-expected.txt: Added.
     13        * css3/compositing/should-have-compositing-layer.html: Added.
     14
    1152012-08-30  Xianzhu Wang  <wangxianzhu@chromium.org>
    216
  • trunk/Source/WebCore/ChangeLog

    r127157 r127162  
     12012-08-30  Rik Cabanier  <cabanier@adobe.com>
     2
     3        Add support for blendmode to webkit rendering engine
     4        https://bugs.webkit.org/show_bug.cgi?id=95258
     5
     6        Reviewed by Simon Fraser.
     7
     8        This code adds support for blendmodes to the WebCore engine. The CSS parser already
     9        supported this keyword but didn't pass it along. Support for rendering blending will
     10        be provided in subsequent patches
     11
     12        Test: css3/compositing/should-have-compositing-layer.html
     13
     14        * css/StyleBuilder.cpp:
     15        (WebCore::StyleBuilder::StyleBuilder):
     16        * css/StyleResolver.cpp:
     17        (WebCore::StyleResolver::collectMatchingRulesForList):
     18        * rendering/RenderBox.h:
     19        * rendering/RenderBoxModelObject.h:
     20        (RenderBoxModelObject):
     21        (WebCore::RenderBoxModelObject::requiresLayer):
     22        * rendering/RenderInline.h:
     23        (WebCore::RenderInline::requiresLayer):
     24        * rendering/RenderLayer.cpp:
     25        (WebCore::RenderLayer::RenderLayer):
     26        (WebCore):
     27        (WebCore::RenderLayer::updateBlendMode):
     28        (WebCore::RenderLayer::ensureBacking):
     29        (WebCore::RenderLayer::shouldBeNormalFlowOnly):
     30        (WebCore::RenderLayer::styleChanged):
     31        * rendering/RenderLayer.h:
     32        (RenderLayer):
     33        (WebCore::RenderLayer::hasBlendMode):
     34        * rendering/RenderLayerCompositor.cpp:
     35        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
     36        (WebCore::RenderLayerCompositor::requiresOwnBackingStore):
     37        (WebCore::RenderLayerCompositor::reasonForCompositing):
     38        (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason):
     39        (WebCore::RenderLayerCompositor::requiresCompositingForBlending):
     40        (WebCore):
     41        * rendering/RenderLayerCompositor.h:
     42        (RenderLayerCompositor):
     43        * rendering/RenderObject.h:
     44        (RenderObject):
     45        (WebCore::RenderObject::hasBlendMode):
     46        (WebCore::RenderObject::createsGroup):
     47        * rendering/RenderTableRow.h:
     48        * rendering/style/RenderStyle.h:
     49
    1502012-08-30  Tony Chang  <tony@chromium.org>
    251
  • trunk/Source/WebCore/css/StyleBuilder.cpp

    r127155 r127162  
    19301930    setPropertyHandler(CSSPropertyWebkitBackgroundOrigin, CSSPropertyBackgroundOrigin);
    19311931    setPropertyHandler(CSSPropertyWebkitBackgroundSize, CSSPropertyBackgroundSize);
     1932#if ENABLE(CSS_COMPOSITING)
     1933    setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler());
     1934#endif
    19321935    setPropertyHandler(CSSPropertyWebkitBorderFit, ApplyPropertyDefault<EBorderFit, &RenderStyle::borderFit, EBorderFit, &RenderStyle::setBorderFit, EBorderFit, &RenderStyle::initialBorderFit>::createHandler());
    19331936    setPropertyHandler(CSSPropertyWebkitBorderHorizontalSpacing, ApplyPropertyComputeLength<short, &RenderStyle::horizontalBorderSpacing, &RenderStyle::setHorizontalBorderSpacing, &RenderStyle::initialHorizontalBorderSpacing>::createHandler());
     
    20652068    setPropertyHandler(CSSPropertyZIndex, ApplyPropertyAuto<int, &RenderStyle::zIndex, &RenderStyle::setZIndex, &RenderStyle::hasAutoZIndex, &RenderStyle::setHasAutoZIndex>::createHandler());
    20662069    setPropertyHandler(CSSPropertyZoom, ApplyPropertyZoom::createHandler());
    2067 #if ENABLE(CSS_COMPOSITING)
    2068     setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler());
    2069 #endif
    20702070}
    20712071
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r127145 r127162  
    21982198        || style->boxReflect()
    21992199        || style->hasFilter()
     2200        || style->hasBlendMode()
    22002201        || style->position() == StickyPosition
    22012202#ifdef FIXED_POSITION_CREATES_STACKING_CONTEXT
  • trunk/Source/WebCore/rendering/RenderBox.h

    r127157 r127162  
    4545    // hasAutoZIndex only returns true if the element is positioned or a flex-item since
    4646    // position:static elements that are not flex-items get their z-index coerced to auto.
    47     virtual bool requiresLayer() const OVERRIDE { return isRoot() || isPositioned() || isTransparent() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasMask() || hasReflection() || hasFilter() || style()->specifiesColumns() || !style()->hasAutoZIndex(); }
     47    virtual bool requiresLayer() const OVERRIDE { return isRoot() || isPositioned() || createsGroup() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasReflection() || style()->specifiesColumns() || !style()->hasAutoZIndex(); }
    4848
    4949    // Use this with caution! No type checking is done!
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.h

    r126816 r127162  
    8787    bool hasSelfPaintingLayer() const;
    8888    RenderLayer* layer() const { return m_layer; }
    89     virtual bool requiresLayer() const { return isRoot() || isPositioned() || isTransparent() || hasTransform() || hasHiddenBackface() || hasMask() || hasReflection() || hasFilter() || style()->specifiesColumns(); }
     89
     90    virtual bool requiresLayer() const { return isRoot() || isPositioned() || createsGroup() || hasTransform() || hasHiddenBackface() || hasReflection() || style()->specifiesColumns(); }
    9091
    9192    // This will work on inlines to return the bounding box of all of the lines' border boxes.
  • trunk/Source/WebCore/rendering/RenderInline.h

    r126859 r127162  
    126126    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
    127127
    128     virtual bool requiresLayer() const { return isInFlowPositioned() || isTransparent() || hasMask() || hasFilter(); }
     128    virtual bool requiresLayer() const { return isInFlowPositioned() || createsGroup(); }
    129129
    130130    virtual LayoutUnit offsetLeft() const;
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r126926 r127162  
    162162    , m_hasFilterInfo(false)
    163163#endif
     164#if ENABLE(CSS_COMPOSITING)
     165    , m_blendMode(BlendModeNormal)
     166#endif
    164167    , m_renderer(renderer)
    165168    , m_parent(0)
     
    543546        m_marquee->updateMarqueePosition();
    544547}
     548
     549#if ENABLE(CSS_COMPOSITING)
     550void RenderLayer::updateBlendMode()
     551{
     552    BlendMode newBlendMode = renderer()->style()->blendMode();
     553    if (newBlendMode != m_blendMode) {
     554        m_blendMode = newBlendMode;
     555        if (backing())
     556            backing()->setBlendMode(newBlendMode);
     557    }
     558}
     559#endif
    545560
    546561void RenderLayer::updateTransform()
     
    44224437        updateOrRemoveFilterEffect();
    44234438#endif
     4439#if ENABLE(CSS_COMPOSITING)
     4440        backing()->setBlendMode(m_blendMode);
     4441#endif
    44244442    }
    44254443    return m_backing.get();
     
    48084826            && !renderer()->hasFilter()
    48094827#endif
     4828#if ENABLE(CSS_COMPOSITING)
     4829            && !renderer()->hasBlendMode()
     4830#endif
    48104831            && !isTransparent()
    48114832            && !usesCompositedScrolling();
     
    49614982    updateDescendantDependentFlags();
    49624983    updateTransform();
     4984#if ENABLE(CSS_COMPOSITING)
     4985    updateBlendMode();
     4986#endif
    49634987
    49644988#if USE(ACCELERATED_COMPOSITING)
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r126859 r127162  
    614614#endif
    615615
     616#if ENABLE(CSS_COMPOSITING)
     617    bool hasBlendMode() const { return renderer()->hasBlendMode(); }
     618#else
     619    bool hasBlendMode() const { return false; }
     620#endif
     621
    616622    // Overloaded new operator. Derived classes must override operator new
    617623    // in order to allocate out of the RenderArena.
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r126663 r127162  
    14461446        || requiresCompositingForFilters(renderer)
    14471447        || requiresCompositingForPosition(renderer, layer)
    1448         || requiresCompositingForOverflowScrolling(layer);
     1448        || requiresCompositingForOverflowScrolling(layer)
     1449        || requiresCompositingForBlending(renderer);
    14491450}
    14501451
     
    14741475        || requiresCompositingForAnimation(renderer)
    14751476        || requiresCompositingForFilters(renderer)
     1477        || requiresCompositingForBlending(renderer)
    14761478        || requiresCompositingForPosition(renderer, layer)
    14771479        || requiresCompositingForOverflowScrolling(layer)
     
    15601562        if (renderer->hasFilter())
    15611563            return "filter with composited descendants";
     1564           
     1565        if (renderer->hasBlendMode())
     1566            return "blending with composited descendants";
    15621567    }
    15631568
     
    17721777    // When a layer has composited descendants, some effects, like 2d transforms, filters, masks etc must be implemented
    17731778    // via compositing so that they also apply to those composited descdendants.
    1774     if (hasCompositedDescendants && (layer->transform() || renderer->isTransparent() || renderer->hasMask() || renderer->hasReflection() || renderer->hasFilter())) {
     1779    if (hasCompositedDescendants && (layer->transform() || renderer->createsGroup() || renderer->hasReflection())) {
    17751780        reason = RenderLayer::IndirectCompositingForGraphicalEffect;
    17761781        return true;
     
    18021807
    18031808    return renderer->hasFilter();
     1809#else
     1810    UNUSED_PARAM(renderer);
     1811    return false;
     1812#endif
     1813}
     1814
     1815bool RenderLayerCompositor::requiresCompositingForBlending(RenderObject* renderer) const
     1816{
     1817#if ENABLE(CSS_COMPOSITING)
     1818    return renderer->hasBlendMode();
    18041819#else
    18051820    UNUSED_PARAM(renderer);
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r126663 r127162  
    291291    bool requiresCompositingForFrame(RenderObject*) const;
    292292    bool requiresCompositingForFilters(RenderObject*) const;
     293    bool requiresCompositingForBlending(RenderObject* renderer) const;
    293294    bool requiresCompositingForScrollableFrame() const;
    294295    bool requiresCompositingForPosition(RenderObject*, const RenderLayer*) const;
  • trunk/Source/WebCore/rendering/RenderObject.h

    r126961 r127162  
    568568#endif
    569569
     570#if ENABLE(CSS_COMPOSITING)
     571    bool hasBlendMode() const { return style() && style()->hasBlendMode(); }
     572#else
     573    bool hasBlendMode() const { return false; }
     574#endif
     575
    570576    inline bool preservesNewline() const;
    571577
     
    906912    void getTransformFromContainer(const RenderObject* container, const LayoutSize& offsetInContainer, TransformationMatrix&) const;
    907913   
     914    // return true if this object requires a new stacking context
     915    bool createsGroup() const { return isTransparent() || hasMask() || hasFilter() || hasBlendMode(); }
     916   
    908917    virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&) { };
    909918
     
    933942    void paintOutline(GraphicsContext*, const LayoutRect&);
    934943    void addPDFURLRect(GraphicsContext*, const LayoutRect&);
    935 
     944   
    936945    virtual LayoutRect viewRect() const;
    937946
  • trunk/Source/WebCore/rendering/RenderTableRow.h

    r126859 r127162  
    9898    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
    9999
    100     virtual bool requiresLayer() const OVERRIDE { return isTransparent() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasMask() || hasFilter(); }
     100    virtual bool requiresLayer() const OVERRIDE { return hasOverflowClip() || hasTransform() || hasHiddenBackface() || createsGroup(); }
    101101
    102102    virtual void paint(PaintInfo&, const LayoutPoint&);
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r127155 r127162  
    991991    BlendMode blendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode); }
    992992    void setBlendMode(BlendMode v) { rareNonInheritedData.access()->m_effectiveBlendMode = v; }
    993     bool hasBlendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode) == BlendModeNormal; }
     993    bool hasBlendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode) != BlendModeNormal; }
    994994#else
    995995    bool hasBlendMode() const { return false; }
Note: See TracChangeset for help on using the changeset viewer.