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

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

Issue 2367463002: Fold DisplayItem creation into paintFilteredContent in SVGFilterPainter (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/SVGFilterPainter.h" 5 #include "core/paint/SVGFilterPainter.h"
6 6
7 #include "core/layout/svg/LayoutSVGResourceFilter.h" 7 #include "core/layout/svg/LayoutSVGResourceFilter.h"
8 #include "core/paint/FilterEffectBuilder.h" 8 #include "core/paint/FilterEffectBuilder.h"
9 #include "core/paint/LayoutObjectDrawingRecorder.h" 9 #include "core/paint/LayoutObjectDrawingRecorder.h"
10 #include "core/svg/graphics/filters/SVGFilterBuilder.h" 10 #include "core/svg/graphics/filters/SVGFilterBuilder.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 45
46 // Content is cached by the source graphic so temporaries can be freed. 46 // Content is cached by the source graphic so temporaries can be freed.
47 m_paintController = nullptr; 47 m_paintController = nullptr;
48 m_context = nullptr; 48 m_context = nullptr;
49 49
50 filterData->m_state = FilterData::ReadyToPaint; 50 filterData->m_state = FilterData::ReadyToPaint;
51 } 51 }
52 52
53 static void paintFilteredContent(GraphicsContext& context, const LayoutObject& o bject, FilterData* filterData) 53 static void paintFilteredContent(GraphicsContext& context, const LayoutObject& o bject, FilterData* filterData)
54 { 54 {
55 DCHECK_EQ(filterData->m_state, FilterData::ReadyToPaint); 55 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, object, DisplayItem::kSVGFilter))
56 return;
57
58 FloatRect filterBounds = filterData ? filterData->lastEffect->getFilter()->f ilterRegion() : FloatRect();
59 LayoutObjectDrawingRecorder recorder(context, object, DisplayItem::kSVGFilte r, filterBounds);
60 if (!filterData || filterData->m_state != FilterData::ReadyToPaint)
61 return;
56 DCHECK(filterData->lastEffect->getFilter()->getSourceGraphic()); 62 DCHECK(filterData->lastEffect->getFilter()->getSourceGraphic());
57 63
58 filterData->m_state = FilterData::PaintingFilter; 64 filterData->m_state = FilterData::PaintingFilter;
59 65
60 FilterEffect* lastEffect = filterData->lastEffect; 66 FilterEffect* lastEffect = filterData->lastEffect;
61 sk_sp<SkImageFilter> imageFilter = SkiaImageFilterBuilder::build(lastEffect, ColorSpaceDeviceRGB); 67 sk_sp<SkImageFilter> imageFilter = SkiaImageFilterBuilder::build(lastEffect, ColorSpaceDeviceRGB);
62 context.save(); 68 context.save();
63 69
64 // Clip drawing of filtered image to the minimum required paint rect. 70 // Clip drawing of filtered image to the minimum required paint rect.
65 context.clipRect(lastEffect->mapRect(object.strokeBoundingBox())); 71 context.clipRect(lastEffect->mapRect(object.strokeBoundingBox()));
66 72
67 FloatRect boundaries = lastEffect->getFilter()->filterRegion(); 73 context.beginLayer(1, SkXfermode::kSrcOver_Mode, &filterBounds, ColorFilterN one, std::move(imageFilter));
68 context.beginLayer(1, SkXfermode::kSrcOver_Mode, &boundaries, ColorFilterNon e, std::move(imageFilter));
69 context.endLayer(); 74 context.endLayer();
70 context.restore(); 75 context.restore();
71 76
72 filterData->m_state = FilterData::ReadyToPaint; 77 filterData->m_state = FilterData::ReadyToPaint;
73 } 78 }
74 79
75 GraphicsContext* SVGFilterPainter::prepareEffect(const LayoutObject& object, SVG FilterRecordingContext& recordingContext) 80 GraphicsContext* SVGFilterPainter::prepareEffect(const LayoutObject& object, SVG FilterRecordingContext& recordingContext)
76 { 81 {
77 m_filter.clearInvalidationMask(); 82 m_filter.clearInvalidationMask();
78 83
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 filterData->m_state = FilterData::PaintingFilter; 123 filterData->m_state = FilterData::PaintingFilter;
119 124
120 // Check for RecordingContent here because we may can be re-painting 125 // Check for RecordingContent here because we may can be re-painting
121 // without re-recording the contents to be filtered. 126 // without re-recording the contents to be filtered.
122 if (filterData->m_state == FilterData::RecordingContent) 127 if (filterData->m_state == FilterData::RecordingContent)
123 recordingContext.endContent(filterData); 128 recordingContext.endContent(filterData);
124 129
125 if (filterData->m_state == FilterData::RecordingContentCycleDetected) 130 if (filterData->m_state == FilterData::RecordingContentCycleDetected)
126 filterData->m_state = FilterData::RecordingContent; 131 filterData->m_state = FilterData::RecordingContent;
127 } 132 }
128 133 paintFilteredContent(recordingContext.paintingContext(), object, filterData) ;
129 GraphicsContext& context = recordingContext.paintingContext();
130 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, object, DisplayItem::kSVGFilter))
131 return;
132
133 FloatRect filterRegion = filterData ? filterData->lastEffect->getFilter()->f ilterRegion() : FloatRect();
134 LayoutObjectDrawingRecorder recorder(context, object, DisplayItem::kSVGFilte r, filterRegion);
135 if (filterData && filterData->m_state == FilterData::ReadyToPaint)
136 paintFilteredContent(context, object, filterData);
137 } 134 }
138 135
139 } // namespace blink 136 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698