OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #ifndef BaseRenderingContext2D_h | 5 #ifndef BaseRenderingContext2D_h |
6 #define BaseRenderingContext2D_h | 6 #define BaseRenderingContext2D_h |
7 | 7 |
8 #include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrHTMLVideoElementO
rHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" | 8 #include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrHTMLVideoElementO
rHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" |
9 #include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h" | 9 #include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h" |
10 #include "core/html/ImageData.h" | 10 #include "core/html/ImageData.h" |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 | 221 |
222 virtual SkCanvas* drawingCanvas() const = 0; | 222 virtual SkCanvas* drawingCanvas() const = 0; |
223 virtual SkCanvas* existingDrawingCanvas() const = 0; | 223 virtual SkCanvas* existingDrawingCanvas() const = 0; |
224 virtual void disableDeferral(DisableDeferralReason) = 0; | 224 virtual void disableDeferral(DisableDeferralReason) = 0; |
225 | 225 |
226 virtual AffineTransform baseTransform() const = 0; | 226 virtual AffineTransform baseTransform() const = 0; |
227 | 227 |
228 virtual void didDraw(const SkIRect& dirtyRect) = 0; | 228 virtual void didDraw(const SkIRect& dirtyRect) = 0; |
229 | 229 |
230 virtual bool stateHasFilter() = 0; | 230 virtual bool stateHasFilter() = 0; |
231 virtual SkImageFilter* stateGetFilter() = 0; | 231 virtual sk_sp<SkImageFilter> stateGetFilter() = 0; |
232 virtual void snapshotStateForFilter() = 0; | 232 virtual void snapshotStateForFilter() = 0; |
233 | 233 |
234 virtual void validateStateStack() const = 0; | 234 virtual void validateStateStack() const = 0; |
235 | 235 |
236 virtual bool hasAlpha() const = 0; | 236 virtual bool hasAlpha() const = 0; |
237 | 237 |
238 virtual bool isContextLost() const = 0; | 238 virtual bool isContextLost() const = 0; |
239 | 239 |
240 void restoreMatrixClipStack(SkCanvas*) const; | 240 void restoreMatrixClipStack(SkCanvas*) const; |
241 | 241 |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 } | 415 } |
416 return true; | 416 return true; |
417 } | 417 } |
418 | 418 |
419 template <typename DrawFunc> | 419 template <typename DrawFunc> |
420 void BaseRenderingContext2D::compositedDraw( | 420 void BaseRenderingContext2D::compositedDraw( |
421 const DrawFunc& drawFunc, | 421 const DrawFunc& drawFunc, |
422 SkCanvas* c, | 422 SkCanvas* c, |
423 CanvasRenderingContext2DState::PaintType paintType, | 423 CanvasRenderingContext2DState::PaintType paintType, |
424 CanvasRenderingContext2DState::ImageType imageType) { | 424 CanvasRenderingContext2DState::ImageType imageType) { |
425 SkImageFilter* filter = stateGetFilter(); | 425 sk_sp<SkImageFilter> filter = stateGetFilter(); |
426 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter); | 426 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter); |
427 SkMatrix ctm = c->getTotalMatrix(); | 427 SkMatrix ctm = c->getTotalMatrix(); |
428 c->resetMatrix(); | 428 c->resetMatrix(); |
429 SkPaint compositePaint; | 429 SkPaint compositePaint; |
430 compositePaint.setBlendMode((SkBlendMode)state().globalComposite()); | 430 compositePaint.setBlendMode((SkBlendMode)state().globalComposite()); |
431 if (state().shouldDrawShadows()) { | 431 if (state().shouldDrawShadows()) { |
432 // unroll into two independently composited passes if drawing shadows | 432 // unroll into two independently composited passes if drawing shadows |
433 SkPaint shadowPaint = | 433 SkPaint shadowPaint = |
434 *state().getPaint(paintType, DrawShadowOnly, imageType); | 434 *state().getPaint(paintType, DrawShadowOnly, imageType); |
435 int saveCount = c->getSaveCount(); | 435 int saveCount = c->getSaveCount(); |
436 if (filter) { | 436 if (filter) { |
437 SkPaint foregroundPaint = | 437 SkPaint foregroundPaint = |
438 *state().getPaint(paintType, DrawForegroundOnly, imageType); | 438 *state().getPaint(paintType, DrawForegroundOnly, imageType); |
439 sk_sp<SkImageFilter> composedFilter = | 439 sk_sp<SkImageFilter> composedFilter = |
440 sk_ref_sp(foregroundPaint.getImageFilter()); | 440 sk_ref_sp(foregroundPaint.getImageFilter()); |
441 composedFilter = SkComposeImageFilter::Make( | 441 composedFilter = SkComposeImageFilter::Make( |
442 std::move(composedFilter), sk_ref_sp(shadowPaint.getImageFilter())); | 442 std::move(composedFilter), sk_ref_sp(shadowPaint.getImageFilter())); |
443 composedFilter = SkComposeImageFilter::Make(std::move(composedFilter), | 443 composedFilter = |
444 sk_ref_sp(filter)); | 444 SkComposeImageFilter::Make(std::move(composedFilter), filter); |
445 foregroundPaint.setImageFilter(std::move(composedFilter)); | 445 foregroundPaint.setImageFilter(std::move(composedFilter)); |
446 c->setMatrix(ctm); | 446 c->setMatrix(ctm); |
447 drawFunc(c, &foregroundPaint); | 447 drawFunc(c, &foregroundPaint); |
448 } else { | 448 } else { |
449 ASSERT(isFullCanvasCompositeMode(state().globalComposite())); | 449 ASSERT(isFullCanvasCompositeMode(state().globalComposite())); |
450 c->saveLayer(nullptr, &compositePaint); | 450 c->saveLayer(nullptr, &compositePaint); |
451 shadowPaint.setBlendMode(SkBlendMode::kSrcOver); | 451 shadowPaint.setBlendMode(SkBlendMode::kSrcOver); |
452 c->setMatrix(ctm); | 452 c->setMatrix(ctm); |
453 drawFunc(c, &shadowPaint); | 453 drawFunc(c, &shadowPaint); |
454 } | 454 } |
455 c->restoreToCount(saveCount); | 455 c->restoreToCount(saveCount); |
456 } | 456 } |
457 | 457 |
458 compositePaint.setImageFilter(filter); | 458 compositePaint.setImageFilter(std::move(filter)); |
459 c->saveLayer(nullptr, &compositePaint); | 459 c->saveLayer(nullptr, &compositePaint); |
460 SkPaint foregroundPaint = | 460 SkPaint foregroundPaint = |
461 *state().getPaint(paintType, DrawForegroundOnly, imageType); | 461 *state().getPaint(paintType, DrawForegroundOnly, imageType); |
462 foregroundPaint.setBlendMode(SkBlendMode::kSrcOver); | 462 foregroundPaint.setBlendMode(SkBlendMode::kSrcOver); |
463 c->setMatrix(ctm); | 463 c->setMatrix(ctm); |
464 drawFunc(c, &foregroundPaint); | 464 drawFunc(c, &foregroundPaint); |
465 c->restore(); | 465 c->restore(); |
466 c->setMatrix(ctm); | 466 c->setMatrix(ctm); |
467 } | 467 } |
468 | 468 |
469 } // namespace blink | 469 } // namespace blink |
470 | 470 |
471 #endif // BaseRenderingContext2D_h | 471 #endif // BaseRenderingContext2D_h |
OLD | NEW |