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 2007 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 SkColorShader_DEFINED |
| 9 | #define SkColorShader_DEFINED |
| 10 | |
| 11 | #include "SkShader.h" |
reed | dd9ffea | 2016-02-18 12:39:14 -0800 | [diff] [blame] | 12 | #include "SkPM4f.h" |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 13 | |
| 14 | /** \class SkColorShader |
| 15 | A Shader that represents a single color. In general, this effect can be |
| 16 | accomplished by just using the color field on the paint, but if an |
| 17 | actual shader object is needed, this provides that feature. |
| 18 | */ |
ctguil@chromium.org | 7ffb1b2 | 2011-03-15 21:27:08 +0000 | [diff] [blame] | 19 | class SK_API SkColorShader : public SkShader { |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 20 | public: |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 21 | /** Create a ColorShader that ignores the color in the paint, and uses the |
| 22 | specified color. Note: like all shaders, at draw time the paint's alpha |
| 23 | will be respected, and is applied to the specified color. |
| 24 | */ |
commit-bot@chromium.org | 76a3b2a | 2014-04-24 16:54:46 +0000 | [diff] [blame] | 25 | explicit SkColorShader(SkColor c); |
reed@android.com | f2b98d6 | 2010-12-20 18:26:13 +0000 | [diff] [blame] | 26 | |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 27 | bool isOpaque() const override; |
Mike Klein | b0d10e0 | 2016-11-12 10:29:26 -0500 | [diff] [blame] | 28 | bool isConstant() const override { return true; } |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 29 | |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 30 | class ColorShaderContext : public SkShader::Context { |
| 31 | public: |
commit-bot@chromium.org | e901b6d | 2014-05-01 19:31:31 +0000 | [diff] [blame] | 32 | ColorShaderContext(const SkColorShader& shader, const ContextRec&); |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 33 | |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 34 | uint32_t getFlags() const override; |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 35 | void shadeSpan(int x, int y, SkPMColor span[], int count) override; |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 36 | void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) override; |
reed | 6d3cef9 | 2016-01-22 01:04:29 -0800 | [diff] [blame] | 37 | void shadeSpan4f(int x, int y, SkPM4f[], int count) override; |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 38 | |
reed | 830dfd8 | 2016-03-16 12:29:01 -0700 | [diff] [blame] | 39 | protected: |
reed | 58fc94e | 2016-03-18 12:42:26 -0700 | [diff] [blame] | 40 | bool onChooseBlitProcs(const SkImageInfo&, BlitState*) override; |
| 41 | |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 42 | private: |
reed | 6d3cef9 | 2016-01-22 01:04:29 -0800 | [diff] [blame] | 43 | SkPM4f fPM4f; |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 44 | SkPMColor fPMColor; |
| 45 | uint32_t fFlags; |
commit-bot@chromium.org | 87fcd95 | 2014-04-23 19:10:51 +0000 | [diff] [blame] | 46 | |
| 47 | typedef SkShader::Context INHERITED; |
| 48 | }; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 49 | |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 50 | GradientType asAGradient(GradientInfo* info) const override; |
vandebo@chromium.org | d3ae779 | 2011-02-24 00:21:06 +0000 | [diff] [blame] | 51 | |
bsalomon | c21b09e | 2015-08-28 18:46:56 -0700 | [diff] [blame] | 52 | #if SK_SUPPORT_GPU |
brianosman | 839345d | 2016-07-22 11:04:53 -0700 | [diff] [blame] | 53 | sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override; |
bsalomon | c21b09e | 2015-08-28 18:46:56 -0700 | [diff] [blame] | 54 | #endif |
dandov | 9de5b51 | 2014-06-10 14:38:28 -0700 | [diff] [blame] | 55 | |
commit-bot@chromium.org | 0f10f7b | 2014-03-13 18:02:17 +0000 | [diff] [blame] | 56 | SK_TO_STRING_OVERRIDE() |
djsollen@google.com | ba28d03 | 2012-03-26 17:57:35 +0000 | [diff] [blame] | 57 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader) |
djsollen@google.com | a2ca41e | 2012-03-23 19:00:34 +0000 | [diff] [blame] | 58 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 59 | protected: |
commit-bot@chromium.org | 8b0e8ac | 2014-01-30 18:58:24 +0000 | [diff] [blame] | 60 | SkColorShader(SkReadBuffer&); |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 61 | void flatten(SkWriteBuffer&) const override; |
| 62 | Context* onCreateContext(const ContextRec&, void* storage) const override; |
reed | a0cee5f | 2016-03-04 07:38:11 -0800 | [diff] [blame] | 63 | size_t onContextSize(const ContextRec&) const override { return sizeof(ColorShaderContext); } |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 64 | bool onAsLuminanceColor(SkColor* lum) const override { |
reed | 8367b8c | 2014-08-22 08:30:20 -0700 | [diff] [blame] | 65 | *lum = fColor; |
| 66 | return true; |
| 67 | } |
Herb Derby | ac04fef | 2017-01-13 17:34:33 -0500 | [diff] [blame] | 68 | bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, |
Florin Malita | 882ccaf | 2017-01-27 10:51:58 -0500 | [diff] [blame^] | 69 | const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override; |
reed@google.com | 59ccef6 | 2011-12-07 14:59:50 +0000 | [diff] [blame] | 70 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 71 | private: |
reed | 8367b8c | 2014-08-22 08:30:20 -0700 | [diff] [blame] | 72 | SkColor fColor; |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 73 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 74 | typedef SkShader INHERITED; |
| 75 | }; |
| 76 | |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 77 | class SkColor4Shader : public SkShader { |
| 78 | public: |
| 79 | SkColor4Shader(const SkColor4f&, sk_sp<SkColorSpace>); |
| 80 | |
| 81 | bool isOpaque() const override { |
| 82 | return SkColorGetA(fCachedByteColor) == 255; |
| 83 | } |
Mike Klein | b0d10e0 | 2016-11-12 10:29:26 -0500 | [diff] [blame] | 84 | bool isConstant() const override { return true; } |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 85 | |
| 86 | class Color4Context : public SkShader::Context { |
| 87 | public: |
| 88 | Color4Context(const SkColor4Shader& shader, const ContextRec&); |
| 89 | |
| 90 | uint32_t getFlags() const override; |
| 91 | void shadeSpan(int x, int y, SkPMColor span[], int count) override; |
| 92 | void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) override; |
| 93 | void shadeSpan4f(int x, int y, SkPM4f[], int count) override; |
| 94 | |
| 95 | protected: |
| 96 | bool onChooseBlitProcs(const SkImageInfo&, BlitState*) override; |
| 97 | |
| 98 | private: |
| 99 | SkPM4f fPM4f; |
| 100 | SkPMColor fPMColor; |
| 101 | uint32_t fFlags; |
| 102 | |
| 103 | typedef SkShader::Context INHERITED; |
| 104 | }; |
| 105 | |
| 106 | GradientType asAGradient(GradientInfo* info) const override; |
| 107 | |
| 108 | #if SK_SUPPORT_GPU |
brianosman | 839345d | 2016-07-22 11:04:53 -0700 | [diff] [blame] | 109 | sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override; |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 110 | #endif |
| 111 | |
| 112 | SK_TO_STRING_OVERRIDE() |
| 113 | SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader) |
| 114 | |
| 115 | protected: |
| 116 | SkColor4Shader(SkReadBuffer&); |
| 117 | void flatten(SkWriteBuffer&) const override; |
| 118 | Context* onCreateContext(const ContextRec&, void* storage) const override; |
| 119 | size_t onContextSize(const ContextRec&) const override { return sizeof(Color4Context); } |
| 120 | bool onAsLuminanceColor(SkColor* lum) const override { |
| 121 | *lum = fCachedByteColor; |
| 122 | return true; |
| 123 | } |
Herb Derby | ac04fef | 2017-01-13 17:34:33 -0500 | [diff] [blame] | 124 | bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, |
Florin Malita | 882ccaf | 2017-01-27 10:51:58 -0500 | [diff] [blame^] | 125 | const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override; |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 126 | |
| 127 | private: |
| 128 | sk_sp<SkColorSpace> fColorSpace; |
| 129 | const SkColor4f fColor4; |
| 130 | const SkColor fCachedByteColor; |
Mike Klein | b0d10e0 | 2016-11-12 10:29:26 -0500 | [diff] [blame] | 131 | |
reed | 0ccc62d | 2016-05-04 13:09:39 -0700 | [diff] [blame] | 132 | typedef SkShader INHERITED; |
| 133 | }; |
| 134 | |
reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame] | 135 | #endif |