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

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

Issue 1326183002: Merge ReferenceFilter into Filter (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Touchups; Rebase. Created 5 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/paint/FilterEffectBuilder.cpp ('k') | Source/core/svg/graphics/filters/SVGFilter.h » ('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 "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 21 matching lines...) Expand all
32 context = m_context.get(); 32 context = m_context.get();
33 33
34 filterData->m_state = FilterData::RecordingContent; 34 filterData->m_state = FilterData::RecordingContent;
35 return context; 35 return context;
36 } 36 }
37 37
38 void SVGFilterRecordingContext::endContent(FilterData* filterData) 38 void SVGFilterRecordingContext::endContent(FilterData* filterData)
39 { 39 {
40 ASSERT(filterData->m_state == FilterData::RecordingContent); 40 ASSERT(filterData->m_state == FilterData::RecordingContent);
41 41
42 // FIXME: maybe filterData should just hold onto SourceGraphic after creatio n? 42 SourceGraphic* sourceGraphic = filterData->filter->sourceGraphic();
43 SourceGraphic* sourceGraphic = static_cast<SourceGraphic*>(filterData->build er->getEffectById(SourceGraphic::effectName()));
44 ASSERT(sourceGraphic); 43 ASSERT(sourceGraphic);
45 44
46 GraphicsContext* context = paintingContext(); 45 GraphicsContext* context = paintingContext();
47 46
48 // Use the context that contains the filtered content. 47 // Use the context that contains the filtered content.
49 ASSERT(m_displayItemList); 48 ASSERT(m_displayItemList);
50 ASSERT(m_context); 49 ASSERT(m_context);
51 context = m_context.get(); 50 context = m_context.get();
52 context->beginRecording(filterData->filter->filterRegion()); 51 context->beginRecording(filterData->filter->filterRegion());
53 m_displayItemList->commitNewDisplayItemsAndReplay(*context); 52 m_displayItemList->commitNewDisplayItemsAndReplay(*context);
54 53
55 sourceGraphic->setPicture(context->endRecording()); 54 sourceGraphic->setPicture(context->endRecording());
56 55
57 // Content is cached by the source graphic so temporaries can be freed. 56 // Content is cached by the source graphic so temporaries can be freed.
58 m_displayItemList = nullptr; 57 m_displayItemList = nullptr;
59 m_context = nullptr; 58 m_context = nullptr;
60 59
61 filterData->m_state = FilterData::ReadyToPaint; 60 filterData->m_state = FilterData::ReadyToPaint;
62 } 61 }
63 62
64 static void paintFilteredContent(LayoutObject& object, GraphicsContext* context, FilterData* filterData) 63 static void paintFilteredContent(LayoutObject& object, GraphicsContext* context, FilterData* filterData)
65 { 64 {
66 ASSERT(filterData->m_state == FilterData::ReadyToPaint); 65 ASSERT(filterData->m_state == FilterData::ReadyToPaint);
67 ASSERT(filterData->builder->getEffectById(SourceGraphic::effectName())); 66 ASSERT(filterData->filter->sourceGraphic());
68 67
69 filterData->m_state = FilterData::PaintingFilter; 68 filterData->m_state = FilterData::PaintingFilter;
70 69
71 SkiaImageFilterBuilder builder; 70 SkiaImageFilterBuilder builder;
72 RefPtr<SkImageFilter> imageFilter = builder.build(filterData->builder->lastE ffect(), ColorSpaceDeviceRGB); 71 RefPtr<SkImageFilter> imageFilter = builder.build(filterData->filter->lastEf fect(), ColorSpaceDeviceRGB);
73 FloatRect boundaries = filterData->filter->filterRegion(); 72 FloatRect boundaries = filterData->filter->filterRegion();
74 context->save(); 73 context->save();
75 74
76 // Clip drawing of filtered image to the minimum required paint rect. 75 // Clip drawing of filtered image to the minimum required paint rect.
77 FilterEffect* lastEffect = filterData->builder->lastEffect(); 76 FilterEffect* lastEffect = filterData->filter->lastEffect();
78 context->clipRect(lastEffect->determineAbsolutePaintRect(lastEffect->maxEffe ctRect())); 77 context->clipRect(lastEffect->determineAbsolutePaintRect(lastEffect->maxEffe ctRect()));
79 78
80 #ifdef CHECK_CTM_FOR_TRANSFORMED_IMAGEFILTER 79 #ifdef CHECK_CTM_FOR_TRANSFORMED_IMAGEFILTER
81 // TODO: Remove this workaround once skew/rotation support is added in Skia 80 // TODO: Remove this workaround once skew/rotation support is added in Skia
82 // (https://code.google.com/p/skia/issues/detail?id=3288, crbug.com/446935). 81 // (https://code.google.com/p/skia/issues/detail?id=3288, crbug.com/446935).
83 // If the CTM contains rotation or shearing, apply the filter to 82 // If the CTM contains rotation or shearing, apply the filter to
84 // the unsheared/unrotated matrix, and do the shearing/rotation 83 // the unsheared/unrotated matrix, and do the shearing/rotation
85 // as a final pass. 84 // as a final pass.
86 AffineTransform ctm = SVGLayoutSupport::deprecatedCalculateTransformToLayer( &object); 85 AffineTransform ctm = SVGLayoutSupport::deprecatedCalculateTransformToLayer( &object);
87 if (ctm.b() || ctm.c()) { 86 if (ctm.b() || ctm.c()) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 FloatRect drawingRegion = object.strokeBoundingBox(); 133 FloatRect drawingRegion = object.strokeBoundingBox();
135 drawingRegion.intersect(filterRegion); 134 drawingRegion.intersect(filterRegion);
136 bool primitiveBoundingBoxMode = filterElement->primitiveUnits()->currentValu e()->enumValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; 135 bool primitiveBoundingBoxMode = filterElement->primitiveUnits()->currentValu e()->enumValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
137 filterData->filter = SVGFilter::create(enclosingIntRect(drawingRegion), targ etBoundingBox, filterRegion, primitiveBoundingBoxMode); 136 filterData->filter = SVGFilter::create(enclosingIntRect(drawingRegion), targ etBoundingBox, filterRegion, primitiveBoundingBoxMode);
138 137
139 // Create all relevant filter primitives. 138 // Create all relevant filter primitives.
140 filterData->builder = m_filter.buildPrimitives(filterData->filter.get()); 139 filterData->builder = m_filter.buildPrimitives(filterData->filter.get());
141 if (!filterData->builder) 140 if (!filterData->builder)
142 return nullptr; 141 return nullptr;
143 142
144 FilterEffect* lastEffect = filterData->builder->lastEffect(); 143 FilterEffect* lastEffect = filterData->filter->lastEffect();
145 if (!lastEffect) 144 if (!lastEffect)
146 return nullptr; 145 return nullptr;
147 146
148 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion); 147 lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion);
149 148
150 FilterData* data = filterData.get(); 149 FilterData* data = filterData.get();
151 m_filter.setFilterDataForLayoutObject(&object, filterData.release()); 150 m_filter.setFilterDataForLayoutObject(&object, filterData.release());
152 return recordingContext.beginContent(data); 151 return recordingContext.beginContent(data);
153 } 152 }
154 153
(...skipping 21 matching lines...) Expand all
176 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint())) 175 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*context, object , DisplayItem::SVGFilter, LayoutPoint()))
177 return; 176 return;
178 177
179 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter . 178 // TODO(chrishtr): stop using an infinite rect, and instead bound the filter .
180 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint()); 179 LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilte r, LayoutRect::infiniteIntRect(), LayoutPoint());
181 if (filterData && filterData->m_state == FilterData::ReadyToPaint) 180 if (filterData && filterData->m_state == FilterData::ReadyToPaint)
182 paintFilteredContent(object, context, filterData); 181 paintFilteredContent(object, context, filterData);
183 } 182 }
184 183
185 } 184 }
OLDNEW
« no previous file with comments | « Source/core/paint/FilterEffectBuilder.cpp ('k') | Source/core/svg/graphics/filters/SVGFilter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698