Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / effects / GrConfigConversionEffect.h
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 GrFragmentStage;
14 class GrGLConfigConversionEffect;
15
16 /**
17  * This class is used to perform config conversions. Clients may want to read/write data that is
18  * unpremultiplied. Also on some systems reading/writing BGRA or RGBA is faster. In those cases we
19  * read/write using the faster path and perform an R/B swap in the shader if the client data is in
20  * the slower config.
21  */
22 class GrConfigConversionEffect : public GrSingleTextureEffect {
23 public:
24     /**
25      * The PM->UPM or UPM->PM conversions to apply.
26      */
27     enum PMConversion {
28         kNone_PMConversion = 0,
29         kMulByAlpha_RoundUp_PMConversion,
30         kMulByAlpha_RoundDown_PMConversion,
31         kDivByAlpha_RoundUp_PMConversion,
32         kDivByAlpha_RoundDown_PMConversion,
33
34         kPMConversionCnt
35     };
36
37     // Installs an effect in the GrProcessorStage to perform a config conversion.
38     static const GrFragmentProcessor* Create(GrTexture*, bool swapRedAndBlue, PMConversion,
39                                              const SkMatrix&);
40
41     static const char* Name() { return "Config Conversion"; }
42     typedef GrGLConfigConversionEffect GLProcessor;
43
44     virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE;
45
46     bool swapsRedAndBlue() const { return fSwapRedAndBlue; }
47     PMConversion  pmConversion() const { return fPMConversion; }
48
49     // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions
50     // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that
51     // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again
52     // both reads will produce the same result. This test is quite expensive and should not be run
53     // multiple times for a given context.
54     static void TestForPreservingPMConversions(GrContext* context,
55                                                PMConversion* PMToUPMRule,
56                                                PMConversion* UPMToPMRule);
57
58 private:
59     GrConfigConversionEffect(GrTexture*,
60                             bool swapRedAndBlue,
61                             PMConversion pmConversion,
62                             const SkMatrix& matrix);
63
64     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
65
66     virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
67
68     bool            fSwapRedAndBlue;
69     PMConversion    fPMConversion;
70
71     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
72
73     typedef GrSingleTextureEffect INHERITED;
74 };
75
76 #endif