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