diff options
author | 2013-01-16 15:16:18 +0000 | |
---|---|---|
committer | 2013-01-16 15:16:18 +0000 | |
commit | 0ac6af49975c54c2debf41e9200af416ecd2d973 (patch) | |
tree | 79ee2038a2b5c994f688f30f9770310555dcc6bf /src/effects/gradients | |
parent | 6f54724c11ab739fa0d6deff1d4b564596fe3970 (diff) |
Wrap GrEffects in GrEffectPtr.
This is the first step towards automatic recycling of scratch resouces in the cache via ref-cnts.
R=robertphillips@google.com
Review URL: https://codereview.appspot.com/7092061
git-svn-id: http://skia.googlecode.com/svn/trunk@7222 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/gradients')
-rw-r--r-- | src/effects/gradients/SkLinearGradient.cpp | 28 | ||||
-rw-r--r-- | src/effects/gradients/SkLinearGradient.h | 2 | ||||
-rw-r--r-- | src/effects/gradients/SkRadialGradient.cpp | 29 | ||||
-rw-r--r-- | src/effects/gradients/SkRadialGradient.h | 2 | ||||
-rw-r--r-- | src/effects/gradients/SkSweepGradient.cpp | 25 | ||||
-rw-r--r-- | src/effects/gradients/SkSweepGradient.h | 2 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.cpp | 34 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.h | 2 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointRadialGradient.cpp | 34 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointRadialGradient.h | 2 |
10 files changed, 98 insertions, 62 deletions
diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index 1788b7ada7..2785806b5d 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -484,11 +484,14 @@ private: class GrLinearGradient : public GrGradientEffect { public: - GrLinearGradient(GrContext* ctx, - const SkLinearGradient& shader, - const SkMatrix& matrix, - SkShader::TileMode tm) - : INHERITED(ctx, shader, matrix, tm) { } + static GrEffectRef* Create(GrContext* ctx, + const SkLinearGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) { + SkAutoTUnref<GrEffect> effect(SkNEW_ARGS(GrLinearGradient, (ctx, shader, matrix, tm))); + return CreateEffectPtr(effect); + } + virtual ~GrLinearGradient() { } static const char* Name() { return "Linear Gradient"; } @@ -499,6 +502,11 @@ public: typedef GrGLLinearGradient GLEffect; private: + GrLinearGradient(GrContext* ctx, + const SkLinearGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) + : INHERITED(ctx, shader, matrix, tm) { } GR_DECLARE_EFFECT_TEST; typedef GrGradientEffect INHERITED; @@ -508,9 +516,9 @@ private: GR_DEFINE_EFFECT_TEST(GrLinearGradient); -GrEffect* GrLinearGradient::TestCreate(SkRandom* random, - GrContext* context, - GrTexture**) { +GrEffectRef* GrLinearGradient::TestCreate(SkRandom* random, + GrContext* context, + GrTexture**) { SkPoint points[] = {{random->nextUScalar1(), random->nextUScalar1()}, {random->nextUScalar1(), random->nextUScalar1()}}; @@ -546,14 +554,14 @@ void GrGLLinearGradient::emitCode(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrEffect* SkLinearGradient::asNewEffect(GrContext* context, const SkPaint&) const { +GrEffectRef* SkLinearGradient::asNewEffect(GrContext* context, const SkPaint&) const { SkASSERT(NULL != context); SkMatrix matrix; if (!this->getLocalMatrix().invert(&matrix)) { return NULL; } matrix.postConcat(fPtsToUnit); - return SkNEW_ARGS(GrLinearGradient, (context, *this, matrix, fTileMode)); + return GrLinearGradient::Create(context, *this, matrix, fTileMode); } #else diff --git a/src/effects/gradients/SkLinearGradient.h b/src/effects/gradients/SkLinearGradient.h index e7935e46d6..046a1e10b4 100644 --- a/src/effects/gradients/SkLinearGradient.h +++ b/src/effects/gradients/SkLinearGradient.h @@ -22,7 +22,7 @@ public: virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE; virtual BitmapType asABitmap(SkBitmap*, SkMatrix*, TileMode*) const SK_OVERRIDE; virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrEffect* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; + virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; SK_DEVELOPER_TO_STRING() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient) diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp index a33a9cd842..4609db1b75 100644 --- a/src/effects/gradients/SkRadialGradient.cpp +++ b/src/effects/gradients/SkRadialGradient.cpp @@ -504,12 +504,12 @@ private: class GrRadialGradient : public GrGradientEffect { public: - - GrRadialGradient(GrContext* ctx, - const SkRadialGradient& shader, - const SkMatrix& matrix, - SkShader::TileMode tm) - : INHERITED(ctx, shader, matrix, tm) { + static GrEffectRef* Create(GrContext* ctx, + const SkRadialGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) { + SkAutoTUnref<GrEffect> effect(SkNEW_ARGS(GrRadialGradient, (ctx, shader, matrix, tm))); + return CreateEffectPtr(effect); } virtual ~GrRadialGradient() { } @@ -522,6 +522,13 @@ public: typedef GrGLRadialGradient GLEffect; private: + GrRadialGradient(GrContext* ctx, + const SkRadialGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) + : INHERITED(ctx, shader, matrix, tm) { + } + GR_DECLARE_EFFECT_TEST; typedef GrGradientEffect INHERITED; @@ -531,9 +538,9 @@ private: GR_DEFINE_EFFECT_TEST(GrRadialGradient); -GrEffect* GrRadialGradient::TestCreate(SkRandom* random, - GrContext* context, - GrTexture**) { +GrEffectRef* GrRadialGradient::TestCreate(SkRandom* random, + GrContext* context, + GrTexture**) { SkPoint center = {random->nextUScalar1(), random->nextUScalar1()}; SkScalar radius = random->nextUScalar1(); @@ -569,7 +576,7 @@ void GrGLRadialGradient::emitCode(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrEffect* SkRadialGradient::asNewEffect(GrContext* context, const SkPaint&) const { +GrEffectRef* SkRadialGradient::asNewEffect(GrContext* context, const SkPaint&) const { SkASSERT(NULL != context); SkMatrix matrix; @@ -577,7 +584,7 @@ GrEffect* SkRadialGradient::asNewEffect(GrContext* context, const SkPaint&) cons return NULL; } matrix.postConcat(fPtsToUnit); - return SkNEW_ARGS(GrRadialGradient, (context, *this, matrix, fTileMode)); + return GrRadialGradient::Create(context, *this, matrix, fTileMode); } #else diff --git a/src/effects/gradients/SkRadialGradient.h b/src/effects/gradients/SkRadialGradient.h index 0bb75c57d7..88530cd51e 100644 --- a/src/effects/gradients/SkRadialGradient.h +++ b/src/effects/gradients/SkRadialGradient.h @@ -24,7 +24,7 @@ public: SkMatrix* matrix, TileMode* xy) const SK_OVERRIDE; virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrEffect* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; + virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; SK_DEVELOPER_TO_STRING() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRadialGradient) diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp index 493109e7ee..91e239c423 100644 --- a/src/effects/gradients/SkSweepGradient.cpp +++ b/src/effects/gradients/SkSweepGradient.cpp @@ -413,11 +413,12 @@ private: class GrSweepGradient : public GrGradientEffect { public: - - GrSweepGradient(GrContext* ctx, - const SkSweepGradient& shader, - const SkMatrix& matrix) - : INHERITED(ctx, shader, matrix, SkShader::kClamp_TileMode) { } + static GrEffectRef* Create(GrContext* ctx, + const SkSweepGradient& shader, + const SkMatrix& matrix) { + SkAutoTUnref<GrEffect> effect(SkNEW_ARGS(GrSweepGradient, (ctx, shader, matrix))); + return CreateEffectPtr(effect); + } virtual ~GrSweepGradient() { } static const char* Name() { return "Sweep Gradient"; } @@ -428,6 +429,10 @@ public: typedef GrGLSweepGradient GLEffect; private: + GrSweepGradient(GrContext* ctx, + const SkSweepGradient& shader, + const SkMatrix& matrix) + : INHERITED(ctx, shader, matrix, SkShader::kClamp_TileMode) { } GR_DECLARE_EFFECT_TEST; typedef GrGradientEffect INHERITED; @@ -437,9 +442,9 @@ private: GR_DEFINE_EFFECT_TEST(GrSweepGradient); -GrEffect* GrSweepGradient::TestCreate(SkRandom* random, - GrContext* context, - GrTexture**) { +GrEffectRef* GrSweepGradient::TestCreate(SkRandom* random, + GrContext* context, + GrTexture**) { SkPoint center = {random->nextUScalar1(), random->nextUScalar1()}; SkColor colors[kMaxRandomGradientColors]; @@ -472,13 +477,13 @@ void GrGLSweepGradient::emitCode(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrEffect* SkSweepGradient::asNewEffect(GrContext* context, const SkPaint&) const { +GrEffectRef* SkSweepGradient::asNewEffect(GrContext* context, const SkPaint&) const { SkMatrix matrix; if (!this->getLocalMatrix().invert(&matrix)) { return NULL; } matrix.postConcat(fPtsToUnit); - return SkNEW_ARGS(GrSweepGradient, (context, *this, matrix)); + return GrSweepGradient::Create(context, *this, matrix); } #else diff --git a/src/effects/gradients/SkSweepGradient.h b/src/effects/gradients/SkSweepGradient.h index 4148966590..95c1419b6f 100644 --- a/src/effects/gradients/SkSweepGradient.h +++ b/src/effects/gradients/SkSweepGradient.h @@ -24,7 +24,7 @@ public: virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrEffect* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; + virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; SK_DEVELOPER_TO_STRING() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSweepGradient) diff --git a/src/effects/gradients/SkTwoPointConicalGradient.cpp b/src/effects/gradients/SkTwoPointConicalGradient.cpp index 23e4dcc295..8d03c13426 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient.cpp @@ -369,14 +369,13 @@ private: class GrConical2Gradient : public GrGradientEffect { public: - GrConical2Gradient(GrContext* ctx, - const SkTwoPointConicalGradient& shader, - const SkMatrix& matrix, - SkShader::TileMode tm) - : INHERITED(ctx, shader, matrix, tm) - , fCenterX1(shader.getCenterX1()) - , fRadius0(shader.getStartRadius()) - , fDiffRadius(shader.getDiffRadius()) { } + static GrEffectRef* Create(GrContext* ctx, + const SkTwoPointConicalGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) { + SkAutoTUnref<GrEffect> effect(SkNEW_ARGS(GrConical2Gradient, (ctx, shader, matrix, tm))); + return CreateEffectPtr(effect); + } virtual ~GrConical2Gradient() { } @@ -401,6 +400,15 @@ public: typedef GrGLConical2Gradient GLEffect; private: + GrConical2Gradient(GrContext* ctx, + const SkTwoPointConicalGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) + : INHERITED(ctx, shader, matrix, tm) + , fCenterX1(shader.getCenterX1()) + , fRadius0(shader.getStartRadius()) + , fDiffRadius(shader.getDiffRadius()) { } + GR_DECLARE_EFFECT_TEST; // @{ @@ -418,9 +426,9 @@ private: GR_DEFINE_EFFECT_TEST(GrConical2Gradient); -GrEffect* GrConical2Gradient::TestCreate(SkRandom* random, - GrContext* context, - GrTexture**) { +GrEffectRef* GrConical2Gradient::TestCreate(SkRandom* random, + GrContext* context, + GrTexture**) { SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; SkScalar radius1 = random->nextUScalar1(); SkPoint center2; @@ -684,7 +692,7 @@ GrGLEffect::EffectKey GrGLConical2Gradient::GenKey(const GrEffectStage& s, const ///////////////////////////////////////////////////////////////////// -GrEffect* SkTwoPointConicalGradient::asNewEffect(GrContext* context, const SkPaint&) const { +GrEffectRef* SkTwoPointConicalGradient::asNewEffect(GrContext* context, const SkPaint&) const { SkASSERT(NULL != context); SkASSERT(fPtsToUnit.isIdentity()); // invert the localM, translate to center1, rotate so center2 is on x axis. @@ -704,7 +712,7 @@ GrEffect* SkTwoPointConicalGradient::asNewEffect(GrContext* context, const SkPai matrix.postConcat(rot); } - return SkNEW_ARGS(GrConical2Gradient, (context, *this, matrix, fTileMode)); + return GrConical2Gradient::Create(context, *this, matrix, fTileMode); } #else diff --git a/src/effects/gradients/SkTwoPointConicalGradient.h b/src/effects/gradients/SkTwoPointConicalGradient.h index 44432cc6be..32a7b80ed8 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.h +++ b/src/effects/gradients/SkTwoPointConicalGradient.h @@ -61,7 +61,7 @@ public: SkMatrix* matrix, TileMode* xy) const; virtual SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrEffect* asNewEffect(GrContext* context, const SkPaint& paint) const SK_OVERRIDE; + virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint& paint) const SK_OVERRIDE; SkScalar getCenterX1() const { return SkPoint::Distance(fCenter1, fCenter2); } SkScalar getStartRadius() const { return fRadius1; } diff --git a/src/effects/gradients/SkTwoPointRadialGradient.cpp b/src/effects/gradients/SkTwoPointRadialGradient.cpp index 2e458097d1..8380a3f5b9 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.cpp +++ b/src/effects/gradients/SkTwoPointRadialGradient.cpp @@ -428,15 +428,14 @@ private: class GrRadial2Gradient : public GrGradientEffect { public: + static GrEffectRef* Create(GrContext* ctx, + const SkTwoPointRadialGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) { + SkAutoTUnref<GrEffect> effect(SkNEW_ARGS(GrRadial2Gradient, (ctx, shader, matrix, tm))); + return CreateEffectPtr(effect); + } - GrRadial2Gradient(GrContext* ctx, - const SkTwoPointRadialGradient& shader, - const SkMatrix& matrix, - SkShader::TileMode tm) - : INHERITED(ctx, shader, matrix, tm) - , fCenterX1(shader.getCenterX1()) - , fRadius0(shader.getStartRadius()) - , fPosRoot(shader.getDiffRadius() < 0) { } virtual ~GrRadial2Gradient() { } static const char* Name() { return "Two-Point Radial Gradient"; } @@ -460,6 +459,15 @@ public: typedef GrGLRadial2Gradient GLEffect; private: + GrRadial2Gradient(GrContext* ctx, + const SkTwoPointRadialGradient& shader, + const SkMatrix& matrix, + SkShader::TileMode tm) + : INHERITED(ctx, shader, matrix, tm) + , fCenterX1(shader.getCenterX1()) + , fRadius0(shader.getStartRadius()) + , fPosRoot(shader.getDiffRadius() < 0) { } + GR_DECLARE_EFFECT_TEST; // @{ @@ -479,9 +487,9 @@ private: GR_DEFINE_EFFECT_TEST(GrRadial2Gradient); -GrEffect* GrRadial2Gradient::TestCreate(SkRandom* random, - GrContext* context, - GrTexture**) { +GrEffectRef* GrRadial2Gradient::TestCreate(SkRandom* random, + GrContext* context, + GrTexture**) { SkPoint center1 = {random->nextUScalar1(), random->nextUScalar1()}; SkScalar radius1 = random->nextUScalar1(); SkPoint center2; @@ -683,7 +691,7 @@ GrGLEffect::EffectKey GrGLRadial2Gradient::GenKey(const GrEffectStage& s, const ///////////////////////////////////////////////////////////////////// -GrEffect* SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPaint&) const { +GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPaint&) const { SkASSERT(NULL != context); // invert the localM, translate to center1 (fPtsToUni), rotate so center2 is on x axis. SkMatrix matrix; @@ -701,7 +709,7 @@ GrEffect* SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPain matrix.postConcat(rot); } - return SkNEW_ARGS(GrRadial2Gradient, (context, *this, matrix, fTileMode)); + return GrRadial2Gradient::Create(context, *this, matrix, fTileMode); } #else diff --git a/src/effects/gradients/SkTwoPointRadialGradient.h b/src/effects/gradients/SkTwoPointRadialGradient.h index e0b00827e1..273d1c932e 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.h +++ b/src/effects/gradients/SkTwoPointRadialGradient.h @@ -23,7 +23,7 @@ public: SkMatrix* matrix, TileMode* xy) const SK_OVERRIDE; virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrEffect* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; + virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint&) const SK_OVERRIDE; virtual void shadeSpan(int x, int y, SkPMColor* dstCParam, int count) SK_OVERRIDE; |