diff options
author | 2017-02-07 11:23:28 -0500 | |
---|---|---|
committer | 2017-02-07 16:58:07 +0000 | |
commit | 041f7dfc577822f1e97721a865f86a9a02660cf9 (patch) | |
tree | e97779c04ea0d2059cbd6291de3cbfbf27c1cc61 /src/image/SkImage_Gpu.cpp | |
parent | 2bb94e814726cbe8e0a6a5763e262a5ccea9313c (diff) |
Bring back SkImage::makeTextureImage
Ensures that an image is GPU backed on the passed-in GrContxt. The new
version requires a destination color space (intended usage of the image),
so we can make a proper decision about decoded format.
This reverts commit d263413a2a92cafe3fd3b051c67d00206c9a0e4d.
BUG=skia:
Change-Id: Ibccddbafc301779559592045ed5a5fa9264e7432
Reviewed-on: https://skia-review.googlesource.com/8116
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
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)); |