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

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: 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.get(), filterData->filter->sourc eGraphic(), filterData->nodeMap.get());
142 if (!filterData->builder) 143 builder.buildGraph(*filterElement, referenceBox);
143 return nullptr;
144 144
145 FilterEffect* lastEffect = filterData->filter->lastEffect(); 145 FilterEffect* lastEffect = filterData->filter->lastEffect();
146 if (!lastEffect) 146 if (!lastEffect)
147 return nullptr; 147 return nullptr;
148 148
149 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion); 149 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion);
150 150
151 FilterData* data = filterData.get(); 151 FilterData* data = filterData.get();
152 // TODO(pdr): Can this be moved out of painter? 152 // TODO(pdr): Can this be moved out of painter?
153 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData.release()); 153 m_filter.setFilterDataForLayoutObject(const_cast<LayoutObject*>(&object), fi lterData.release());
(...skipping 24 matching lines...) Expand all
178 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint())) 178 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint()))
179 return; 179 return;
180 180
181 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter . 181 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter .
182 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint()); 182 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint());
183 if (filterData && filterData->m_state == FilterData::ReadyToPaint) 183 if (filterData && filterData->m_state == FilterData::ReadyToPaint)
184 paintFilteredContent(object, context, filterData); 184 paintFilteredContent(object, context, filterData);
185 } 185 }
186 186
187 } 187 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698