diff options
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index ef25844a0f..98a7101e6b 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -350,6 +350,38 @@ sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace std::move(imageColorSpace)); } +static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType at, uint32_t id, + SkColorSpace* dstColorSpace) { + sk_sp<SkColorSpace> texColorSpace; + sk_sp<GrTexture> texture(maker->refTextureForParams(GrSamplerParams::ClampNoFilter(), + dstColorSpace, &texColorSpace, nullptr)); + if (!texture) { + return nullptr; + } + return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), id, at, std::move(texture), + std::move(texColorSpace), SkBudgeted::kNo); +} + +sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context, SkColorSpace* dstColorSpace) const { + if (!context) { + return nullptr; + } + if (GrTexture* peek = as_IB(this)->peekTexture()) { + return peek->getContext() == context ? sk_ref_sp(const_cast<SkImage*>(this)) : nullptr; + } + + if (SkImageCacherator* cacher = as_IB(this)->peekCacherator()) { + GrImageTextureMaker maker(context, cacher, this, kDisallow_CachingHint); + return create_image_from_maker(&maker, this->alphaType(), this->uniqueID(), dstColorSpace); + } + + if (const SkBitmap* bmp = as_IB(this)->onPeekBitmap()) { + GrBitmapTextureMaker maker(context, *bmp); + return create_image_from_maker(&maker, this->alphaType(), this->uniqueID(), dstColorSpace); + } + return nullptr; +} + sk_sp<SkImage> SkImage::makeNonTextureImage() const { if (!this->isTextureBacked()) { return sk_ref_sp(const_cast<SkImage*>(this)); |