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 #include "effects/GrPorterDuffXferProcessor.h" | 8 #include "effects/GrPorterDuffXferProcessor.h" |
9 | 9 |
10 #include "GrBlend.h" | 10 #include "GrBlend.h" |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 } | 843 } |
844 BlendFormula blendFormula = static_cast<const PorterDuffXferProcessor*>(xp)-
>getBlendFormula(); | 844 BlendFormula blendFormula = static_cast<const PorterDuffXferProcessor*>(xp)-
>getBlendFormula(); |
845 *outPrimary = blendFormula.fPrimaryOutputType; | 845 *outPrimary = blendFormula.fPrimaryOutputType; |
846 *outSecondary = blendFormula.fSecondaryOutputType; | 846 *outSecondary = blendFormula.fSecondaryOutputType; |
847 } | 847 } |
848 | 848 |
849 | 849 |
850 ////////////////////////////////////////////////////////////////////////////////
//////////////// | 850 ////////////////////////////////////////////////////////////////////////////////
//////////////// |
851 // SrcOver Global functions | 851 // SrcOver Global functions |
852 ////////////////////////////////////////////////////////////////////////////////
//////////////// | 852 ////////////////////////////////////////////////////////////////////////////////
//////////////// |
| 853 const GrXferProcessor& GrPorterDuffXPFactory::SimpleSrcOverXP() { |
| 854 static BlendFormula gSrcOverBlendFormula = COEFF_FORMULA(kOne_GrBlendCoeff, |
| 855 kISA_GrBlendCoeff); |
| 856 static PorterDuffXferProcessor gSrcOverXP(gSrcOverBlendFormula); |
| 857 return gSrcOverXP; |
| 858 } |
853 | 859 |
854 GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( | 860 GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor( |
855 const GrCaps& caps, | 861 const GrCaps& caps, |
856 const GrPipelineOptimizations& optimizations, | 862 const GrPipelineOptimizations& optimizations, |
857 bool hasMixedSamples, | 863 bool hasMixedSamples, |
858 const GrXferProcessor::DstTexture* dstTexture) { | 864 const GrXferProcessor::DstTexture* dstTexture) { |
859 if (!optimizations.fCoveragePOI.isFourChannelOutput() && | 865 if (!optimizations.fCoveragePOI.isFourChannelOutput() && |
860 !(optimizations.fCoveragePOI.isSolidWhite() && | 866 !(optimizations.fCoveragePOI.isSolidWhite() && |
861 !hasMixedSamples && | 867 !hasMixedSamples && |
862 optimizations.fColorPOI.isOpaque())) { | 868 optimizations.fColorPOI.isOpaque())) { |
863 static BlendFormula gSrcOverBlendFormula = COEFF_FORMULA(kOne_GrBlendCoe
ff, | 869 // We return nullptr here, which our caller interprets as meaning "use S
impleSrcOverXP". |
864 kISA_GrBlendCoe
ff); | 870 // We don't simply return the address of that XP here because our caller
would have to unref |
865 static PorterDuffXferProcessor gSrcOverXP(gSrcOverBlendFormula); | 871 // it and since it is a global object and GrProgramElement's ref-cnting
system is not thread |
866 SkASSERT(!dstTexture || !dstTexture->texture()); | 872 // safe. |
867 gSrcOverXP.ref(); | 873 return nullptr; |
868 return &gSrcOverXP; | |
869 } | 874 } |
870 | 875 |
871 BlendFormula blendFormula; | 876 BlendFormula blendFormula; |
872 if (optimizations.fCoveragePOI.isFourChannelOutput()) { | 877 if (optimizations.fCoveragePOI.isFourChannelOutput()) { |
873 if (kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags()
&& | 878 if (kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags()
&& |
874 !caps.shaderCaps()->dualSourceBlendingSupport() && | 879 !caps.shaderCaps()->dualSourceBlendingSupport() && |
875 !caps.shaderCaps()->dstReadInShaderSupport()) { | 880 !caps.shaderCaps()->dstReadInShaderSupport()) { |
876 // If we don't have dual source blending or in shader dst reads, we
fall | 881 // If we don't have dual source blending or in shader dst reads, we
fall |
877 // back to this trick for rendering SrcOver LCD text instead of doin
g a | 882 // back to this trick for rendering SrcOver LCD text instead of doin
g a |
878 // dst copy. | 883 // dst copy. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 } | 916 } |
912 return get_lcd_blend_formula(optimizations.fCoveragePOI, | 917 return get_lcd_blend_formula(optimizations.fCoveragePOI, |
913 SkXfermode::kSrcOver_Mode).hasSecondaryOutp
ut(); | 918 SkXfermode::kSrcOver_Mode).hasSecondaryOutp
ut(); |
914 } | 919 } |
915 // We fallback on the shader XP when the blend formula would use dual source
blending but we | 920 // We fallback on the shader XP when the blend formula would use dual source
blending but we |
916 // don't have support for it. | 921 // don't have support for it. |
917 return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI
, | 922 return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI
, |
918 hasMixedSamples, SkXfermode::kSrcOver_Mode).hasSeco
ndaryOutput(); | 923 hasMixedSamples, SkXfermode::kSrcOver_Mode).hasSeco
ndaryOutput(); |
919 } | 924 } |
920 | 925 |
OLD | NEW |