#include "GrRecordReplaceDraw.h"
#include "SkCanvas.h"
+#include "SkDeviceImageFilterProxy.h"
+#include "SkDeviceProperties.h"
#include "SkGpuDevice.h"
#include "SkGrPixelRef.h"
#include "SkLayerInfo.h"
}
}
+SkBitmap wrap_texture(GrTexture* 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;
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();
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;
}