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

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

Issue 1382163003: Split SVGFilterbuilder into "builder" and "node map" parts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: No SVGFilterBuilder::m_filter; Reverse order of args to addPrimitive. Created 5 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
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 "config.h" 5 #include "config.h"
6 #include "core/paint/SVGFilterPainter.h" 6 #include "core/paint/SVGFilterPainter.h"
7 7
8 #include "core/layout/svg/LayoutSVGResourceFilter.h" 8 #include "core/layout/svg/LayoutSVGResourceFilter.h"
9 #include "core/layout/svg/SVGLayoutSupport.h" 9 #include "core/layout/svg/SVGLayoutSupport.h"
10 #include "core/paint/CompositingRecorder.h" 10 #include "core/paint/CompositingRecorder.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 if (filterData->m_state == FilterData::PaintingFilter) 115 if (filterData->m_state == FilterData::PaintingFilter)
116 filterData->m_state = FilterData::PaintingFilterCycleDetected; 116 filterData->m_state = FilterData::PaintingFilterCycleDetected;
117 117
118 if (filterData->m_state == FilterData::RecordingContent) 118 if (filterData->m_state == FilterData::RecordingContent)
119 filterData->m_state = FilterData::RecordingContentCycleDetected; 119 filterData->m_state = FilterData::RecordingContentCycleDetected;
120 120
121 return nullptr; 121 return nullptr;
122 } 122 }
123 123
124 OwnPtrWillBeRawPtr<FilterData> filterData = FilterData::create(); 124 OwnPtrWillBeRawPtr<FilterData> filterData = FilterData::create();
125 FloatRect targetBoundingBox = object.objectBoundingBox(); 125 FloatRect referenceBox = object.objectBoundingBox();
126 126
127 SVGFilterElement* filterElement = toSVGFilterElement(m_filter.element()); 127 SVGFilterElement* filterElement = toSVGFilterElement(m_filter.element());
128 FloatRect filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement >(filterElement, filterElement->filterUnits()->currentValue()->enumValue(), targ etBoundingBox); 128 FloatRect filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement >(filterElement, filterElement->filterUnits()->currentValue()->enumValue(), refe renceBox);
129 if (filterRegion.isEmpty()) 129 if (filterRegion.isEmpty())
130 return nullptr; 130 return nullptr;
131 131
132 // Create the SVGFilter object. 132 // Create the SVGFilter object.
133 bool primitiveBoundingBoxMode = filterElement->primitiveUnits()->currentValu e()->enumValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; 133 bool primitiveBoundingBoxMode = filterElement->primitiveUnits()->currentValu e()->enumValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
134 Filter::UnitScaling unitScaling = primitiveBoundingBoxMode ? Filter::Boundin gBox : Filter::UserSpace; 134 Filter::UnitScaling unitScaling = primitiveBoundingBoxMode ? Filter::Boundin gBox : Filter::UserSpace;
135 filterData->filter = Filter::create(targetBoundingBox, filterRegion, 1, unit Scaling); 135 filterData->filter = Filter::create(referenceBox, filterRegion, 1, unitScali ng);
136 filterData->nodeMap = SVGFilterGraphNodeMap::create();
136 137
137 IntRect sourceRegion = enclosingIntRect(intersection(filterRegion, object.st rokeBoundingBox())); 138 IntRect sourceRegion = enclosingIntRect(intersection(filterRegion, object.st rokeBoundingBox()));
138 filterData->filter->sourceGraphic()->setSourceRect(sourceRegion); 139 filterData->filter->sourceGraphic()->setSourceRect(sourceRegion);
139 140
140 // Create all relevant filter primitives. 141 // Create all relevant filter primitives.
141 filterData->builder = m_filter.buildPrimitives(filterData->filter.get()); 142 SVGFilterBuilder builder(filterData->filter->sourceGraphic(), filterData->no deMap.get());
142 if (!filterData->builder) 143 builder.buildGraph(filterData->filter.get(), *filterElement, referenceBox);
143 return nullptr;
144 144
145 FilterEffect* lastEffect = filterData->filter->lastEffect(); 145 FilterEffect* lastEffect = builder.lastEffect();
146 if (!lastEffect) 146 if (!lastEffect)
147 return nullptr; 147 return nullptr;
148 148
149 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion); 149 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion);
150 filterData->filter->setLastEffect(lastEffect);
150 151
151 FilterData* data = filterData.get(); 152 FilterData* data = filterData.get();
152 // TODO(pdr): Can this be moved out of painter? 153 // TODO(pdr): Can this be moved out of painter?
153 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData.release()); 154 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData.release());
154 return recordingContext.beginContent(data); 155 return recordingContext.beginContent(data);
155 } 156 }
156 157
157 void SVGFilterPainter::finishEffect(const LayoutObject& object, SVGFilterRecordi ngContext& recordingContext) 158 void SVGFilterPainter::finishEffect(const LayoutObject& object, SVGFilterRecordi ngContext& recordingContext)
158 { 159 {
159 FilterData* filterData = m_filter.getFilterDataForLayoutObject(&object); 160 FilterData* filterData = m_filter.getFilterDataForLayoutObject(&object);
(...skipping 18 matching lines...) Expand all
178 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint())) 179 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint()))
179 return; 180 return;
180 181
181 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter . 182 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter .
182 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint()); 183 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint());
183 if (filterData && filterData->m_state == FilterData::ReadyToPaint) 184 if (filterData && filterData->m_state == FilterData::ReadyToPaint)
184 paintFilteredContent(object, context, filterData); 185 paintFilteredContent(object, context, filterData);
185 } 186 }
186 187
187 } 188 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698