| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrPorterDuffXferProcessor_DEFINED | 8 #ifndef GrPorterDuffXferProcessor_DEFINED |
| 9 #define GrPorterDuffXferProcessor_DEFINED | 9 #define GrPorterDuffXferProcessor_DEFINED |
| 10 | 10 |
| 11 #include "GrTypes.h" | 11 #include "GrTypes.h" |
| 12 #include "GrXferProcessor.h" | 12 #include "GrXferProcessor.h" |
| 13 #include "SkXfermode.h" | 13 #include "SkXfermode.h" |
| 14 | 14 |
| 15 class GrInvariantOutput; | |
| 16 class GrProcOptInfo; | 15 class GrProcOptInfo; |
| 17 | 16 |
| 18 class GrPorterDuffXferProcessor : public GrXferProcessor { | 17 class GrPorterDuffXferProcessor : public GrXferProcessor { |
| 19 public: | 18 public: |
| 20 static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, | 19 static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, |
| 21 GrColor constant = 0) { | 20 GrColor constant = 0) { |
| 22 return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend, consta
nt)); | 21 return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend, consta
nt)); |
| 23 } | 22 } |
| 24 | 23 |
| 25 virtual ~GrPorterDuffXferProcessor(); | 24 virtual ~GrPorterDuffXferProcessor(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 kCoverageISC_SecondaryOutputType, | 60 kCoverageISC_SecondaryOutputType, |
| 62 | 61 |
| 63 kSecondaryOutputTypeCnt, | 62 kSecondaryOutputTypeCnt, |
| 64 }; | 63 }; |
| 65 | 64 |
| 66 PrimaryOutputType primaryOutputType() const { return fPrimaryOutputType; } | 65 PrimaryOutputType primaryOutputType() const { return fPrimaryOutputType; } |
| 67 SecondaryOutputType secondaryOutputType() const { return fSecondaryOutputTyp
e; } | 66 SecondaryOutputType secondaryOutputType() const { return fSecondaryOutputTyp
e; } |
| 68 | 67 |
| 69 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, | 68 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, |
| 70 const GrProcOptInfo& coveragePOI, | 69 const GrProcOptInfo& coveragePOI, |
| 71 bool colorWriteDisabled, | |
| 72 bool doesStencilWrite, | 70 bool doesStencilWrite, |
| 73 GrColor* overrideColor, | 71 GrColor* overrideColor, |
| 74 const GrDrawTargetCaps& caps) SK_
OVERRIDE; | 72 const GrDrawTargetCaps& caps) SK_
OVERRIDE; |
| 75 | 73 |
| 76 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { | 74 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { |
| 77 blendInfo->fSrcBlend = fSrcBlend; | 75 blendInfo->fSrcBlend = fSrcBlend; |
| 78 blendInfo->fDstBlend = fDstBlend; | 76 blendInfo->fDstBlend = fDstBlend; |
| 79 blendInfo->fBlendConstant = fBlendConstant; | 77 blendInfo->fBlendConstant = fBlendConstant; |
| 80 } | 78 } |
| 81 | 79 |
| 82 private: | 80 private: |
| 83 GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrCo
lor constant); | 81 GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrCo
lor constant); |
| 84 | 82 |
| 85 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { | 83 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { |
| 86 const GrPorterDuffXferProcessor& xp = xpBase.cast<GrPorterDuffXferProces
sor>(); | 84 const GrPorterDuffXferProcessor& xp = xpBase.cast<GrPorterDuffXferProces
sor>(); |
| 87 if (fSrcBlend != xp.fSrcBlend || | 85 if (fSrcBlend != xp.fSrcBlend || |
| 88 fDstBlend != xp.fDstBlend || | 86 fDstBlend != xp.fDstBlend || |
| 89 fBlendConstant != xp.fBlendConstant || | 87 fBlendConstant != xp.fBlendConstant || |
| 90 fPrimaryOutputType != xp.fPrimaryOutputType || | 88 fPrimaryOutputType != xp.fPrimaryOutputType || |
| 91 fSecondaryOutputType != xp.fSecondaryOutputType) { | 89 fSecondaryOutputType != xp.fSecondaryOutputType) { |
| 92 return false; | 90 return false; |
| 93 } | 91 } |
| 94 return true; | 92 return true; |
| 95 } | 93 } |
| 96 | 94 |
| 97 GrXferProcessor::OptFlags internalGetOptimizations(const GrProcOptInfo& colo
rPOI, | 95 GrXferProcessor::OptFlags internalGetOptimizations(const GrProcOptInfo& colo
rPOI, |
| 98 const GrProcOptInfo& cove
ragePOI, | 96 const GrProcOptInfo& cove
ragePOI, |
| 99 bool colorWriteDisabled, | |
| 100 bool doesStencilWrite); | 97 bool doesStencilWrite); |
| 101 | 98 |
| 102 void calcOutputTypes(GrXferProcessor::OptFlags blendOpts, const GrDrawTarget
Caps& caps, | 99 void calcOutputTypes(GrXferProcessor::OptFlags blendOpts, const GrDrawTarget
Caps& caps, |
| 103 bool hasSolidCoverage, bool readDst); | 100 bool hasSolidCoverage, bool readDst); |
| 104 | 101 |
| 105 GrBlendCoeff fSrcBlend; | 102 GrBlendCoeff fSrcBlend; |
| 106 GrBlendCoeff fDstBlend; | 103 GrBlendCoeff fDstBlend; |
| 107 GrColor fBlendConstant; | 104 GrColor fBlendConstant; |
| 108 PrimaryOutputType fPrimaryOutputType; | 105 PrimaryOutputType fPrimaryOutputType; |
| 109 SecondaryOutputType fSecondaryOutputType; | 106 SecondaryOutputType fSecondaryOutputType; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 123 | 120 |
| 124 static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { | 121 static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { |
| 125 return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); | 122 return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); |
| 126 } | 123 } |
| 127 | 124 |
| 128 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 125 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, |
| 129 const GrProcOptInfo& coveragePOI) const
SK_OVERRIDE; | 126 const GrProcOptInfo& coveragePOI) const
SK_OVERRIDE; |
| 130 | 127 |
| 131 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
SK_OVERRIDE; | 128 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
SK_OVERRIDE; |
| 132 | 129 |
| 133 bool canApplyCoverage(const GrProcOptInfo& colorPOI, const GrProcOptInfo& co
veragePOI, | 130 bool canApplyCoverage(const GrProcOptInfo& colorPOI, |
| 134 bool colorWriteDisabled) const SK_OVERRIDE; | 131 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; |
| 135 | 132 |
| 136 bool canTweakAlphaForCoverage() const SK_OVERRIDE; | 133 bool canTweakAlphaForCoverage() const SK_OVERRIDE; |
| 137 | 134 |
| 138 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo&
coveragePOI, | 135 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo&
coveragePOI, |
| 139 bool colorWriteDisabled, | |
| 140 GrXPFactory::InvariantOutput*) const SK_OVERRIDE; | 136 GrXPFactory::InvariantOutput*) const SK_OVERRIDE; |
| 141 | 137 |
| 138 bool willReadDst(const GrProcOptInfo& colorPOI, |
| 139 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; |
| 140 |
| 142 private: | 141 private: |
| 143 GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst); | 142 GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst); |
| 144 | 143 |
| 145 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { | 144 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { |
| 146 const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
; | 145 const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
; |
| 147 return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff); | 146 return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff); |
| 148 } | 147 } |
| 149 | 148 |
| 150 GR_DECLARE_XP_FACTORY_TEST; | 149 GR_DECLARE_XP_FACTORY_TEST; |
| 151 | 150 |
| 152 GrBlendCoeff fSrcCoeff; | 151 GrBlendCoeff fSrcCoeff; |
| 153 GrBlendCoeff fDstCoeff; | 152 GrBlendCoeff fDstCoeff; |
| 154 | 153 |
| 155 typedef GrXPFactory INHERITED; | 154 typedef GrXPFactory INHERITED; |
| 156 }; | 155 }; |
| 157 | 156 |
| 158 #endif | 157 #endif |
| OLD | NEW |