Index: src/effects/SkMorphologyImageFilter.cpp |
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp |
index 1d465edcb5246d9a144bcce9b57cfdfe326128a3..8cca694403d7f07295dd7f6f7f262164b8e8aead 100644 |
--- a/src/effects/SkMorphologyImageFilter.cpp |
+++ b/src/effects/SkMorphologyImageFilter.cpp |
@@ -14,6 +14,7 @@ |
#include "SkRect.h" |
#include "SkWriteBuffer.h" |
#if SK_SUPPORT_GPU |
+#include "SkGR.h" |
#include "GrContext.h" |
#include "GrDrawContext.h" |
#include "GrInvariantOutput.h" |
@@ -211,14 +212,15 @@ public: |
kDilate_MorphologyType, |
}; |
- static GrFragmentProcessor* Create(GrTexture* tex, Direction dir, int radius, |
- MorphologyType type) { |
- return new GrMorphologyEffect(tex, dir, radius, type); |
+ static GrFragmentProcessor* Create(GrTexture* tex, |
+ Direction dir, int radius, MorphologyType type, GrRenderTarget* dst) { |
+ return new GrMorphologyEffect(tex, dir, radius, type, dst); |
} |
- static GrFragmentProcessor* Create(GrTexture* tex, Direction dir, int radius, |
- MorphologyType type, float bounds[2]) { |
- return new GrMorphologyEffect(tex, dir, radius, type, bounds); |
+ static GrFragmentProcessor* Create(GrTexture* tex, |
+ Direction dir, int radius, MorphologyType type, |
+ float bounds[2], GrRenderTarget* dst) { |
+ return new GrMorphologyEffect(tex, dir, radius, type, bounds, dst); |
} |
virtual ~GrMorphologyEffect(); |
@@ -244,9 +246,9 @@ private: |
void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
- GrMorphologyEffect(GrTexture*, Direction, int radius, MorphologyType); |
+ GrMorphologyEffect(GrTexture*, Direction, int radius, MorphologyType, GrRenderTarget* dst); |
GrMorphologyEffect(GrTexture*, Direction, int radius, MorphologyType, |
- float bounds[2]); |
+ float bounds[2], GrRenderTarget* dst); |
GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
@@ -402,8 +404,8 @@ void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture, |
Direction direction, |
int radius, |
- MorphologyType type) |
- : INHERITED(texture, direction, radius) |
+ MorphologyType type, GrRenderTarget* dst) |
+ : INHERITED(texture, direction, radius, dst) |
, fType(type), fUseRange(false) { |
this->initClassID<GrMorphologyEffect>(); |
} |
@@ -412,8 +414,8 @@ GrMorphologyEffect::GrMorphologyEffect(GrTexture* texture, |
Direction direction, |
int radius, |
MorphologyType type, |
- float range[2]) |
- : INHERITED(texture, direction, radius) |
+ float range[2], GrRenderTarget* dst) |
+ : INHERITED(texture, direction, radius, dst) |
, fType(type), fUseRange(true) { |
this->initClassID<GrMorphologyEffect>(); |
fRange[0] = range[0]; |
@@ -457,7 +459,7 @@ const GrFragmentProcessor* GrMorphologyEffect::TestCreate(GrProcessorTestData* d |
MorphologyType type = d->fRandom->nextBool() ? GrMorphologyEffect::kErode_MorphologyType : |
GrMorphologyEffect::kDilate_MorphologyType; |
- return GrMorphologyEffect::Create(d->fTextures[texIdx], dir, radius, type); |
+ return GrMorphologyEffect::Create(d->fTextures[texIdx], dir, radius, type, NULL); |
} |
namespace { |
@@ -477,9 +479,10 @@ void apply_morphology_rect(GrDrawContext* drawContext, |
direction, |
radius, |
morphType, |
- bounds))->unref(); |
+ bounds, drawContext->rt_remove_me()))->unref(); |
+ |
drawContext->fillRectToRect(clip, paint, SkMatrix::I(), SkRect::Make(dstRect), |
- SkRect::Make(srcRect)); |
+ SkRect::Make(srcRect)); |
} |
void apply_morphology_rect_no_bounds(GrDrawContext* drawContext, |
@@ -494,7 +497,8 @@ void apply_morphology_rect_no_bounds(GrDrawContext* drawContext, |
paint.addColorFragmentProcessor(GrMorphologyEffect::Create(texture, |
direction, |
radius, |
- morphType))->unref(); |
+ morphType, drawContext->rt_remove_me()))->unref(); |
+ |
drawContext->fillRectToRect(clip, paint, SkMatrix::I(), SkRect::Make(dstRect), |
SkRect::Make(srcRect)); |
} |
@@ -579,6 +583,7 @@ bool apply_morphology(const SkBitmap& input, |
if (nullptr == scratch) { |
return false; |
} |
+ |
SkAutoTUnref<GrDrawContext> dstDrawContext( |
context->drawContext(scratch->asRenderTarget())); |
if (!dstDrawContext) { |
@@ -593,6 +598,7 @@ bool apply_morphology(const SkBitmap& input, |
GrColor clearColor = GrMorphologyEffect::kErode_MorphologyType == morphType ? |
SK_ColorWHITE : |
SK_ColorTRANSPARENT; |
+ |
dstDrawContext->clear(&clearRect, clearColor, false); |
srcTexture.reset(scratch); |
@@ -603,6 +609,7 @@ bool apply_morphology(const SkBitmap& input, |
if (nullptr == scratch) { |
return false; |
} |
+ |
SkAutoTUnref<GrDrawContext> dstDrawContext( |
context->drawContext(scratch->asRenderTarget())); |
if (!dstDrawContext) { |