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

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

Issue 2343173002: Let clients of FilterEffectBuilder compute/provide the reference-box (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 2056 matching lines...) Expand 10 before | Expand all | Expand 10 after
2067 if (!result.hitTestRequest().listBased()) 2067 if (!result.hitTestRequest().listBased())
2068 result = tempResult; 2068 result = tempResult;
2069 if (!depthSortDescendants) 2069 if (!depthSortDescendants)
2070 break; 2070 break;
2071 } 2071 }
2072 } 2072 }
2073 2073
2074 return resultLayer; 2074 return resultLayer;
2075 } 2075 }
2076 2076
2077 FloatRect PaintLayer::boxForFilter() const
2078 {
2079 return FloatRect(physicalBoundingBoxIncludingReflectionAndStackingChildren(
2080 LayoutPoint(), PaintLayer::CalculateBoundsOptions::IncludeTransformsAndC ompositedChildLayers));
2081 }
2082
2077 LayoutRect PaintLayer::boxForClipPath() const 2083 LayoutRect PaintLayer::boxForClipPath() const
2078 { 2084 {
2079 if (!layoutObject()->isBox()) { 2085 if (!layoutObject()->isBox()) {
2080 SECURITY_DCHECK(layoutObject()->isLayoutInline()); 2086 SECURITY_DCHECK(layoutObject()->isLayoutInline());
2081 const LayoutInline& layoutInline = toLayoutInline(*layoutObject()); 2087 const LayoutInline& layoutInline = toLayoutInline(*layoutObject());
2082 // This somewhat convoluted computation matches what Gecko does. 2088 // This somewhat convoluted computation matches what Gecko does.
2083 // See crbug.com/641907. 2089 // See crbug.com/641907.
2084 LayoutRect inlineBBox = layoutInline.linesBoundingBox(); 2090 LayoutRect inlineBBox = layoutInline.linesBoundingBox();
2085 const InlineFlowBox* flowBox = layoutInline.firstLineBox(); 2091 const InlineFlowBox* flowBox = layoutInline.firstLineBox();
2086 inlineBBox.setHeight(flowBox ? flowBox->frameRect().height() : LayoutUni t(0)); 2092 inlineBBox.setHeight(flowBox ? flowBox->frameRect().height() : LayoutUni t(0));
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
2678 bool PaintLayer::scrollsOverflow() const 2684 bool PaintLayer::scrollsOverflow() const
2679 { 2685 {
2680 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea()) 2686 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea())
2681 return scrollableArea->scrollsOverflow(); 2687 return scrollableArea->scrollsOverflow();
2682 2688
2683 return false; 2689 return false;
2684 } 2690 }
2685 2691
2686 namespace { 2692 namespace {
2687 2693
2688 FilterOperations resolveReferenceFilters(const FilterOperations& filters, float effectiveZoom, Node* enclosingNode) 2694 FilterOperations resolveReferenceFilters(
2695 const FilterOperations& filters, float effectiveZoom, Element& element, cons t FloatRect& zoomedReferenceBox)
2689 { 2696 {
2690 if (filters.hasReferenceFilter()) { 2697 DCHECK(filters.hasReferenceFilter());
2691 for (size_t i = 0; i < filters.size(); ++i) { 2698
2692 FilterOperation* filterOperation = filters.operations().at(i).get(); 2699 for (FilterOperation* filterOperation : filters.operations()) {
2693 if (filterOperation->type() != FilterOperation::REFERENCE) 2700 if (filterOperation->type() != FilterOperation::REFERENCE)
2694 continue; 2701 continue;
2695 ReferenceFilterOperation& referenceOperation = toReferenceFilterOper ation(*filterOperation); 2702 ReferenceFilterOperation& referenceOperation = toReferenceFilterOperatio n(*filterOperation);
2696 // FIXME: Cache the Filter if it didn't change. 2703 // TODO(fs): Cache the Filter if it didn't change.
2697 Filter* referenceFilter = FilterEffectBuilder::buildReferenceFilter( referenceOperation, nullptr, nullptr, nullptr, *toElement(enclosingNode), nullpt r, effectiveZoom); 2704 Filter* referenceFilter = FilterEffectBuilder::buildReferenceFilter(refe renceOperation, zoomedReferenceBox, nullptr, nullptr, element, nullptr, effectiv eZoom);
2698 referenceOperation.setFilter(referenceFilter); 2705 referenceOperation.setFilter(referenceFilter);
2699 }
2700 } 2706 }
2701 return filters; 2707 return filters;
2702 } 2708 }
2703 2709
2704 } // unnamed namespace 2710 } // unnamed namespace
2705 2711
2706 FilterOperations PaintLayer::computeFilterOperations(const ComputedStyle& style) const 2712 FilterOperations PaintLayer::addReflectionToFilterOperations(const ComputedStyle & style) const
2707 { 2713 {
2708 FilterOperations filterOperations = style.filter(); 2714 FilterOperations filterOperations = style.filter();
2709 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && layoutObject()-> hasReflection() && layoutObject()->isBox()) { 2715 if (RuntimeEnabledFeatures::cssBoxReflectFilterEnabled() && layoutObject()-> hasReflection() && layoutObject()->isBox()) {
2710 BoxReflection reflection = boxReflectionForPaintLayer(*this, style); 2716 BoxReflection reflection = boxReflectionForPaintLayer(*this, style);
2711 filterOperations.operations().append(BoxReflectFilterOperation::create(r eflection)); 2717 filterOperations.operations().append(BoxReflectFilterOperation::create(r eflection));
2712 } 2718 }
2713 return resolveReferenceFilters(filterOperations, style.effectiveZoom(), encl osingNode()); 2719 return filterOperations;
2714 } 2720 }
2715 2721
2716 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForFilter (const ComputedStyle& style) 2722 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForFilter (const ComputedStyle& style)
2717 { 2723 {
2718 return SkiaImageFilterBuilder::buildFilterOperations(computeFilterOperations (style)); 2724 FilterOperations filterOperations = addReflectionToFilterOperations(style);
2725 if (filterOperations.hasReferenceFilter())
2726 filterOperations = resolveReferenceFilters(filterOperations, style.effec tiveZoom(), toElement(*enclosingNode()), boxForFilter());
2727 return SkiaImageFilterBuilder::buildFilterOperations(filterOperations);
2719 } 2728 }
2720 2729
2721 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForBackdr opFilter(const ComputedStyle& style) 2730 CompositorFilterOperations PaintLayer::createCompositorFilterOperationsForBackdr opFilter(const ComputedStyle& style)
2722 { 2731 {
2723 FilterOperations operations = resolveReferenceFilters(style.backdropFilter() , style.effectiveZoom(), enclosingNode()); 2732 FilterOperations operations = style.backdropFilter();
2733 if (operations.hasReferenceFilter())
2734 operations = resolveReferenceFilters(operations, style.effectiveZoom(), toElement(*enclosingNode()), boxForFilter());
2724 return SkiaImageFilterBuilder::buildFilterOperations(operations); 2735 return SkiaImageFilterBuilder::buildFilterOperations(operations);
2725 } 2736 }
2726 2737
2727 PaintLayerFilterInfo& PaintLayer::ensureFilterInfo() 2738 PaintLayerFilterInfo& PaintLayer::ensureFilterInfo()
2728 { 2739 {
2729 PaintLayerRareData& rareData = ensureRareData(); 2740 PaintLayerRareData& rareData = ensureRareData();
2730 if (!rareData.filterInfo) 2741 if (!rareData.filterInfo)
2731 rareData.filterInfo = new PaintLayerFilterInfo(this); 2742 rareData.filterInfo = new PaintLayerFilterInfo(this);
2732 return *rareData.filterInfo; 2743 return *rareData.filterInfo;
2733 } 2744 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2773 2784
2774 // Should have been added by updateOrRemoveFilterEffectBuilder(). 2785 // Should have been added by updateOrRemoveFilterEffectBuilder().
2775 ASSERT(filterInfo); 2786 ASSERT(filterInfo);
2776 2787
2777 if (filterInfo->builder()) 2788 if (filterInfo->builder())
2778 return filterInfo->builder(); 2789 return filterInfo->builder();
2779 2790
2780 filterInfo->setBuilder(FilterEffectBuilder::create()); 2791 filterInfo->setBuilder(FilterEffectBuilder::create());
2781 2792
2782 const ComputedStyle& style = layoutObject()->styleRef(); 2793 const ComputedStyle& style = layoutObject()->styleRef();
2783 if (!filterInfo->builder()->build(toElement(enclosingNode()), computeFilterO perations(style), style.effectiveZoom())) 2794 Element* element = toElement(enclosingNode());
2795 FilterOperations operations = addReflectionToFilterOperations(style);
2796 FloatRect zoomedReferenceBox;
2797 if (style.filter().hasReferenceFilter()) {
2798 zoomedReferenceBox = boxForFilter();
2799 operations = resolveReferenceFilters(operations, style.effectiveZoom(), *element, zoomedReferenceBox);
2800 }
2801 if (!filterInfo->builder()->build(element, operations, style.effectiveZoom() , zoomedReferenceBox))
2784 filterInfo->setBuilder(nullptr); 2802 filterInfo->setBuilder(nullptr);
2785 2803
2786 return filterInfo->builder(); 2804 return filterInfo->builder();
2787 } 2805 }
2788 2806
2789 FilterEffect* PaintLayer::lastFilterEffect() const 2807 FilterEffect* PaintLayer::lastFilterEffect() const
2790 { 2808 {
2791 FilterEffectBuilder* builder = updateFilterEffectBuilder(); 2809 FilterEffectBuilder* builder = updateFilterEffectBuilder();
2792 if (!builder) 2810 if (!builder)
2793 return nullptr; 2811 return nullptr;
2794 return builder->lastEffect(); 2812 return builder->lastEffect();
2795 } 2813 }
2796 2814
2797 FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const 2815 FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const
2798 { 2816 {
2799 if (!hasFilterThatMovesPixels()) 2817 if (!hasFilterThatMovesPixels())
2800 return rect; 2818 return rect;
2819
2801 // Ensure the filter-chain is refreshed wrt reference filters. 2820 // Ensure the filter-chain is refreshed wrt reference filters.
2802 updateFilterEffectBuilder(); 2821 updateFilterEffectBuilder();
2803 2822
2804 FilterOperations filterOperations = computeFilterOperations(layoutObject()-> styleRef()); 2823 FilterOperations filterOperations = addReflectionToFilterOperations(layoutOb ject()->styleRef());
Stephen White 2016/09/16 19:14:23 Isn't this already handled by the call to updateFi
Stephen White 2016/09/16 19:16:54 Oh, I see now that the computed filter operations
fs 2016/09/16 19:20:37 It isn't handled because there (in updateFilterEff
2805 return filterOperations.mapRect(rect); 2824 return filterOperations.mapRect(rect);
2806 } 2825 }
2807 2826
2808 LayoutRect PaintLayer::mapLayoutRectForFilter(const LayoutRect& rect) const 2827 LayoutRect PaintLayer::mapLayoutRectForFilter(const LayoutRect& rect) const
2809 { 2828 {
2810 if (!hasFilterThatMovesPixels()) 2829 if (!hasFilterThatMovesPixels())
2811 return rect; 2830 return rect;
2812 return enclosingLayoutRect(mapRectForFilter(FloatRect(rect))); 2831 return enclosingLayoutRect(mapRectForFilter(FloatRect(rect)));
2813 } 2832 }
2814 2833
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
2988 3007
2989 void showLayerTree(const blink::LayoutObject* layoutObject) 3008 void showLayerTree(const blink::LayoutObject* layoutObject)
2990 { 3009 {
2991 if (!layoutObject) { 3010 if (!layoutObject) {
2992 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n"); 3011 fprintf(stderr, "Cannot showLayerTree. Root is (nil)\n");
2993 return; 3012 return;
2994 } 3013 }
2995 showLayerTree(layoutObject->enclosingLayer()); 3014 showLayerTree(layoutObject->enclosingLayer());
2996 } 3015 }
2997 #endif 3016 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698