Changeset 127162 in webkit
- Timestamp:
- Aug 30, 2012 11:02:52 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r127159 r127162 1 2012-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 1 15 2012-08-30 Xianzhu Wang <wangxianzhu@chromium.org> 2 16 -
trunk/Source/WebCore/ChangeLog
r127157 r127162 1 2012-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 1 50 2012-08-30 Tony Chang <tony@chromium.org> 2 51 -
trunk/Source/WebCore/css/StyleBuilder.cpp
r127155 r127162 1930 1930 setPropertyHandler(CSSPropertyWebkitBackgroundOrigin, CSSPropertyBackgroundOrigin); 1931 1931 setPropertyHandler(CSSPropertyWebkitBackgroundSize, CSSPropertyBackgroundSize); 1932 #if ENABLE(CSS_COMPOSITING) 1933 setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler()); 1934 #endif 1932 1935 setPropertyHandler(CSSPropertyWebkitBorderFit, ApplyPropertyDefault<EBorderFit, &RenderStyle::borderFit, EBorderFit, &RenderStyle::setBorderFit, EBorderFit, &RenderStyle::initialBorderFit>::createHandler()); 1933 1936 setPropertyHandler(CSSPropertyWebkitBorderHorizontalSpacing, ApplyPropertyComputeLength<short, &RenderStyle::horizontalBorderSpacing, &RenderStyle::setHorizontalBorderSpacing, &RenderStyle::initialHorizontalBorderSpacing>::createHandler()); … … 2065 2068 setPropertyHandler(CSSPropertyZIndex, ApplyPropertyAuto<int, &RenderStyle::zIndex, &RenderStyle::setZIndex, &RenderStyle::hasAutoZIndex, &RenderStyle::setHasAutoZIndex>::createHandler()); 2066 2069 setPropertyHandler(CSSPropertyZoom, ApplyPropertyZoom::createHandler()); 2067 #if ENABLE(CSS_COMPOSITING)2068 setPropertyHandler(CSSPropertyWebkitBlendMode, ApplyPropertyDefault<BlendMode, &RenderStyle::blendMode, BlendMode, &RenderStyle::setBlendMode, BlendMode, &RenderStyle::initialBlendMode>::createHandler());2069 #endif2070 2070 } 2071 2071 -
trunk/Source/WebCore/css/StyleResolver.cpp
r127145 r127162 2198 2198 || style->boxReflect() 2199 2199 || style->hasFilter() 2200 || style->hasBlendMode() 2200 2201 || style->position() == StickyPosition 2201 2202 #ifdef FIXED_POSITION_CREATES_STACKING_CONTEXT -
trunk/Source/WebCore/rendering/RenderBox.h
r127157 r127162 45 45 // hasAutoZIndex only returns true if the element is positioned or a flex-item since 46 46 // 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(); } 48 48 49 49 // Use this with caution! No type checking is done! -
trunk/Source/WebCore/rendering/RenderBoxModelObject.h
r126816 r127162 87 87 bool hasSelfPaintingLayer() const; 88 88 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(); } 90 91 91 92 // 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 126 126 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE; 127 127 128 virtual bool requiresLayer() const { return isInFlowPositioned() || isTransparent() || hasMask() || hasFilter(); }128 virtual bool requiresLayer() const { return isInFlowPositioned() || createsGroup(); } 129 129 130 130 virtual LayoutUnit offsetLeft() const; -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r126926 r127162 162 162 , m_hasFilterInfo(false) 163 163 #endif 164 #if ENABLE(CSS_COMPOSITING) 165 , m_blendMode(BlendModeNormal) 166 #endif 164 167 , m_renderer(renderer) 165 168 , m_parent(0) … … 543 546 m_marquee->updateMarqueePosition(); 544 547 } 548 549 #if ENABLE(CSS_COMPOSITING) 550 void 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 545 560 546 561 void RenderLayer::updateTransform() … … 4422 4437 updateOrRemoveFilterEffect(); 4423 4438 #endif 4439 #if ENABLE(CSS_COMPOSITING) 4440 backing()->setBlendMode(m_blendMode); 4441 #endif 4424 4442 } 4425 4443 return m_backing.get(); … … 4808 4826 && !renderer()->hasFilter() 4809 4827 #endif 4828 #if ENABLE(CSS_COMPOSITING) 4829 && !renderer()->hasBlendMode() 4830 #endif 4810 4831 && !isTransparent() 4811 4832 && !usesCompositedScrolling(); … … 4961 4982 updateDescendantDependentFlags(); 4962 4983 updateTransform(); 4984 #if ENABLE(CSS_COMPOSITING) 4985 updateBlendMode(); 4986 #endif 4963 4987 4964 4988 #if USE(ACCELERATED_COMPOSITING) -
trunk/Source/WebCore/rendering/RenderLayer.h
r126859 r127162 614 614 #endif 615 615 616 #if ENABLE(CSS_COMPOSITING) 617 bool hasBlendMode() const { return renderer()->hasBlendMode(); } 618 #else 619 bool hasBlendMode() const { return false; } 620 #endif 621 616 622 // Overloaded new operator. Derived classes must override operator new 617 623 // in order to allocate out of the RenderArena. -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r126663 r127162 1446 1446 || requiresCompositingForFilters(renderer) 1447 1447 || requiresCompositingForPosition(renderer, layer) 1448 || requiresCompositingForOverflowScrolling(layer); 1448 || requiresCompositingForOverflowScrolling(layer) 1449 || requiresCompositingForBlending(renderer); 1449 1450 } 1450 1451 … … 1474 1475 || requiresCompositingForAnimation(renderer) 1475 1476 || requiresCompositingForFilters(renderer) 1477 || requiresCompositingForBlending(renderer) 1476 1478 || requiresCompositingForPosition(renderer, layer) 1477 1479 || requiresCompositingForOverflowScrolling(layer) … … 1560 1562 if (renderer->hasFilter()) 1561 1563 return "filter with composited descendants"; 1564 1565 if (renderer->hasBlendMode()) 1566 return "blending with composited descendants"; 1562 1567 } 1563 1568 … … 1772 1777 // When a layer has composited descendants, some effects, like 2d transforms, filters, masks etc must be implemented 1773 1778 // 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())) { 1775 1780 reason = RenderLayer::IndirectCompositingForGraphicalEffect; 1776 1781 return true; … … 1802 1807 1803 1808 return renderer->hasFilter(); 1809 #else 1810 UNUSED_PARAM(renderer); 1811 return false; 1812 #endif 1813 } 1814 1815 bool RenderLayerCompositor::requiresCompositingForBlending(RenderObject* renderer) const 1816 { 1817 #if ENABLE(CSS_COMPOSITING) 1818 return renderer->hasBlendMode(); 1804 1819 #else 1805 1820 UNUSED_PARAM(renderer); -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r126663 r127162 291 291 bool requiresCompositingForFrame(RenderObject*) const; 292 292 bool requiresCompositingForFilters(RenderObject*) const; 293 bool requiresCompositingForBlending(RenderObject* renderer) const; 293 294 bool requiresCompositingForScrollableFrame() const; 294 295 bool requiresCompositingForPosition(RenderObject*, const RenderLayer*) const; -
trunk/Source/WebCore/rendering/RenderObject.h
r126961 r127162 568 568 #endif 569 569 570 #if ENABLE(CSS_COMPOSITING) 571 bool hasBlendMode() const { return style() && style()->hasBlendMode(); } 572 #else 573 bool hasBlendMode() const { return false; } 574 #endif 575 570 576 inline bool preservesNewline() const; 571 577 … … 906 912 void getTransformFromContainer(const RenderObject* container, const LayoutSize& offsetInContainer, TransformationMatrix&) const; 907 913 914 // return true if this object requires a new stacking context 915 bool createsGroup() const { return isTransparent() || hasMask() || hasFilter() || hasBlendMode(); } 916 908 917 virtual void addFocusRingRects(Vector<IntRect>&, const LayoutPoint&) { }; 909 918 … … 933 942 void paintOutline(GraphicsContext*, const LayoutRect&); 934 943 void addPDFURLRect(GraphicsContext*, const LayoutRect&); 935 944 936 945 virtual LayoutRect viewRect() const; 937 946 -
trunk/Source/WebCore/rendering/RenderTableRow.h
r126859 r127162 98 98 virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE; 99 99 100 virtual bool requiresLayer() const OVERRIDE { return isTransparent() || hasOverflowClip() || hasTransform() || hasHiddenBackface() || hasMask() || hasFilter(); }100 virtual bool requiresLayer() const OVERRIDE { return hasOverflowClip() || hasTransform() || hasHiddenBackface() || createsGroup(); } 101 101 102 102 virtual void paint(PaintInfo&, const LayoutPoint&); -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r127155 r127162 991 991 BlendMode blendMode() const { return static_cast<BlendMode>(rareNonInheritedData->m_effectiveBlendMode); } 992 992 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; } 994 994 #else 995 995 bool hasBlendMode() const { return false; }
Note: See TracChangeset
for help on using the changeset viewer.