Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2018 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 GrYUVtoRGBEffect_DEFINED
      9 #define GrYUVtoRGBEffect_DEFINED
     10 
     11 #include "SkTypes.h"
     12 
     13 #include "GrFragmentProcessor.h"
     14 #include "GrCoordTransform.h"
     15 
     16 #include "SkYUVAIndex.h"
     17 
     18 class GrYUVtoRGBEffect : public GrFragmentProcessor {
     19 public:
     20     static std::unique_ptr<GrFragmentProcessor> Make(const sk_sp<GrTextureProxy> proxies[],
     21                                                      const SkYUVAIndex indices[4],
     22                                                      SkYUVColorSpace yuvColorSpace,
     23                                                      GrSamplerState::Filter filterMode);
     24 #ifdef SK_DEBUG
     25     SkString dumpInfo() const override;
     26 #endif
     27 
     28     const SkMatrix44& colorSpaceMatrix() const { return fColorSpaceMatrix; }
     29     const SkYUVAIndex& yuvaIndex(int i) const { return fYUVAIndices[i]; }
     30 
     31     GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src);
     32     std::unique_ptr<GrFragmentProcessor> clone() const override;
     33     const char* name() const override { return "YUVtoRGBEffect"; }
     34 
     35 private:
     36     GrYUVtoRGBEffect(const sk_sp<GrTextureProxy> proxies[], const SkSize scales[],
     37                      const GrSamplerState::Filter filterModes[], int numPlanes,
     38                      const SkYUVAIndex yuvaIndices[4], const SkMatrix44& colorSpaceMatrix)
     39             : INHERITED(kGrYUVtoRGBEffect_ClassID, kNone_OptimizationFlags)
     40             , fColorSpaceMatrix(colorSpaceMatrix) {
     41         for (int i = 0; i < numPlanes; ++i) {
     42             fSamplers[i].reset(std::move(proxies[i]),
     43                                GrSamplerState(GrSamplerState::WrapMode::kClamp, filterModes[i]));
     44             fSamplerTransforms[i] = SkMatrix::MakeScale(scales[i].width(), scales[i].height());
     45             fSamplerCoordTransforms[i] =
     46                     GrCoordTransform(fSamplerTransforms[i], fSamplers[i].proxy());
     47         }
     48 
     49         this->setTextureSamplerCnt(numPlanes);
     50         for (int i = 0; i < numPlanes; ++i) {
     51             this->addCoordTransform(&fSamplerCoordTransforms[i]);
     52         }
     53 
     54         memcpy(fYUVAIndices, yuvaIndices, sizeof(fYUVAIndices));
     55     }
     56     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     57     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     58     bool onIsEqual(const GrFragmentProcessor&) const override;
     59     const TextureSampler& onTextureSampler(int) const override;
     60     GR_DECLARE_FRAGMENT_PROCESSOR_TEST
     61 
     62     TextureSampler   fSamplers[4];
     63     SkMatrix44       fSamplerTransforms[4];
     64     GrCoordTransform fSamplerCoordTransforms[4];
     65     SkYUVAIndex      fYUVAIndices[4];
     66     SkMatrix44       fColorSpaceMatrix;
     67 
     68     typedef GrFragmentProcessor INHERITED;
     69 };
     70 #endif
     71