OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
673 /////////////////////////////////////////////////////////////////////////////// | 673 /////////////////////////////////////////////////////////////////////////////// |
674 | 674 |
675 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { | 675 bool SkXfermode::asCoeff(Coeff* src, Coeff* dst) const { |
676 return false; | 676 return false; |
677 } | 677 } |
678 | 678 |
679 bool SkXfermode::asMode(Mode* mode) const { | 679 bool SkXfermode::asMode(Mode* mode) const { |
680 return false; | 680 return false; |
681 } | 681 } |
682 | 682 |
683 bool SkXfermode::asNewEffect(GrContext*, GrEffectRef**, Coeff*, Coeff*) const { | 683 bool SkXfermode::asNewEffectOrCoeff(GrContext*, GrEffectRef**, Coeff* src, Coeff * dst) const { |
684 return false; | 684 return this->asCoeff(src, dst); |
685 } | 685 } |
686 | 686 |
687 bool SkXfermode::AsNewEffect(SkXfermode* xfermode, | 687 bool SkXfermode::AsNewEffectOrCoeff(SkXfermode* xfermode, |
688 GrContext* context, | 688 GrContext* context, |
689 GrEffectRef** effect, | 689 GrEffectRef** effect, |
690 Coeff* src, | 690 Coeff* src, |
691 Coeff* dst) { | 691 Coeff* dst) { |
692 if (NULL == xfermode) { | 692 if (NULL == xfermode) { |
693 return ModeAsCoeff(kSrcOver_Mode, src, dst); | 693 return ModeAsCoeff(kSrcOver_Mode, src, dst); |
694 } else { | 694 } else { |
695 return xfermode->asNewEffect(context, effect, src, dst); | 695 return xfermode->asNewEffectOrCoeff(context, effect, src, dst); |
696 } | 696 } |
697 } | 697 } |
698 | 698 |
699 SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) const{ | 699 SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) const{ |
700 // no-op. subclasses should override this | 700 // no-op. subclasses should override this |
701 return dst; | 701 return dst; |
702 } | 702 } |
703 | 703 |
704 void SkXfermode::xfer32(SkPMColor* SK_RESTRICT dst, | 704 void SkXfermode::xfer32(SkPMColor* SK_RESTRICT dst, |
705 const SkPMColor* SK_RESTRICT src, int count, | 705 const SkPMColor* SK_RESTRICT src, int count, |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
933 buffer.writeFunctionPtr((void*)fProc); | 933 buffer.writeFunctionPtr((void*)fProc); |
934 } | 934 } |
935 } | 935 } |
936 | 936 |
937 #ifdef SK_DEVELOPER | 937 #ifdef SK_DEVELOPER |
938 void SkProcXfermode::toString(SkString* str) const { | 938 void SkProcXfermode::toString(SkString* str) const { |
939 str->appendf("SkProcXfermode: %p", fProc); | 939 str->appendf("SkProcXfermode: %p", fProc); |
940 } | 940 } |
941 #endif | 941 #endif |
942 | 942 |
943 ////////////////////////////////////////////////////////////////////////////// | |
944 | |
945 #if SK_SUPPORT_GPU | |
946 | |
947 #include "GrEffect.h" | |
948 #include "GrEffectUnitTest.h" | |
949 #include "GrTBackendEffectFactory.h" | |
950 #include "gl/GrGLEffect.h" | |
951 | |
952 // TODO: Make this work for all non-Coeff SkXfermode::Mode values | |
robertphillips
2013/03/29 18:32:57
Comment as to behavior?
bsalomon
2013/03/29 18:59:38
Done.
| |
953 class DarkenEffect : public GrEffect { | |
954 public: | |
955 static GrEffectRef* Create() { | |
956 static AutoEffectUnref gEffect(SkNEW(DarkenEffect)); | |
957 return CreateEffectRef(gEffect); | |
958 } | |
959 | |
960 virtual void getConstantColorComponents(GrColor* color, | |
961 uint32_t* validFlags) const SK_OVERR IDE { | |
962 *validFlags = 0; | |
963 } | |
964 | |
965 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE { | |
966 return GrTBackendEffectFactory<DarkenEffect>::getInstance(); | |
967 } | |
968 | |
969 static const char* Name() { return "XfermodeDarken"; } | |
970 | |
971 class GLEffect : public GrGLEffect { | |
972 public: | |
973 GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) | |
974 : GrGLEffect(factory ) { | |
975 } | |
976 virtual void emitCode(GrGLShaderBuilder* builder, | |
977 const GrDrawEffect& drawEffect, | |
978 EffectKey key, | |
979 const char* outputColor, | |
980 const char* inputColor, | |
981 const TextureSamplerArray& samplers) SK_OVERRIDE { | |
982 const char* dstColorName = builder->dstColor(); | |
983 GrAssert(NULL != dstColorName); | |
984 builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.b) ;\n", | |
985 outputColor, dstColorName, inputColor); | |
robertphillips
2013/03/29 18:32:57
two overlength lines
bsalomon
2013/03/29 18:59:38
Done.
| |
986 builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s. rgb, (1.0 - %s.a) * %s.rgb + %s.rgb);\n", | |
987 outputColor, inputColor, dstColorName, inputC olor, dstColorName, inputColor, dstColorName); | |
988 } | |
989 | |
990 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { r eturn 0; } | |
991 | |
992 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_ OVERRIDE {} | |
993 }; | |
994 | |
995 GR_DECLARE_EFFECT_TEST; | |
996 | |
997 private: | |
998 DarkenEffect() { this->setWillReadDst(); } | |
999 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { return tru e; } | |
robertphillips
2013/03/29 18:32:57
INHERITED?
bsalomon
2013/03/29 18:59:38
Done.
| |
1000 }; | |
1001 | |
1002 GR_DEFINE_EFFECT_TEST(DarkenEffect); | |
1003 GrEffectRef* DarkenEffect::TestCreate(SkMWCRandom*, | |
1004 GrContext*, | |
1005 const GrDrawTargetCaps&, | |
1006 GrTexture*[]) { | |
1007 static AutoEffectUnref gEffect(SkNEW(DarkenEffect)); | |
1008 return CreateEffectRef(gEffect); | |
1009 } | |
1010 | |
1011 #endif | |
1012 | |
943 /////////////////////////////////////////////////////////////////////////////// | 1013 /////////////////////////////////////////////////////////////////////////////// |
944 /////////////////////////////////////////////////////////////////////////////// | 1014 /////////////////////////////////////////////////////////////////////////////// |
945 | 1015 |
946 class SkProcCoeffXfermode : public SkProcXfermode { | 1016 class SkProcCoeffXfermode : public SkProcXfermode { |
947 public: | 1017 public: |
948 SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) | 1018 SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) |
949 : INHERITED(rec.fProc) { | 1019 : INHERITED(rec.fProc) { |
950 fMode = mode; | 1020 fMode = mode; |
951 // these may be valid, or may be CANNOT_USE_COEFF | 1021 // these may be valid, or may be CANNOT_USE_COEFF |
952 fSrcCoeff = rec.fSC; | 1022 fSrcCoeff = rec.fSC; |
(...skipping 14 matching lines...) Expand all Loading... | |
967 | 1037 |
968 if (sc) { | 1038 if (sc) { |
969 *sc = fSrcCoeff; | 1039 *sc = fSrcCoeff; |
970 } | 1040 } |
971 if (dc) { | 1041 if (dc) { |
972 *dc = fDstCoeff; | 1042 *dc = fDstCoeff; |
973 } | 1043 } |
974 return true; | 1044 return true; |
975 } | 1045 } |
976 | 1046 |
977 virtual bool asNewEffect(GrContext*, GrEffectRef**, Coeff* src, Coeff* dst) const SK_OVERRIDE { | 1047 #if SK_SUPPORT_GPU |
978 return this->asCoeff(src, dst); | 1048 virtual bool asNewEffectOrCoeff(GrContext*, |
1049 GrEffectRef** effect, | |
1050 Coeff* src, | |
1051 Coeff* dst) const SK_OVERRIDE { | |
1052 if (this->asCoeff(src, dst)) { | |
1053 return true; | |
1054 } | |
1055 if (kDarken_Mode == fMode) { | |
1056 if (NULL != effect) { | |
1057 *effect = DarkenEffect::Create(); | |
1058 } | |
1059 return true; | |
1060 } | |
1061 return false; | |
979 } | 1062 } |
1063 #endif | |
980 | 1064 |
981 SK_DEVELOPER_TO_STRING() | 1065 SK_DEVELOPER_TO_STRING() |
982 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) | 1066 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) |
983 | 1067 |
984 protected: | 1068 protected: |
985 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { | 1069 SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
986 fMode = (SkXfermode::Mode)buffer.read32(); | 1070 fMode = (SkXfermode::Mode)buffer.read32(); |
987 | 1071 |
988 const ProcCoeff& rec = gProcCoeffs[fMode]; | 1072 const ProcCoeff& rec = gProcCoeffs[fMode]; |
989 // these may be valid, or may be CANNOT_USE_COEFF | 1073 // these may be valid, or may be CANNOT_USE_COEFF |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1510 return proc16; | 1594 return proc16; |
1511 } | 1595 } |
1512 | 1596 |
1513 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1597 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1514 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1598 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1515 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1599 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1516 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1600 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1517 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1601 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1518 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1602 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1519 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1603 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |