Index: src/core/SkSpecialImage.cpp |
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp |
index e90c655a5824567bb64035da8643567ea77f73e1..991e16351586674ad01272215071f043c72d8408 100644 |
--- a/src/core/SkSpecialImage.cpp |
+++ b/src/core/SkSpecialImage.cpp |
@@ -4,10 +4,16 @@ |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file |
*/ |
+#include "SkSpecialImage.h" |
+ |
+#if SK_SUPPORT_GPU |
+#include "GrTexture.h" |
+#include "GrTextureParams.h" |
+#include "SkGr.h" |
+#endif |
#include "SkCanvas.h" |
#include "SkImage_Base.h" |
-#include "SkSpecialImage.h" |
#include "SkSpecialSurface.h" |
/////////////////////////////////////////////////////////////////////////////// |
@@ -42,6 +48,38 @@ static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { |
return static_cast<const SkSpecialImage_Base*>(image); |
} |
+sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* proxy, |
+ GrContext* context) { |
+#if SK_SUPPORT_GPU |
+ if (!context) { |
+ return nullptr; |
+ } |
+ if (GrTexture* peek = as_SIB(this)->peekTexture()) { |
+ return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)) : nullptr; |
+ } |
+ |
+ SkBitmap bmp; |
+ if (!this->internal_getBM(&bmp)) { |
+ return nullptr; |
+ } |
+ |
+ SkAutoTUnref<GrTexture> resultTex( |
+ GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter())); |
+ if (!resultTex) { |
+ return nullptr; |
+ } |
+ |
+ SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
+ |
+ return SkSpecialImage::MakeFromGpu(proxy, |
+ SkIRect::MakeWH(resultTex->width(), resultTex->height()), |
+ this->uniqueID(), |
+ resultTex, at); |
+#else |
+ return nullptr; |
+#endif |
+} |
+ |
void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const { |
return as_SIB(this)->onDraw(canvas, x, y, paint); |
} |