aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Gpu.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-02-07 11:23:28 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-07 16:58:07 +0000
commit041f7dfc577822f1e97721a865f86a9a02660cf9 (patch)
treee97779c04ea0d2059cbd6291de3cbfbf27c1cc61 /src/image/SkImage_Gpu.cpp
parent2bb94e814726cbe8e0a6a5763e262a5ccea9313c (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.cpp32
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));