diff options
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkBlendImageFilter.cpp | 6 | ||||
-rw-r--r-- | src/effects/SkMorphologyImageFilter.cpp | 3 | ||||
-rw-r--r-- | src/effects/gradients/SkLinearGradient.cpp | 33 | ||||
-rw-r--r-- | src/effects/gradients/SkLinearGradient.h | 3 | ||||
-rw-r--r-- | src/effects/gradients/SkRadialGradient.cpp | 32 | ||||
-rw-r--r-- | src/effects/gradients/SkRadialGradient.h | 3 | ||||
-rw-r--r-- | src/effects/gradients/SkSweepGradient.cpp | 32 | ||||
-rw-r--r-- | src/effects/gradients/SkSweepGradient.h | 3 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.cpp | 40 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.h | 3 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointRadialGradient.cpp | 39 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointRadialGradient.h | 3 |
12 files changed, 128 insertions, 72 deletions
diff --git a/src/effects/SkBlendImageFilter.cpp b/src/effects/SkBlendImageFilter.cpp index 7933e27999..1fa3c0da6b 100644 --- a/src/effects/SkBlendImageFilter.cpp +++ b/src/effects/SkBlendImageFilter.cpp @@ -206,10 +206,8 @@ GrTexture* SkBlendImageFilter::onFilterImageGPU(Proxy* proxy, GrTexture* src, co GrMatrix sampleM; sampleM.setIDiv(background->width(), background->height()); GrPaint paint; - paint.colorSampler(0)->reset(sampleM); - paint.colorSampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (background.get())))->unref(); - paint.colorSampler(1)->reset(sampleM); - paint.colorSampler(1)->setCustomStage(SkNEW_ARGS(GrBlendEffect, (fMode, foreground.get())))->unref(); + paint.colorSampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (background.get())), sampleM)->unref(); + paint.colorSampler(1)->setCustomStage(SkNEW_ARGS(GrBlendEffect, (fMode, foreground.get())), sampleM)->unref(); context->drawRect(paint, rect); return dst; } diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 64d22be56e..9bddb9b9e6 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -431,8 +431,7 @@ void apply_morphology_pass(GrContext* context, GrMatrix sampleM; sampleM.setIDiv(texture->width(), texture->height()); GrPaint paint; - paint.colorSampler(0)->reset(sampleM); - paint.colorSampler(0)->setCustomStage(SkNEW_ARGS(GrMorphologyEffect, (texture, direction, radius, morphType)))->unref(); + paint.colorSampler(0)->setCustomStage(SkNEW_ARGS(GrMorphologyEffect, (texture, direction, radius, morphType)), sampleM)->unref(); context->drawRect(paint, rect); } diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index 4b673f6691..fff218010a 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -539,9 +539,11 @@ GrCustomStage* GrLinearGradient::TestCreate(SkRandom* random, colors, stops, colorCount, tm)); GrSamplerState sampler; - GrCustomStage* stage = shader->asNewCustomStage(context, &sampler); - GrAssert(NULL != stage); - return stage; + shader->asNewCustomStage(context, &sampler); + GrAssert(NULL != sampler.getCustomStage()); + // const_cast and ref is a hack! Will remove when asNewCustomStage returns GrCustomStage* + sampler.getCustomStage()->ref(); + return const_cast<GrCustomStage*>(sampler.getCustomStage()); } ///////////////////////////////////////////////////////////////////// @@ -557,19 +559,30 @@ void GrGLLinearGradient::emitFS(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrCustomStage* SkLinearGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { +bool SkLinearGradient::asNewCustomStage(GrContext* context, GrSamplerState* sampler) const { SkASSERT(NULL != context && NULL != sampler); - sampler->matrix()->preConcat(fPtsToUnit); - return SkNEW_ARGS(GrLinearGradient, (context, *this, fTileMode)); + + SkAutoTUnref<GrCustomStage> stage(SkNEW_ARGS(GrLinearGradient, (context, *this, fTileMode))); + + SkMatrix matrix; + if (this->getLocalMatrix(&matrix)) { + if (!matrix.invert(&matrix)) { + return false; + } + matrix.postConcat(fPtsToUnit); + sampler->setCustomStage(stage, matrix); + } else { + sampler->setCustomStage(stage, fPtsToUnit); + } + + return true; } #else -GrCustomStage* SkLinearGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { +bool SkLinearGradient::asNewCustomStage(GrContext*, GrSamplerState*) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif diff --git a/src/effects/gradients/SkLinearGradient.h b/src/effects/gradients/SkLinearGradient.h index 129a56aadc..fe60543d52 100644 --- a/src/effects/gradients/SkLinearGradient.h +++ b/src/effects/gradients/SkLinearGradient.h @@ -22,8 +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 GrCustomStage* asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const SK_OVERRIDE; + virtual bool asNewCustomStage(GrContext* context, GrSamplerState* sampler) const SK_OVERRIDE; SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient) diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp index 512eafb2ba..0156acdd54 100644 --- a/src/effects/gradients/SkRadialGradient.cpp +++ b/src/effects/gradients/SkRadialGradient.cpp @@ -538,9 +538,11 @@ GrCustomStage* GrRadialGradient::TestCreate(SkRandom* random, colors, stops, colorCount, tm)); GrSamplerState sampler; - GrCustomStage* stage = shader->asNewCustomStage(context, &sampler); - GrAssert(NULL != stage); - return stage; + shader->asNewCustomStage(context, &sampler); + GrAssert(NULL != sampler.getCustomStage()); + // const_cast and ref is a hack! Will remove when asNewCustomStage returns GrCustomStage* + sampler.getCustomStage()->ref(); + return const_cast<GrCustomStage*>(sampler.getCustomStage()); } ///////////////////////////////////////////////////////////////////// @@ -556,19 +558,29 @@ void GrGLRadialGradient::emitFS(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrCustomStage* SkRadialGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { +bool SkRadialGradient::asNewCustomStage(GrContext* context, GrSamplerState* sampler) const { SkASSERT(NULL != context && NULL != sampler); - sampler->matrix()->preConcat(fPtsToUnit); - return SkNEW_ARGS(GrRadialGradient, (context, *this, fTileMode)); + SkAutoTUnref<GrCustomStage> stage(SkNEW_ARGS(GrRadialGradient, (context, *this, fTileMode))); + + SkMatrix matrix; + if (this->getLocalMatrix(&matrix)) { + if (!matrix.invert(&matrix)) { + return false; + } + matrix.postConcat(fPtsToUnit); + sampler->setCustomStage(stage, matrix); + } else { + sampler->setCustomStage(stage, fPtsToUnit); + } + + return true; } #else -GrCustomStage* SkRadialGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { +bool SkRadialGradient::asNewCustomStage(GrContext*, GrSamplerState*) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif diff --git a/src/effects/gradients/SkRadialGradient.h b/src/effects/gradients/SkRadialGradient.h index 23a35f7fd2..fc17520e29 100644 --- a/src/effects/gradients/SkRadialGradient.h +++ b/src/effects/gradients/SkRadialGradient.h @@ -24,8 +24,7 @@ public: SkMatrix* matrix, TileMode* xy) const SK_OVERRIDE; virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrCustomStage* asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const SK_OVERRIDE; + virtual bool asNewCustomStage(GrContext* context, GrSamplerState* sampler) const SK_OVERRIDE; SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRadialGradient) diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp index f18b08ea9c..d8cbf9ceb6 100644 --- a/src/effects/gradients/SkSweepGradient.cpp +++ b/src/effects/gradients/SkSweepGradient.cpp @@ -444,9 +444,10 @@ GrCustomStage* GrSweepGradient::TestCreate(SkRandom* random, SkAutoTUnref<SkShader> shader(SkGradientShader::CreateSweep(center.fX, center.fY, colors, stops, colorCount)); GrSamplerState sampler; - GrCustomStage* stage = shader->asNewCustomStage(context, &sampler); - GrAssert(NULL != stage); - return stage; + shader->asNewCustomStage(context, &sampler); + GrAssert(NULL != sampler.getCustomStage()); + // const_cast and ref is a hack! Will remove when asNewCustomStage returns GrCustomStage* + return const_cast<GrCustomStage*>(sampler.getCustomStage()); } ///////////////////////////////////////////////////////////////////// @@ -463,18 +464,29 @@ void GrGLSweepGradient::emitFS(GrGLShaderBuilder* builder, ///////////////////////////////////////////////////////////////////// -GrCustomStage* SkSweepGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { - sampler->matrix()->preConcat(fPtsToUnit); - return SkNEW_ARGS(GrSweepGradient, (context, *this)); +bool SkSweepGradient::asNewCustomStage(GrContext* context, GrSamplerState* sampler) const { + SkAutoTUnref<GrCustomStage> stage(SkNEW_ARGS(GrSweepGradient, (context, *this))); + + + SkMatrix matrix; + if (this->getLocalMatrix(&matrix)) { + if (!matrix.invert(&matrix)) { + return false; + } + matrix.postConcat(fPtsToUnit); + sampler->setCustomStage(stage, matrix); + } else { + sampler->setCustomStage(stage, fPtsToUnit); + } + + return true; } #else -GrCustomStage* SkSweepGradient::asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const { +bool SkSweepGradient::asNewCustomStage(GrContext*, GrSamplerState*) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif diff --git a/src/effects/gradients/SkSweepGradient.h b/src/effects/gradients/SkSweepGradient.h index 2b9dfeb675..8e42be0921 100644 --- a/src/effects/gradients/SkSweepGradient.h +++ b/src/effects/gradients/SkSweepGradient.h @@ -24,8 +24,7 @@ public: virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrCustomStage* asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const SK_OVERRIDE; + virtual bool asNewCustomStage(GrContext* context, GrSamplerState* sampler) const SK_OVERRIDE; SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSweepGradient) diff --git a/src/effects/gradients/SkTwoPointConicalGradient.cpp b/src/effects/gradients/SkTwoPointConicalGradient.cpp index 31e3b37c13..19b1228c88 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient.cpp @@ -441,9 +441,11 @@ GrCustomStage* GrConical2Gradient::TestCreate(SkRandom* random, colors, stops, colorCount, tm)); GrSamplerState sampler; - GrCustomStage* stage = shader->asNewCustomStage(context, &sampler); - GrAssert(NULL != stage); - return stage; + shader->asNewCustomStage(context, &sampler); + GrAssert(NULL != sampler.getCustomStage()); + // const_cast and ref is a hack! Will remove when asNewCustomStage returns GrCustomStage* + sampler.getCustomStage()->ref(); + return const_cast<GrCustomStage*>(sampler.getCustomStage()); } @@ -673,28 +675,40 @@ GrCustomStage::StageKey GrGLConical2Gradient::GenKey(const GrCustomStage& s, con ///////////////////////////////////////////////////////////////////// -GrCustomStage* SkTwoPointConicalGradient::asNewCustomStage( - GrContext* context, GrSamplerState* sampler) const { +bool SkTwoPointConicalGradient::asNewCustomStage(GrContext* context, + GrSamplerState* sampler) const { SkASSERT(NULL != context && NULL != sampler); + + SkMatrix matrix; SkPoint diff = fCenter2 - fCenter1; SkScalar diffLen = diff.length(); if (0 != diffLen) { SkScalar invDiffLen = SkScalarInvert(diffLen); - sampler->matrix()->setSinCos(-SkScalarMul(invDiffLen, diff.fY), - SkScalarMul(invDiffLen, diff.fX)); + matrix.setSinCos(-SkScalarMul(invDiffLen, diff.fY), + SkScalarMul(invDiffLen, diff.fX)); } else { - sampler->matrix()->reset(); + matrix.reset(); + } + matrix.preTranslate(-fCenter1.fX, -fCenter1.fY); + + SkMatrix localM; + if (this->getLocalMatrix(&localM)) { + if (!localM.invert(&localM)) { + return false; + } + matrix.preConcat(localM); } - sampler->matrix()->preTranslate(-fCenter1.fX, -fCenter1.fY); - return SkNEW_ARGS(GrConical2Gradient, (context, *this, fTileMode)); + + sampler->setCustomStage(SkNEW_ARGS(GrConical2Gradient, (context, *this, fTileMode)), matrix)->unref(); + + return true; } #else -GrCustomStage* SkTwoPointConicalGradient::asNewCustomStage( - GrContext* context, GrSamplerState* sampler) const { +bool SkTwoPointConicalGradient::asNewCustomStage(GrContext*, GrSamplerState*) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif diff --git a/src/effects/gradients/SkTwoPointConicalGradient.h b/src/effects/gradients/SkTwoPointConicalGradient.h index 4ce72801e0..40544919c3 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.h +++ b/src/effects/gradients/SkTwoPointConicalGradient.h @@ -61,8 +61,7 @@ public: SkMatrix* matrix, TileMode* xy) const; virtual SkShader::GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrCustomStage* asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const SK_OVERRIDE; + virtual bool asNewCustomStage(GrContext* context, GrSamplerState* sampler) 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 97f335d97c..2715511e1b 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.cpp +++ b/src/effects/gradients/SkTwoPointRadialGradient.cpp @@ -475,9 +475,11 @@ GrCustomStage* GrRadial2Gradient::TestCreate(SkRandom* random, colors, stops, colorCount, tm)); GrSamplerState sampler; - GrCustomStage* stage = shader->asNewCustomStage(context, &sampler); - GrAssert(NULL != stage); - return stage; + shader->asNewCustomStage(context, &sampler); + GrAssert(NULL != sampler.getCustomStage()); + // const_cast and ref is a hack! Will remove when asNewCustomStage returns GrCustomStage* + sampler.getCustomStage()->ref(); + return const_cast<GrCustomStage*>(sampler.getCustomStage()); } ///////////////////////////////////////////////////////////////////// @@ -647,27 +649,38 @@ GrCustomStage::StageKey GrGLRadial2Gradient::GenKey(const GrCustomStage& s, cons ///////////////////////////////////////////////////////////////////// -GrCustomStage* SkTwoPointRadialGradient::asNewCustomStage( - GrContext* context, GrSamplerState* sampler) const { +bool SkTwoPointRadialGradient::asNewCustomStage(GrContext* context, + GrSamplerState* sampler) const { SkASSERT(NULL != context && NULL != sampler); SkScalar diffLen = fDiff.length(); + SkMatrix matrix; if (0 != diffLen) { SkScalar invDiffLen = SkScalarInvert(diffLen); - sampler->matrix()->setSinCos(-SkScalarMul(invDiffLen, fDiff.fY), - SkScalarMul(invDiffLen, fDiff.fX)); + matrix.setSinCos(-SkScalarMul(invDiffLen, fDiff.fY), + SkScalarMul(invDiffLen, fDiff.fX)); } else { - sampler->matrix()->reset(); + matrix.reset(); } - sampler->matrix()->preConcat(fPtsToUnit); - return SkNEW_ARGS(GrRadial2Gradient, (context, *this, fTileMode)); + + matrix.preConcat(fPtsToUnit); + + SkMatrix localM; + if (this->getLocalMatrix(&localM)) { + if (!localM.invert(&localM)) { + return false; + } + matrix.preConcat(localM); + } + + sampler->setCustomStage(SkNEW_ARGS(GrRadial2Gradient, (context, *this, fTileMode)), matrix)->unref(); + return true; } #else -GrCustomStage* SkTwoPointRadialGradient::asNewCustomStage( - GrContext* context, GrSamplerState* sampler) const { +bool SkTwoPointRadialGradient::asNewCustomStage(GrContext*, GrSamplerState*) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif diff --git a/src/effects/gradients/SkTwoPointRadialGradient.h b/src/effects/gradients/SkTwoPointRadialGradient.h index a6036f176f..adbb602265 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.h +++ b/src/effects/gradients/SkTwoPointRadialGradient.h @@ -23,8 +23,7 @@ public: SkMatrix* matrix, TileMode* xy) const SK_OVERRIDE; virtual GradientType asAGradient(GradientInfo* info) const SK_OVERRIDE; - virtual GrCustomStage* asNewCustomStage(GrContext* context, - GrSamplerState* sampler) const SK_OVERRIDE; + virtual bool asNewCustomStage(GrContext* context, GrSamplerState* sampler) const SK_OVERRIDE; virtual void shadeSpan(int x, int y, SkPMColor* dstCParam, int count) SK_OVERRIDE; |