blob: 2d73ad2dbc414ca8526484a51651cc07795cb387 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/shaders/SkShaderBase.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000012
13/** \class SkColorShader
14 A Shader that represents a single color. In general, this effect can be
15 accomplished by just using the color field on the paint, but if an
16 actual shader object is needed, this provides that feature.
17*/
Florin Malita95c993c2017-05-26 09:44:10 -040018class SkColorShader : public SkShaderBase {
reed@android.com8a1c16f2008-12-17 15:59:43 +000019public:
reed@android.com8a1c16f2008-12-17 15:59:43 +000020 /** Create a ColorShader that ignores the color in the paint, and uses the
21 specified color. Note: like all shaders, at draw time the paint's alpha
22 will be respected, and is applied to the specified color.
23 */
commit-bot@chromium.org76a3b2a2014-04-24 16:54:46 +000024 explicit SkColorShader(SkColor c);
reed@android.comf2b98d62010-12-20 18:26:13 +000025
mtklein36352bf2015-03-25 18:17:31 -070026 bool isOpaque() const override;
Mike Kleinb0d10e02016-11-12 10:29:26 -050027 bool isConstant() const override { return true; }
commit-bot@chromium.org87fcd952014-04-23 19:10:51 +000028
mtklein36352bf2015-03-25 18:17:31 -070029 GradientType asAGradient(GradientInfo* info) const override;
vandebo@chromium.orgd3ae7792011-02-24 00:21:06 +000030
bsalomonc21b09e2015-08-28 18:46:56 -070031#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050032 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
bsalomonc21b09e2015-08-28 18:46:56 -070033#endif
dandov9de5b512014-06-10 14:38:28 -070034
Mike Kleina4eb9362018-10-30 13:36:24 -040035private:
36 SK_FLATTENABLE_HOOKS(SkColorShader)
37
mtklein36352bf2015-03-25 18:17:31 -070038 void flatten(SkWriteBuffer&) const override;
Herb Derby83e939b2017-02-07 14:25:11 -050039
mtklein36352bf2015-03-25 18:17:31 -070040 bool onAsLuminanceColor(SkColor* lum) const override {
reed8367b8c2014-08-22 08:30:20 -070041 *lum = fColor;
42 return true;
43 }
Herb Derby83e939b2017-02-07 14:25:11 -050044
Mike Reed1386b2d2019-03-13 21:15:05 -040045 bool onAppendStages(const SkStageRec&) const override;
reed@google.com59ccef62011-12-07 14:59:50 +000046
Mike Klein03935052019-11-01 11:36:55 -050047 bool onProgram(skvm::Builder*,
48 SkColorSpace* dstCS,
Mike Klein1cc60672019-11-05 14:19:58 -060049 skvm::Uniforms* uniforms,
Mike Kleinf3d41092019-11-04 13:22:02 -060050 skvm::F32 x, skvm::F32 y,
Mike Kleinb9f20882019-11-08 12:14:15 -060051 skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
Mike Kleine4522dc2019-10-29 12:10:34 -050052
reed8367b8c2014-08-22 08:30:20 -070053 SkColor fColor;
reed@android.com8a1c16f2008-12-17 15:59:43 +000054};
55
Florin Malita4aed1382017-05-25 10:38:07 -040056class SkColor4Shader : public SkShaderBase {
reed0ccc62d2016-05-04 13:09:39 -070057public:
58 SkColor4Shader(const SkColor4f&, sk_sp<SkColorSpace>);
59
Mike Kleina4eb9362018-10-30 13:36:24 -040060 bool isOpaque() const override { return fColor.isOpaque(); }
Mike Kleinb0d10e02016-11-12 10:29:26 -050061 bool isConstant() const override { return true; }
reed0ccc62d2016-05-04 13:09:39 -070062
reed0ccc62d2016-05-04 13:09:39 -070063#if SK_SUPPORT_GPU
Mike Reede3429e62018-01-19 11:43:34 -050064 std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
reed0ccc62d2016-05-04 13:09:39 -070065#endif
66
reed0ccc62d2016-05-04 13:09:39 -070067private:
Mike Klein4fee3232018-10-18 17:27:16 -040068 SK_FLATTENABLE_HOOKS(SkColor4Shader)
69
Mike Kleina4eb9362018-10-30 13:36:24 -040070 void flatten(SkWriteBuffer&) const override;
Mike Reed1386b2d2019-03-13 21:15:05 -040071 bool onAppendStages(const SkStageRec&) const override;
Mike Kleinb0d10e02016-11-12 10:29:26 -050072
Mike Klein03935052019-11-01 11:36:55 -050073 bool onProgram(skvm::Builder*,
74 SkColorSpace* dstCS,
Mike Klein1cc60672019-11-05 14:19:58 -060075 skvm::Uniforms* uniforms,
Mike Kleinf3d41092019-11-04 13:22:02 -060076 skvm::F32 x, skvm::F32 y,
Mike Kleinb9f20882019-11-08 12:14:15 -060077 skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
Mike Klein9d0c67a2019-10-31 15:41:58 -050078
Mike Kleina4eb9362018-10-30 13:36:24 -040079 sk_sp<SkColorSpace> fColorSpace;
80 const SkColor4f fColor;
reed0ccc62d2016-05-04 13:09:39 -070081};
82
reed@android.com8a1c16f2008-12-17 15:59:43 +000083#endif