Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2012 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 GrConfigConversionEffect_DEFINED
      9 #define GrConfigConversionEffect_DEFINED
     10 
     11 #include "GrSingleTextureEffect.h"
     12 
     13 class GrInvariantOutput;
     14 
     15 /**
     16  * This class is used to perform config conversions. Clients may want to read/write data that is
     17  * unpremultiplied.
     18  */
     19 class GrConfigConversionEffect : public GrSingleTextureEffect {
     20 public:
     21     /**
     22      * The PM->UPM or UPM->PM conversions to apply.
     23      */
     24     enum PMConversion {
     25         kMulByAlpha_RoundUp_PMConversion = 0,
     26         kMulByAlpha_RoundDown_PMConversion,
     27         kDivByAlpha_RoundUp_PMConversion,
     28         kDivByAlpha_RoundDown_PMConversion,
     29 
     30         kPMConversionCnt
     31     };
     32 
     33     static sk_sp<GrFragmentProcessor> Make(GrTexture*, PMConversion, const SkMatrix&);
     34 
     35     static sk_sp<GrFragmentProcessor> Make(GrResourceProvider*, sk_sp<GrTextureProxy>,
     36                                            PMConversion, const SkMatrix&);
     37 
     38     const char* name() const override { return "Config Conversion"; }
     39 
     40     PMConversion  pmConversion() const { return fPMConversion; }
     41 
     42     // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions
     43     // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that
     44     // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again
     45     // both reads will produce the same result. This test is quite expensive and should not be run
     46     // multiple times for a given context.
     47     static void TestForPreservingPMConversions(GrContext* context,
     48                                                PMConversion* PMToUPMRule,
     49                                                PMConversion* UPMToPMRule);
     50 private:
     51     GrConfigConversionEffect(GrTexture*, PMConversion, const SkMatrix& matrix);
     52 
     53     GrConfigConversionEffect(GrResourceProvider*, sk_sp<GrTextureProxy>,
     54                              PMConversion, const SkMatrix& matrix);
     55 
     56     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
     57 
     58     void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
     59 
     60     bool onIsEqual(const GrFragmentProcessor&) const override;
     61 
     62     PMConversion    fPMConversion;
     63 
     64     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
     65 
     66     typedef GrSingleTextureEffect INHERITED;
     67 };
     68 
     69 #endif
     70