| 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 "GrRRectEffect.h" | 8 #include "GrRRectEffect.h" |
| 9 | 9 |
| 10 #include "GrConvexPolyEffect.h" | 10 #include "GrConvexPolyEffect.h" |
| 11 #include "GrFragmentProcessor.h" | 11 #include "GrFragmentProcessor.h" |
| 12 #include "GrInvariantOutput.h" | 12 #include "GrInvariantOutput.h" |
| 13 #include "GrOvalEffect.h" | 13 #include "GrOvalEffect.h" |
| 14 #include "SkRRect.h" | 14 #include "SkRRect.h" |
| 15 #include "gl/GrGLFragmentProcessor.h" | 15 #include "glsl/GrGLSLFragmentProcessor.h" |
| 16 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 16 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 17 #include "glsl/GrGLSLProgramBuilder.h" | 17 #include "glsl/GrGLSLProgramBuilder.h" |
| 18 #include "glsl/GrGLSLProgramDataManager.h" | 18 #include "glsl/GrGLSLProgramDataManager.h" |
| 19 | 19 |
| 20 // The effects defined here only handle rrect radii >= kRadiusMin. | 20 // The effects defined here only handle rrect radii >= kRadiusMin. |
| 21 static const SkScalar kRadiusMin = SK_ScalarHalf; | 21 static const SkScalar kRadiusMin = SK_ScalarHalf; |
| 22 | 22 |
| 23 ////////////////////////////////////////////////////////////////////////////// | 23 ////////////////////////////////////////////////////////////////////////////// |
| 24 | 24 |
| 25 class CircularRRectEffect : public GrFragmentProcessor { | 25 class CircularRRectEffect : public GrFragmentProcessor { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 53 | 53 |
| 54 const SkRRect& getRRect() const { return fRRect; } | 54 const SkRRect& getRRect() const { return fRRect; } |
| 55 | 55 |
| 56 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } | 56 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } |
| 57 | 57 |
| 58 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 58 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 59 | 59 |
| 60 private: | 60 private: |
| 61 CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const
SkRRect&); | 61 CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const
SkRRect&); |
| 62 | 62 |
| 63 GrGLFragmentProcessor* onCreateGLInstance() const override; | 63 GrGLSLFragmentProcessor* onCreateGLInstance() const override; |
| 64 | 64 |
| 65 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 65 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
| 66 | 66 |
| 67 bool onIsEqual(const GrFragmentProcessor& other) const override; | 67 bool onIsEqual(const GrFragmentProcessor& other) const override; |
| 68 | 68 |
| 69 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 69 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 70 | 70 |
| 71 SkRRect fRRect; | 71 SkRRect fRRect; |
| 72 GrPrimitiveEdgeType fEdgeType; | 72 GrPrimitiveEdgeType fEdgeType; |
| 73 uint32_t fCircularCornerFlags; | 73 uint32_t fCircularCornerFlags; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 do { | 119 do { |
| 120 GrPrimitiveEdgeType et = | 120 GrPrimitiveEdgeType et = |
| 121 (GrPrimitiveEdgeType)d->fRandom->nextULessThan(kGrProcessorEdgeT
ypeCnt); | 121 (GrPrimitiveEdgeType)d->fRandom->nextULessThan(kGrProcessorEdgeT
ypeCnt); |
| 122 fp = GrRRectEffect::Create(et, rrect); | 122 fp = GrRRectEffect::Create(et, rrect); |
| 123 } while (nullptr == fp); | 123 } while (nullptr == fp); |
| 124 return fp; | 124 return fp; |
| 125 } | 125 } |
| 126 | 126 |
| 127 ////////////////////////////////////////////////////////////////////////////// | 127 ////////////////////////////////////////////////////////////////////////////// |
| 128 | 128 |
| 129 class GLCircularRRectEffect : public GrGLFragmentProcessor { | 129 class GLCircularRRectEffect : public GrGLSLFragmentProcessor { |
| 130 public: | 130 public: |
| 131 GLCircularRRectEffect(const GrProcessor&); | 131 GLCircularRRectEffect(const GrProcessor&); |
| 132 | 132 |
| 133 virtual void emitCode(EmitArgs&) override; | 133 virtual void emitCode(EmitArgs&) override; |
| 134 | 134 |
| 135 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 135 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
| 136 | 136 |
| 137 protected: | 137 protected: |
| 138 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 138 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
| 139 | 139 |
| 140 private: | 140 private: |
| 141 GrGLSLProgramDataManager::UniformHandle fInnerRectUniform; | 141 GrGLSLProgramDataManager::UniformHandle fInnerRectUniform; |
| 142 GrGLSLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; | 142 GrGLSLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; |
| 143 SkRRect fPrevRRect; | 143 SkRRect fPrevRRect; |
| 144 typedef GrGLFragmentProcessor INHERITED; | 144 typedef GrGLSLFragmentProcessor INHERITED; |
| 145 }; | 145 }; |
| 146 | 146 |
| 147 GLCircularRRectEffect::GLCircularRRectEffect(const GrProcessor& ) { | 147 GLCircularRRectEffect::GLCircularRRectEffect(const GrProcessor& ) { |
| 148 fPrevRRect.setEmpty(); | 148 fPrevRRect.setEmpty(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 void GLCircularRRectEffect::emitCode(EmitArgs& args) { | 151 void GLCircularRRectEffect::emitCode(EmitArgs& args) { |
| 152 const CircularRRectEffect& crre = args.fFp.cast<CircularRRectEffect>(); | 152 const CircularRRectEffect& crre = args.fFp.cast<CircularRRectEffect>(); |
| 153 const char *rectName; | 153 const char *rectName; |
| 154 const char *radiusPlusHalfName; | 154 const char *radiusPlusHalfName; |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 } | 362 } |
| 363 } | 363 } |
| 364 | 364 |
| 365 ////////////////////////////////////////////////////////////////////////////////
//////////////////// | 365 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
| 366 | 366 |
| 367 void CircularRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 367 void CircularRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 368 GrProcessorKeyBuilder* b) const { | 368 GrProcessorKeyBuilder* b) const { |
| 369 GLCircularRRectEffect::GenKey(*this, caps, b); | 369 GLCircularRRectEffect::GenKey(*this, caps, b); |
| 370 } | 370 } |
| 371 | 371 |
| 372 GrGLFragmentProcessor* CircularRRectEffect::onCreateGLInstance() const { | 372 GrGLSLFragmentProcessor* CircularRRectEffect::onCreateGLInstance() const { |
| 373 return new GLCircularRRectEffect(*this); | 373 return new GLCircularRRectEffect(*this); |
| 374 } | 374 } |
| 375 | 375 |
| 376 ////////////////////////////////////////////////////////////////////////////// | 376 ////////////////////////////////////////////////////////////////////////////// |
| 377 | 377 |
| 378 class EllipticalRRectEffect : public GrFragmentProcessor { | 378 class EllipticalRRectEffect : public GrFragmentProcessor { |
| 379 public: | 379 public: |
| 380 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); | 380 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); |
| 381 | 381 |
| 382 virtual ~EllipticalRRectEffect() {}; | 382 virtual ~EllipticalRRectEffect() {}; |
| 383 | 383 |
| 384 const char* name() const override { return "EllipticalRRect"; } | 384 const char* name() const override { return "EllipticalRRect"; } |
| 385 | 385 |
| 386 const SkRRect& getRRect() const { return fRRect; } | 386 const SkRRect& getRRect() const { return fRRect; } |
| 387 | 387 |
| 388 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 388 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 389 | 389 |
| 390 private: | 390 private: |
| 391 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); | 391 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); |
| 392 | 392 |
| 393 GrGLFragmentProcessor* onCreateGLInstance() const override; | 393 GrGLSLFragmentProcessor* onCreateGLInstance() const override; |
| 394 | 394 |
| 395 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 395 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
| 396 | 396 |
| 397 bool onIsEqual(const GrFragmentProcessor& other) const override; | 397 bool onIsEqual(const GrFragmentProcessor& other) const override; |
| 398 | 398 |
| 399 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 399 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
| 400 | 400 |
| 401 SkRRect fRRect; | 401 SkRRect fRRect; |
| 402 GrPrimitiveEdgeType fEdgeType; | 402 GrPrimitiveEdgeType fEdgeType; |
| 403 | 403 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 do { | 465 do { |
| 466 GrPrimitiveEdgeType et = | 466 GrPrimitiveEdgeType et = |
| 467 (GrPrimitiveEdgeType)d->fRandom->nextULessThan(kGrProcessorEdgeT
ypeCnt); | 467 (GrPrimitiveEdgeType)d->fRandom->nextULessThan(kGrProcessorEdgeT
ypeCnt); |
| 468 fp = GrRRectEffect::Create(et, rrect); | 468 fp = GrRRectEffect::Create(et, rrect); |
| 469 } while (nullptr == fp); | 469 } while (nullptr == fp); |
| 470 return fp; | 470 return fp; |
| 471 } | 471 } |
| 472 | 472 |
| 473 ////////////////////////////////////////////////////////////////////////////// | 473 ////////////////////////////////////////////////////////////////////////////// |
| 474 | 474 |
| 475 class GLEllipticalRRectEffect : public GrGLFragmentProcessor { | 475 class GLEllipticalRRectEffect : public GrGLSLFragmentProcessor { |
| 476 public: | 476 public: |
| 477 GLEllipticalRRectEffect(const GrProcessor&); | 477 GLEllipticalRRectEffect(const GrProcessor&); |
| 478 | 478 |
| 479 virtual void emitCode(EmitArgs&) override; | 479 virtual void emitCode(EmitArgs&) override; |
| 480 | 480 |
| 481 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); | 481 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor
KeyBuilder*); |
| 482 | 482 |
| 483 protected: | 483 protected: |
| 484 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; | 484 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
| 485 | 485 |
| 486 private: | 486 private: |
| 487 GrGLSLProgramDataManager::UniformHandle fInnerRectUniform; | 487 GrGLSLProgramDataManager::UniformHandle fInnerRectUniform; |
| 488 GrGLSLProgramDataManager::UniformHandle fInvRadiiSqdUniform; | 488 GrGLSLProgramDataManager::UniformHandle fInvRadiiSqdUniform; |
| 489 SkRRect fPrevRRect; | 489 SkRRect fPrevRRect; |
| 490 typedef GrGLFragmentProcessor INHERITED; | 490 typedef GrGLSLFragmentProcessor INHERITED; |
| 491 }; | 491 }; |
| 492 | 492 |
| 493 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrProcessor& effect) { | 493 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrProcessor& effect) { |
| 494 fPrevRRect.setEmpty(); | 494 fPrevRRect.setEmpty(); |
| 495 } | 495 } |
| 496 | 496 |
| 497 void GLEllipticalRRectEffect::emitCode(EmitArgs& args) { | 497 void GLEllipticalRRectEffect::emitCode(EmitArgs& args) { |
| 498 const EllipticalRRectEffect& erre = args.fFp.cast<EllipticalRRectEffect>(); | 498 const EllipticalRRectEffect& erre = args.fFp.cast<EllipticalRRectEffect>(); |
| 499 const char *rectName; | 499 const char *rectName; |
| 500 // The inner rect is the rrect bounds inset by the x/y radii | 500 // The inner rect is the rrect bounds inset by the x/y radii |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 } | 613 } |
| 614 } | 614 } |
| 615 | 615 |
| 616 ////////////////////////////////////////////////////////////////////////////////
//////////////////// | 616 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
| 617 | 617 |
| 618 void EllipticalRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, | 618 void EllipticalRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 619 GrProcessorKeyBuilder* b) const
{ | 619 GrProcessorKeyBuilder* b) const
{ |
| 620 GLEllipticalRRectEffect::GenKey(*this, caps, b); | 620 GLEllipticalRRectEffect::GenKey(*this, caps, b); |
| 621 } | 621 } |
| 622 | 622 |
| 623 GrGLFragmentProcessor* EllipticalRRectEffect::onCreateGLInstance() const { | 623 GrGLSLFragmentProcessor* EllipticalRRectEffect::onCreateGLInstance() const { |
| 624 return new GLEllipticalRRectEffect(*this); | 624 return new GLEllipticalRRectEffect(*this); |
| 625 } | 625 } |
| 626 | 626 |
| 627 ////////////////////////////////////////////////////////////////////////////// | 627 ////////////////////////////////////////////////////////////////////////////// |
| 628 | 628 |
| 629 GrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const S
kRRect& rrect) { | 629 GrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const S
kRRect& rrect) { |
| 630 if (rrect.isRect()) { | 630 if (rrect.isRect()) { |
| 631 return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); | 631 return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); |
| 632 } | 632 } |
| 633 | 633 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 if (rrect.isNinePatch()) { | 715 if (rrect.isNinePatch()) { |
| 716 return EllipticalRRectEffect::Create(edgeType, rrect); | 716 return EllipticalRRectEffect::Create(edgeType, rrect); |
| 717 } | 717 } |
| 718 return nullptr; | 718 return nullptr; |
| 719 } | 719 } |
| 720 } | 720 } |
| 721 } | 721 } |
| 722 | 722 |
| 723 return nullptr; | 723 return nullptr; |
| 724 } | 724 } |
| OLD | NEW |