diff options
author | 2012-09-27 21:57:45 +0000 | |
---|---|---|
committer | 2012-09-27 21:57:45 +0000 | |
commit | 9c39744a00573b7133fc765b0a9d50a0ceace7b8 (patch) | |
tree | f416a1bf3e821884974ec2cf4e0d383ad75d16e2 /src/gpu | |
parent | 200e53fa5fe7dae717a73224064a2fc37302e003 (diff) |
Fix recursive GPU processing for SkImageFilter. Plumb through the
SkImageFilter::Proxy parameter to the GPU recursion path. Extract
DeviceImageFilterProxy from SkCanvas.cpp into its own .h, and rename it.
https://codereview.appspot.com/6575059/
git-svn-id: http://skia.googlecode.com/svn/trunk@5720 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 322748e2d2..59a3b61739 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -16,6 +16,7 @@ #include "SkGrTexturePixelRef.h" #include "SkColorFilter.h" +#include "SkDeviceImageFilterProxy.h" #include "SkDrawProcs.h" #include "SkGlyphCache.h" #include "SkImageFilter.h" @@ -1514,9 +1515,11 @@ void apply_custom_stage(GrContext* context, }; -static GrTexture* filter_texture(GrContext* context, GrTexture* texture, - SkImageFilter* filter, const GrRect& rect) { +static GrTexture* filter_texture(SkDevice* device, GrContext* context, + GrTexture* texture, SkImageFilter* filter, + const GrRect& rect) { GrAssert(filter); + SkDeviceImageFilterProxy proxy(device); GrTextureDesc desc; desc.fFlags = kRenderTarget_GrTextureFlagBit, @@ -1526,7 +1529,7 @@ static GrTexture* filter_texture(GrContext* context, GrTexture* texture, GrCustomStage* stage; if (filter->canFilterImageGPU()) { - texture = filter->onFilterImageGPU(texture, rect); + texture = filter->onFilterImageGPU(&proxy, texture, rect); } else if (filter->asNewCustomStage(&stage, texture)) { GrAutoScratchTexture dst(context, desc); apply_custom_stage(context, texture, dst.texture(), rect, stage); @@ -1567,7 +1570,7 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, SkImageFilter* filter = paint.getImageFilter(); if (NULL != filter) { - GrTexture* filteredTexture = filter_texture(fContext, texture, filter, + GrTexture* filteredTexture = filter_texture(this, fContext, texture, filter, GrRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h))); if (filteredTexture) { grPaint.textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS @@ -1653,7 +1656,7 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkDevice* device, if (NULL != filter) { GrRect rect = GrRect::MakeWH(SkIntToScalar(devTex->width()), SkIntToScalar(devTex->height())); - GrTexture* filteredTexture = filter_texture(fContext, devTex, filter, rect); + GrTexture* filteredTexture = filter_texture(this, fContext, devTex, filter, rect); if (filteredTexture) { grPaint.textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS (GrSingleTextureEffect, (filteredTexture)))->unref(); @@ -1712,7 +1715,7 @@ bool SkGpuDevice::filterImage(SkImageFilter* filter, const SkBitmap& src, result->setConfig(src.config(), src.width(), src.height()); GrRect rect = GrRect::MakeWH(SkIntToScalar(src.width()), SkIntToScalar(src.height())); - GrTexture* resultTexture = filter_texture(fContext, texture, filter, rect); + GrTexture* resultTexture = filter_texture(this, fContext, texture, filter, rect); if (resultTexture) { result->setPixelRef(SkNEW_ARGS(SkGrTexturePixelRef, (resultTexture)))->unref(); |