OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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/GrCustomXfermode.h" | 8 #include "effects/GrCustomXfermode.h" |
9 #include "effects/GrCustomXfermodePriv.h" | 9 #include "effects/GrCustomXfermodePriv.h" |
10 | 10 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 GR_STATIC_ASSERT(kDifference_GrBlendEquation == SkXfermode::kDifference_Mode
+ kOffset); | 44 GR_STATIC_ASSERT(kDifference_GrBlendEquation == SkXfermode::kDifference_Mode
+ kOffset); |
45 GR_STATIC_ASSERT(kExclusion_GrBlendEquation == SkXfermode::kExclusion_Mode +
kOffset); | 45 GR_STATIC_ASSERT(kExclusion_GrBlendEquation == SkXfermode::kExclusion_Mode +
kOffset); |
46 GR_STATIC_ASSERT(kMultiply_GrBlendEquation == SkXfermode::kMultiply_Mode + k
Offset); | 46 GR_STATIC_ASSERT(kMultiply_GrBlendEquation == SkXfermode::kMultiply_Mode + k
Offset); |
47 GR_STATIC_ASSERT(kHSLHue_GrBlendEquation == SkXfermode::kHue_Mode + kOffset)
; | 47 GR_STATIC_ASSERT(kHSLHue_GrBlendEquation == SkXfermode::kHue_Mode + kOffset)
; |
48 GR_STATIC_ASSERT(kHSLSaturation_GrBlendEquation == SkXfermode::kSaturation_M
ode + kOffset); | 48 GR_STATIC_ASSERT(kHSLSaturation_GrBlendEquation == SkXfermode::kSaturation_M
ode + kOffset); |
49 GR_STATIC_ASSERT(kHSLColor_GrBlendEquation == SkXfermode::kColor_Mode + kOff
set); | 49 GR_STATIC_ASSERT(kHSLColor_GrBlendEquation == SkXfermode::kColor_Mode + kOff
set); |
50 GR_STATIC_ASSERT(kHSLLuminosity_GrBlendEquation == SkXfermode::kLuminosity_M
ode + kOffset); | 50 GR_STATIC_ASSERT(kHSLLuminosity_GrBlendEquation == SkXfermode::kLuminosity_M
ode + kOffset); |
51 GR_STATIC_ASSERT(kGrBlendEquationCnt == SkXfermode::kLastMode + 1 + kOffset)
; | 51 GR_STATIC_ASSERT(kGrBlendEquationCnt == SkXfermode::kLastMode + 1 + kOffset)
; |
52 } | 52 } |
53 | 53 |
54 static bool can_use_hw_blend_equation(const GrProcOptInfo& coveragePOI, const Gr
Caps& caps) { | 54 static bool can_use_hw_blend_equation(GrBlendEquation equation, |
| 55 const GrProcOptInfo& coveragePOI, |
| 56 const GrCaps& caps) { |
55 if (!caps.advancedBlendEquationSupport()) { | 57 if (!caps.advancedBlendEquationSupport()) { |
56 return false; | 58 return false; |
57 } | 59 } |
58 if (coveragePOI.isFourChannelOutput()) { | 60 if (coveragePOI.isFourChannelOutput()) { |
59 return false; // LCD coverage must be applied after the blend equation. | 61 return false; // LCD coverage must be applied after the blend equation. |
60 } | 62 } |
| 63 if (caps.canUseAdvancedBlendEquation(equation)) { |
| 64 return false; |
| 65 } |
61 return true; | 66 return true; |
62 } | 67 } |
63 | 68 |
64 static void hard_light(GrGLFragmentBuilder* fsBuilder, | 69 static void hard_light(GrGLFragmentBuilder* fsBuilder, |
65 const char* final, | 70 const char* final, |
66 const char* src, | 71 const char* src, |
67 const char* dst) { | 72 const char* dst) { |
68 static const char kComponents[] = {'r', 'g', 'b'}; | 73 static const char kComponents[] = {'r', 'g', 'b'}; |
69 for (size_t i = 0; i < SK_ARRAY_COUNT(kComponents); ++i) { | 74 for (size_t i = 0; i < SK_ARRAY_COUNT(kComponents); ++i) { |
70 char component = kComponents[i]; | 75 char component = kComponents[i]; |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 SkASSERT(GrCustomXfermode::IsSupportedMode(fMode)); | 786 SkASSERT(GrCustomXfermode::IsSupportedMode(fMode)); |
782 this->initClassID<GrCustomXPFactory>(); | 787 this->initClassID<GrCustomXPFactory>(); |
783 } | 788 } |
784 | 789 |
785 GrXferProcessor* | 790 GrXferProcessor* |
786 GrCustomXPFactory::onCreateXferProcessor(const GrCaps& caps, | 791 GrCustomXPFactory::onCreateXferProcessor(const GrCaps& caps, |
787 const GrProcOptInfo& colorPOI, | 792 const GrProcOptInfo& colorPOI, |
788 const GrProcOptInfo& coveragePOI, | 793 const GrProcOptInfo& coveragePOI, |
789 bool hasMixedSamples, | 794 bool hasMixedSamples, |
790 const DstTexture* dstTexture) const { | 795 const DstTexture* dstTexture) const { |
791 if (can_use_hw_blend_equation(coveragePOI, caps)) { | 796 if (can_use_hw_blend_equation(fHWBlendEquation, coveragePOI, caps)) { |
792 SkASSERT(!dstTexture || !dstTexture->texture()); | 797 SkASSERT(!dstTexture || !dstTexture->texture()); |
793 return SkNEW_ARGS(CustomXP, (fMode, fHWBlendEquation)); | 798 return SkNEW_ARGS(CustomXP, (fMode, fHWBlendEquation)); |
794 } | 799 } |
795 return SkNEW_ARGS(CustomXP, (dstTexture, hasMixedSamples, fMode)); | 800 return SkNEW_ARGS(CustomXP, (dstTexture, hasMixedSamples, fMode)); |
796 } | 801 } |
797 | 802 |
798 bool GrCustomXPFactory::willReadDstColor(const GrCaps& caps, | 803 bool GrCustomXPFactory::willReadDstColor(const GrCaps& caps, |
799 const GrProcOptInfo& colorPOI, | 804 const GrProcOptInfo& colorPOI, |
800 const GrProcOptInfo& coveragePOI, | 805 const GrProcOptInfo& coveragePOI, |
801 bool hasMixedSamples) const { | 806 bool hasMixedSamples) const { |
802 return !can_use_hw_blend_equation(coveragePOI, caps); | 807 return !can_use_hw_blend_equation(fHWBlendEquation, coveragePOI, caps); |
803 } | 808 } |
804 | 809 |
805 void GrCustomXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorPOI, | 810 void GrCustomXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorPOI, |
806 InvariantBlendedColor* blendedC
olor) const { | 811 InvariantBlendedColor* blendedC
olor) const { |
807 blendedColor->fWillBlendWithDst = true; | 812 blendedColor->fWillBlendWithDst = true; |
808 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; | 813 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags; |
809 } | 814 } |
810 | 815 |
811 GR_DEFINE_XP_FACTORY_TEST(GrCustomXPFactory); | 816 GR_DEFINE_XP_FACTORY_TEST(GrCustomXPFactory); |
812 GrXPFactory* GrCustomXPFactory::TestCreate(SkRandom* rand, | 817 GrXPFactory* GrCustomXPFactory::TestCreate(SkRandom* rand, |
813 GrContext*, | 818 GrContext*, |
814 const GrCaps&, | 819 const GrCaps&, |
815 GrTexture*[]) { | 820 GrTexture*[]) { |
816 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas
tSeparableMode); | 821 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas
tSeparableMode); |
817 | 822 |
818 return SkNEW_ARGS(GrCustomXPFactory, (static_cast<SkXfermode::Mode>(mode))); | 823 return SkNEW_ARGS(GrCustomXPFactory, (static_cast<SkXfermode::Mode>(mode))); |
819 } | 824 } |
820 | 825 |
OLD | NEW |