| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 "SkGradientShaderPriv.h" | 8 #include "SkGradientShaderPriv.h" |
| 9 #include "SkLinearGradient.h" | 9 #include "SkLinearGradient.h" |
| 10 #include "SkRadialGradient.h" | 10 #include "SkRadialGradient.h" |
| (...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 818 /////////////////////////////////////////////////////////////////////////////// | 818 /////////////////////////////////////////////////////////////////////////////// |
| 819 | 819 |
| 820 #if SK_SUPPORT_GPU | 820 #if SK_SUPPORT_GPU |
| 821 | 821 |
| 822 #include "effects/GrTextureStripAtlas.h" | 822 #include "effects/GrTextureStripAtlas.h" |
| 823 #include "GrTBackendEffectFactory.h" | 823 #include "GrTBackendEffectFactory.h" |
| 824 #include "SkGr.h" | 824 #include "SkGr.h" |
| 825 | 825 |
| 826 GrGLGradientEffect::GrGLGradientEffect(const GrBackendEffectFactory& factory) | 826 GrGLGradientEffect::GrGLGradientEffect(const GrBackendEffectFactory& factory) |
| 827 : INHERITED(factory) | 827 : INHERITED(factory) |
| 828 , fCachedYCoord(SK_ScalarMax) | 828 , fCachedYCoord(SK_ScalarMax) { |
| 829 , fEffectMatrix(kCoordsType) { | |
| 830 } | 829 } |
| 831 | 830 |
| 832 GrGLGradientEffect::~GrGLGradientEffect() { } | 831 GrGLGradientEffect::~GrGLGradientEffect() { } |
| 833 | 832 |
| 834 void GrGLGradientEffect::emitUniforms(GrGLShaderBuilder* builder, EffectKey key)
{ | 833 void GrGLGradientEffect::emitUniforms(GrGLShaderBuilder* builder, EffectKey key)
{ |
| 835 | 834 |
| 836 if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)) { // 2 Color
case | 835 if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)) { // 2 Color
case |
| 837 fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, | 836 fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, |
| 838 kVec4f_GrSLType, "GradientStartColo
r"); | 837 kVec4f_GrSLType, "GradientStartColo
r"); |
| 839 fColorEndUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, | 838 fColorEndUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 } | 875 } |
| 877 | 876 |
| 878 void GrGLGradientEffect::setData(const GrGLUniformManager& uman, | 877 void GrGLGradientEffect::setData(const GrGLUniformManager& uman, |
| 879 const GrDrawEffect& drawEffect) { | 878 const GrDrawEffect& drawEffect) { |
| 880 | 879 |
| 881 const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>(); | 880 const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>(); |
| 882 | 881 |
| 883 | 882 |
| 884 if (GrGradientEffect::kTwo_ColorType == e.getColorType()){ | 883 if (GrGradientEffect::kTwo_ColorType == e.getColorType()){ |
| 885 | 884 |
| 886 fEffectMatrix.setData(uman, e.getMatrix(), drawEffect, NULL); | |
| 887 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { | 885 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { |
| 888 set_mul_color_uni(uman, fColorStartUni, e.getColors(0)); | 886 set_mul_color_uni(uman, fColorStartUni, e.getColors(0)); |
| 889 set_mul_color_uni(uman, fColorEndUni, e.getColors(1)); | 887 set_mul_color_uni(uman, fColorEndUni, e.getColors(1)); |
| 890 } else { | 888 } else { |
| 891 set_color_uni(uman, fColorStartUni, e.getColors(0)); | 889 set_color_uni(uman, fColorStartUni, e.getColors(0)); |
| 892 set_color_uni(uman, fColorEndUni, e.getColors(1)); | 890 set_color_uni(uman, fColorEndUni, e.getColors(1)); |
| 893 } | 891 } |
| 894 | 892 |
| 895 } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){ | 893 } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){ |
| 896 | 894 |
| 897 fEffectMatrix.setData(uman, e.getMatrix(), drawEffect, NULL); | |
| 898 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { | 895 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { |
| 899 set_mul_color_uni(uman, fColorStartUni, e.getColors(0)); | 896 set_mul_color_uni(uman, fColorStartUni, e.getColors(0)); |
| 900 set_mul_color_uni(uman, fColorMidUni, e.getColors(1)); | 897 set_mul_color_uni(uman, fColorMidUni, e.getColors(1)); |
| 901 set_mul_color_uni(uman, fColorEndUni, e.getColors(2)); | 898 set_mul_color_uni(uman, fColorEndUni, e.getColors(2)); |
| 902 } else { | 899 } else { |
| 903 set_color_uni(uman, fColorStartUni, e.getColors(0)); | 900 set_color_uni(uman, fColorStartUni, e.getColors(0)); |
| 904 set_color_uni(uman, fColorMidUni, e.getColors(1)); | 901 set_color_uni(uman, fColorMidUni, e.getColors(1)); |
| 905 set_color_uni(uman, fColorEndUni, e.getColors(2)); | 902 set_color_uni(uman, fColorEndUni, e.getColors(2)); |
| 906 } | 903 } |
| 907 } else { | 904 } else { |
| 908 const GrTexture* texture = e.texture(0); | |
| 909 fEffectMatrix.setData(uman, e.getMatrix(), drawEffect, texture); | |
| 910 | 905 |
| 911 SkScalar yCoord = e.getYCoord(); | 906 SkScalar yCoord = e.getYCoord(); |
| 912 if (yCoord != fCachedYCoord) { | 907 if (yCoord != fCachedYCoord) { |
| 913 uman.set1f(fFSYUni, yCoord); | 908 uman.set1f(fFSYUni, yCoord); |
| 914 fCachedYCoord = yCoord; | 909 fCachedYCoord = yCoord; |
| 915 } | 910 } |
| 916 } | 911 } |
| 917 } | 912 } |
| 918 | 913 |
| 919 | 914 |
| 920 GrGLEffect::EffectKey GrGLGradientEffect::GenBaseGradientKey(const GrDrawEffect&
drawEffect) { | 915 GrGLEffect::EffectKey GrGLGradientEffect::GenBaseGradientKey(const GrDrawEffect&
drawEffect) { |
| 921 const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>(); | 916 const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>(); |
| 922 const GrTexture* texture = NULL; | |
| 923 | 917 |
| 924 if (GrGradientEffect::kTexture_ColorType == e.getColorType()){ | 918 EffectKey key = 0; |
| 925 texture = e.texture(0); | |
| 926 } | |
| 927 | |
| 928 EffectKey key = GrGLEffectMatrix::GenKey(e.getMatrix(), drawEffect, kCoordsT
ype, texture); | |
| 929 | 919 |
| 930 if (GrGradientEffect::kTwo_ColorType == e.getColorType()) { | 920 if (GrGradientEffect::kTwo_ColorType == e.getColorType()) { |
| 931 key |= kTwoColorKey; | 921 key |= kTwoColorKey; |
| 932 } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){ | 922 } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){ |
| 933 key |= kThreeColorKey; | 923 key |= kThreeColorKey; |
| 934 } | 924 } |
| 935 | 925 |
| 936 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { | 926 if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) { |
| 937 key |= kPremulBeforeInterpKey; | 927 key |= kPremulBeforeInterpKey; |
| 938 } | 928 } |
| 939 | 929 |
| 940 return key; | 930 return key; |
| 941 } | 931 } |
| 942 | 932 |
| 943 void GrGLGradientEffect::setupMatrix(GrGLShaderBuilder* builder, | |
| 944 EffectKey key, | |
| 945 SkString* fsCoordName, | |
| 946 SkString* vsVaryingName, | |
| 947 GrSLType* vsVaryingType) { | |
| 948 fEffectMatrix.emitCodeMakeFSCoords2D(builder, | |
| 949 key & kMatrixKeyMask, | |
| 950 fsCoordName, | |
| 951 vsVaryingName, | |
| 952 vsVaryingType); | |
| 953 } | |
| 954 | |
| 955 void GrGLGradientEffect::emitColor(GrGLShaderBuilder* builder, | 933 void GrGLGradientEffect::emitColor(GrGLShaderBuilder* builder, |
| 956 const char* gradientTValue, | 934 const char* gradientTValue, |
| 957 EffectKey key, | 935 EffectKey key, |
| 958 const char* outputColor, | 936 const char* outputColor, |
| 959 const char* inputColor, | 937 const char* inputColor, |
| 960 const GrGLShaderBuilder::TextureSamplerArray&
samplers) { | 938 const GrGLShaderBuilder::TextureSamplerArray&
samplers) { |
| 961 if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)){ | 939 if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)){ |
| 962 builder->fsCodeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.
0));\n", | 940 builder->fsCodeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.
0));\n", |
| 963 builder->getUniformVariable(fColorStartUni).c_str
(), | 941 builder->getUniformVariable(fColorStartUni).c_str
(), |
| 964 builder->getUniformVariable(fColorEndUni).c_str()
, | 942 builder->getUniformVariable(fColorEndUni).c_str()
, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 } | 994 } |
| 1017 } | 995 } |
| 1018 | 996 |
| 1019 ///////////////////////////////////////////////////////////////////// | 997 ///////////////////////////////////////////////////////////////////// |
| 1020 | 998 |
| 1021 GrGradientEffect::GrGradientEffect(GrContext* ctx, | 999 GrGradientEffect::GrGradientEffect(GrContext* ctx, |
| 1022 const SkGradientShaderBase& shader, | 1000 const SkGradientShaderBase& shader, |
| 1023 const SkMatrix& matrix, | 1001 const SkMatrix& matrix, |
| 1024 SkShader::TileMode tileMode) { | 1002 SkShader::TileMode tileMode) { |
| 1025 | 1003 |
| 1026 | |
| 1027 fMatrix = matrix; | |
| 1028 fIsOpaque = shader.isOpaque(); | 1004 fIsOpaque = shader.isOpaque(); |
| 1029 | 1005 |
| 1030 SkShader::GradientInfo info; | 1006 SkShader::GradientInfo info; |
| 1031 SkScalar pos[3] = {0}; | 1007 SkScalar pos[3] = {0}; |
| 1032 | 1008 |
| 1033 info.fColorCount = 3; | 1009 info.fColorCount = 3; |
| 1034 info.fColors = &fColors[0]; | 1010 info.fColors = &fColors[0]; |
| 1035 info.fColorOffsets = &pos[0]; | 1011 info.fColorOffsets = &pos[0]; |
| 1036 shader.asAGradient(&info); | 1012 shader.asAGradient(&info); |
| 1037 | 1013 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1048 fColorType = kThree_ColorType; | 1024 fColorType = kThree_ColorType; |
| 1049 foundSpecialCase = true; | 1025 foundSpecialCase = true; |
| 1050 } | 1026 } |
| 1051 } | 1027 } |
| 1052 if (foundSpecialCase) { | 1028 if (foundSpecialCase) { |
| 1053 if (SkGradientShader::kInterpolateColorsInPremul_Flag & info.fGradientFl
ags) { | 1029 if (SkGradientShader::kInterpolateColorsInPremul_Flag & info.fGradientFl
ags) { |
| 1054 fPremulType = kBeforeInterp_PremulType; | 1030 fPremulType = kBeforeInterp_PremulType; |
| 1055 } else { | 1031 } else { |
| 1056 fPremulType = kAfterInterp_PremulType; | 1032 fPremulType = kAfterInterp_PremulType; |
| 1057 } | 1033 } |
| 1034 fCoordTransform.reset(kCoordSet, matrix); |
| 1058 } else { | 1035 } else { |
| 1059 // doesn't matter how this is set, just be consistent because it is part
of the effect key. | 1036 // doesn't matter how this is set, just be consistent because it is part
of the effect key. |
| 1060 fPremulType = kBeforeInterp_PremulType; | 1037 fPremulType = kBeforeInterp_PremulType; |
| 1061 SkBitmap bitmap; | 1038 SkBitmap bitmap; |
| 1062 shader.getGradientTableBitmap(&bitmap); | 1039 shader.getGradientTableBitmap(&bitmap); |
| 1063 fColorType = kTexture_ColorType; | 1040 fColorType = kTexture_ColorType; |
| 1064 | 1041 |
| 1065 GrTextureStripAtlas::Desc desc; | 1042 GrTextureStripAtlas::Desc desc; |
| 1066 desc.fWidth = bitmap.width(); | 1043 desc.fWidth = bitmap.width(); |
| 1067 desc.fHeight = 32; | 1044 desc.fHeight = 32; |
| 1068 desc.fRowHeight = bitmap.height(); | 1045 desc.fRowHeight = bitmap.height(); |
| 1069 desc.fContext = ctx; | 1046 desc.fContext = ctx; |
| 1070 desc.fConfig = SkBitmapConfig2GrPixelConfig(bitmap.config()); | 1047 desc.fConfig = SkBitmapConfig2GrPixelConfig(bitmap.config()); |
| 1071 fAtlas = GrTextureStripAtlas::GetAtlas(desc); | 1048 fAtlas = GrTextureStripAtlas::GetAtlas(desc); |
| 1072 SkASSERT(NULL != fAtlas); | 1049 SkASSERT(NULL != fAtlas); |
| 1073 | 1050 |
| 1074 // We always filter the gradient table. Each table is one row of a textu
re, always y-clamp. | 1051 // We always filter the gradient table. Each table is one row of a textu
re, always y-clamp. |
| 1075 GrTextureParams params; | 1052 GrTextureParams params; |
| 1076 params.setFilterMode(GrTextureParams::kBilerp_FilterMode); | 1053 params.setFilterMode(GrTextureParams::kBilerp_FilterMode); |
| 1077 params.setTileModeX(tileMode); | 1054 params.setTileModeX(tileMode); |
| 1078 | 1055 |
| 1079 fRow = fAtlas->lockRow(bitmap); | 1056 fRow = fAtlas->lockRow(bitmap); |
| 1080 if (-1 != fRow) { | 1057 if (-1 != fRow) { |
| 1081 fYCoord = fAtlas->getYOffset(fRow) + SK_ScalarHalf * | 1058 fYCoord = fAtlas->getYOffset(fRow) + SK_ScalarHalf * |
| 1082 fAtlas->getVerticalScaleFactor(); | 1059 fAtlas->getVerticalScaleFactor(); |
| 1060 fCoordTransform.reset(kCoordSet, matrix, fAtlas->getTexture()); |
| 1083 fTextureAccess.reset(fAtlas->getTexture(), params); | 1061 fTextureAccess.reset(fAtlas->getTexture(), params); |
| 1084 } else { | 1062 } else { |
| 1085 GrTexture* texture = GrLockAndRefCachedBitmapTexture(ctx, bitmap, &p
arams); | 1063 GrTexture* texture = GrLockAndRefCachedBitmapTexture(ctx, bitmap, &p
arams); |
| 1064 fCoordTransform.reset(kCoordSet, matrix, texture); |
| 1086 fTextureAccess.reset(texture, params); | 1065 fTextureAccess.reset(texture, params); |
| 1087 fYCoord = SK_ScalarHalf; | 1066 fYCoord = SK_ScalarHalf; |
| 1088 | 1067 |
| 1089 // Unlock immediately, this is not great, but we don't have a way of | 1068 // Unlock immediately, this is not great, but we don't have a way of |
| 1090 // knowing when else to unlock it currently, so it may get purged fr
om | 1069 // knowing when else to unlock it currently, so it may get purged fr
om |
| 1091 // the cache, but it'll still be ref'd until it's no longer being us
ed. | 1070 // the cache, but it'll still be ref'd until it's no longer being us
ed. |
| 1092 GrUnlockAndUnrefCachedBitmapTexture(texture); | 1071 GrUnlockAndUnrefCachedBitmapTexture(texture); |
| 1093 } | 1072 } |
| 1094 this->addTextureAccess(&fTextureAccess); | 1073 this->addTextureAccess(&fTextureAccess); |
| 1095 } | 1074 } |
| 1075 this->addCoordTransform(&fCoordTransform); |
| 1096 } | 1076 } |
| 1097 | 1077 |
| 1098 GrGradientEffect::~GrGradientEffect() { | 1078 GrGradientEffect::~GrGradientEffect() { |
| 1099 if (this->useAtlas()) { | 1079 if (this->useAtlas()) { |
| 1100 fAtlas->unlockRow(fRow); | 1080 fAtlas->unlockRow(fRow); |
| 1101 } | 1081 } |
| 1102 } | 1082 } |
| 1103 | 1083 |
| 1104 bool GrGradientEffect::onIsEqual(const GrEffect& effect) const { | 1084 bool GrGradientEffect::onIsEqual(const GrEffect& effect) const { |
| 1105 const GrGradientEffect& s = CastEffect<GrGradientEffect>(effect); | 1085 const GrGradientEffect& s = CastEffect<GrGradientEffect>(effect); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1117 *this->getColors(2) != *s.getColors(2)) { | 1097 *this->getColors(2) != *s.getColors(2)) { |
| 1118 return false; | 1098 return false; |
| 1119 } | 1099 } |
| 1120 } | 1100 } |
| 1121 | 1101 |
| 1122 return fTextureAccess.getTexture() == s.fTextureAccess.getTexture() && | 1102 return fTextureAccess.getTexture() == s.fTextureAccess.getTexture() && |
| 1123 fTextureAccess.getParams().getTileModeX() == | 1103 fTextureAccess.getParams().getTileModeX() == |
| 1124 s.fTextureAccess.getParams().getTileModeX() && | 1104 s.fTextureAccess.getParams().getTileModeX() && |
| 1125 this->useAtlas() == s.useAtlas() && | 1105 this->useAtlas() == s.useAtlas() && |
| 1126 fYCoord == s.getYCoord() && | 1106 fYCoord == s.getYCoord() && |
| 1127 fMatrix.cheapEqualTo(s.getMatrix()); | 1107 fCoordTransform.getMatrix().cheapEqualTo(s.fCoordTransform.getMatrix
()); |
| 1128 } | 1108 } |
| 1129 | 1109 |
| 1130 return false; | 1110 return false; |
| 1131 } | 1111 } |
| 1132 | 1112 |
| 1133 void GrGradientEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { | 1113 void GrGradientEffect::getConstantColorComponents(GrColor* color, uint32_t* vali
dFlags) const { |
| 1134 if (fIsOpaque && (kA_GrColorComponentFlag & *validFlags) && 0xff == GrColorU
npackA(*color)) { | 1114 if (fIsOpaque && (kA_GrColorComponentFlag & *validFlags) && 0xff == GrColorU
npackA(*color)) { |
| 1135 *validFlags = kA_GrColorComponentFlag; | 1115 *validFlags = kA_GrColorComponentFlag; |
| 1136 } else { | 1116 } else { |
| 1137 *validFlags = 0; | 1117 *validFlags = 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1156 (*stops)[i] = stop; | 1136 (*stops)[i] = stop; |
| 1157 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; | 1137 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; |
| 1158 } | 1138 } |
| 1159 } | 1139 } |
| 1160 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); | 1140 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); |
| 1161 | 1141 |
| 1162 return outColors; | 1142 return outColors; |
| 1163 } | 1143 } |
| 1164 | 1144 |
| 1165 #endif | 1145 #endif |
| OLD | NEW |