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 "modules/canvas2d/CanvasRenderingContext2DState.h" | 5 #include "modules/canvas2d/CanvasRenderingContext2DState.h" |
6 | 6 |
7 #include "core/css/CSSFontSelector.h" | 7 #include "core/css/CSSFontSelector.h" |
8 #include "core/css/resolver/FilterOperationResolver.h" | 8 #include "core/css/resolver/FilterOperationResolver.h" |
9 #include "core/css/resolver/StyleBuilder.h" | 9 #include "core/css/resolver/StyleBuilder.h" |
10 #include "core/css/resolver/StyleResolverState.h" | 10 #include "core/css/resolver/StyleResolverState.h" |
11 #include "core/html/HTMLCanvasElement.h" | 11 #include "core/html/HTMLCanvasElement.h" |
12 #include "core/paint/FilterEffectBuilder.h" | 12 #include "core/paint/FilterEffectBuilder.h" |
13 #include "core/style/ComputedStyle.h" | 13 #include "core/style/ComputedStyle.h" |
14 #include "core/svg/SVGFilterElement.h" | 14 #include "core/svg/SVGFilterElement.h" |
15 #include "modules/canvas2d/CanvasGradient.h" | 15 #include "modules/canvas2d/CanvasGradient.h" |
16 #include "modules/canvas2d/CanvasPattern.h" | 16 #include "modules/canvas2d/CanvasPattern.h" |
17 #include "modules/canvas2d/CanvasRenderingContext2D.h" | 17 #include "modules/canvas2d/CanvasRenderingContext2D.h" |
18 #include "modules/canvas2d/CanvasStyle.h" | 18 #include "modules/canvas2d/CanvasStyle.h" |
19 #include "platform/graphics/DrawLooperBuilder.h" | 19 #include "platform/graphics/DrawLooperBuilder.h" |
| 20 #include "platform/graphics/filters/FilterEffect.h" |
20 #include "platform/graphics/filters/FilterOperation.h" | 21 #include "platform/graphics/filters/FilterOperation.h" |
21 #include "platform/graphics/filters/SkiaImageFilterBuilder.h" | 22 #include "platform/graphics/filters/SkiaImageFilterBuilder.h" |
22 #include "platform/graphics/skia/SkiaUtils.h" | 23 #include "platform/graphics/skia/SkiaUtils.h" |
23 #include "third_party/skia/include/effects/SkDashPathEffect.h" | 24 #include "third_party/skia/include/effects/SkDashPathEffect.h" |
24 #include "third_party/skia/include/effects/SkDropShadowImageFilter.h" | 25 #include "third_party/skia/include/effects/SkDropShadowImageFilter.h" |
25 #include <memory> | 26 #include <memory> |
26 | 27 |
27 static const char defaultFont[] = "10px sans-serif"; | 28 static const char defaultFont[] = "10px sans-serif"; |
28 static const char defaultFilter[] = "none"; | 29 static const char defaultFilter[] = "none"; |
29 | 30 |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 if (!m_resolvedFilter) { | 302 if (!m_resolvedFilter) { |
302 RefPtr<ComputedStyle> filterStyle = ComputedStyle::create(); | 303 RefPtr<ComputedStyle> filterStyle = ComputedStyle::create(); |
303 // Must set font in case the filter uses any font-relative units (em, ex
) | 304 // Must set font in case the filter uses any font-relative units (em, ex
) |
304 filterStyle->setFont(m_fontForFilter); | 305 filterStyle->setFont(m_fontForFilter); |
305 | 306 |
306 StyleResolverState resolverState(styleResolutionHost->document(), styleR
esolutionHost, filterStyle.get()); | 307 StyleResolverState resolverState(styleResolutionHost->document(), styleR
esolutionHost, filterStyle.get()); |
307 resolverState.setStyle(filterStyle); | 308 resolverState.setStyle(filterStyle); |
308 | 309 |
309 StyleBuilder::applyProperty(CSSPropertyFilter, resolverState, *m_filterV
alue); | 310 StyleBuilder::applyProperty(CSSPropertyFilter, resolverState, *m_filterV
alue); |
310 resolverState.loadPendingResources(); | 311 resolverState.loadPendingResources(); |
311 FilterEffectBuilder* filterEffectBuilder = FilterEffectBuilder::create()
; | |
312 | 312 |
313 // We can't reuse m_fillPaint and m_strokePaint for the filter, since th
ese incorporate | 313 // We can't reuse m_fillPaint and m_strokePaint for the filter, since th
ese incorporate |
314 // the global alpha, which isn't applicable here. | 314 // the global alpha, which isn't applicable here. |
315 SkPaint fillPaintForFilter; | 315 SkPaint fillPaintForFilter; |
| 316 m_fillStyle->applyToPaint(fillPaintForFilter); |
| 317 fillPaintForFilter.setColor(m_fillStyle->paintColor()); |
316 SkPaint strokePaintForFilter; | 318 SkPaint strokePaintForFilter; |
317 m_fillStyle->applyToPaint(fillPaintForFilter); | |
318 m_strokeStyle->applyToPaint(strokePaintForFilter); | 319 m_strokeStyle->applyToPaint(strokePaintForFilter); |
319 fillPaintForFilter.setColor(m_fillStyle->paintColor()); | |
320 strokePaintForFilter.setColor(m_strokeStyle->paintColor()); | 320 strokePaintForFilter.setColor(m_strokeStyle->paintColor()); |
321 FloatRect referenceBox((FloatPoint()), FloatSize(canvasSize)); | |
322 const double effectiveZoom = 1.0; // Deliberately ignore zoom on the can
vas element | |
323 filterEffectBuilder->build(styleResolutionHost, filterStyle->filter(), e
ffectiveZoom, referenceBox, &fillPaintForFilter, &strokePaintForFilter); | |
324 | 321 |
325 if (FilterEffect* lastEffect = filterEffectBuilder->lastEffect()) { | 322 FilterEffectBuilder filterEffectBuilder( |
| 323 styleResolutionHost, |
| 324 FloatRect((FloatPoint()), FloatSize(canvasSize)), |
| 325 1.0f, // Deliberately ignore zoom on the canvas element. |
| 326 &fillPaintForFilter, &strokePaintForFilter); |
| 327 |
| 328 if (FilterEffect* lastEffect = filterEffectBuilder.buildFilterEffect(fil
terStyle->filter())) { |
326 m_resolvedFilter = SkiaImageFilterBuilder::build(lastEffect, ColorSp
aceDeviceRGB); | 329 m_resolvedFilter = SkiaImageFilterBuilder::build(lastEffect, ColorSp
aceDeviceRGB); |
327 if (m_resolvedFilter) { | 330 if (m_resolvedFilter) { |
328 updateFilterReferences(toHTMLCanvasElement(styleResolutionHost),
context, filterStyle->filter()); | 331 updateFilterReferences(toHTMLCanvasElement(styleResolutionHost),
context, filterStyle->filter()); |
329 if (lastEffect->originTainted()) | 332 if (lastEffect->originTainted()) |
330 context->setOriginTainted(); | 333 context->setOriginTainted(); |
331 } | 334 } |
332 } | 335 } |
333 } | 336 } |
334 | 337 |
335 return m_resolvedFilter.get(); | 338 return m_resolvedFilter.get(); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 paint->setLooper(0); | 563 paint->setLooper(0); |
561 paint->setImageFilter(shadowAndForegroundImageFilter()); | 564 paint->setImageFilter(shadowAndForegroundImageFilter()); |
562 return paint; | 565 return paint; |
563 } | 566 } |
564 paint->setLooper(sk_ref_sp(shadowAndForegroundDrawLooper())); | 567 paint->setLooper(sk_ref_sp(shadowAndForegroundDrawLooper())); |
565 paint->setImageFilter(0); | 568 paint->setImageFilter(0); |
566 return paint; | 569 return paint; |
567 } | 570 } |
568 | 571 |
569 } // namespace blink | 572 } // namespace blink |
OLD | NEW |