GrColorSpaceXform.h 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  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. #ifndef GrColorSpaceXform_DEFINED
  8. #define GrColorSpaceXform_DEFINED
  9. #include "include/core/SkRefCnt.h"
  10. #include "src/core/SkColorSpaceXformSteps.h"
  11. #include "src/gpu/GrFragmentProcessor.h"
  12. class SkColorSpace;
  13. /**
  14. * Represents a color space transformation
  15. */
  16. class GrColorSpaceXform : public SkRefCnt {
  17. public:
  18. GrColorSpaceXform(const SkColorSpaceXformSteps& steps) : fSteps(steps) {}
  19. static sk_sp<GrColorSpaceXform> Make(SkColorSpace* src, SkAlphaType srcAT,
  20. SkColorSpace* dst, SkAlphaType dstAT);
  21. const SkColorSpaceXformSteps& steps() const { return fSteps; }
  22. /**
  23. * GrGLSLFragmentProcessor::GenKey() must call this and include the returned value in its
  24. * computed key.
  25. */
  26. static uint32_t XformKey(const GrColorSpaceXform* xform) {
  27. // Code generation depends on which steps we apply
  28. return xform ? xform->fSteps.flags.mask() : 0;
  29. }
  30. static bool Equals(const GrColorSpaceXform* a, const GrColorSpaceXform* b);
  31. SkColor4f apply(const SkColor4f& srcColor);
  32. private:
  33. friend class GrGLSLColorSpaceXformHelper;
  34. SkColorSpaceXformSteps fSteps;
  35. };
  36. class GrColorSpaceXformEffect : public GrFragmentProcessor {
  37. public:
  38. /**
  39. * Returns a fragment processor that converts the input's color space from src to dst.
  40. */
  41. static std::unique_ptr<GrFragmentProcessor> Make(SkColorSpace* src, SkAlphaType srcAT,
  42. SkColorSpace* dst, SkAlphaType dstAT);
  43. /**
  44. * Returns a fragment processor that calls the passed in fragment processor, and then converts
  45. * the color space of the output from src to dst.
  46. */
  47. static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> child,
  48. SkColorSpace* src, SkAlphaType srcAT,
  49. SkColorSpace* dst);
  50. /**
  51. * Returns a fragment processor that calls the passed in FP and then converts it with the given
  52. * color xform. Returns null if child is null, returns child if the xform is null (e.g. noop).
  53. */
  54. static std::unique_ptr<GrFragmentProcessor> Make(std::unique_ptr<GrFragmentProcessor> child,
  55. sk_sp<GrColorSpaceXform> colorXform);
  56. const char* name() const override { return "ColorSpaceXform"; }
  57. std::unique_ptr<GrFragmentProcessor> clone() const override;
  58. const GrColorSpaceXform* colorXform() const { return fColorXform.get(); }
  59. private:
  60. GrColorSpaceXformEffect(std::unique_ptr<GrFragmentProcessor> child,
  61. sk_sp<GrColorSpaceXform> colorXform);
  62. static OptimizationFlags OptFlags(const GrFragmentProcessor* child);
  63. GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
  64. void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
  65. bool onIsEqual(const GrFragmentProcessor&) const override;
  66. sk_sp<GrColorSpaceXform> fColorXform;
  67. typedef GrFragmentProcessor INHERITED;
  68. };
  69. #endif