1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTPin.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGPaint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGRenderEffect.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace sksg { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker // Paint nodes don't generate damage on their own, but via their aggregation ancestor Draw nodes. PaintNode()21*c8dee2aaSAndroid Build Coastguard WorkerPaintNode::PaintNode() : INHERITED(kBubbleDamage_Trait) {} 22*c8dee2aaSAndroid Build Coastguard Worker makePaint() const23*c8dee2aaSAndroid Build Coastguard WorkerSkPaint PaintNode::makePaint() const { 24*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!this->hasInval()); 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(fAntiAlias); 29*c8dee2aaSAndroid Build Coastguard Worker paint.setBlendMode(fBlendMode); 30*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(fStyle); 31*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(fStrokeWidth); 32*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeMiter(fStrokeMiter); 33*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(fStrokeJoin); 34*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(fStrokeCap); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker this->onApplyToPaint(&paint); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker // Compose opacity on top of the subclass value. 39*c8dee2aaSAndroid Build Coastguard Worker paint.setAlpha(SkScalarRoundToInt(paint.getAlpha() * SkTPin<SkScalar>(fOpacity, 0, 1))); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker return paint; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker Make(SkColor c)44*c8dee2aaSAndroid Build Coastguard Workersk_sp<Color> Color::Make(SkColor c) { 45*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<Color>(new Color(c)); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker Color(SkColor c)48*c8dee2aaSAndroid Build Coastguard WorkerColor::Color(SkColor c) : fColor(c) {} 49*c8dee2aaSAndroid Build Coastguard Worker onRevalidate(InvalidationController * ic,const SkMatrix & ctm)50*c8dee2aaSAndroid Build Coastguard WorkerSkRect Color::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { 51*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->hasInval()); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker return SkRect::MakeEmpty(); 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker onApplyToPaint(SkPaint * paint) const56*c8dee2aaSAndroid Build Coastguard Workervoid Color::onApplyToPaint(SkPaint* paint) const { 57*c8dee2aaSAndroid Build Coastguard Worker paint->setColor(fColor); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker Make(sk_sp<Shader> sh)60*c8dee2aaSAndroid Build Coastguard Workersk_sp<ShaderPaint> ShaderPaint::Make(sk_sp<Shader> sh) { 61*c8dee2aaSAndroid Build Coastguard Worker return sh ? sk_sp<ShaderPaint>(new ShaderPaint(std::move(sh))) 62*c8dee2aaSAndroid Build Coastguard Worker : nullptr; 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker ShaderPaint(sk_sp<Shader> sh)65*c8dee2aaSAndroid Build Coastguard WorkerShaderPaint::ShaderPaint(sk_sp<Shader> sh) 66*c8dee2aaSAndroid Build Coastguard Worker : fShader(std::move(sh)) { 67*c8dee2aaSAndroid Build Coastguard Worker this->observeInval(fShader); 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker ~ShaderPaint()70*c8dee2aaSAndroid Build Coastguard WorkerShaderPaint::~ShaderPaint() { 71*c8dee2aaSAndroid Build Coastguard Worker this->unobserveInval(fShader); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker onRevalidate(InvalidationController * ic,const SkMatrix & ctm)74*c8dee2aaSAndroid Build Coastguard WorkerSkRect ShaderPaint::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { 75*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->hasInval()); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker return fShader->revalidate(ic, ctm); 78*c8dee2aaSAndroid Build Coastguard Worker } 79*c8dee2aaSAndroid Build Coastguard Worker onApplyToPaint(SkPaint * paint) const80*c8dee2aaSAndroid Build Coastguard Workervoid ShaderPaint::onApplyToPaint(SkPaint* paint) const { 81*c8dee2aaSAndroid Build Coastguard Worker paint->setShader(fShader->getShader()); 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker } // namespace sksg 85