blob: 813fd3e892a26371248586dfa8748c6abee89e24 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2007 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkColorShader_DEFINED
9#define SkColorShader_DEFINED
10
11#include "SkShader.h"
reeddd9ffea2016-02-18 12:39:14 -080012#include "SkPM4f.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013
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.org7ffb1b22011-03-15 21:27:08 +000019class SK_API SkColorShader : public SkShader {
reed@android.com8a1c16f2008-12-17 15:59:43 +000020public:
reed@android.com8a1c16f2008-12-17 15:59:43 +000021 /** 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.org76a3b2a2014-04-24 16:54:46 +000025 explicit SkColorShader(SkColor c);
reed@android.comf2b98d62010-12-20 18:26:13 +000026
mtklein36352bf2015-03-25 18:17:31 -070027 bool isOpaque() const override;
Mike Kleinb0d10e02016-11-12 10:29:26 -050028 bool isConstant() const override { return true; }
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000029
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000030 class ColorShaderContext : public SkShader::Context {
31 public:
commit-bot@chromium.orge901b6d2014-05-01 19:31:31 +000032 ColorShaderContext(const SkColorShader& shader, const ContextRec&);
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000033
mtklein36352bf2015-03-25 18:17:31 -070034 uint32_t getFlags() const override;
mtklein36352bf2015-03-25 18:17:31 -070035 void shadeSpan(int x, int y, SkPMColor span[], int count) override;
mtklein36352bf2015-03-25 18:17:31 -070036 void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) override;
reed6d3cef92016-01-22 01:04:29 -080037 void shadeSpan4f(int x, int y, SkPM4f[], int count) override;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000038
reed830dfd82016-03-16 12:29:01 -070039 protected:
reed58fc94e2016-03-18 12:42:26 -070040 bool onChooseBlitProcs(const SkImageInfo&, BlitState*) override;
41
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000042 private:
reed6d3cef92016-01-22 01:04:29 -080043 SkPM4f fPM4f;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000044 SkPMColor fPMColor;
45 uint32_t fFlags;
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000046
47 typedef SkShader::Context INHERITED;
48 };
reed@android.com8a1c16f2008-12-17 15:59:43 +000049
mtklein36352bf2015-03-25 18:17:31 -070050 GradientType asAGradient(GradientInfo* info) const override;
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +000051
bsalomonc21b09e2015-08-28 18:46:56 -070052#if SK_SUPPORT_GPU
brianosman839345d2016-07-22 11:04:53 -070053 sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070054#endif
dandov9de5b512014-06-10 14:38:28 -070055
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000056 SK_TO_STRING_OVERRIDE()
djsollen@google.comba28d032012-03-26 17:57:35 +000057 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader)
djsollen@google.coma2ca41e2012-03-23 19:00:34 +000058
reed@android.com8a1c16f2008-12-17 15:59:43 +000059protected:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000060 SkColorShader(SkReadBuffer&);
mtklein36352bf2015-03-25 18:17:31 -070061 void flatten(SkWriteBuffer&) const override;
62 Context* onCreateContext(const ContextRec&, void* storage) const override;
reeda0cee5f2016-03-04 07:38:11 -080063 size_t onContextSize(const ContextRec&) const override { return sizeof(ColorShaderContext); }
mtklein36352bf2015-03-25 18:17:31 -070064 bool onAsLuminanceColor(SkColor* lum) const override {
reed8367b8c2014-08-22 08:30:20 -070065 *lum = fColor;
66 return true;
67 }
Herb Derbyac04fef2017-01-13 17:34:33 -050068 bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
Florin Malita882ccaf2017-01-27 10:51:58 -050069 const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override;
reed@google.com59ccef62011-12-07 14:59:50 +000070
reed@android.com8a1c16f2008-12-17 15:59:43 +000071private:
reed8367b8c2014-08-22 08:30:20 -070072 SkColor fColor;
reed@android.com8a1c16f2008-12-17 15:59:43 +000073
reed@android.com8a1c16f2008-12-17 15:59:43 +000074 typedef SkShader INHERITED;
75};
76
reed0ccc62d2016-05-04 13:09:39 -070077class SkColor4Shader : public SkShader {
78public:
79 SkColor4Shader(const SkColor4f&, sk_sp<SkColorSpace>);
80
81 bool isOpaque() const override {
82 return SkColorGetA(fCachedByteColor) == 255;
83 }
Mike Kleinb0d10e02016-11-12 10:29:26 -050084 bool isConstant() const override { return true; }
reed0ccc62d2016-05-04 13:09:39 -070085
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
brianosman839345d2016-07-22 11:04:53 -0700109 sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
reed0ccc62d2016-05-04 13:09:39 -0700110#endif
111
112 SK_TO_STRING_OVERRIDE()
113 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader)
114
115protected:
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 Derbyac04fef2017-01-13 17:34:33 -0500124 bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
Florin Malita882ccaf2017-01-27 10:51:58 -0500125 const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override;
reed0ccc62d2016-05-04 13:09:39 -0700126
127private:
128 sk_sp<SkColorSpace> fColorSpace;
129 const SkColor4f fColor4;
130 const SkColor fCachedByteColor;
Mike Kleinb0d10e02016-11-12 10:29:26 -0500131
reed0ccc62d2016-05-04 13:09:39 -0700132 typedef SkShader INHERITED;
133};
134
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135#endif