blob: 242eeb52be47e985c2e72e7e10d4e51dfaacb265 [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
Brian Osmanc4f93ca2017-10-17 17:15:52 -040011#include "GrFragmentProcessor.h"
Brian Osman3567c142018-06-18 10:20:32 -040012#include "SkColorSpaceXformSteps.h"
brianosman54f30c12016-07-18 10:53:52 -070013#include "SkRefCnt.h"
14
Brian Osman3567c142018-06-18 10:20:32 -040015class SkColorSpace;
16
brianosman54f30c12016-07-18 10:53:52 -070017 /**
Brian Osmanf06ead92017-10-30 13:47:41 -040018 * Represents a color space transformation
brianosman54f30c12016-07-18 10:53:52 -070019 */
20class GrColorSpaceXform : public SkRefCnt {
21public:
Brian Osman3567c142018-06-18 10:20:32 -040022 GrColorSpaceXform(const SkColorSpaceXformSteps& steps) : fSteps(steps) {}
brianosman54f30c12016-07-18 10:53:52 -070023
Mike Kleine03a1762018-08-22 11:52:16 -040024 static sk_sp<GrColorSpaceXform> Make(SkColorSpace* src, SkAlphaType srcAT,
25 SkColorSpace* dst, SkAlphaType dstAT);
Brian Osmanf06ead92017-10-30 13:47:41 -040026
Brian Osman3567c142018-06-18 10:20:32 -040027 const SkColorSpaceXformSteps& steps() const { return fSteps; }
brianosman77320db2016-09-07 08:09:10 -070028
29 /**
30 * GrGLSLFragmentProcessor::GenKey() must call this and include the returned value in its
31 * computed key.
32 */
Brian Osmane411a072017-03-14 10:26:58 -040033 static uint32_t XformKey(const GrColorSpaceXform* xform) {
Brian Osman3567c142018-06-18 10:20:32 -040034 // Code generation depends on which steps we apply
35 return xform ? xform->fSteps.flags.mask() : 0;
brianosman77320db2016-09-07 08:09:10 -070036 }
brianosman54f30c12016-07-18 10:53:52 -070037
brianosmanb9c51372016-09-15 11:09:45 -070038 static bool Equals(const GrColorSpaceXform* a, const GrColorSpaceXform* b);
39
Brian Osmanf28e55d2018-10-03 16:35:54 -040040 SkColor4f apply(const SkColor4f& srcColor);
brianosman5a7ae7e2016-09-12 12:07:25 -070041
brianosman54f30c12016-07-18 10:53:52 -070042private:
Brian Osmanf06ead92017-10-30 13:47:41 -040043 friend class GrGLSLColorSpaceXformHelper;
44
Brian Osman3567c142018-06-18 10:20:32 -040045 SkColorSpaceXformSteps fSteps;
brianosman54f30c12016-07-18 10:53:52 -070046};
47
Brian Osmanc4f93ca2017-10-17 17:15:52 -040048class GrColorSpaceXformEffect : public GrFragmentProcessor {
49public:
50 /**
Brian Osman3567c142018-06-18 10:20:32 -040051 * Returns a fragment processor that converts the input's color space from src to dst.
52 */
Brian Osman21fc5ce2018-08-27 20:36:19 +000053 static std::unique_ptr<GrFragmentProcessor> Make(SkColorSpace* src, SkAlphaType srcAT,
Brian Osman15f0f292018-10-01 14:14:46 -040054 SkColorSpace* dst, SkAlphaType dstAT);
Brian Osman3567c142018-06-18 10:20:32 -040055
56 /**
Brian Osmanc4f93ca2017-10-17 17:15:52 -040057 * Returns a fragment processor that calls the passed in fragment processor, and then converts
58 * the color space of the output from src to dst.
59 */
60 static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> child,
Brian Osman21fc5ce2018-08-27 20:36:19 +000061 SkColorSpace* src, SkAlphaType srcAT,
62 SkColorSpace* dst);
Brian Osmanc4f93ca2017-10-17 17:15:52 -040063
64 const char* name() const override { return "ColorSpaceXform"; }
65 std::unique_ptr<GrFragmentProcessor> clone() const override;
66
67 const GrColorSpaceXform* colorXform() const { return fColorXform.get(); }
68
69private:
70 GrColorSpaceXformEffect(std::unique_ptr<GrFragmentProcessor> child,
71 sk_sp<GrColorSpaceXform> colorXform);
72
73 static OptimizationFlags OptFlags(const GrFragmentProcessor* child);
74
75 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
76 void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
77 bool onIsEqual(const GrFragmentProcessor&) const override;
78
79 sk_sp<GrColorSpaceXform> fColorXform;
80
81 typedef GrFragmentProcessor INHERITED;
82};
83
brianosman54f30c12016-07-18 10:53:52 -070084#endif