OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |