| 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 "gl/builders/GrGLProgramBuilder.h" | |
| 9 #include "GrRRectEffect.h" | 8 #include "GrRRectEffect.h" |
| 10 | 9 |
| 10 #include "GrConvexPolyEffect.h" |
| 11 #include "GrFragmentProcessor.h" |
| 12 #include "GrInvariantOutput.h" |
| 13 #include "GrOvalEffect.h" |
| 14 #include "SkRRect.h" |
| 11 #include "gl/GrGLProcessor.h" | 15 #include "gl/GrGLProcessor.h" |
| 12 #include "gl/GrGLSL.h" | 16 #include "gl/GrGLSL.h" |
| 13 #include "GrConvexPolyEffect.h" | 17 #include "gl/builders/GrGLProgramBuilder.h" |
| 14 #include "GrInvariantOutput.h" | |
| 15 #include "GrOvalEffect.h" | |
| 16 #include "GrTBackendProcessorFactory.h" | |
| 17 | |
| 18 #include "SkRRect.h" | |
| 19 | 18 |
| 20 // The effects defined here only handle rrect radii >= kRadiusMin. | 19 // The effects defined here only handle rrect radii >= kRadiusMin. |
| 21 static const SkScalar kRadiusMin = SK_ScalarHalf; | 20 static const SkScalar kRadiusMin = SK_ScalarHalf; |
| 22 | 21 |
| 23 ////////////////////////////////////////////////////////////////////////////// | 22 ////////////////////////////////////////////////////////////////////////////// |
| 24 | 23 |
| 25 class GLCircularRRectEffect; | |
| 26 | |
| 27 class CircularRRectEffect : public GrFragmentProcessor { | 24 class CircularRRectEffect : public GrFragmentProcessor { |
| 28 public: | 25 public: |
| 29 | 26 |
| 30 enum CornerFlags { | 27 enum CornerFlags { |
| 31 kTopLeft_CornerFlag = (1 << SkRRect::kUpperLeft_Corner), | 28 kTopLeft_CornerFlag = (1 << SkRRect::kUpperLeft_Corner), |
| 32 kTopRight_CornerFlag = (1 << SkRRect::kUpperRight_Corner), | 29 kTopRight_CornerFlag = (1 << SkRRect::kUpperRight_Corner), |
| 33 kBottomRight_CornerFlag = (1 << SkRRect::kLowerRight_Corner), | 30 kBottomRight_CornerFlag = (1 << SkRRect::kLowerRight_Corner), |
| 34 kBottomLeft_CornerFlag = (1 << SkRRect::kLowerLeft_Corner), | 31 kBottomLeft_CornerFlag = (1 << SkRRect::kLowerLeft_Corner), |
| 35 | 32 |
| 36 kLeft_CornerFlags = kTopLeft_CornerFlag | kBottomLeft_CornerFlag, | 33 kLeft_CornerFlags = kTopLeft_CornerFlag | kBottomLeft_CornerFlag, |
| 37 kTop_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag, | 34 kTop_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag, |
| 38 kRight_CornerFlags = kTopRight_CornerFlag | kBottomRight_CornerFlag, | 35 kRight_CornerFlags = kTopRight_CornerFlag | kBottomRight_CornerFlag, |
| 39 kBottom_CornerFlags = kBottomLeft_CornerFlag | kBottomRight_CornerFlag, | 36 kBottom_CornerFlags = kBottomLeft_CornerFlag | kBottomRight_CornerFlag, |
| 40 | 37 |
| 41 kAll_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag | | 38 kAll_CornerFlags = kTopLeft_CornerFlag | kTopRight_CornerFlag | |
| 42 kBottomLeft_CornerFlag | kBottomRight_CornerFlag, | 39 kBottomLeft_CornerFlag | kBottomRight_CornerFlag, |
| 43 | 40 |
| 44 kNone_CornerFlags = 0 | 41 kNone_CornerFlags = 0 |
| 45 }; | 42 }; |
| 46 | 43 |
| 47 // The flags are used to indicate which corners are circluar (unflagged corn
ers are assumed to | 44 // The flags are used to indicate which corners are circluar (unflagged corn
ers are assumed to |
| 48 // be square). | 45 // be square). |
| 49 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCor
nerFlags, | 46 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, uint32_t circularCor
nerFlags, |
| 50 const SkRRect&); | 47 const SkRRect&); |
| 51 | 48 |
| 52 virtual ~CircularRRectEffect() {}; | 49 virtual ~CircularRRectEffect() {}; |
| 53 static const char* Name() { return "CircularRRect"; } | 50 |
| 51 virtual const char* name() const SK_OVERRIDE { return "CircularRRect"; } |
| 52 |
| 53 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 54 |
| 55 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 56 |
| 57 virtual uint32_t classID() const { |
| 58 static uint32_t id = GenClassID(); |
| 59 return id; |
| 60 } |
| 54 | 61 |
| 55 const SkRRect& getRRect() const { return fRRect; } | 62 const SkRRect& getRRect() const { return fRRect; } |
| 56 | 63 |
| 57 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } | 64 uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } |
| 58 | 65 |
| 59 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 66 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 60 | 67 |
| 61 typedef GLCircularRRectEffect GLProcessor; | |
| 62 | |
| 63 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | |
| 64 | |
| 65 private: | 68 private: |
| 66 CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const
SkRRect&); | 69 CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const
SkRRect&); |
| 67 | 70 |
| 68 virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; | 71 virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; |
| 69 | 72 |
| 70 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 73 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; |
| 71 | 74 |
| 72 SkRRect fRRect; | 75 SkRRect fRRect; |
| 73 GrPrimitiveEdgeType fEdgeType; | 76 GrPrimitiveEdgeType fEdgeType; |
| 74 uint32_t fCircularCornerFlags; | 77 uint32_t fCircularCornerFlags; |
| 75 | 78 |
| 76 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 79 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 77 | 80 |
| 78 typedef GrFragmentProcessor INHERITED; | 81 typedef GrFragmentProcessor INHERITED; |
| 79 }; | 82 }; |
| 80 | 83 |
| 81 GrFragmentProcessor* CircularRRectEffect::Create(GrPrimitiveEdgeType edgeType, | 84 GrFragmentProcessor* CircularRRectEffect::Create(GrPrimitiveEdgeType edgeType, |
| 82 uint32_t circularCornerFlags, | 85 uint32_t circularCornerFlags, |
| 83 const SkRRect& rrect) { | 86 const SkRRect& rrect) { |
| 84 if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdg
eType != edgeType) { | 87 if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdg
eType != edgeType) { |
| 85 return NULL; | 88 return NULL; |
| 86 } | 89 } |
| 87 return SkNEW_ARGS(CircularRRectEffect, (edgeType, circularCornerFlags, rrect
)); | 90 return SkNEW_ARGS(CircularRRectEffect, (edgeType, circularCornerFlags, rrect
)); |
| 88 } | 91 } |
| 89 | 92 |
| 90 void CircularRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) con
st { | 93 void CircularRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) con
st { |
| 91 inout->mulByUnknownAlpha(); | 94 inout->mulByUnknownAlpha(); |
| 92 } | 95 } |
| 93 | 96 |
| 94 const GrBackendFragmentProcessorFactory& CircularRRectEffect::getFactory() const
{ | |
| 95 return GrTBackendFragmentProcessorFactory<CircularRRectEffect>::getInstance(
); | |
| 96 } | |
| 97 | |
| 98 CircularRRectEffect::CircularRRectEffect(GrPrimitiveEdgeType edgeType, uint32_t
circularCornerFlags, | 97 CircularRRectEffect::CircularRRectEffect(GrPrimitiveEdgeType edgeType, uint32_t
circularCornerFlags, |
| 99 const SkRRect& rrect) | 98 const SkRRect& rrect) |
| 100 : fRRect(rrect) | 99 : fRRect(rrect) |
| 101 , fEdgeType(edgeType) | 100 , fEdgeType(edgeType) |
| 102 , fCircularCornerFlags(circularCornerFlags) { | 101 , fCircularCornerFlags(circularCornerFlags) { |
| 103 this->setWillReadFragmentPosition(); | 102 this->setWillReadFragmentPosition(); |
| 104 } | 103 } |
| 105 | 104 |
| 106 bool CircularRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { | 105 bool CircularRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { |
| 107 const CircularRRectEffect& crre = other.cast<CircularRRectEffect>(); | 106 const CircularRRectEffect& crre = other.cast<CircularRRectEffect>(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 128 (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeC
nt); | 127 (GrPrimitiveEdgeType)random->nextULessThan(kGrProcessorEdgeTypeC
nt); |
| 129 fp = GrRRectEffect::Create(et, rrect); | 128 fp = GrRRectEffect::Create(et, rrect); |
| 130 } while (NULL == fp); | 129 } while (NULL == fp); |
| 131 return fp; | 130 return fp; |
| 132 } | 131 } |
| 133 | 132 |
| 134 ////////////////////////////////////////////////////////////////////////////// | 133 ////////////////////////////////////////////////////////////////////////////// |
| 135 | 134 |
| 136 class GLCircularRRectEffect : public GrGLFragmentProcessor { | 135 class GLCircularRRectEffect : public GrGLFragmentProcessor { |
| 137 public: | 136 public: |
| 138 GLCircularRRectEffect(const GrBackendProcessorFactory&, const GrProcessor&); | 137 GLCircularRRectEffect(const GrProcessor&); |
| 139 | 138 |
| 140 virtual void emitCode(GrGLFPBuilder* builder, | 139 virtual void emitCode(GrGLFPBuilder* builder, |
| 141 const GrFragmentProcessor& fp, | 140 const GrFragmentProcessor& fp, |
| 142 const char* outputColor, | 141 const char* outputColor, |
| 143 const char* inputColor, | 142 const char* inputColor, |
| 144 const TransformedCoordsArray&, | 143 const TransformedCoordsArray&, |
| 145 const TextureSamplerArray&) SK_OVERRIDE; | 144 const TextureSamplerArray&) SK_OVERRIDE; |
| 146 | 145 |
| 147 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 146 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
| 148 | 147 |
| 149 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 148 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
| 150 | 149 |
| 151 private: | 150 private: |
| 152 GrGLProgramDataManager::UniformHandle fInnerRectUniform; | 151 GrGLProgramDataManager::UniformHandle fInnerRectUniform; |
| 153 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; | 152 GrGLProgramDataManager::UniformHandle fRadiusPlusHalfUniform; |
| 154 SkRRect fPrevRRect; | 153 SkRRect fPrevRRect; |
| 155 typedef GrGLFragmentProcessor INHERITED; | 154 typedef GrGLFragmentProcessor INHERITED; |
| 156 }; | 155 }; |
| 157 | 156 |
| 158 GLCircularRRectEffect::GLCircularRRectEffect(const GrBackendProcessorFactory& fa
ctory, | 157 GLCircularRRectEffect::GLCircularRRectEffect(const GrProcessor& ) { |
| 159 const GrProcessor& ) | |
| 160 : INHERITED (factory) { | |
| 161 fPrevRRect.setEmpty(); | 158 fPrevRRect.setEmpty(); |
| 162 } | 159 } |
| 163 | 160 |
| 164 void GLCircularRRectEffect::emitCode(GrGLFPBuilder* builder, | 161 void GLCircularRRectEffect::emitCode(GrGLFPBuilder* builder, |
| 165 const GrFragmentProcessor& fp, | 162 const GrFragmentProcessor& fp, |
| 166 const char* outputColor, | 163 const char* outputColor, |
| 167 const char* inputColor, | 164 const char* inputColor, |
| 168 const TransformedCoordsArray&, | 165 const TransformedCoordsArray&, |
| 169 const TextureSamplerArray& samplers) { | 166 const TextureSamplerArray& samplers) { |
| 170 const CircularRRectEffect& crre = fp.cast<CircularRRectEffect>(); | 167 const CircularRRectEffect& crre = fp.cast<CircularRRectEffect>(); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 break; | 370 break; |
| 374 default: | 371 default: |
| 375 SkFAIL("Should have been one of the above cases."); | 372 SkFAIL("Should have been one of the above cases."); |
| 376 } | 373 } |
| 377 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); | 374 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); |
| 378 pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); | 375 pdman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); |
| 379 fPrevRRect = rrect; | 376 fPrevRRect = rrect; |
| 380 } | 377 } |
| 381 } | 378 } |
| 382 | 379 |
| 380 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
| 381 |
| 382 void CircularRRectEffect::getGLProcessorKey(const GrGLCaps& caps, |
| 383 GrProcessorKeyBuilder* b) const { |
| 384 GLCircularRRectEffect::GenKey(*this, caps, b); |
| 385 } |
| 386 |
| 387 GrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const { |
| 388 return SkNEW_ARGS(GLCircularRRectEffect, (*this)); |
| 389 } |
| 390 |
| 383 ////////////////////////////////////////////////////////////////////////////// | 391 ////////////////////////////////////////////////////////////////////////////// |
| 384 | 392 |
| 385 class GLEllipticalRRectEffect; | |
| 386 | |
| 387 class EllipticalRRectEffect : public GrFragmentProcessor { | 393 class EllipticalRRectEffect : public GrFragmentProcessor { |
| 388 public: | 394 public: |
| 389 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); | 395 static GrFragmentProcessor* Create(GrPrimitiveEdgeType, const SkRRect&); |
| 390 | 396 |
| 391 virtual ~EllipticalRRectEffect() {}; | 397 virtual ~EllipticalRRectEffect() {}; |
| 392 static const char* Name() { return "EllipticalRRect"; } | 398 |
| 399 virtual const char* name() const SK_OVERRIDE { return "EllipticalRRect"; } |
| 400 |
| 401 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 402 |
| 403 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 404 |
| 405 virtual uint32_t classID() const { |
| 406 static uint32_t id = GenClassID(); |
| 407 return id; |
| 408 } |
| 393 | 409 |
| 394 const SkRRect& getRRect() const { return fRRect; } | 410 const SkRRect& getRRect() const { return fRRect; } |
| 395 | 411 |
| 396 | |
| 397 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } | 412 GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } |
| 398 | 413 |
| 399 typedef GLEllipticalRRectEffect GLProcessor; | |
| 400 | |
| 401 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | |
| 402 | |
| 403 private: | 414 private: |
| 404 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); | 415 EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); |
| 405 | 416 |
| 406 virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; | 417 virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE; |
| 407 | 418 |
| 408 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; | 419 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVE
RRIDE; |
| 409 | 420 |
| 410 SkRRect fRRect; | 421 SkRRect fRRect; |
| 411 GrPrimitiveEdgeType fEdgeType; | 422 GrPrimitiveEdgeType fEdgeType; |
| 412 | 423 |
| 413 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 424 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
| 414 | 425 |
| 415 typedef GrFragmentProcessor INHERITED; | 426 typedef GrFragmentProcessor INHERITED; |
| 416 }; | 427 }; |
| 417 | 428 |
| 418 GrFragmentProcessor* | 429 GrFragmentProcessor* |
| 419 EllipticalRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect
) { | 430 EllipticalRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect
) { |
| 420 if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdg
eType != edgeType) { | 431 if (kFillAA_GrProcessorEdgeType != edgeType && kInverseFillAA_GrProcessorEdg
eType != edgeType) { |
| 421 return NULL; | 432 return NULL; |
| 422 } | 433 } |
| 423 return SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect)); | 434 return SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect)); |
| 424 } | 435 } |
| 425 | 436 |
| 426 void EllipticalRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) c
onst { | 437 void EllipticalRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) c
onst { |
| 427 inout->mulByUnknownAlpha(); | 438 inout->mulByUnknownAlpha(); |
| 428 } | 439 } |
| 429 | 440 |
| 430 const GrBackendFragmentProcessorFactory& EllipticalRRectEffect::getFactory() con
st { | |
| 431 return GrTBackendFragmentProcessorFactory<EllipticalRRectEffect>::getInstanc
e(); | |
| 432 } | |
| 433 | |
| 434 EllipticalRRectEffect::EllipticalRRectEffect(GrPrimitiveEdgeType edgeType, const
SkRRect& rrect) | 441 EllipticalRRectEffect::EllipticalRRectEffect(GrPrimitiveEdgeType edgeType, const
SkRRect& rrect) |
| 435 : fRRect(rrect) | 442 : fRRect(rrect) |
| 436 , fEdgeType(edgeType){ | 443 , fEdgeType(edgeType){ |
| 437 this->setWillReadFragmentPosition(); | 444 this->setWillReadFragmentPosition(); |
| 438 } | 445 } |
| 439 | 446 |
| 440 bool EllipticalRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { | 447 bool EllipticalRRectEffect::onIsEqual(const GrFragmentProcessor& other) const { |
| 441 const EllipticalRRectEffect& erre = other.cast<EllipticalRRectEffect>(); | 448 const EllipticalRRectEffect& erre = other.cast<EllipticalRRectEffect>(); |
| 442 return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; | 449 return fEdgeType == erre.fEdgeType && fRRect == erre.fRRect; |
| 443 } | 450 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)random->nextULessThan(kGrP
rocessorEdgeTypeCnt); | 488 GrPrimitiveEdgeType et = (GrPrimitiveEdgeType)random->nextULessThan(kGrP
rocessorEdgeTypeCnt); |
| 482 fp = GrRRectEffect::Create(et, rrect); | 489 fp = GrRRectEffect::Create(et, rrect); |
| 483 } while (NULL == fp); | 490 } while (NULL == fp); |
| 484 return fp; | 491 return fp; |
| 485 } | 492 } |
| 486 | 493 |
| 487 ////////////////////////////////////////////////////////////////////////////// | 494 ////////////////////////////////////////////////////////////////////////////// |
| 488 | 495 |
| 489 class GLEllipticalRRectEffect : public GrGLFragmentProcessor { | 496 class GLEllipticalRRectEffect : public GrGLFragmentProcessor { |
| 490 public: | 497 public: |
| 491 GLEllipticalRRectEffect(const GrBackendProcessorFactory&, const GrProcessor&
); | 498 GLEllipticalRRectEffect(const GrProcessor&); |
| 492 | 499 |
| 493 virtual void emitCode(GrGLFPBuilder* builder, | 500 virtual void emitCode(GrGLFPBuilder* builder, |
| 494 const GrFragmentProcessor& effect, | 501 const GrFragmentProcessor& effect, |
| 495 const char* outputColor, | 502 const char* outputColor, |
| 496 const char* inputColor, | 503 const char* inputColor, |
| 497 const TransformedCoordsArray&, | 504 const TransformedCoordsArray&, |
| 498 const TextureSamplerArray&) SK_OVERRIDE; | 505 const TextureSamplerArray&) SK_OVERRIDE; |
| 499 | 506 |
| 500 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 507 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
| 501 | 508 |
| 502 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 509 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
| 503 | 510 |
| 504 private: | 511 private: |
| 505 GrGLProgramDataManager::UniformHandle fInnerRectUniform; | 512 GrGLProgramDataManager::UniformHandle fInnerRectUniform; |
| 506 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; | 513 GrGLProgramDataManager::UniformHandle fInvRadiiSqdUniform; |
| 507 SkRRect fPrevRRect; | 514 SkRRect fPrevRRect; |
| 508 typedef GrGLFragmentProcessor INHERITED; | 515 typedef GrGLFragmentProcessor INHERITED; |
| 509 }; | 516 }; |
| 510 | 517 |
| 511 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrBackendProcessorFactory
& factory, | 518 GLEllipticalRRectEffect::GLEllipticalRRectEffect(const GrProcessor& effect) { |
| 512 const GrProcessor& effect) | |
| 513 : INHERITED (factory) { | |
| 514 fPrevRRect.setEmpty(); | 519 fPrevRRect.setEmpty(); |
| 515 } | 520 } |
| 516 | 521 |
| 517 void GLEllipticalRRectEffect::emitCode(GrGLFPBuilder* builder, | 522 void GLEllipticalRRectEffect::emitCode(GrGLFPBuilder* builder, |
| 518 const GrFragmentProcessor& effect, | 523 const GrFragmentProcessor& effect, |
| 519 const char* outputColor, | 524 const char* outputColor, |
| 520 const char* inputColor, | 525 const char* inputColor, |
| 521 const TransformedCoordsArray&, | 526 const TransformedCoordsArray&, |
| 522 const TextureSamplerArray& samplers) { | 527 const TextureSamplerArray& samplers) { |
| 523 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); | 528 const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 break; | 632 break; |
| 628 } | 633 } |
| 629 default: | 634 default: |
| 630 SkFAIL("RRect should always be simple or nine-patch."); | 635 SkFAIL("RRect should always be simple or nine-patch."); |
| 631 } | 636 } |
| 632 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); | 637 pdman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.
fBottom); |
| 633 fPrevRRect = rrect; | 638 fPrevRRect = rrect; |
| 634 } | 639 } |
| 635 } | 640 } |
| 636 | 641 |
| 642 ////////////////////////////////////////////////////////////////////////////////
//////////////////// |
| 643 |
| 644 void EllipticalRRectEffect::getGLProcessorKey(const GrGLCaps& caps, |
| 645 GrProcessorKeyBuilder* b) const { |
| 646 GLEllipticalRRectEffect::GenKey(*this, caps, b); |
| 647 } |
| 648 |
| 649 GrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const { |
| 650 return SkNEW_ARGS(GLEllipticalRRectEffect, (*this)); |
| 651 } |
| 652 |
| 637 ////////////////////////////////////////////////////////////////////////////// | 653 ////////////////////////////////////////////////////////////////////////////// |
| 638 | 654 |
| 639 GrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const S
kRRect& rrect) { | 655 GrFragmentProcessor* GrRRectEffect::Create(GrPrimitiveEdgeType edgeType, const S
kRRect& rrect) { |
| 640 if (rrect.isRect()) { | 656 if (rrect.isRect()) { |
| 641 return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); | 657 return GrConvexPolyEffect::Create(edgeType, rrect.getBounds()); |
| 642 } | 658 } |
| 643 | 659 |
| 644 if (rrect.isOval()) { | 660 if (rrect.isOval()) { |
| 645 return GrOvalEffect::Create(edgeType, rrect.getBounds()); | 661 return GrOvalEffect::Create(edgeType, rrect.getBounds()); |
| 646 } | 662 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 if (rrect.isNinePatch()) { | 741 if (rrect.isNinePatch()) { |
| 726 return EllipticalRRectEffect::Create(edgeType, rrect); | 742 return EllipticalRRectEffect::Create(edgeType, rrect); |
| 727 } | 743 } |
| 728 return NULL; | 744 return NULL; |
| 729 } | 745 } |
| 730 } | 746 } |
| 731 } | 747 } |
| 732 | 748 |
| 733 return NULL; | 749 return NULL; |
| 734 } | 750 } |
| OLD | NEW |