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