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 "GrDashingEffect.h" | 8 #include "GrDashingEffect.h" |
9 | 9 |
10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 class GLDashingCircleEffect : public GrGLSLGeometryProcessor { | 810 class GLDashingCircleEffect : public GrGLSLGeometryProcessor { |
811 public: | 811 public: |
812 GLDashingCircleEffect(); | 812 GLDashingCircleEffect(); |
813 | 813 |
814 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 814 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
815 | 815 |
816 static inline void GenKey(const GrGeometryProcessor&, | 816 static inline void GenKey(const GrGeometryProcessor&, |
817 const GrGLSLCaps&, | 817 const GrGLSLCaps&, |
818 GrProcessorKeyBuilder*); | 818 GrProcessorKeyBuilder*); |
819 | 819 |
820 void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&, | 820 void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) o
verride; |
821 FPCoordTransformIter&& transformIter) override; | 821 |
| 822 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 823 const GrGLSLProgramDataManager& pdman, |
| 824 int index, |
| 825 const SkTArray<const GrCoordTransform*, true>& transfo
rms) override { |
| 826 this->setTransformDataHelper(primProc.cast<DashingCircleEffect>().localM
atrix(), pdman, |
| 827 index, transforms); |
| 828 } |
| 829 |
822 private: | 830 private: |
823 UniformHandle fParamUniform; | 831 UniformHandle fParamUniform; |
824 UniformHandle fColorUniform; | 832 UniformHandle fColorUniform; |
825 GrColor fColor; | 833 GrColor fColor; |
826 SkScalar fPrevRadius; | 834 SkScalar fPrevRadius; |
827 SkScalar fPrevCenterX; | 835 SkScalar fPrevCenterX; |
828 SkScalar fPrevIntervalLength; | 836 SkScalar fPrevIntervalLength; |
829 typedef GrGLSLGeometryProcessor INHERITED; | 837 typedef GrGLSLGeometryProcessor INHERITED; |
830 }; | 838 }; |
831 | 839 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 // Setup position | 872 // Setup position |
865 this->setupPosition(vertBuilder, gpArgs, dce.inPosition()->fName); | 873 this->setupPosition(vertBuilder, gpArgs, dce.inPosition()->fName); |
866 | 874 |
867 // emit transforms | 875 // emit transforms |
868 this->emitTransforms(vertBuilder, | 876 this->emitTransforms(vertBuilder, |
869 varyingHandler, | 877 varyingHandler, |
870 uniformHandler, | 878 uniformHandler, |
871 gpArgs->fPositionVar, | 879 gpArgs->fPositionVar, |
872 dce.inPosition()->fName, | 880 dce.inPosition()->fName, |
873 dce.localMatrix(), | 881 dce.localMatrix(), |
874 args.fFPCoordTransformHandler); | 882 args.fTransformsIn, |
| 883 args.fTransformsOut); |
875 | 884 |
876 // transforms all points so that we can compare them to our test circle | 885 // transforms all points so that we can compare them to our test circle |
877 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", | 886 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", |
878 dashParams.fsIn(), dashParams.fsIn(), dashParams.fs
In(), | 887 dashParams.fsIn(), dashParams.fsIn(), dashParams.fs
In(), |
879 dashParams.fsIn()); | 888 dashParams.fsIn()); |
880 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dash
Params.fsIn()); | 889 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", dash
Params.fsIn()); |
881 fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn
()); | 890 fragBuilder->codeAppendf("vec2 center = vec2(%s.y, 0.0);", circleParams.fsIn
()); |
882 fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); | 891 fragBuilder->codeAppend("float dist = length(center - fragPosShifted);"); |
883 if (dce.aaMode() != AAMode::kNone) { | 892 if (dce.aaMode() != AAMode::kNone) { |
884 fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn(
)); | 893 fragBuilder->codeAppendf("float diff = dist - %s.x;", circleParams.fsIn(
)); |
885 fragBuilder->codeAppend("diff = 1.0 - diff;"); | 894 fragBuilder->codeAppend("diff = 1.0 - diff;"); |
886 fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); | 895 fragBuilder->codeAppend("float alpha = clamp(diff, 0.0, 1.0);"); |
887 } else { | 896 } else { |
888 fragBuilder->codeAppendf("float alpha = 1.0;"); | 897 fragBuilder->codeAppendf("float alpha = 1.0;"); |
889 fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", cir
cleParams.fsIn()); | 898 fragBuilder->codeAppendf("alpha *= dist < %s.x + 0.5 ? 1.0 : 0.0;", cir
cleParams.fsIn()); |
890 } | 899 } |
891 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 900 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
892 } | 901 } |
893 | 902 |
894 void GLDashingCircleEffect::setData(const GrGLSLProgramDataManager& pdman, | 903 void GLDashingCircleEffect::setData(const GrGLSLProgramDataManager& pdman, |
895 const GrPrimitiveProcessor& processor, | 904 const GrPrimitiveProcessor& processor) { |
896 FPCoordTransformIter&& transformIter) { | |
897 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); | 905 const DashingCircleEffect& dce = processor.cast<DashingCircleEffect>(); |
898 if (dce.color() != fColor) { | 906 if (dce.color() != fColor) { |
899 float c[4]; | 907 float c[4]; |
900 GrColorToRGBAFloat(dce.color(), c); | 908 GrColorToRGBAFloat(dce.color(), c); |
901 pdman.set4fv(fColorUniform, 1, c); | 909 pdman.set4fv(fColorUniform, 1, c); |
902 fColor = dce.color(); | 910 fColor = dce.color(); |
903 } | 911 } |
904 this->setTransformDataHelper(dce.localMatrix(), pdman, &transformIter); | |
905 } | 912 } |
906 | 913 |
907 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, | 914 void GLDashingCircleEffect::GenKey(const GrGeometryProcessor& gp, |
908 const GrGLSLCaps&, | 915 const GrGLSLCaps&, |
909 GrProcessorKeyBuilder* b) { | 916 GrProcessorKeyBuilder* b) { |
910 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); | 917 const DashingCircleEffect& dce = gp.cast<DashingCircleEffect>(); |
911 uint32_t key = 0; | 918 uint32_t key = 0; |
912 key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0
x0; | 919 key |= dce.usesLocalCoords() && dce.localMatrix().hasPerspective() ? 0x1 : 0
x0; |
913 key |= dce.colorIgnored() ? 0x2 : 0x0; | 920 key |= dce.colorIgnored() ? 0x2 : 0x0; |
914 key |= static_cast<uint32_t>(dce.aaMode()) << 8; | 921 key |= static_cast<uint32_t>(dce.aaMode()) << 8; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 class GLDashingLineEffect : public GrGLSLGeometryProcessor { | 1030 class GLDashingLineEffect : public GrGLSLGeometryProcessor { |
1024 public: | 1031 public: |
1025 GLDashingLineEffect(); | 1032 GLDashingLineEffect(); |
1026 | 1033 |
1027 void onEmitCode(EmitArgs&, GrGPArgs*) override; | 1034 void onEmitCode(EmitArgs&, GrGPArgs*) override; |
1028 | 1035 |
1029 static inline void GenKey(const GrGeometryProcessor&, | 1036 static inline void GenKey(const GrGeometryProcessor&, |
1030 const GrGLSLCaps&, | 1037 const GrGLSLCaps&, |
1031 GrProcessorKeyBuilder*); | 1038 GrProcessorKeyBuilder*); |
1032 | 1039 |
1033 void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&, | 1040 void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) o
verride; |
1034 FPCoordTransformIter&& iter) override; | 1041 |
| 1042 void setTransformData(const GrPrimitiveProcessor& primProc, |
| 1043 const GrGLSLProgramDataManager& pdman, |
| 1044 int index, |
| 1045 const SkTArray<const GrCoordTransform*, true>& transfo
rms) override { |
| 1046 this->setTransformDataHelper(primProc.cast<DashingLineEffect>().localMat
rix(), pdman, index, |
| 1047 transforms); |
| 1048 } |
1035 | 1049 |
1036 private: | 1050 private: |
1037 GrColor fColor; | 1051 GrColor fColor; |
1038 UniformHandle fColorUniform; | 1052 UniformHandle fColorUniform; |
1039 typedef GrGLSLGeometryProcessor INHERITED; | 1053 typedef GrGLSLGeometryProcessor INHERITED; |
1040 }; | 1054 }; |
1041 | 1055 |
1042 GLDashingLineEffect::GLDashingLineEffect() { | 1056 GLDashingLineEffect::GLDashingLineEffect() { |
1043 fColor = GrColor_ILLEGAL; | 1057 fColor = GrColor_ILLEGAL; |
1044 } | 1058 } |
(...skipping 28 matching lines...) Expand all Loading... |
1073 // Setup position | 1087 // Setup position |
1074 this->setupPosition(vertBuilder, gpArgs, de.inPosition()->fName); | 1088 this->setupPosition(vertBuilder, gpArgs, de.inPosition()->fName); |
1075 | 1089 |
1076 // emit transforms | 1090 // emit transforms |
1077 this->emitTransforms(vertBuilder, | 1091 this->emitTransforms(vertBuilder, |
1078 varyingHandler, | 1092 varyingHandler, |
1079 uniformHandler, | 1093 uniformHandler, |
1080 gpArgs->fPositionVar, | 1094 gpArgs->fPositionVar, |
1081 de.inPosition()->fName, | 1095 de.inPosition()->fName, |
1082 de.localMatrix(), | 1096 de.localMatrix(), |
1083 args.fFPCoordTransformHandler); | 1097 args.fTransformsIn, |
| 1098 args.fTransformsOut); |
1084 | 1099 |
1085 // transforms all points so that we can compare them to our test rect | 1100 // transforms all points so that we can compare them to our test rect |
1086 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", | 1101 fragBuilder->codeAppendf("float xShifted = %s.x - floor(%s.x / %s.z) * %s.z;
", |
1087 inDashParams.fsIn(), inDashParams.fsIn(), inDashPar
ams.fsIn(), | 1102 inDashParams.fsIn(), inDashParams.fsIn(), inDashPar
ams.fsIn(), |
1088 inDashParams.fsIn()); | 1103 inDashParams.fsIn()); |
1089 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDa
shParams.fsIn()); | 1104 fragBuilder->codeAppendf("vec2 fragPosShifted = vec2(xShifted, %s.y);", inDa
shParams.fsIn()); |
1090 if (de.aaMode() == AAMode::kCoverage) { | 1105 if (de.aaMode() == AAMode::kCoverage) { |
1091 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative | 1106 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative |
1092 // numbers, xSub and ySub. | 1107 // numbers, xSub and ySub. |
1093 fragBuilder->codeAppend("float xSub, ySub;"); | 1108 fragBuilder->codeAppend("float xSub, ySub;"); |
(...skipping 18 matching lines...) Expand all Loading... |
1112 fragBuilder->codeAppendf("float alpha = 1.0;"); | 1127 fragBuilder->codeAppendf("float alpha = 1.0;"); |
1113 fragBuilder->codeAppendf("alpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.
0 : 0.0;", | 1128 fragBuilder->codeAppendf("alpha *= (fragPosShifted.x - %s.x) > -0.5 ? 1.
0 : 0.0;", |
1114 inRectParams.fsIn()); | 1129 inRectParams.fsIn()); |
1115 fragBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1
.0 : 0.0;", | 1130 fragBuilder->codeAppendf("alpha *= (%s.z - fragPosShifted.x) >= -0.5 ? 1
.0 : 0.0;", |
1116 inRectParams.fsIn()); | 1131 inRectParams.fsIn()); |
1117 } | 1132 } |
1118 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); | 1133 fragBuilder->codeAppendf("%s = vec4(alpha);", args.fOutputCoverage); |
1119 } | 1134 } |
1120 | 1135 |
1121 void GLDashingLineEffect::setData(const GrGLSLProgramDataManager& pdman, | 1136 void GLDashingLineEffect::setData(const GrGLSLProgramDataManager& pdman, |
1122 const GrPrimitiveProcessor& processor, | 1137 const GrPrimitiveProcessor& processor) { |
1123 FPCoordTransformIter&& transformIter) { | |
1124 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); | 1138 const DashingLineEffect& de = processor.cast<DashingLineEffect>(); |
1125 if (de.color() != fColor) { | 1139 if (de.color() != fColor) { |
1126 float c[4]; | 1140 float c[4]; |
1127 GrColorToRGBAFloat(de.color(), c); | 1141 GrColorToRGBAFloat(de.color(), c); |
1128 pdman.set4fv(fColorUniform, 1, c); | 1142 pdman.set4fv(fColorUniform, 1, c); |
1129 fColor = de.color(); | 1143 fColor = de.color(); |
1130 } | 1144 } |
1131 this->setTransformDataHelper(de.localMatrix(), pdman, &transformIter); | |
1132 } | 1145 } |
1133 | 1146 |
1134 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, | 1147 void GLDashingLineEffect::GenKey(const GrGeometryProcessor& gp, |
1135 const GrGLSLCaps&, | 1148 const GrGLSLCaps&, |
1136 GrProcessorKeyBuilder* b) { | 1149 GrProcessorKeyBuilder* b) { |
1137 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); | 1150 const DashingLineEffect& de = gp.cast<DashingLineEffect>(); |
1138 uint32_t key = 0; | 1151 uint32_t key = 0; |
1139 key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0
; | 1152 key |= de.usesLocalCoords() && de.localMatrix().hasPerspective() ? 0x1 : 0x0
; |
1140 key |= de.colorIgnored() ? 0x2 : 0x0; | 1153 key |= de.colorIgnored() ? 0x2 : 0x0; |
1141 key |= static_cast<int>(de.aaMode()) << 8; | 1154 key |= static_cast<int>(de.aaMode()) << 8; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 p.setStrokeWidth(SkIntToScalar(1)); | 1285 p.setStrokeWidth(SkIntToScalar(1)); |
1273 p.setStrokeCap(cap); | 1286 p.setStrokeCap(cap); |
1274 p.setPathEffect(GrTest::TestDashPathEffect::Make(intervals, 2, phase)); | 1287 p.setPathEffect(GrTest::TestDashPathEffect::Make(intervals, 2, phase)); |
1275 | 1288 |
1276 GrStyle style(p); | 1289 GrStyle style(p); |
1277 | 1290 |
1278 return GrDashingEffect::CreateDashLineBatch(color, viewMatrix, pts, aaMode,
style); | 1291 return GrDashingEffect::CreateDashLineBatch(color, viewMatrix, pts, aaMode,
style); |
1279 } | 1292 } |
1280 | 1293 |
1281 #endif | 1294 #endif |
OLD | NEW |