From: robertphillips Date: Tue, 13 Jan 2015 18:37:55 +0000 (-0800) Subject: Switch to a more complete method of filtering hoisted layers X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~4108 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=74668a8e818fd891a08c4966cc5973b04c1ad992;p=platform%2Fupstream%2FlibSkiaSharp.git Switch to a more complete method of filtering hoisted layers Review URL: https://codereview.chromium.org/842323003 --- diff --git a/src/gpu/GrLayerCache.h b/src/gpu/GrLayerCache.h index cdbd080..11c8f07 100644 --- a/src/gpu/GrLayerCache.h +++ b/src/gpu/GrLayerCache.h @@ -164,7 +164,7 @@ public: SkASSERT(SK_InvalidGenID != pictureID); if (fPaint) { - if (fPaint->getImageFilter() && fPaint->getImageFilter()->canFilterImageGPU()) { + if (fPaint->getImageFilter()) { fFilter = SkSafeRef(fPaint->getImageFilter()); fPaint->setImageFilter(NULL); } diff --git a/src/gpu/GrLayerHoister.cpp b/src/gpu/GrLayerHoister.cpp index 7d6f5ab..3bb7b2e 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,19 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, } } +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; @@ -294,7 +302,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 +310,11 @@ void GrLayerHoister::FilterLayer(GrContext* context, SkAutoTUnref 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; }