| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "GrBezierEffect.h" | 8 #include "GrBezierEffect.h" |
| 9 | 9 |
| 10 #include "glsl/GrGLSLGeometryProcessor.h" | 10 #include "glsl/GrGLSLGeometryProcessor.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) | 68 GrGLConicEffect::GrGLConicEffect(const GrGeometryProcessor& processor) |
| 69 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 69 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 70 const GrConicEffect& ce = processor.cast<GrConicEffect>(); | 70 const GrConicEffect& ce = processor.cast<GrConicEffect>(); |
| 71 fEdgeType = ce.getEdgeType(); | 71 fEdgeType = ce.getEdgeType(); |
| 72 } | 72 } |
| 73 | 73 |
| 74 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 74 void GrGLConicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 75 GrGLSLGPBuilder* pb = args.fPB; | 75 GrGLSLGPBuilder* pb = args.fPB; |
| 76 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 76 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 77 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); | 77 const GrConicEffect& gp = args.fGP.cast<GrConicEffect>(); |
| 78 | 78 |
| 79 // emit attributes | 79 // emit attributes |
| 80 vsBuilder->emitAttributes(gp); | 80 vertBuilder->emitAttributes(gp); |
| 81 | 81 |
| 82 GrGLSLVertToFrag v(kVec4f_GrSLType); | 82 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 83 args.fPB->addVarying("ConicCoeffs", &v); | 83 args.fPB->addVarying("ConicCoeffs", &v); |
| 84 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); | 84 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName); |
| 85 | 85 |
| 86 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 86 // Setup pass through color | 87 // Setup pass through color |
| 87 if (!gp.colorIgnored()) { | 88 if (!gp.colorIgnored()) { |
| 88 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 89 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); |
| 89 } | 90 } |
| 90 | 91 |
| 91 // Setup position | 92 // Setup position |
| 92 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 93 this->setupPosition(pb, |
| 94 vertBuilder, |
| 95 gpArgs, |
| 96 gp.inPosition()->fName, |
| 97 gp.viewMatrix(), |
| 98 &fViewMatrixUniform); |
| 93 | 99 |
| 94 // emit transforms with position | 100 // emit transforms with position |
| 95 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 101 this->emitTransforms(pb, |
| 96 args.fTransformsIn, args.fTransformsOut); | 102 vertBuilder, |
| 103 gpArgs->fPositionVar, |
| 104 gp.inPosition()->fName, |
| 105 gp.localMatrix(), |
| 106 args.fTransformsIn, |
| 107 args.fTransformsOut); |
| 97 | 108 |
| 98 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 109 fragBuilder->codeAppend("float edgeAlpha;"); |
| 99 fsBuilder->codeAppend("float edgeAlpha;"); | |
| 100 | 110 |
| 101 switch (fEdgeType) { | 111 switch (fEdgeType) { |
| 102 case kHairlineAA_GrProcessorEdgeType: { | 112 case kHairlineAA_GrProcessorEdgeType: { |
| 103 SkAssertResult(fsBuilder->enableFeature( | 113 SkAssertResult(fragBuilder->enableFeature( |
| 104 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 114 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 105 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 115 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
| 106 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 116 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
| 107 fsBuilder->codeAppendf("float dfdx =" | 117 fragBuilder->codeAppendf("float dfdx =" |
| 108 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 118 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z -
%s.z * dklmdx.y;", |
| 109 v.fsIn(), v.fsIn(), v.fsIn()); | 119 v.fsIn(), v.fsIn(), v.fsIn()); |
| 110 fsBuilder->codeAppendf("float dfdy =" | 120 fragBuilder->codeAppendf("float dfdy =" |
| 111 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 121 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z -
%s.z * dklmdy.y;", |
| 112 v.fsIn(), v.fsIn(), v.fsIn()); | 122 v.fsIn(), v.fsIn(), v.fsIn()); |
| 113 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 123 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
| 114 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 124 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
| 115 fsBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fsIn
(), v.fsIn(), | 125 fragBuilder->codeAppendf("float func = %s.x*%s.x - %s.y*%s.z;", v.fs
In(), v.fsIn(), |
| 116 v.fsIn(), v.fsIn()); | 126 v.fsIn(), v.fsIn()); |
| 117 fsBuilder->codeAppend("func = abs(func);"); | 127 fragBuilder->codeAppend("func = abs(func);"); |
| 118 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); | 128 fragBuilder->codeAppend("edgeAlpha = func / gFM;"); |
| 119 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 129 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
| 120 // Add line below for smooth cubic ramp | 130 // Add line below for smooth cubic ramp |
| 121 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 131 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0
*edgeAlpha);"); |
| 122 break; | 132 break; |
| 123 } | 133 } |
| 124 case kFillAA_GrProcessorEdgeType: { | 134 case kFillAA_GrProcessorEdgeType: { |
| 125 SkAssertResult(fsBuilder->enableFeature( | 135 SkAssertResult(fragBuilder->enableFeature( |
| 126 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 136 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 127 fsBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); | 137 fragBuilder->codeAppendf("vec3 dklmdx = dFdx(%s.xyz);", v.fsIn()); |
| 128 fsBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); | 138 fragBuilder->codeAppendf("vec3 dklmdy = dFdy(%s.xyz);", v.fsIn()); |
| 129 fsBuilder->codeAppendf("float dfdx =" | 139 fragBuilder->codeAppendf("float dfdx =" |
| 130 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z - %s
.z * dklmdx.y;", | 140 "2.0 * %s.x * dklmdx.x - %s.y * dklmdx.z -
%s.z * dklmdx.y;", |
| 131 v.fsIn(), v.fsIn(), v.fsIn()); | 141 v.fsIn(), v.fsIn(), v.fsIn()); |
| 132 fsBuilder->codeAppendf("float dfdy =" | 142 fragBuilder->codeAppendf("float dfdy =" |
| 133 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z - %s
.z * dklmdy.y;", | 143 "2.0 * %s.x * dklmdy.x - %s.y * dklmdy.z -
%s.z * dklmdy.y;", |
| 134 v.fsIn(), v.fsIn(), v.fsIn()); | 144 v.fsIn(), v.fsIn(), v.fsIn()); |
| 135 fsBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); | 145 fragBuilder->codeAppend("vec2 gF = vec2(dfdx, dfdy);"); |
| 136 fsBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); | 146 fragBuilder->codeAppend("float gFM = sqrt(dot(gF, gF));"); |
| 137 fsBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;", v.
fsIn(), v.fsIn(), | 147 fragBuilder->codeAppendf("float func = %s.x * %s.x - %s.y * %s.z;",
v.fsIn(), v.fsIn(), |
| 138 v.fsIn(), v.fsIn()); | 148 v.fsIn(), v.fsIn()); |
| 139 fsBuilder->codeAppend("edgeAlpha = func / gFM;"); | 149 fragBuilder->codeAppend("edgeAlpha = func / gFM;"); |
| 140 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); | 150 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0
);"); |
| 141 // Add line below for smooth cubic ramp | 151 // Add line below for smooth cubic ramp |
| 142 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 152 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0
*edgeAlpha);"); |
| 143 break; | 153 break; |
| 144 } | 154 } |
| 145 case kFillBW_GrProcessorEdgeType: { | 155 case kFillBW_GrProcessorEdgeType: { |
| 146 fsBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v.f
sIn(), v.fsIn(), | 156 fragBuilder->codeAppendf("edgeAlpha = %s.x * %s.x - %s.y * %s.z;", v
.fsIn(), v.fsIn(), |
| 147 v.fsIn(), v.fsIn()); | 157 v.fsIn(), v.fsIn()); |
| 148 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 158 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 149 break; | 159 break; |
| 150 } | 160 } |
| 151 default: | 161 default: |
| 152 SkFAIL("Shouldn't get here"); | 162 SkFAIL("Shouldn't get here"); |
| 153 } | 163 } |
| 154 | 164 |
| 155 // TODO should we really be doing this? | 165 // TODO should we really be doing this? |
| 156 if (gp.coverageScale() != 0xff) { | 166 if (gp.coverageScale() != 0xff) { |
| 157 const char* coverageScale; | 167 const char* coverageScale; |
| 158 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 168 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
| 159 kFloat_GrSLType, | 169 kFloat_GrSLType, |
| 160 kDefault_GrSLPrecision, | 170 kDefault_GrSLPrecision, |
| 161 "Coverage", | 171 "Coverage", |
| 162 &coverageScale); | 172 &coverageScale); |
| 163 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 173 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
| 164 } else { | 174 } else { |
| 165 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 175 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 166 } | 176 } |
| 167 } | 177 } |
| 168 | 178 |
| 169 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, | 179 void GrGLConicEffect::GenKey(const GrGeometryProcessor& gp, |
| 170 const GrGLSLCaps&, | 180 const GrGLSLCaps&, |
| 171 GrProcessorKeyBuilder* b) { | 181 GrProcessorKeyBuilder* b) { |
| 172 const GrConicEffect& ce = gp.cast<GrConicEffect>(); | 182 const GrConicEffect& ce = gp.cast<GrConicEffect>(); |
| 173 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 183 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
| 174 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0; | 184 key |= GrColor_ILLEGAL != ce.color() ? 0x4 : 0x0; |
| 175 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0; | 185 key |= 0xff != ce.coverageScale() ? 0x8 : 0x0; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 }; | 292 }; |
| 283 | 293 |
| 284 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) | 294 GrGLQuadEffect::GrGLQuadEffect(const GrGeometryProcessor& processor) |
| 285 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { | 295 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage
Scale(0xff) { |
| 286 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); | 296 const GrQuadEffect& ce = processor.cast<GrQuadEffect>(); |
| 287 fEdgeType = ce.getEdgeType(); | 297 fEdgeType = ce.getEdgeType(); |
| 288 } | 298 } |
| 289 | 299 |
| 290 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 300 void GrGLQuadEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 291 GrGLSLGPBuilder* pb = args.fPB; | 301 GrGLSLGPBuilder* pb = args.fPB; |
| 292 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 302 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 293 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); | 303 const GrQuadEffect& gp = args.fGP.cast<GrQuadEffect>(); |
| 294 | 304 |
| 295 // emit attributes | 305 // emit attributes |
| 296 vsBuilder->emitAttributes(gp); | 306 vertBuilder->emitAttributes(gp); |
| 297 | 307 |
| 298 GrGLSLVertToFrag v(kVec4f_GrSLType); | 308 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 299 args.fPB->addVarying("HairQuadEdge", &v); | 309 args.fPB->addVarying("HairQuadEdge", &v); |
| 300 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); | 310 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName); |
| 301 | 311 |
| 312 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 302 // Setup pass through color | 313 // Setup pass through color |
| 303 if (!gp.colorIgnored()) { | 314 if (!gp.colorIgnored()) { |
| 304 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 315 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); |
| 305 } | 316 } |
| 306 | 317 |
| 307 // Setup position | 318 // Setup position |
| 308 this->setupPosition(pb, gpArgs, gp.inPosition()->fName, gp.viewMatrix(), &fV
iewMatrixUniform); | 319 this->setupPosition(pb, |
| 320 vertBuilder, |
| 321 gpArgs, |
| 322 gp.inPosition()->fName, |
| 323 gp.viewMatrix(), |
| 324 &fViewMatrixUniform); |
| 309 | 325 |
| 310 // emit transforms with position | 326 // emit transforms with position |
| 311 this->emitTransforms(pb, gpArgs->fPositionVar, gp.inPosition()->fName, gp.lo
calMatrix(), | 327 this->emitTransforms(pb, |
| 312 args.fTransformsIn, args.fTransformsOut); | 328 vertBuilder, |
| 329 gpArgs->fPositionVar, |
| 330 gp.inPosition()->fName, |
| 331 gp.localMatrix(), |
| 332 args.fTransformsIn, |
| 333 args.fTransformsOut); |
| 313 | 334 |
| 314 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 335 fragBuilder->codeAppendf("float edgeAlpha;"); |
| 315 fsBuilder->codeAppendf("float edgeAlpha;"); | |
| 316 | 336 |
| 317 switch (fEdgeType) { | 337 switch (fEdgeType) { |
| 318 case kHairlineAA_GrProcessorEdgeType: { | 338 case kHairlineAA_GrProcessorEdgeType: { |
| 319 SkAssertResult(fsBuilder->enableFeature( | 339 SkAssertResult(fragBuilder->enableFeature( |
| 320 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 340 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 321 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 341 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
| 322 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 342 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
| 323 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 343 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd
x.y," |
| 324 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 344 " 2.0 * %s.x * duvdy.x - duvd
y.y);", |
| 325 v.fsIn(), v.fsIn()); | 345 v.fsIn(), v.fsIn()); |
| 326 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 346 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", |
| 327 fsBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(
gF, gF));"); | 347 v.fsIn(), v.fsIn(), v.fsIn()); |
| 328 fsBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); | 348 fragBuilder->codeAppend("edgeAlpha = sqrt(edgeAlpha * edgeAlpha / do
t(gF, gF));"); |
| 349 fragBuilder->codeAppend("edgeAlpha = max(1.0 - edgeAlpha, 0.0);"); |
| 329 // Add line below for smooth cubic ramp | 350 // Add line below for smooth cubic ramp |
| 330 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 351 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0
*edgeAlpha);"); |
| 331 break; | 352 break; |
| 332 } | 353 } |
| 333 case kFillAA_GrProcessorEdgeType: { | 354 case kFillAA_GrProcessorEdgeType: { |
| 334 SkAssertResult(fsBuilder->enableFeature( | 355 SkAssertResult(fragBuilder->enableFeature( |
| 335 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 356 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 336 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); | 357 fragBuilder->codeAppendf("vec2 duvdx = dFdx(%s.xy);", v.fsIn()); |
| 337 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); | 358 fragBuilder->codeAppendf("vec2 duvdy = dFdy(%s.xy);", v.fsIn()); |
| 338 fsBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvdx.
y," | 359 fragBuilder->codeAppendf("vec2 gF = vec2(2.0 * %s.x * duvdx.x - duvd
x.y," |
| 339 " 2.0 * %s.x * duvdy.x - duvdy.
y);", | 360 " 2.0 * %s.x * duvdy.x - duvd
y.y);", |
| 340 v.fsIn(), v.fsIn()); | 361 v.fsIn(), v.fsIn()); |
| 341 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 362 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", |
| 342 fsBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"); | 363 v.fsIn(), v.fsIn(), v.fsIn()); |
| 343 fsBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0);
"); | 364 fragBuilder->codeAppend("edgeAlpha = edgeAlpha / sqrt(dot(gF, gF));"
); |
| 365 fragBuilder->codeAppend("edgeAlpha = clamp(1.0 - edgeAlpha, 0.0, 1.0
);"); |
| 344 // Add line below for smooth cubic ramp | 366 // Add line below for smooth cubic ramp |
| 345 // fsBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*e
dgeAlpha);"); | 367 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0
*edgeAlpha);"); |
| 346 break; | 368 break; |
| 347 } | 369 } |
| 348 case kFillBW_GrProcessorEdgeType: { | 370 case kFillBW_GrProcessorEdgeType: { |
| 349 fsBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", v.fsIn()
, v.fsIn(), v.fsIn()); | 371 fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);", |
| 350 fsBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); | 372 v.fsIn(), v.fsIn(), v.fsIn()); |
| 373 fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);"); |
| 351 break; | 374 break; |
| 352 } | 375 } |
| 353 default: | 376 default: |
| 354 SkFAIL("Shouldn't get here"); | 377 SkFAIL("Shouldn't get here"); |
| 355 } | 378 } |
| 356 | 379 |
| 357 if (0xff != gp.coverageScale()) { | 380 if (0xff != gp.coverageScale()) { |
| 358 const char* coverageScale; | 381 const char* coverageScale; |
| 359 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, | 382 fCoverageScaleUniform = pb->addUniform(GrGLSLProgramBuilder::kFragment_V
isibility, |
| 360 kFloat_GrSLType, | 383 kFloat_GrSLType, |
| 361 kDefault_GrSLPrecision, | 384 kDefault_GrSLPrecision, |
| 362 "Coverage", | 385 "Coverage", |
| 363 &coverageScale); | 386 &coverageScale); |
| 364 fsBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCoverag
e, coverageScale); | 387 fragBuilder->codeAppendf("%s = vec4(%s * edgeAlpha);", args.fOutputCover
age, coverageScale); |
| 365 } else { | 388 } else { |
| 366 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); | 389 fragBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage); |
| 367 } | 390 } |
| 368 } | 391 } |
| 369 | 392 |
| 370 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, | 393 void GrGLQuadEffect::GenKey(const GrGeometryProcessor& gp, |
| 371 const GrGLSLCaps&, | 394 const GrGLSLCaps&, |
| 372 GrProcessorKeyBuilder* b) { | 395 GrProcessorKeyBuilder* b) { |
| 373 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); | 396 const GrQuadEffect& ce = gp.cast<GrQuadEffect>(); |
| 374 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 397 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
| 375 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0; | 398 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x0; |
| 376 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0; | 399 key |= ce.coverageScale() != 0xff ? 0x8 : 0x0; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 typedef GrGLSLGeometryProcessor INHERITED; | 492 typedef GrGLSLGeometryProcessor INHERITED; |
| 470 }; | 493 }; |
| 471 | 494 |
| 472 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) | 495 GrGLCubicEffect::GrGLCubicEffect(const GrGeometryProcessor& processor) |
| 473 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { | 496 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) { |
| 474 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); | 497 const GrCubicEffect& ce = processor.cast<GrCubicEffect>(); |
| 475 fEdgeType = ce.getEdgeType(); | 498 fEdgeType = ce.getEdgeType(); |
| 476 } | 499 } |
| 477 | 500 |
| 478 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { | 501 void GrGLCubicEffect::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { |
| 479 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 502 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
| 480 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); | 503 const GrCubicEffect& gp = args.fGP.cast<GrCubicEffect>(); |
| 481 | 504 |
| 482 // emit attributes | 505 // emit attributes |
| 483 vsBuilder->emitAttributes(gp); | 506 vertBuilder->emitAttributes(gp); |
| 484 | 507 |
| 485 GrGLSLVertToFrag v(kVec4f_GrSLType); | 508 GrGLSLVertToFrag v(kVec4f_GrSLType); |
| 486 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); | 509 args.fPB->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision); |
| 487 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); | 510 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inCubicCoeffs()->fName); |
| 488 | 511 |
| 512 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
| 489 // Setup pass through color | 513 // Setup pass through color |
| 490 if (!gp.colorIgnored()) { | 514 if (!gp.colorIgnored()) { |
| 491 this->setupUniformColor(args.fPB, args.fOutputColor, &fColorUniform); | 515 this->setupUniformColor(args.fPB, fragBuilder, args.fOutputColor, &fColo
rUniform); |
| 492 } | 516 } |
| 493 | 517 |
| 494 // Setup position | 518 // Setup position |
| 495 this->setupPosition(args.fPB, gpArgs, gp.inPosition()->fName, gp.viewMatrix(
), | 519 this->setupPosition(args.fPB, |
| 520 vertBuilder, |
| 521 gpArgs, |
| 522 gp.inPosition()->fName, |
| 523 gp.viewMatrix(), |
| 496 &fViewMatrixUniform); | 524 &fViewMatrixUniform); |
| 497 | 525 |
| 498 // emit transforms with position | 526 // emit transforms with position |
| 499 this->emitTransforms(args.fPB, gpArgs->fPositionVar, gp.inPosition()->fName,
args.fTransformsIn, | 527 this->emitTransforms(args.fPB, |
| 528 vertBuilder, |
| 529 gpArgs->fPositionVar, |
| 530 gp.inPosition()->fName, |
| 531 args.fTransformsIn, |
| 500 args.fTransformsOut); | 532 args.fTransformsOut); |
| 501 | 533 |
| 502 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | |
| 503 | 534 |
| 504 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); | 535 GrGLSLShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecisi
on); |
| 505 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 536 GrGLSLShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 506 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); | 537 GrGLSLShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, kHigh_GrSLPrecision); |
| 507 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 538 GrGLSLShaderVar dfdx("dfdx", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 508 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 539 GrGLSLShaderVar dfdy("dfdy", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 509 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); | 540 GrGLSLShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision); |
| 510 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 541 GrGLSLShaderVar gFM("gFM", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 511 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); | 542 GrGLSLShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision); |
| 512 | 543 |
| 513 fsBuilder->declAppend(edgeAlpha); | 544 fragBuilder->declAppend(edgeAlpha); |
| 514 fsBuilder->declAppend(dklmdx); | 545 fragBuilder->declAppend(dklmdx); |
| 515 fsBuilder->declAppend(dklmdy); | 546 fragBuilder->declAppend(dklmdy); |
| 516 fsBuilder->declAppend(dfdx); | 547 fragBuilder->declAppend(dfdx); |
| 517 fsBuilder->declAppend(dfdy); | 548 fragBuilder->declAppend(dfdy); |
| 518 fsBuilder->declAppend(gF); | 549 fragBuilder->declAppend(gF); |
| 519 fsBuilder->declAppend(gFM); | 550 fragBuilder->declAppend(gFM); |
| 520 fsBuilder->declAppend(func); | 551 fragBuilder->declAppend(func); |
| 521 | 552 |
| 522 switch (fEdgeType) { | 553 switch (fEdgeType) { |
| 523 case kHairlineAA_GrProcessorEdgeType: { | 554 case kHairlineAA_GrProcessorEdgeType: { |
| 524 SkAssertResult(fsBuilder->enableFeature( | 555 SkAssertResult(fragBuilder->enableFeature( |
| 525 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 556 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 526 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 557 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsI
n()); |
| 527 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 558 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsI
n()); |
| 528 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 559 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.
z - %s.z * %s.y;", |
| 529 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 560 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_
str(), v.fsIn(), |
| 530 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 561 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
| 531 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 562 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.
z - %s.z * %s.y;", |
| 532 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 563 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_
str(), v.fsIn(), |
| 533 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 564 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
| 534 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 565 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_st
r(), dfdy.c_str()); |
| 535 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); | 566 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", |
| 536 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", | 567 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 537 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); | 568 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", |
| 538 fsBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()); | 569 func.c_str(), v.fsIn(), v.fsIn(), |
| 539 fsBuilder->codeAppendf("%s = %s / %s;", | 570 v.fsIn(), v.fsIn(), v.fsIn()); |
| 540 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; | 571 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str()
); |
| 541 fsBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", | 572 fragBuilder->codeAppendf("%s = %s / %s;", |
| 542 edgeAlpha.c_str(), edgeAlpha.c_str()); | 573 edgeAlpha.c_str(), func.c_str(), gFM.c_str(
)); |
| 574 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);", |
| 575 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 543 // Add line below for smooth cubic ramp | 576 // Add line below for smooth cubic ramp |
| 544 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", | 577 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", |
| 545 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), | 578 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 546 // edgeAlpha.c_str()); | 579 // edgeAlpha.c_str()); |
| 547 break; | 580 break; |
| 548 } | 581 } |
| 549 case kFillAA_GrProcessorEdgeType: { | 582 case kFillAA_GrProcessorEdgeType: { |
| 550 SkAssertResult(fsBuilder->enableFeature( | 583 SkAssertResult(fragBuilder->enableFeature( |
| 551 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 584 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
| 552 fsBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn(
)); | 585 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsI
n()); |
| 553 fsBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn(
)); | 586 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsI
n()); |
| 554 fsBuilder->codeAppendf("%s =" | 587 fragBuilder->codeAppendf("%s =" |
| 555 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %s.
z * %s.y;", | 588 "3.0 * %s.x * %s.x * %s.x - %s.y * %s.z - %
s.z * %s.y;", |
| 556 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_st
r(), v.fsIn(), | 589 dfdx.c_str(), v.fsIn(), v.fsIn(), dklmdx.c_
str(), v.fsIn(), |
| 557 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); | 590 dklmdx.c_str(), v.fsIn(), dklmdx.c_str()); |
| 558 fsBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.z
- %s.z * %s.y;", | 591 fragBuilder->codeAppendf("%s = 3.0 * %s.x * %s.x * %s.x - %s.y * %s.
z - %s.z * %s.y;", |
| 559 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_st
r(), v.fsIn(), | 592 dfdy.c_str(), v.fsIn(), v.fsIn(), dklmdy.c_
str(), v.fsIn(), |
| 560 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); | 593 dklmdy.c_str(), v.fsIn(), dklmdy.c_str()); |
| 561 fsBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_str(
), dfdy.c_str()); | 594 fragBuilder->codeAppendf("%s = vec2(%s, %s);", gF.c_str(), dfdx.c_st
r(), dfdy.c_str()); |
| 562 fsBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", gFM.c_str(), gF.c_
str(), gF.c_str()); | 595 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));", |
| 563 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", | 596 gFM.c_str(), gF.c_str(), gF.c_str()); |
| 564 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v
.fsIn(), v.fsIn()); | 597 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", |
| 565 fsBuilder->codeAppendf("%s = %s / %s;", | 598 func.c_str(), v.fsIn(), v.fsIn(), |
| 566 edgeAlpha.c_str(), func.c_str(), gFM.c_str())
; | 599 v.fsIn(), v.fsIn(), v.fsIn()); |
| 567 fsBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);", | 600 fragBuilder->codeAppendf("%s = %s / %s;", |
| 568 edgeAlpha.c_str(), edgeAlpha.c_str()); | 601 edgeAlpha.c_str(), func.c_str(), gFM.c_str(
)); |
| 602 fragBuilder->codeAppendf("%s = clamp(1.0 - %s, 0.0, 1.0);", |
| 603 edgeAlpha.c_str(), edgeAlpha.c_str()); |
| 569 // Add line below for smooth cubic ramp | 604 // Add line below for smooth cubic ramp |
| 570 // fsBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", | 605 // fragBuilder->codeAppendf("%s = %s * %s * (3.0 - 2.0 * %s);", |
| 571 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), | 606 // edgeAlpha.c_str(), edgeAlpha.c_str(), edge
Alpha.c_str(), |
| 572 // edgeAlpha.c_str()); | 607 // edgeAlpha.c_str()); |
| 573 break; | 608 break; |
| 574 } | 609 } |
| 575 case kFillBW_GrProcessorEdgeType: { | 610 case kFillBW_GrProcessorEdgeType: { |
| 576 fsBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", | 611 fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;", |
| 577 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn
(), v.fsIn(), v.fsIn()); | 612 edgeAlpha.c_str(), v.fsIn(), v.fsIn(), |
| 578 fsBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), e
dgeAlpha.c_str()); | 613 v.fsIn(), v.fsIn(), v.fsIn()); |
| 614 fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(),
edgeAlpha.c_str()); |
| 579 break; | 615 break; |
| 580 } | 616 } |
| 581 default: | 617 default: |
| 582 SkFAIL("Shouldn't get here"); | 618 SkFAIL("Shouldn't get here"); |
| 583 } | 619 } |
| 584 | 620 |
| 585 | 621 |
| 586 fsBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c_s
tr()); | 622 fragBuilder->codeAppendf("%s = vec4(%s);", args.fOutputCoverage, edgeAlpha.c
_str()); |
| 587 } | 623 } |
| 588 | 624 |
| 589 void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp, | 625 void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp, |
| 590 const GrGLSLCaps&, | 626 const GrGLSLCaps&, |
| 591 GrProcessorKeyBuilder* b) { | 627 GrProcessorKeyBuilder* b) { |
| 592 const GrCubicEffect& ce = gp.cast<GrCubicEffect>(); | 628 const GrCubicEffect& ce = gp.cast<GrCubicEffect>(); |
| 593 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; | 629 uint32_t key = ce.isAntiAliased() ? (ce.isFilled() ? 0x0 : 0x1) : 0x2; |
| 594 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8; | 630 key |= ce.color() != GrColor_ILLEGAL ? 0x4 : 0x8; |
| 595 key |= ComputePosKey(ce.viewMatrix()) << 5; | 631 key |= ComputePosKey(ce.viewMatrix()) << 5; |
| 596 b->add32(key); | 632 b->add32(key); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 do { | 665 do { |
| 630 GrPrimitiveEdgeType edgeType = | 666 GrPrimitiveEdgeType edgeType = |
| 631 static_cast<GrPrimitiveEdgeType>( | 667 static_cast<GrPrimitiveEdgeType>( |
| 632 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); | 668 d->fRandom->nextULessThan(kGrProcessorEdgeTypeCnt)); |
| 633 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), | 669 gp = GrCubicEffect::Create(GrRandomColor(d->fRandom), |
| 634 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); | 670 GrTest::TestMatrix(d->fRandom), edgeType, *d-
>fCaps); |
| 635 } while (nullptr == gp); | 671 } while (nullptr == gp); |
| 636 return gp; | 672 return gp; |
| 637 } | 673 } |
| 638 | 674 |
| OLD | NEW |