reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 1 | /* |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 2 | * Copyright 2006 The Android Open Source Project |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 3 | * |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 6 | */ |
| 7 | |
| 8 | #ifndef SkShader_DEFINED |
| 9 | #define SkShader_DEFINED |
| 10 | |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 11 | #include "include/core/SkColor.h" |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 12 | #include "include/core/SkFlattenable.h" |
Kevin Lubick | 8a0152a | 2023-06-05 11:41:39 -0400 | [diff] [blame] | 13 | #include "include/core/SkRefCnt.h" |
| 14 | #include "include/private/base/SkAPI.h" |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 15 | |
Mike Reed | a2a85e4 | 2021-07-26 15:29:43 -0400 | [diff] [blame] | 16 | class SkBlender; |
reed | 3061af4 | 2016-01-07 15:47:29 -0800 | [diff] [blame] | 17 | class SkColorFilter; |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 18 | class SkColorSpace; |
reed | f1ac182 | 2016-08-01 11:24:14 -0700 | [diff] [blame] | 19 | class SkImage; |
Kevin Lubick | 8a0152a | 2023-06-05 11:41:39 -0400 | [diff] [blame] | 20 | class SkMatrix; |
| 21 | enum class SkBlendMode; |
| 22 | enum class SkTileMode; |
| 23 | struct SkRect; |
Robert Phillips | 3ffa395 | 2024-03-20 12:29:55 -0400 | [diff] [blame] | 24 | struct SkSamplingOptions; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 25 | |
| 26 | /** \class SkShader |
reed@google.com | ad91799 | 2011-04-11 19:01:12 +0000 | [diff] [blame] | 27 | * |
reed@google.com | 880dc47 | 2012-05-11 14:47:03 +0000 | [diff] [blame] | 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. |
reed@google.com | ad91799 | 2011-04-11 19:01:12 +0000 | [diff] [blame] | 35 | */ |
ctguil@chromium.org | 7ffb1b2 | 2011-03-15 21:27:08 +0000 | [diff] [blame] | 36 | class SK_API SkShader : public SkFlattenable { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 37 | public: |
Florin Malita | 4aed138 | 2017-05-25 10:38:07 -0400 | [diff] [blame] | 38 | /** |
junov@chromium.org | b6e1619 | 2011-12-09 15:48:03 +0000 | [diff] [blame] | 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 |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 42 | * optimizations. |
junov@chromium.org | b6e1619 | 2011-12-09 15:48:03 +0000 | [diff] [blame] | 43 | */ |
| 44 | virtual bool isOpaque() const { return false; } |
| 45 | |
vandebo@chromium.org | d3ae779 | 2011-02-24 00:21:06 +0000 | [diff] [blame] | 46 | /** |
reed | f1ac182 | 2016-08-01 11:24:14 -0700 | [diff] [blame] | 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 | */ |
Mike Reed | fae8fce | 2019-04-03 10:27:45 -0400 | [diff] [blame] | 50 | SkImage* isAImage(SkMatrix* localMatrix, SkTileMode xy[2]) const; |
reed | f1ac182 | 2016-08-01 11:24:14 -0700 | [diff] [blame] | 51 | |
| 52 | bool isAImage() const { |
Mike Reed | fae8fce | 2019-04-03 10:27:45 -0400 | [diff] [blame] | 53 | return this->isAImage(nullptr, (SkTileMode*)nullptr) != nullptr; |
reed | f1ac182 | 2016-08-01 11:24:14 -0700 | [diff] [blame] | 54 | } |
| 55 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 56 | ////////////////////////////////////////////////////////////////////////// |
reed | f880e45 | 2015-12-30 13:39:41 -0800 | [diff] [blame] | 57 | // Methods to create combinations or variants of shaders |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 58 | |
commit-bot@chromium.org | ce56d96 | 2014-05-05 18:39:18 +0000 | [diff] [blame] | 59 | /** |
reed | f880e45 | 2015-12-30 13:39:41 -0800 | [diff] [blame] | 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 | */ |
reed | 150835e | 2016-03-10 06:36:49 -0800 | [diff] [blame] | 63 | sk_sp<SkShader> makeWithLocalMatrix(const SkMatrix&) const; |
reed | 3061af4 | 2016-01-07 15:47:29 -0800 | [diff] [blame] | 64 | |
| 65 | /** |
| 66 | * Create a new shader that produces the same colors as invoking this shader and then applying |
| 67 | * the colorfilter. |
| 68 | */ |
reed | d053ce9 | 2016-03-22 10:17:23 -0700 | [diff] [blame] | 69 | sk_sp<SkShader> makeWithColorFilter(sk_sp<SkColorFilter>) const; |
reed | a2b340f | 2016-02-10 08:53:15 -0800 | [diff] [blame] | 70 | |
Brian Osman | 611f089 | 2023-09-13 19:03:21 +0000 | [diff] [blame] | 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 | |
commit-bot@chromium.org | ce56d96 | 2014-05-05 18:39:18 +0000 | [diff] [blame] | 80 | private: |
Florin Malita | f7beee7 | 2017-05-26 12:54:32 -0400 | [diff] [blame] | 81 | SkShader() = default; |
| 82 | friend class SkShaderBase; |
| 83 | |
John Stiles | 7571f9e | 2020-09-02 22:42:33 -0400 | [diff] [blame] | 84 | using INHERITED = SkFlattenable; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 85 | }; |
| 86 | |
Kevin Lubick | 8a0152a | 2023-06-05 11:41:39 -0400 | [diff] [blame] | 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); |
Robert Phillips | 3ffa395 | 2024-03-20 12:29:55 -0400 | [diff] [blame] | 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); |
Kevin Lubick | 8a0152a | 2023-06-05 11:41:39 -0400 | [diff] [blame] | 110 | } |
Mike Reed | c8bea7d | 2019-04-09 13:55:36 -0400 | [diff] [blame] | 111 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 112 | #endif |