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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintLayer.cpp

Issue 2349183002: Turn FilterEffectBuilder into a stack-allocated helper (Closed)
Patch Set: Created 4 years, 3 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) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 2362 matching lines...) Expand 10 before | Expand all | Expand 10 after
2373 } 2373 }
2374 2374
2375 void PaintLayer::ensureCompositedLayerMapping() 2375 void PaintLayer::ensureCompositedLayerMapping()
2376 { 2376 {
2377 if (m_rareData && m_rareData->compositedLayerMapping) 2377 if (m_rareData && m_rareData->compositedLayerMapping)
2378 return; 2378 return;
2379 2379
2380 ensureRareData().compositedLayerMapping = wrapUnique(new CompositedLayerMapp ing(*this)); 2380 ensureRareData().compositedLayerMapping = wrapUnique(new CompositedLayerMapp ing(*this));
2381 m_rareData->compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLaye rUpdateSubtree); 2381 m_rareData->compositedLayerMapping->setNeedsGraphicsLayerUpdate(GraphicsLaye rUpdateSubtree);
2382 2382
2383 updateOrRemoveFilterEffectBuilder(); 2383 updateOrRemoveFilterEffect();
2384 } 2384 }
2385 2385
2386 void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed) 2386 void PaintLayer::clearCompositedLayerMapping(bool layerBeingDestroyed)
2387 { 2387 {
2388 if (!layerBeingDestroyed) { 2388 if (!layerBeingDestroyed) {
2389 // We need to make sure our decendants get a geometry update. In princip le, 2389 // We need to make sure our decendants get a geometry update. In princip le,
2390 // we could call setNeedsGraphicsLayerUpdate on our children, but that w ould 2390 // we could call setNeedsGraphicsLayerUpdate on our children, but that w ould
2391 // require walking the z-order lists to find them. Instead, we over-inva lidate 2391 // require walking the z-order lists to find them. Instead, we over-inva lidate
2392 // by marking our parent as needing a geometry update. 2392 // by marking our parent as needing a geometry update.
2393 if (PaintLayer* compositingParent = enclosingLayerWithCompositedLayerMap ping(ExcludeSelf)) 2393 if (PaintLayer* compositingParent = enclosingLayerWithCompositedLayerMap ping(ExcludeSelf))
2394 compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUp date(GraphicsLayerUpdateSubtree); 2394 compositingParent->compositedLayerMapping()->setNeedsGraphicsLayerUp date(GraphicsLayerUpdateSubtree);
2395 } 2395 }
2396 2396
2397 if (m_rareData) 2397 if (m_rareData)
2398 m_rareData->compositedLayerMapping.reset(); 2398 m_rareData->compositedLayerMapping.reset();
2399 2399
2400 if (!layerBeingDestroyed) 2400 if (!layerBeingDestroyed)
2401 updateOrRemoveFilterEffectBuilder(); 2401 updateOrRemoveFilterEffect();
2402 } 2402 }
2403 2403
2404 void PaintLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping, SetGr oupMappingOptions options) 2404 void PaintLayer::setGroupedMapping(CompositedLayerMapping* groupedMapping, SetGr oupMappingOptions options)
2405 { 2405 {
2406 CompositedLayerMapping* oldGroupedMapping = this->groupedMapping(); 2406 CompositedLayerMapping* oldGroupedMapping = this->groupedMapping();
2407 if (groupedMapping == oldGroupedMapping) 2407 if (groupedMapping == oldGroupedMapping)
2408 return; 2408 return;
2409 2409
2410 if (options == InvalidateLayerAndRemoveFromMapping && oldGroupedMapping) { 2410 if (options == InvalidateLayerAndRemoveFromMapping && oldGroupedMapping) {
2411 oldGroupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtre e); 2411 oldGroupedMapping->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdateSubtre e);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
2575 2575
2576 return hasBoxDecorationsOrBackground() || hasOverflowControls(); 2576 return hasBoxDecorationsOrBackground() || hasOverflowControls();
2577 } 2577 }
2578 2578
2579 void PaintLayer::updateFilters(const ComputedStyle* oldStyle, const ComputedStyl e& newStyle) 2579 void PaintLayer::updateFilters(const ComputedStyle* oldStyle, const ComputedStyl e& newStyle)
2580 { 2580 {
2581 if (!newStyle.hasFilterInducingProperty() && (!oldStyle || !oldStyle->hasFil terInducingProperty())) 2581 if (!newStyle.hasFilterInducingProperty() && (!oldStyle || !oldStyle->hasFil terInducingProperty()))
2582 return; 2582 return;
2583 2583
2584 updateOrRemoveFilterClients(); 2584 updateOrRemoveFilterClients();
2585 updateOrRemoveFilterEffectBuilder(); 2585 updateOrRemoveFilterEffect();
2586 } 2586 }
2587 2587
2588 bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp utedStyle* oldStyle) 2588 bool PaintLayer::attemptDirectCompositingUpdate(StyleDifference diff, const Comp utedStyle* oldStyle)
2589 { 2589 {
2590 CompositingReasons oldPotentialCompositingReasonsFromStyle = potentialCompos itingReasonsFromStyle(); 2590 CompositingReasons oldPotentialCompositingReasonsFromStyle = potentialCompos itingReasonsFromStyle();
2591 compositor()->updatePotentialCompositingReasonsFromStyle(this); 2591 compositor()->updatePotentialCompositingReasonsFromStyle(this);
2592 2592
2593 // This function implements an optimization for transforms and opacity. 2593 // This function implements an optimization for transforms and opacity.
2594 // A common pattern is for a touchmove handler to update the transform 2594 // A common pattern is for a touchmove handler to update the transform
2595 // and/or an opacity of an element every frame while the user moves their 2595 // and/or an opacity of an element every frame while the user moves their
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2684 bool PaintLayer::scrollsOverflow() const 2684 bool PaintLayer::scrollsOverflow() const
2685 { 2685 {
2686 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea()) 2686 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea())
2687 return scrollableArea->scrollsOverflow(); 2687 return scrollableArea->scrollsOverflow();
2688 2688
2689 return false; 2689 return false;
2690 } 2690 }
2691 2691
2692 namespace { 2692 namespace {
2693 2693
2694 FilterOperations resolveReferenceFilters( 2694 FilterOperations resolveReferenceFilters(const FilterEffectBuilder& builder, con st FilterOperations& filters)
2695 const FilterOperations& filters, float effectiveZoom, Element& element, cons t FloatRect& zoomedReferenceBox)
2696 { 2695 {
2697 DCHECK(filters.hasReferenceFilter()); 2696 DCHECK(filters.hasReferenceFilter());
2698 2697
2699 for (FilterOperation* filterOperation : filters.operations()) { 2698 for (FilterOperation* filterOperation : filters.operations()) {
2700 if (filterOperation->type() != FilterOperation::REFERENCE) 2699 if (filterOperation->type() != FilterOperation::REFERENCE)
2701 continue; 2700 continue;
2702 ReferenceFilterOperation& referenceOperation = toReferenceFilterOperatio n(*filterOperation); 2701 ReferenceFilterOperation& referenceOperation = toReferenceFilterOperatio n(*filterOperation);
2703 // TODO(fs): Cache the Filter if it didn't change. 2702 // TODO(fs): Cache the Filter if it didn't change.
2704 Filter* referenceFilter = FilterEffectBuilder::buildReferenceFilter(refe renceOperation, zoomedReferenceBox, nullptr, nullptr, element, nullptr, effectiv eZoom); 2703 referenceOperation.setFilter(builder.buildReferenceFilter(referenceOpera tion));
2705 referenceOperation.setFilter(referenceFilter);
2706 } 2704 }
2707 return filters; 2705 return filters;
2708 } 2706 }
2709 2707
2710 } // unnamed namespace 2708 } // unnamed namespace
2711 2709
2712 FilterOperations PaintLayer::addReflectionToFilterOperations(const ComputedStyle & style) const 2710 FilterOperations PaintLayer::addReflectionToFilterOperations(const ComputedStyle & style) const
2713 { 2711 {
2714 FilterOperations filterOperations = style.filter(); 2712 FilterOperations filterOperations = style.filter();
2715 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && layoutObject()-> hasReflection() && layoutObject()->isBox()) { 2713 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && layoutObject()-> hasReflection() && layoutObject()->isBox()) {
2716 BoxReflection reflection = boxReflectionForPaintLayer(*this, style); 2714 BoxReflection reflection = boxReflectionForPaintLayer(*this, style);
2717 filterOperations.operations().append(BoxReflectFilterOperation::create(r eflection)); 2715 filterOperations.operations().append(BoxReflectFilterOperation::create(r eflection));
2718 } 2716 }
2719 return filterOperations; 2717 return filterOperations;
2720 } 2718 }
2721 2719
2722 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForFilter (const ComputedStyle& style) 2720 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForFilter (const ComputedStyle& style)
2723 { 2721 {
2724 FilterOperations filterOperations = addReflectionToFilterOperations(style); 2722 FilterOperations filterOperations = addReflectionToFilterOperations(style);
2725 if (filterOperations.hasReferenceFilter()) 2723 if (filterOperations.hasReferenceFilter()) {
2726 filterOperations = resolveReferenceFilters(filterOperations, style.effec tiveZoom(), toElement(*enclosingNode()), boxForFilter()); 2724 FilterEffectBuilder builder(toElement(enclosingNode()), boxForFilter(), style.effectiveZoom());
2725 filterOperations = resolveReferenceFilters(builder, filterOperations);
2726 }
2727 return SkiaImageFilterBuilder::buildFilterOperations(filterOperations); 2727 return SkiaImageFilterBuilder::buildFilterOperations(filterOperations);
2728 } 2728 }
2729 2729
2730 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForBackdr opFilter(const ComputedStyle& style) 2730 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForBackdr opFilter(const ComputedStyle& style)
2731 { 2731 {
2732 FilterOperations operations = style.backdropFilter(); 2732 FilterOperations operations = style.backdropFilter();
2733 if (operations.hasReferenceFilter()) 2733 if (operations.hasReferenceFilter()) {
2734 operations = resolveReferenceFilters(operations, style.effectiveZoom(), toElement(*enclosingNode()), boxForFilter()); 2734 FilterEffectBuilder builder(toElement(enclosingNode()), boxForFilter(), style.effectiveZoom());
2735 operations = resolveReferenceFilters(builder, operations);
2736 }
2735 return SkiaImageFilterBuilder::buildFilterOperations(operations); 2737 return SkiaImageFilterBuilder::buildFilterOperations(operations);
2736 } 2738 }
2737 2739
2738 PaintLayerFilterInfo& PaintLayer::ensureFilterInfo() 2740 PaintLayerFilterInfo& PaintLayer::ensureFilterInfo()
2739 { 2741 {
2740 PaintLayerRareData& rareData = ensureRareData(); 2742 PaintLayerRareData& rareData = ensureRareData();
2741 if (!rareData.filterInfo) 2743 if (!rareData.filterInfo)
2742 rareData.filterInfo = new PaintLayerFilterInfo(this); 2744 rareData.filterInfo = new PaintLayerFilterInfo(this);
2743 return *rareData.filterInfo; 2745 return *rareData.filterInfo;
2744 } 2746 }
(...skipping 21 matching lines...) Expand all
2766 if (filter.isEmpty() && m_rareData && m_rareData->filterInfo) { 2768 if (filter.isEmpty() && m_rareData && m_rareData->filterInfo) {
2767 m_rareData->filterInfo->clearLayer(); 2769 m_rareData->filterInfo->clearLayer();
2768 m_rareData->filterInfo = nullptr; 2770 m_rareData->filterInfo = nullptr;
2769 } else if (filter.hasReferenceFilter()) { 2771 } else if (filter.hasReferenceFilter()) {
2770 ensureFilterInfo().updateReferenceFilterClients(filter); 2772 ensureFilterInfo().updateReferenceFilterClients(filter);
2771 } else if (filterInfo()) { 2773 } else if (filterInfo()) {
2772 filterInfo()->clearFilterReferences(); 2774 filterInfo()->clearFilterReferences();
2773 } 2775 }
2774 } 2776 }
2775 2777
2776 FilterEffectBuilder* PaintLayer::updateFilterEffectBuilder() const 2778 FilterEffect* PaintLayer::updateFilterEffect() const
2777 { 2779 {
2778 // TODO(chrishtr): ensure (and assert) that compositing is clean here. 2780 // TODO(chrishtr): ensure (and assert) that compositing is clean here.
2779 2781
2780 if (!paintsWithFilters()) 2782 if (!paintsWithFilters())
2781 return nullptr; 2783 return nullptr;
2782 2784
2783 PaintLayerFilterInfo* filterInfo = this->filterInfo(); 2785 PaintLayerFilterInfo* filterInfo = this->filterInfo();
2784 2786
2785 // Should have been added by updateOrRemoveFilterEffectBuilder(). 2787 // Should have been added by updateOrRemoveFilterEffect().
2786 ASSERT(filterInfo); 2788 ASSERT(filterInfo);
2787 2789
2788 if (filterInfo->builder()) 2790 if (filterInfo->lastEffect())
2789 return filterInfo->builder(); 2791 return filterInfo->lastEffect();
2790
2791 filterInfo->setBuilder(FilterEffectBuilder::create());
2792 2792
2793 const ComputedStyle& style = layoutObject()->styleRef(); 2793 const ComputedStyle& style = layoutObject()->styleRef();
2794 Element* element = toElement(enclosingNode()); 2794 const bool hasReferenceFilter = style.filter().hasReferenceFilter();
2795 FloatRect zoomedReferenceBox;
2796 if (hasReferenceFilter)
2797 zoomedReferenceBox = boxForFilter();
2798
2795 FilterOperations operations = addReflectionToFilterOperations(style); 2799 FilterOperations operations = addReflectionToFilterOperations(style);
2796 FloatRect zoomedReferenceBox; 2800 FilterEffectBuilder builder(toElement(enclosingNode()), zoomedReferenceBox, style.effectiveZoom());
2797 if (style.filter().hasReferenceFilter()) { 2801 if (hasReferenceFilter)
2798 zoomedReferenceBox = boxForFilter(); 2802 operations = resolveReferenceFilters(builder, operations);
2799 operations = resolveReferenceFilters(operations, style.effectiveZoom(), *element, zoomedReferenceBox);
2800 }
2801 if (!filterInfo->builder()->build(element, operations, style.effectiveZoom() , zoomedReferenceBox))
2802 filterInfo->setBuilder(nullptr);
2803 2803
2804 return filterInfo->builder(); 2804 filterInfo->setLastEffect(builder.buildFilterEffect(operations));
2805 return filterInfo->lastEffect();
2805 } 2806 }
2806 2807
2807 FilterEffect* PaintLayer::lastFilterEffect() const 2808 FilterEffect* PaintLayer::lastFilterEffect() const
2808 { 2809 {
2809 FilterEffectBuilder* builder = updateFilterEffectBuilder(); 2810 return updateFilterEffect();
2810 if (!builder)
2811 return nullptr;
2812 return builder->lastEffect();
2813 } 2811 }
2814 2812
2815 FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const 2813 FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const
2816 { 2814 {
2817 if (!hasFilterThatMovesPixels()) 2815 if (!hasFilterThatMovesPixels())
2818 return rect; 2816 return rect;
2819 2817
2820 // Ensure the filter-chain is refreshed wrt reference filters. 2818 // Ensure the filter-chain is refreshed wrt reference filters.
2821 updateFilterEffectBuilder(); 2819 updateFilterEffect();
2822 2820
2823 FilterOperations filterOperations = addReflectionToFilterOperations(layoutOb ject()->styleRef()); 2821 FilterOperations filterOperations = addReflectionToFilterOperations(layoutOb ject()->styleRef());
2824 return filterOperations.mapRect(rect); 2822 return filterOperations.mapRect(rect);
2825 } 2823 }
2826 2824
2827 LayoutRect PaintLayer::mapLayoutRectForFilter(const LayoutRect& rect) const 2825 LayoutRect PaintLayer::mapLayoutRectForFilter(const LayoutRect& rect) const
2828 { 2826 {
2829 if (!hasFilterThatMovesPixels()) 2827 if (!hasFilterThatMovesPixels())
2830 return rect; 2828 return rect;
2831 return enclosingLayoutRect(mapRectForFilter(FloatRect(rect))); 2829 return enclosingLayoutRect(mapRectForFilter(FloatRect(rect)));
2832 } 2830 }
2833 2831
2834 bool PaintLayer::hasFilterThatMovesPixels() const 2832 bool PaintLayer::hasFilterThatMovesPixels() const
2835 { 2833 {
2836 if (!hasFilterInducingProperty()) 2834 if (!hasFilterInducingProperty())
2837 return false; 2835 return false;
2838 const ComputedStyle& style = layoutObject()->styleRef(); 2836 const ComputedStyle& style = layoutObject()->styleRef();
2839 if (style.hasFilter() && style.filter().hasFilterThatMovesPixels()) 2837 if (style.hasFilter() && style.filter().hasFilterThatMovesPixels())
2840 return true; 2838 return true;
2841 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && style.hasBoxRefl ect()) 2839 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && style.hasBoxRefl ect())
2842 return true; 2840 return true;
2843 return false; 2841 return false;
2844 } 2842 }
2845 2843
2846 void PaintLayer::updateOrRemoveFilterEffectBuilder() 2844 void PaintLayer::updateOrRemoveFilterEffect()
2847 { 2845 {
2848 // FilterEffectBuilder is only used to render the filters in software mode, 2846 // FilterEffectBuilder is only used to render the filters in software mode,
2849 // so we always need to run updateOrRemoveFilterEffectBuilder after the comp osited 2847 // so we always need to run updateOrRemoveFilterEffect after the composited
2850 // mode might have changed for this layer. 2848 // mode might have changed for this layer.
2851 if (!paintsWithFilters()) { 2849 if (!paintsWithFilters()) {
2852 // Don't delete the whole filter info here, because we might use it
2853 // for loading CSS shader files.
2854 if (PaintLayerFilterInfo* filterInfo = this->filterInfo()) 2850 if (PaintLayerFilterInfo* filterInfo = this->filterInfo())
2855 filterInfo->setBuilder(nullptr); 2851 filterInfo->setLastEffect(nullptr);
2856
2857 return; 2852 return;
2858 } 2853 }
2859 2854
2860 ensureFilterInfo().setBuilder(nullptr); 2855 ensureFilterInfo().setLastEffect(nullptr);
2861 } 2856 }
2862 2857
2863 void PaintLayer::filterNeedsPaintInvalidation() 2858 void PaintLayer::filterNeedsPaintInvalidation()
2864 { 2859 {
2865 { 2860 {
2866 DeprecatedScheduleStyleRecalcDuringLayout marker(layoutObject()->documen t().lifecycle()); 2861 DeprecatedScheduleStyleRecalcDuringLayout marker(layoutObject()->documen t().lifecycle());
2867 // It's possible for scheduleSVGFilterLayerUpdateHack to schedule a styl e recalc, which 2862 // It's possible for scheduleSVGFilterLayerUpdateHack to schedule a styl e recalc, which
2868 // is a problem because this function can be called right before perform ing layout but 2863 // is a problem because this function can be called right before perform ing layout but
2869 // after style recalc. 2864 // after style recalc.
2870 // 2865 //
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
3007 3002
3008 void showLayerTree(const blink::LayoutObject* layoutObject) 3003 void showLayerTree(const blink::LayoutObject* layoutObject)
3009 { 3004 {
3010 if (!layoutObject) { 3005 if (!layoutObject) {
3011 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); 3006 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n");
3012 return; 3007 return;
3013 } 3008 }
3014 showLayerTree(layoutObject->enclosingLayer()); 3009 showLayerTree(layoutObject->enclosingLayer());
3015 } 3010 }
3016 #endif 3011 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698