1 /* 2 * Copyright 2013 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkMatrix.h" 9 10 #if SK_SUPPORT_GPU 11 #include "GrTexture.h" 12 #include "SkImageFilterUtils.h" 13 #include "SkBitmap.h" 14 #include "SkGrPixelRef.h" 15 #include "SkGr.h" 16 17 bool SkImageFilterUtils::WrapTexture(GrTexture* texture, int width, int height, SkBitmap* result) { 18 SkASSERT(texture->config() == kSkia8888_GrPixelConfig); 19 result->setConfig(SkBitmap::kARGB_8888_Config, width, height); 20 result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (texture)))->unref(); 21 return true; 22 } 23 24 bool SkImageFilterUtils::GetInputResultGPU(SkImageFilter* filter, SkImageFilter::Proxy* proxy, const SkBitmap& src, SkBitmap* result) { 25 if (!filter) { 26 *result = src; 27 return true; 28 } else if (filter->canFilterImageGPU()) { 29 return filter->filterImageGPU(proxy, src, result); 30 } else { 31 SkIPoint offset; 32 if (filter->filterImage(proxy, src, SkMatrix(), result, &offset)) { 33 if (!result->getTexture()) { 34 GrContext* context = ((GrTexture *) src.getTexture())->getContext(); 35 GrTexture* resultTex = GrLockAndRefCachedBitmapTexture(context, 36 *result, NULL); 37 result->setPixelRef(new SkGrPixelRef(resultTex))->unref(); 38 GrUnlockAndUnrefCachedBitmapTexture(resultTex); 39 } 40 return true; 41 } else { 42 return false; 43 } 44 } 45 } 46 #endif 47