| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrYUVtoRGBEffect_DEFINED |
| #define GrYUVtoRGBEffect_DEFINED |
| |
| #include "SkTypes.h" |
| |
| #include "GrFragmentProcessor.h" |
| #include "GrCoordTransform.h" |
| |
| #include "SkYUVAIndex.h" |
| |
| class GrYUVtoRGBEffect : public GrFragmentProcessor { |
| public: |
| static std::unique_ptr<GrFragmentProcessor> Make(const sk_sp<GrTextureProxy> proxies[], |
| const SkYUVAIndex indices[4], |
| SkYUVColorSpace yuvColorSpace, |
| GrSamplerState::Filter filterMode); |
| #ifdef SK_DEBUG |
| SkString dumpInfo() const override; |
| #endif |
| |
| const SkMatrix44& colorSpaceMatrix() const { return fColorSpaceMatrix; } |
| const SkYUVAIndex& yuvaIndex(int i) const { return fYUVAIndices[i]; } |
| |
| GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src); |
| std::unique_ptr<GrFragmentProcessor> clone() const override; |
| const char* name() const override { return "YUVtoRGBEffect"; } |
| |
| private: |
| GrYUVtoRGBEffect(const sk_sp<GrTextureProxy> proxies[], const SkSize scales[], |
| const GrSamplerState::Filter filterModes[], int numPlanes, |
| const SkYUVAIndex yuvaIndices[4], const SkMatrix44& colorSpaceMatrix) |
| : INHERITED(kGrYUVtoRGBEffect_ClassID, kNone_OptimizationFlags) |
| , fColorSpaceMatrix(colorSpaceMatrix) { |
| for (int i = 0; i < numPlanes; ++i) { |
| fSamplers[i].reset(std::move(proxies[i]), |
| GrSamplerState(GrSamplerState::WrapMode::kClamp, filterModes[i])); |
| fSamplerTransforms[i] = SkMatrix::MakeScale(scales[i].width(), scales[i].height()); |
| fSamplerCoordTransforms[i] = |
| GrCoordTransform(fSamplerTransforms[i], fSamplers[i].proxy()); |
| } |
| |
| this->setTextureSamplerCnt(numPlanes); |
| for (int i = 0; i < numPlanes; ++i) { |
| this->addCoordTransform(&fSamplerCoordTransforms[i]); |
| } |
| |
| memcpy(fYUVAIndices, yuvaIndices, sizeof(fYUVAIndices)); |
| } |
| GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
| void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; |
| bool onIsEqual(const GrFragmentProcessor&) const override; |
| const TextureSampler& onTextureSampler(int) const override; |
| GR_DECLARE_FRAGMENT_PROCESSOR_TEST |
| |
| TextureSampler fSamplers[4]; |
| SkMatrix44 fSamplerTransforms[4]; |
| GrCoordTransform fSamplerCoordTransforms[4]; |
| SkYUVAIndex fYUVAIndices[4]; |
| SkMatrix44 fColorSpaceMatrix; |
| |
| typedef GrFragmentProcessor INHERITED; |
| }; |
| #endif |