| 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;
|
| }
|
|
|
|
|