blob: d824dcd55b640f7e31a69634b201993e8a6080d0 [file] [log] [blame]
brianosman54f30c12016-07-18 10:53:52 -07001/*
2 * Copyright 2016 Google Inc.
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 GrColorSpaceXform_DEFINED
9#define GrColorSpaceXform_DEFINED
10
brianosman5a7ae7e2016-09-12 12:07:25 -070011#include "GrColor.h"
Brian Osmanc4f93ca2017-10-17 17:15:52 -040012#include "GrFragmentProcessor.h"
Brian Osman3567c142018-06-18 10:20:32 -040013#include "SkColorSpaceXformSteps.h"
brianosman54f30c12016-07-18 10:53:52 -070014#include "SkRefCnt.h"
15
Brian Osman3567c142018-06-18 10:20:32 -040016class SkColorSpace;
17
brianosman54f30c12016-07-18 10:53:52 -070018 /**
Brian Osmanf06ead92017-10-30 13:47:41 -040019 * Represents a color space transformation
brianosman54f30c12016-07-18 10:53:52 -070020 */
21class GrColorSpaceXform : public SkRefCnt {
22public:
Brian Osman3567c142018-06-18 10:20:32 -040023 GrColorSpaceXform(const SkColorSpaceXformSteps& steps) : fSteps(steps) {}
brianosman54f30c12016-07-18 10:53:52 -070024
Mike Kleine03a1762018-08-22 11:52:16 -040025 static sk_sp<GrColorSpaceXform> Make(SkColorSpace* src, SkAlphaType srcAT,
26 SkColorSpace* dst, SkAlphaType dstAT);
Brian Osmanf06ead92017-10-30 13:47:41 -040027
Brian Osman3567c142018-06-18 10:20:32 -040028 const SkColorSpaceXformSteps& steps() const { return fSteps; }
brianosman77320db2016-09-07 08:09:10 -070029
30 /**
31 * GrGLSLFragmentProcessor::GenKey() must call this and include the returned value in its
32 * computed key.
33 */
Brian Osmane411a072017-03-14 10:26:58 -040034 static uint32_t XformKey(const GrColorSpaceXform* xform) {
Brian Osman3567c142018-06-18 10:20:32 -040035 // Code generation depends on which steps we apply
36 return xform ? xform->fSteps.flags.mask() : 0;
brianosman77320db2016-09-07 08:09:10 -070037 }
brianosman54f30c12016-07-18 10:53:52 -070038
brianosmanb9c51372016-09-15 11:09:45 -070039 static bool Equals(const GrColorSpaceXform* a, const GrColorSpaceXform* b);
40
Brian Osman3567c142018-06-18 10:20:32 -040041 GrColor4f apply(const GrColor4f& srcColor);
brianosman5a7ae7e2016-09-12 12:07:25 -070042
brianosman54f30c12016-07-18 10:53:52 -070043private:
Brian Osmanf06ead92017-10-30 13:47:41 -040044 friend class GrGLSLColorSpaceXformHelper;
45
Brian Osman3567c142018-06-18 10:20:32 -040046 SkColorSpaceXformSteps fSteps;
brianosman54f30c12016-07-18 10:53:52 -070047};
48
Brian Osmanc4f93ca2017-10-17 17:15:52 -040049class GrColorSpaceXformEffect : public GrFragmentProcessor {
50public:
51 /**
Brian Osman3567c142018-06-18 10:20:32 -040052 * Returns a fragment processor that converts the input's color space from src to dst.
53 */
Brian Osman21fc5ce2018-08-27 20:36:19 +000054 static std::unique_ptr<GrFragmentProcessor> Make(SkColorSpace* src, SkAlphaType srcAT,
55 SkColorSpace* dst);
Brian Osman3567c142018-06-18 10:20:32 -040056
57 /**
Brian Osmanc4f93ca2017-10-17 17:15:52 -040058 * Returns a fragment processor that calls the passed in fragment processor, and then converts
59 * the color space of the output from src to dst.
60 */
61 static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> child,
Brian Osman21fc5ce2018-08-27 20:36:19 +000062 SkColorSpace* src, SkAlphaType srcAT,
63 SkColorSpace* dst);
Brian Osmanc4f93ca2017-10-17 17:15:52 -040064
65 const char* name() const override { return "ColorSpaceXform"; }
66 std::unique_ptr<GrFragmentProcessor> clone() const override;
67
68 const GrColorSpaceXform* colorXform() const { return fColorXform.get(); }
69
70private:
71 GrColorSpaceXformEffect(std::unique_ptr<GrFragmentProcessor> child,
72 sk_sp<GrColorSpaceXform> colorXform);
73
74 static OptimizationFlags OptFlags(const GrFragmentProcessor* child);
75
76 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
77 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
78 bool onIsEqual(const GrFragmentProcessor&) const override;
79
80 sk_sp<GrColorSpaceXform> fColorXform;
81
82 typedef GrFragmentProcessor INHERITED;
83};
84
brianosman54f30c12016-07-18 10:53:52 -070085#endif