| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "SkRRectsGaussianEdgeShader.h" | 8 #include "SkRRectsGaussianEdgeShader.h" |
| 9 #include "SkReadBuffer.h" | 9 #include "SkReadBuffer.h" |
| 10 #include "SkWriteBuffer.h" | 10 #include "SkWriteBuffer.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 case kCircle_Mode: | 119 case kCircle_Mode: |
| 120 fragBuilder->codeAppendf("%s = clamp((%s.%c - length(delta))/%s,
0.0, 1.0);", | 120 fragBuilder->codeAppendf("%s = clamp((%s.%c - length(delta))/%s,
0.0, 1.0);", |
| 121 outputName, sizesName, indices[0], radN
ame); | 121 outputName, sizesName, indices[0], radN
ame); |
| 122 break; | 122 break; |
| 123 case kRect_Mode: | 123 case kRect_Mode: |
| 124 fragBuilder->codeAppendf( | 124 fragBuilder->codeAppendf( |
| 125 "vec2 rectDist = vec2(1.0 - clamp((%s.%c - abs(delta.x))/%s,
0.0, 1.0)," | 125 "vec2 rectDist = vec2(1.0 - clamp((%s.%c - abs(delta.x))/%s,
0.0, 1.0)," |
| 126 "1.0 - clamp((%s.%c - abs(delta.y))/%s,
0.0, 1.0));", | 126 "1.0 - clamp((%s.%c - abs(delta.y))/%s,
0.0, 1.0));", |
| 127 sizesName, indices[0], radName, | 127 sizesName, indices[0], radName, |
| 128 sizesName, indices[1], radName); | 128 sizesName, indices[1], radName); |
| 129 fragBuilder->codeAppendf("%s = 1.0 - length(rectDist);", outputN
ame); | 129 fragBuilder->codeAppendf("%s = clamp(1.0 - length(rectDist), 0.0
, 1.0);", |
| 130 outputName); |
| 130 break; | 131 break; |
| 131 case kSimpleCircular_Mode: | 132 case kSimpleCircular_Mode: |
| 132 // For the circular round rect we first compute the distance | 133 // For the circular round rect we first compute the distance |
| 133 // to the rect. Then we compute a multiplier that is 1 if the | 134 // to the rect. Then we compute a multiplier that is 1 if the |
| 134 // point is in one of the circular corners. We then compute the | 135 // point is in one of the circular corners. We then compute the |
| 135 // distance from the corner and then use the multiplier to mask | 136 // distance from the corner and then use the multiplier to mask |
| 136 // between the two distances. | 137 // between the two distances. |
| 137 fragBuilder->codeAppendf("float xDist = clamp((%s.%c - abs(delta
.x))/%s," | 138 fragBuilder->codeAppendf("float xDist = clamp((%s.%c - abs(delta
.x))/%s," |
| 138 " 0.0, 1.0);", | 139 " 0.0, 1.0);", |
| 139 sizesName, indices[0], radName); | 140 sizesName, indices[0], radName); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 radUniName, "firstDist", "xy"); | 196 radUniName, "firstDist", "xy"); |
| 196 fragBuilder->codeAppend("}"); | 197 fragBuilder->codeAppend("}"); |
| 197 | 198 |
| 198 fragBuilder->codeAppend("float secondDist;"); | 199 fragBuilder->codeAppend("float secondDist;"); |
| 199 fragBuilder->codeAppend("{"); | 200 fragBuilder->codeAppend("{"); |
| 200 this->emitModeCode(fp.secondMode(), fragBuilder, | 201 this->emitModeCode(fp.secondMode(), fragBuilder, |
| 201 positionsUniName, sizesUniName, radiiUniName, | 202 positionsUniName, sizesUniName, radiiUniName, |
| 202 radUniName, "secondDist", "zw"); | 203 radUniName, "secondDist", "zw"); |
| 203 fragBuilder->codeAppend("}"); | 204 fragBuilder->codeAppend("}"); |
| 204 | 205 |
| 205 fragBuilder->codeAppendf("float dist = %s * firstDist * secondDist;"
, radUniName); | 206 fragBuilder->codeAppend("vec2 distVec = vec2(1.0 - firstDist, 1.0 -
secondDist);"); |
| 206 | 207 |
| 207 // Finally use the distance to apply the Gaussian edge | 208 // Finally use the distance to apply the Gaussian edge |
| 208 // TODO: we undo the multiply by the radius here - we should just sk
ip both | 209 fragBuilder->codeAppend("float factor = clamp(length(distVec), 0.0,
1.0);"); |
| 209 fragBuilder->codeAppendf("float factor = 1.0 - clamp(dist/%s, 0.0, 1
.0);", radUniName); | |
| 210 fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.01
8;"); | 210 fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.01
8;"); |
| 211 fragBuilder->codeAppendf("%s = factor*%s;", | 211 fragBuilder->codeAppendf("%s = factor*%s;", |
| 212 args.fOutputColor, args.fInputColor); | 212 args.fOutputColor, args.fInputColor); |
| 213 } | 213 } |
| 214 | 214 |
| 215 static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, | 215 static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, |
| 216 GrProcessorKeyBuilder* b) { | 216 GrProcessorKeyBuilder* b) { |
| 217 const RRectsGaussianEdgeFP& fp = proc.cast<RRectsGaussianEdgeFP>(); | 217 const RRectsGaussianEdgeFP& fp = proc.cast<RRectsGaussianEdgeFP>(); |
| 218 | 218 |
| 219 b->add32(fp.firstMode() | (fp.secondMode() << 4)); | 219 b->add32(fp.firstMode() | (fp.secondMode() << 4)); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 return sk_make_sp<SkRRectsGaussianEdgeShaderImpl>(first, second, radius); | 420 return sk_make_sp<SkRRectsGaussianEdgeShaderImpl>(first, second, radius); |
| 421 } | 421 } |
| 422 | 422 |
| 423 /////////////////////////////////////////////////////////////////////////////// | 423 /////////////////////////////////////////////////////////////////////////////// |
| 424 | 424 |
| 425 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkRRectsGaussianEdgeShader) | 425 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkRRectsGaussianEdgeShader) |
| 426 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRRectsGaussianEdgeShaderImpl) | 426 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRRectsGaussianEdgeShaderImpl) |
| 427 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 427 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| 428 | 428 |
| 429 /////////////////////////////////////////////////////////////////////////////// | 429 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |