| 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 "GrOvalRenderer.h" | 8 #include "GrOvalRenderer.h" |
| 9 | 9 |
| 10 #include "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 } | 84 } |
| 85 | 85 |
| 86 virtual ~CircleEdgeEffect() {} | 86 virtual ~CircleEdgeEffect() {} |
| 87 | 87 |
| 88 static const char* Name() { return "CircleEdge"; } | 88 static const char* Name() { return "CircleEdge"; } |
| 89 | 89 |
| 90 inline bool isStroked() const { return fStroke; } | 90 inline bool isStroked() const { return fStroke; } |
| 91 | 91 |
| 92 class GLProcessor : public GrGLGeometryProcessor { | 92 class GLProcessor : public GrGLGeometryProcessor { |
| 93 public: | 93 public: |
| 94 GLProcessor(const GrBackendProcessorFactory& factory, | 94 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) |
| 95 const GrGeometryProcessor&, | |
| 96 const GrBatchTracker&) | |
| 97 : INHERITED (factory) {} | 95 : INHERITED (factory) {} |
| 98 | 96 |
| 99 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 97 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 100 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 98 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
| 101 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 99 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 102 | 100 |
| 103 GrGLVertToFrag v(kVec4f_GrSLType); | 101 GrGLVertToFrag v(kVec4f_GrSLType); |
| 104 args.fPB->addVarying("CircleEdge", &v); | 102 args.fPB->addVarying("CircleEdge", &v); |
| 105 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); | 103 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa
me); |
| 106 | 104 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 117 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); | 115 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0);
", v.fsIn()); |
| 118 if (ce.isStroked()) { | 116 if (ce.isStroked()) { |
| 119 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", | 117 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0,
1.0);", |
| 120 v.fsIn()); | 118 v.fsIn()); |
| 121 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); | 119 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); |
| 122 } | 120 } |
| 123 | 121 |
| 124 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 122 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
| 125 } | 123 } |
| 126 | 124 |
| 127 static void GenKey(const GrGeometryProcessor& processor, | 125 static void GenKey(const GrProcessor& processor, const GrGLCaps&, |
| 128 const GrBatchTracker&, | |
| 129 const GrGLCaps&, | |
| 130 GrProcessorKeyBuilder* b) { | 126 GrProcessorKeyBuilder* b) { |
| 131 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); | 127 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe
ct>(); |
| 132 b->add32(circleEffect.isStroked()); | 128 b->add32(circleEffect.isStroked()); |
| 133 } | 129 } |
| 134 | 130 |
| 135 virtual void setData(const GrGLProgramDataManager&, | 131 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE {} |
| 136 const GrGeometryProcessor&, | |
| 137 const GrBatchTracker&) SK_OVERRIDE {} | |
| 138 | 132 |
| 139 private: | 133 private: |
| 140 typedef GrGLGeometryProcessor INHERITED; | 134 typedef GrGLGeometryProcessor INHERITED; |
| 141 }; | 135 }; |
| 142 | 136 |
| 143 | 137 |
| 144 private: | 138 private: |
| 145 CircleEdgeEffect(bool stroke) { | 139 CircleEdgeEffect(bool stroke) { |
| 146 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 140 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
| 147 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", | 141 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 | 205 |
| 212 | 206 |
| 213 const GrAttribute* inPosition() const { return fInPosition; } | 207 const GrAttribute* inPosition() const { return fInPosition; } |
| 214 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } | 208 const GrAttribute* inEllipseOffset() const { return fInEllipseOffset; } |
| 215 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } | 209 const GrAttribute* inEllipseRadii() const { return fInEllipseRadii; } |
| 216 | 210 |
| 217 inline bool isStroked() const { return fStroke; } | 211 inline bool isStroked() const { return fStroke; } |
| 218 | 212 |
| 219 class GLProcessor : public GrGLGeometryProcessor { | 213 class GLProcessor : public GrGLGeometryProcessor { |
| 220 public: | 214 public: |
| 221 GLProcessor(const GrBackendProcessorFactory& factory, | 215 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) |
| 222 const GrGeometryProcessor&, | |
| 223 const GrBatchTracker&) | |
| 224 : INHERITED (factory) {} | 216 : INHERITED (factory) {} |
| 225 | 217 |
| 226 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 218 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 227 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 219 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
| 228 | 220 |
| 229 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 221 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 230 | 222 |
| 231 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 223 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
| 232 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); | 224 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); |
| 233 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 225 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); | 258 fsBuilder->codeAppend("test = dot(scaledOffset, scaledOffset) -
1.0;"); |
| 267 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", | 259 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", |
| 268 ellipseRadii.fsIn()); | 260 ellipseRadii.fsIn()); |
| 269 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 261 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
| 270 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 262 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
| 271 } | 263 } |
| 272 | 264 |
| 273 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 265 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
| 274 } | 266 } |
| 275 | 267 |
| 276 static void GenKey(const GrGeometryProcessor& processor, | 268 static void GenKey(const GrProcessor& processor, const GrGLCaps&, |
| 277 const GrBatchTracker&, | |
| 278 const GrGLCaps&, | |
| 279 GrProcessorKeyBuilder* b) { | 269 GrProcessorKeyBuilder* b) { |
| 280 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); | 270 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE
ffect>(); |
| 281 b->add32(ellipseEffect.isStroked()); | 271 b->add32(ellipseEffect.isStroked()); |
| 282 } | 272 } |
| 283 | 273 |
| 284 virtual void setData(const GrGLProgramDataManager&, | 274 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE { |
| 285 const GrGeometryProcessor&, | |
| 286 const GrBatchTracker&) SK_OVERRIDE { | |
| 287 } | 275 } |
| 288 | 276 |
| 289 private: | 277 private: |
| 290 typedef GrGLGeometryProcessor INHERITED; | 278 typedef GrGLGeometryProcessor INHERITED; |
| 291 }; | 279 }; |
| 292 | 280 |
| 293 private: | 281 private: |
| 294 EllipseEdgeEffect(bool stroke) { | 282 EllipseEdgeEffect(bool stroke) { |
| 295 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 283 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
| 296 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", | 284 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 static const char* Name() { return "DIEllipseEdge"; } | 357 static const char* Name() { return "DIEllipseEdge"; } |
| 370 | 358 |
| 371 const GrAttribute* inPosition() const { return fInPosition; } | 359 const GrAttribute* inPosition() const { return fInPosition; } |
| 372 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } | 360 const GrAttribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } |
| 373 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } | 361 const GrAttribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } |
| 374 | 362 |
| 375 inline Mode getMode() const { return fMode; } | 363 inline Mode getMode() const { return fMode; } |
| 376 | 364 |
| 377 class GLProcessor : public GrGLGeometryProcessor { | 365 class GLProcessor : public GrGLGeometryProcessor { |
| 378 public: | 366 public: |
| 379 GLProcessor(const GrBackendProcessorFactory& factory, | 367 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor&
) |
| 380 const GrGeometryProcessor&, | |
| 381 const GrBatchTracker&) | |
| 382 : INHERITED (factory) {} | 368 : INHERITED (factory) {} |
| 383 | 369 |
| 384 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 370 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 385 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 371 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
| 386 | 372 |
| 387 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 373 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 388 | 374 |
| 389 GrGLVertToFrag offsets0(kVec2f_GrSLType); | 375 GrGLVertToFrag offsets0(kVec2f_GrSLType); |
| 390 args.fPB->addVarying("EllipseOffsets0", &offsets0); | 376 args.fPB->addVarying("EllipseOffsets0", &offsets0); |
| 391 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 377 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", | 424 " 2.0*%s.x*duvdy.x + 2.0*%s.y*
duvdy.y);", |
| 439 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), | 425 offsets1.fsIn(), offsets1.fsIn(), offsets
1.fsIn(), |
| 440 offsets1.fsIn()); | 426 offsets1.fsIn()); |
| 441 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); | 427 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); |
| 442 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); | 428 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0,
1.0);"); |
| 443 } | 429 } |
| 444 | 430 |
| 445 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); | 431 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage
); |
| 446 } | 432 } |
| 447 | 433 |
| 448 static void GenKey(const GrGeometryProcessor& processor, | 434 static void GenKey(const GrProcessor& processor, const GrGLCaps&, |
| 449 const GrBatchTracker&, | |
| 450 const GrGLCaps&, | |
| 451 GrProcessorKeyBuilder* b) { | 435 GrProcessorKeyBuilder* b) { |
| 452 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); | 436 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE
dgeEffect>(); |
| 453 | 437 |
| 454 b->add32(ellipseEffect.getMode()); | 438 b->add32(ellipseEffect.getMode()); |
| 455 } | 439 } |
| 456 | 440 |
| 457 virtual void setData(const GrGLProgramDataManager&, | 441 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE { |
| 458 const GrGeometryProcessor&, | |
| 459 const GrBatchTracker&) SK_OVERRIDE { | |
| 460 } | 442 } |
| 461 | 443 |
| 462 private: | 444 private: |
| 463 typedef GrGLGeometryProcessor INHERITED; | 445 typedef GrGLGeometryProcessor INHERITED; |
| 464 }; | 446 }; |
| 465 | 447 |
| 466 private: | 448 private: |
| 467 DIEllipseEdgeEffect(Mode mode) { | 449 DIEllipseEdgeEffect(Mode mode) { |
| 468 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); | 450 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr
VertexAttribType)); |
| 469 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", | 451 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset
s0", |
| (...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : | 1244 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : |
| 1263 SK_ARRAY_COUNT(gRRectIndices); | 1245 SK_ARRAY_COUNT(gRRectIndices); |
| 1264 target->setIndexSourceToBuffer(indexBuffer); | 1246 target->setIndexSourceToBuffer(indexBuffer); |
| 1265 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, | 1247 target->drawIndexedInstances(drawState, kTriangles_GrPrimitiveType, 1, 1
6, indexCnt, |
| 1266 &bounds); | 1248 &bounds); |
| 1267 } | 1249 } |
| 1268 | 1250 |
| 1269 target->resetIndexSource(); | 1251 target->resetIndexSource(); |
| 1270 return true; | 1252 return true; |
| 1271 } | 1253 } |
| OLD | NEW |