Index: src/gpu/effects/GrRRectEffect.cpp |
diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp |
index 3923a6f36bc2e76fe82101b2973b6067b1eb3e53..3b7cecaff0461a0e34182190146182c4c9903718 100644 |
--- a/src/gpu/effects/GrRRectEffect.cpp |
+++ b/src/gpu/effects/GrRRectEffect.cpp |
@@ -11,16 +11,87 @@ |
#include "gl/GrGLSL.h" |
#include "GrTBackendEffectFactory.h" |
-#include "SkPath.h" |
+#include "SkRRect.h" |
-// This effect only supports circular corner rrects where all corners have the same radius |
-// which must be <= kRadiusMin. |
-static const SkScalar kRadiusMin = 0.5f; |
+class GLRRectEffect; |
+ |
+class RRectEffect : public GrEffect { |
+public: |
+ // This effect only supports circular corner rrects where all corners have the same radius |
+ // which must be <= kRadiusMin. |
+ static const SkScalar kRadiusMin; |
+ |
+ static GrEffectRef* Create(const SkRRect&); |
+ |
+ virtual ~RRectEffect() {}; |
+ static const char* Name() { return "RRect"; } |
+ |
+ const SkRRect& getRRect() const { return fRRect; } |
+ |
+ typedef GLRRectEffect GLEffect; |
+ |
+ virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; |
+ |
+ virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
+ |
+private: |
+ RRectEffect(const SkRRect&); |
+ |
+ virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; |
+ |
+ SkRRect fRRect; |
+ |
+ GR_DECLARE_EFFECT_TEST; |
+ |
+ typedef GrEffect INHERITED; |
+}; |
+ |
+const SkScalar RRectEffect::kRadiusMin = 0.5f; |
+ |
+GrEffectRef* RRectEffect::Create(const SkRRect& rrect) { |
+ return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(RRectEffect, (rrect)))); |
+} |
+ |
+void RRectEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { |
+ *validFlags = 0; |
+} |
+ |
+const GrBackendEffectFactory& RRectEffect::getFactory() const { |
+ return GrTBackendEffectFactory<RRectEffect>::getInstance(); |
+} |
+ |
+RRectEffect::RRectEffect(const SkRRect& rrect) |
+ : fRRect(rrect) { |
+ this->setWillReadFragmentPosition(); |
+} |
+ |
+bool RRectEffect::onIsEqual(const GrEffect& other) const { |
+ const RRectEffect& rre = CastEffect<RRectEffect>(other); |
+ return fRRect == rre.fRRect; |
+} |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+GR_DEFINE_EFFECT_TEST(RRectEffect); |
+ |
+GrEffectRef* RRectEffect::TestCreate(SkRandom* random, |
+ GrContext*, |
+ const GrDrawTargetCaps& caps, |
+ GrTexture*[]) { |
+ SkScalar w = random->nextRangeScalar(20.f, 1000.f); |
+ SkScalar h = random->nextRangeScalar(20.f, 1000.f); |
+ SkScalar r = random->nextRangeF(kRadiusMin, 9.f); |
+ SkRRect rrect; |
+ rrect.setRectXY(SkRect::MakeWH(w, h), r, r); |
+ |
+ return GrRRectEffect::Create(rrect); |
+} |
////////////////////////////////////////////////////////////////////////////// |
-class GrGLRRectEffect : public GrGLEffect { |
+ |
+class GLRRectEffect : public GrGLEffect { |
public: |
- GrGLRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); |
+ GLRRectEffect(const GrBackendEffectFactory&, const GrDrawEffect&); |
virtual void emitCode(GrGLShaderBuilder* builder, |
const GrDrawEffect& drawEffect, |
@@ -41,19 +112,19 @@ private: |
typedef GrGLEffect INHERITED; |
}; |
-GrGLRRectEffect::GrGLRRectEffect(const GrBackendEffectFactory& factory, |
- const GrDrawEffect& drawEffect) |
+GLRRectEffect::GLRRectEffect(const GrBackendEffectFactory& factory, |
+ const GrDrawEffect& drawEffect) |
: INHERITED (factory) { |
fPrevRRect.setEmpty(); |
} |
-void GrGLRRectEffect::emitCode(GrGLShaderBuilder* builder, |
- const GrDrawEffect& drawEffect, |
- EffectKey key, |
- const char* outputColor, |
- const char* inputColor, |
- const TransformedCoordsArray&, |
- const TextureSamplerArray& samplers) { |
+void GLRRectEffect::emitCode(GrGLShaderBuilder* builder, |
+ const GrDrawEffect& drawEffect, |
+ EffectKey key, |
+ const char* outputColor, |
+ const char* inputColor, |
+ const TransformedCoordsArray&, |
+ const TextureSamplerArray& samplers) { |
const char *rectName; |
const char *radiusPlusHalfName; |
// The inner rect is the rrect bounds inset by the radius. Its top, left, right, and bottom |
@@ -88,14 +159,14 @@ void GrGLRRectEffect::emitCode(GrGLShaderBuilder* builder, |
(GrGLSLExpr4(inputColor) * GrGLSLExpr1("alpha")).c_str()); |
} |
-void GrGLRRectEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) { |
- const GrRRectEffect& rre = drawEffect.castEffect<GrRRectEffect>(); |
+void GLRRectEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) { |
+ const RRectEffect& rre = drawEffect.castEffect<RRectEffect>(); |
const SkRRect& rrect = rre.getRRect(); |
if (rrect != fPrevRRect) { |
SkASSERT(rrect.isSimpleCircular()); |
SkRect rect = rrect.getBounds(); |
SkScalar radius = rrect.getSimpleRadii().fX; |
- SkASSERT(radius >= kRadiusMin); |
+ SkASSERT(radius >= RRectEffect::kRadiusMin); |
rect.inset(radius, radius); |
uman.set4f(fInnerRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); |
uman.set1f(fRadiusPlusHalfUniform, radius + 0.5f); |
@@ -109,47 +180,10 @@ GrEffectRef* GrRRectEffect::Create(const SkRRect& rrect) { |
if (!rrect.isSimpleCircular()) { |
return NULL; |
} |
- if (rrect.getSimpleRadii().fX < kRadiusMin) { |
+ |
+ if (rrect.getSimpleRadii().fX < RRectEffect::kRadiusMin) { |
return NULL; |
} |
- return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(GrRRectEffect, (rrect)))); |
-} |
- |
-GrRRectEffect::~GrRRectEffect() {} |
- |
-void GrRRectEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { |
- *validFlags = 0; |
-} |
- |
-const GrBackendEffectFactory& GrRRectEffect::getFactory() const { |
- return GrTBackendEffectFactory<GrRRectEffect>::getInstance(); |
-} |
-GrRRectEffect::GrRRectEffect(const SkRRect& rrect) |
- : fRRect(rrect) { |
- SkASSERT(rrect.isSimpleCircular()); |
- SkASSERT(rrect.getSimpleRadii().fX >= kRadiusMin); |
- this->setWillReadFragmentPosition(); |
-} |
- |
-bool GrRRectEffect::onIsEqual(const GrEffect& other) const { |
- const GrRRectEffect& rre = CastEffect<GrRRectEffect>(other); |
- return fRRect == rre.fRRect; |
-} |
- |
-////////////////////////////////////////////////////////////////////////////// |
- |
-GR_DEFINE_EFFECT_TEST(GrRRectEffect); |
- |
-GrEffectRef* GrRRectEffect::TestCreate(SkRandom* random, |
- GrContext*, |
- const GrDrawTargetCaps& caps, |
- GrTexture*[]) { |
- SkScalar w = random->nextRangeScalar(20.f, 1000.f); |
- SkScalar h = random->nextRangeScalar(20.f, 1000.f); |
- SkScalar r = random->nextRangeF(kRadiusMin, 9.f); |
- SkRRect rrect; |
- rrect.setRectXY(SkRect::MakeWH(w, h), r, r); |
- |
- return GrRRectEffect::Create(rrect); |
+ return RRectEffect::Create(rrect); |
} |