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

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

Issue 2319293004: Replace FilterEffect::maxEffectRect() with absoluteBounds() (Closed)
Patch Set: Add comment 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp » ('j') | 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 "platform/graphics/filters/SkiaImageFilterBuilder.h" 10 #include "platform/graphics/filters/SkiaImageFilterBuilder.h"
11 #include "platform/graphics/filters/SourceGraphic.h" 11 #include "platform/graphics/filters/SourceGraphic.h"
12 #include "wtf/PtrUtil.h" 12 #include "wtf/PtrUtil.h"
13 13
14 namespace blink { 14 namespace blink {
15 15
16 GraphicsContext* SVGFilterRecordingContext::beginContent(FilterData* filterData) 16 GraphicsContext* SVGFilterRecordingContext::beginContent(FilterData* filterData)
17 { 17 {
18 ASSERT(filterData->m_state == FilterData::Initial); 18 DCHECK_EQ(filterData->m_state, FilterData::Initial);
19 19
20 // Create a new context so the contents of the filter can be drawn and cache d. 20 // Create a new context so the contents of the filter can be drawn and cache d.
21 m_paintController = PaintController::create(); 21 m_paintController = PaintController::create();
22 m_context = wrapUnique(new GraphicsContext(*m_paintController)); 22 m_context = wrapUnique(new GraphicsContext(*m_paintController));
23 23
24 filterData->m_state = FilterData::RecordingContent; 24 filterData->m_state = FilterData::RecordingContent;
25 return m_context.get(); 25 return m_context.get();
26 } 26 }
27 27
28 void SVGFilterRecordingContext::endContent(FilterData* filterData) 28 void SVGFilterRecordingContext::endContent(FilterData* filterData)
29 { 29 {
30 ASSERT(filterData->m_state == FilterData::RecordingContent); 30 DCHECK_EQ(filterData->m_state, FilterData::RecordingContent);
31 31
32 SourceGraphic* sourceGraphic = filterData->filter->getSourceGraphic(); 32 SourceGraphic* sourceGraphic = filterData->filter->getSourceGraphic();
33 ASSERT(sourceGraphic); 33 DCHECK(sourceGraphic);
34 34
35 // Use the context that contains the filtered content. 35 // Use the context that contains the filtered content.
36 ASSERT(m_paintController); 36 DCHECK(m_paintController);
37 ASSERT(m_context); 37 DCHECK(m_context);
38 m_context->beginRecording(filterData->filter->filterRegion()); 38 m_context->beginRecording(filterData->filter->filterRegion());
39 m_paintController->commitNewDisplayItems(); 39 m_paintController->commitNewDisplayItems();
40 m_paintController->paintArtifact().replay(*m_context); 40 m_paintController->paintArtifact().replay(*m_context);
41 41
42 SkiaImageFilterBuilder::buildSourceGraphic(sourceGraphic, m_context->endReco rding()); 42 SkiaImageFilterBuilder::buildSourceGraphic(sourceGraphic, m_context->endReco rding());
43 43
44 // Content is cached by the source graphic so temporaries can be freed. 44 // Content is cached by the source graphic so temporaries can be freed.
45 m_paintController = nullptr; 45 m_paintController = nullptr;
46 m_context = nullptr; 46 m_context = nullptr;
47 47
48 filterData->m_state = FilterData::ReadyToPaint; 48 filterData->m_state = FilterData::ReadyToPaint;
49 } 49 }
50 50
51 static void paintFilteredContent(GraphicsContext& context, FilterData* filterDat a) 51 static void paintFilteredContent(GraphicsContext& context, FilterData* filterDat a)
52 { 52 {
53 ASSERT(filterData->m_state == FilterData::ReadyToPaint); 53 DCHECK_EQ(filterData->m_state, FilterData::ReadyToPaint);
54 ASSERT(filterData->filter->getSourceGraphic()); 54 DCHECK(filterData->filter->getSourceGraphic());
55 55
56 filterData->m_state = FilterData::PaintingFilter; 56 filterData->m_state = FilterData::PaintingFilter;
57 57
58 sk_sp<SkImageFilter> imageFilter = SkiaImageFilterBuilder::build(filterData- >filter->lastEffect(), ColorSpaceDeviceRGB); 58 FilterEffect* lastEffect = filterData->filter->lastEffect();
59 FloatRect boundaries = filterData->filter->filterRegion(); 59 sk_sp<SkImageFilter> imageFilter = SkiaImageFilterBuilder::build(lastEffect, ColorSpaceDeviceRGB);
60 context.save(); 60 context.save();
61 61
62 // Clip drawing of filtered image to the minimum required paint rect. 62 // Clip drawing of filtered image to the minimum required paint rect.
63 FilterEffect* lastEffect = filterData->filter->lastEffect(); 63 context.clipRect(lastEffect->determineAbsolutePaintRect(lastEffect->absolute Bounds()));
64 context.clipRect(lastEffect->determineAbsolutePaintRect(lastEffect->maxEffec tRect()));
65 64
65 FloatRect boundaries = filterData->filter->filterRegion();
66 context.beginLayer(1, SkXfermode::kSrcOver_Mode, &boundaries, ColorFilterNon e, std::move(imageFilter)); 66 context.beginLayer(1, SkXfermode::kSrcOver_Mode, &boundaries, ColorFilterNon e, std::move(imageFilter));
67 context.endLayer(); 67 context.endLayer();
68 context.restore(); 68 context.restore();
69 69
70 filterData->m_state = FilterData::ReadyToPaint; 70 filterData->m_state = FilterData::ReadyToPaint;
71 } 71 }
72 72
73 GraphicsContext* SVGFilterPainter::prepareEffect(const LayoutObject& object, SVG FilterRecordingContext& recordingContext) 73 GraphicsContext* SVGFilterPainter::prepareEffect(const LayoutObject& object, SVG FilterRecordingContext& recordingContext)
74 { 74 {
75 m_filter.clearInvalidationMask(); 75 m_filter.clearInvalidationMask();
(...skipping 12 matching lines...) Expand all
88 } 88 }
89 89
90 const FloatRect referenceBox = object.objectBoundingBox(); 90 const FloatRect referenceBox = object.objectBoundingBox();
91 SVGFilterGraphNodeMap* nodeMap = SVGFilterGraphNodeMap::create(); 91 SVGFilterGraphNodeMap* nodeMap = SVGFilterGraphNodeMap::create();
92 Filter* filter = FilterEffectBuilder::buildReferenceFilter(toSVGFilterElemen t(*m_filter.element()), referenceBox, nullptr, nullptr, nullptr, 1, nodeMap); 92 Filter* filter = FilterEffectBuilder::buildReferenceFilter(toSVGFilterElemen t(*m_filter.element()), referenceBox, nullptr, nullptr, nullptr, 1, nodeMap);
93 if (!filter || !filter->lastEffect()) 93 if (!filter || !filter->lastEffect())
94 return nullptr; 94 return nullptr;
95 95
96 IntRect sourceRegion = enclosingIntRect(intersection(filter->filterRegion(), object.strokeBoundingBox())); 96 IntRect sourceRegion = enclosingIntRect(intersection(filter->filterRegion(), object.strokeBoundingBox()));
97 filter->getSourceGraphic()->setSourceRect(sourceRegion); 97 filter->getSourceGraphic()->setSourceRect(sourceRegion);
98 filter->lastEffect()->determineMaximumEffectRect();
99 98
100 FilterData* filterData = FilterData::create(); 99 FilterData* filterData = FilterData::create();
101 filterData->filter = filter; 100 filterData->filter = filter;
102 filterData->nodeMap = nodeMap; 101 filterData->nodeMap = nodeMap;
103 102
104 // TODO(pdr): Can this be moved out of painter? 103 // TODO(pdr): Can this be moved out of painter?
105 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData); 104 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData);
106 return recordingContext.beginContent(filterData); 105 return recordingContext.beginContent(filterData);
107 } 106 }
108 107
(...skipping 20 matching lines...) Expand all
129 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, object, DisplayItem::kSVGFilter)) 128 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, object, DisplayItem::kSVGFilter))
130 return; 129 return;
131 130
132 FloatRect filterRegion = filterData ? filterData->filter->filterRegion() : F loatRect(); 131 FloatRect filterRegion = filterData ? filterData->filter->filterRegion() : F loatRect();
133 LayoutObjectDrawingRecorder recorder(context, object, DisplayItem::kSVGFilte r, filterRegion); 132 LayoutObjectDrawingRecorder recorder(context, object, DisplayItem::kSVGFilte r, filterRegion);
134 if (filterData && filterData->m_state == FilterData::ReadyToPaint) 133 if (filterData && filterData->m_state == FilterData::ReadyToPaint)
135 paintFilteredContent(context, filterData); 134 paintFilteredContent(context, filterData);
136 } 135 }
137 136
138 } // namespace blink 137 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698