aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-09-27 21:57:45 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-09-27 21:57:45 +0000
commit9c39744a00573b7133fc765b0a9d50a0ceace7b8 (patch)
treef416a1bf3e821884974ec2cf4e0d383ad75d16e2 /src/gpu
parent200e53fa5fe7dae717a73224064a2fc37302e003 (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.cpp15
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();