Index: src/gpu/GrLayerHoister.cpp |
diff --git a/src/gpu/GrLayerHoister.cpp b/src/gpu/GrLayerHoister.cpp |
index 7d6f5ab1b3879b4f1648d459ec6bc3111405622c..70c10d7f69db1e62e84a60437406ed23d762c57e 100644 |
--- a/src/gpu/GrLayerHoister.cpp |
+++ b/src/gpu/GrLayerHoister.cpp |
@@ -10,6 +10,8 @@ |
#include "GrRecordReplaceDraw.h" |
#include "SkCanvas.h" |
+#include "SkDeviceImageFilterProxy.h" |
+#include "SkDeviceProperties.h" |
#include "SkGpuDevice.h" |
#include "SkGrPixelRef.h" |
#include "SkLayerInfo.h" |
@@ -274,13 +276,21 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, |
} |
} |
+SkBitmap wrap_texture(GrTexture* texture) { |
+ SkASSERT(texture); |
+ |
+ SkBitmap result; |
+ result.setInfo(texture->surfacePriv().info()); |
+ result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (result.info(), texture)))->unref(); |
+ return result; |
+} |
+ |
void GrLayerHoister::FilterLayer(GrContext* context, |
SkGpuDevice* device, |
const GrHoistedLayer& info) { |
GrCachedLayer* layer = info.fLayer; |
SkASSERT(layer->filter()); |
- SkASSERT(layer->filter()->canFilterImageGPU()); |
static const int kDefaultCacheSize = 32 * 1024 * 1024; |
@@ -294,7 +304,6 @@ void GrLayerHoister::FilterLayer(GrContext* context, |
totMat.preConcat(info.fLocalMat); |
totMat.postTranslate(-SkIntToScalar(filterOffset.fX), -SkIntToScalar(filterOffset.fY)); |
- |
SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); |
SkIRect clipBounds = layer->rect(); |
@@ -303,9 +312,11 @@ void GrLayerHoister::FilterLayer(GrContext* context, |
SkAutoTUnref<SkImageFilter::Cache> cache(SkImageFilter::Cache::Create(kDefaultCacheSize)); |
SkImageFilter::Context filterContext(totMat, clipBounds, cache); |
- if (!device->filterTexture(context, layer->texture(), layer->filter(), |
- filterContext, &filteredBitmap, &offset)) { |
- // Filtering failed. Press on with the unfiltered version |
+ SkDeviceImageFilterProxy proxy(device, SkSurfaceProps(0, kUnknown_SkPixelGeometry)); |
+ const SkBitmap src = wrap_texture(layer->texture()); |
+ |
+ if (!layer->filter()->filterImage(&proxy, src, filterContext, &filteredBitmap, &offset)) { |
+ // Filtering failed. Press on with the unfiltered version. |
return; |
} |