|
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 GrEffectStage; |
|
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 GrEffectStage to perform a config conversion. |
|
38 static const GrEffectRef* Create(GrTexture*, |
|
39 bool swapRedAndBlue, |
|
40 PMConversion pmConversion, |
|
41 const SkMatrix& matrix); |
|
42 |
|
43 static const char* Name() { return "Config Conversion"; } |
|
44 typedef GrGLConfigConversionEffect GLEffect; |
|
45 |
|
46 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
|
47 |
|
48 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; |
|
49 |
|
50 bool swapsRedAndBlue() const { return fSwapRedAndBlue; } |
|
51 PMConversion pmConversion() const { return fPMConversion; } |
|
52 |
|
53 // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions |
|
54 // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that |
|
55 // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again |
|
56 // both reads will produce the same result. This test is quite expensive and should not be run |
|
57 // multiple times for a given context. |
|
58 static void TestForPreservingPMConversions(GrContext* context, |
|
59 PMConversion* PMToUPMRule, |
|
60 PMConversion* UPMToPMRule); |
|
61 |
|
62 private: |
|
63 GrConfigConversionEffect(GrTexture*, |
|
64 bool swapRedAndBlue, |
|
65 PMConversion pmConversion, |
|
66 const SkMatrix& matrix); |
|
67 |
|
68 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; |
|
69 |
|
70 bool fSwapRedAndBlue; |
|
71 PMConversion fPMConversion; |
|
72 |
|
73 GR_DECLARE_EFFECT_TEST; |
|
74 |
|
75 typedef GrSingleTextureEffect INHERITED; |
|
76 }; |
|
77 |
|
78 #endif |