Coverage Report

Created: 2024-05-20 07:14

/src/skia/include/core/SkShader.h
Line
Count
Source
1
/*
2
 * Copyright 2006 The Android Open Source Project
3
 *
4
 * Use of this source code is governed by a BSD-style license that can be
5
 * found in the LICENSE file.
6
 */
7
8
#ifndef SkShader_DEFINED
9
#define SkShader_DEFINED
10
11
#include "include/core/SkColor.h"
12
#include "include/core/SkFlattenable.h"
13
#include "include/core/SkRefCnt.h"
14
#include "include/private/base/SkAPI.h"
15
16
class SkBlender;
17
class SkColorFilter;
18
class SkColorSpace;
19
class SkImage;
20
class SkMatrix;
21
enum class SkBlendMode;
22
enum class SkTileMode;
23
struct SkRect;
24
struct SkSamplingOptions;
25
26
/** \class SkShader
27
 *
28
 *  Shaders specify the source color(s) for what is being drawn. If a paint
29
 *  has no shader, then the paint's color is used. If the paint has a
30
 *  shader, then the shader's color(s) are use instead, but they are
31
 *  modulated by the paint's alpha. This makes it easy to create a shader
32
 *  once (e.g. bitmap tiling or gradient) and then change its transparency
33
 *  w/o having to modify the original shader... only the paint's alpha needs
34
 *  to be modified.
35
 */
36
class SK_API SkShader : public SkFlattenable {
37
public:
38
    /**
39
     *  Returns true if the shader is guaranteed to produce only opaque
40
     *  colors, subject to the SkPaint using the shader to apply an opaque
41
     *  alpha value. Subclasses should override this to allow some
42
     *  optimizations.
43
     */
44
142k
    virtual bool isOpaque() const { return false; }
45
46
    /**
47
     *  Iff this shader is backed by a single SkImage, return its ptr (the caller must ref this
48
     *  if they want to keep it longer than the lifetime of the shader). If not, return nullptr.
49
     */
50
    SkImage* isAImage(SkMatrix* localMatrix, SkTileMode xy[2]) const;
51
52
939
    bool isAImage() const {
53
939
        return this->isAImage(nullptr, (SkTileMode*)nullptr) != nullptr;
54
939
    }
55
56
    //////////////////////////////////////////////////////////////////////////
57
    //  Methods to create combinations or variants of shaders
58
59
    /**
60
     *  Return a shader that will apply the specified localMatrix to this shader.
61
     *  The specified matrix will be applied before any matrix associated with this shader.
62
     */
63
    sk_sp<SkShader> makeWithLocalMatrix(const SkMatrix&) const;
64
65
    /**
66
     *  Create a new shader that produces the same colors as invoking this shader and then applying
67
     *  the colorfilter.
68
     */
69
    sk_sp<SkShader> makeWithColorFilter(sk_sp<SkColorFilter>) const;
70
71
    /**
72
     *  Return a shader that will compute this shader in a specific color space.
73
     *  By default, all shaders operate in the destination (surface) color space.
74
     *  The results of a shader are still always converted to the destination - this
75
     *  API has no impact on simple shaders or images. Primarily, it impacts shaders
76
     *  that perform mathematical operations, like Blend shaders, or runtime shaders.
77
     */
78
    sk_sp<SkShader> makeWithWorkingColorSpace(sk_sp<SkColorSpace>) const;
79
80
private:
81
444k
    SkShader() = default;
82
    friend class SkShaderBase;
83
84
    using INHERITED = SkFlattenable;
85
};
86
87
namespace SkShaders {
88
SK_API sk_sp<SkShader> Empty();
89
SK_API sk_sp<SkShader> Color(SkColor);
90
SK_API sk_sp<SkShader> Color(const SkColor4f&, sk_sp<SkColorSpace>);
91
SK_API sk_sp<SkShader> Blend(SkBlendMode mode, sk_sp<SkShader> dst, sk_sp<SkShader> src);
92
SK_API sk_sp<SkShader> Blend(sk_sp<SkBlender>, sk_sp<SkShader> dst, sk_sp<SkShader> src);
93
SK_API sk_sp<SkShader> CoordClamp(sk_sp<SkShader>, const SkRect& subset);
94
95
/*
96
 * Create an SkShader that will sample the 'image'. This is equivalent to SkImage::makeShader.
97
 */
98
SK_API sk_sp<SkShader> Image(sk_sp<SkImage> image,
99
                             SkTileMode tmx, SkTileMode tmy,
100
                             const SkSamplingOptions& options,
101
                             const SkMatrix* localMatrix = nullptr);
102
/*
103
 * Create an SkShader that will sample 'image' with minimal processing. This is equivalent to
104
 * SkImage::makeRawShader.
105
 */
106
SK_API sk_sp<SkShader> RawImage(sk_sp<SkImage> image,
107
                                SkTileMode tmx, SkTileMode tmy,
108
                                const SkSamplingOptions& options,
109
                                const SkMatrix* localMatrix = nullptr);
110
}
111
112
#endif