/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkCrossContextImageData_DEFINED #define SkCrossContextImageData_DEFINED #include "SkImage.h" #if SK_SUPPORT_GPU #include "GrExternalTextureData.h" #endif class SK_API SkCrossContextImageData : SkNoncopyable { public: /** * Decodes and uploads the encoded data to a texture using the supplied GrContext, then * returns an instance of SkCrossContextImageData that can be used to transport that texture * to a different GrContext, across thread boundaries. The GrContext used here, and the one * used to reconstruct the texture-backed image later must be in the same GL share group, * or otherwise be able to share resources. After calling this, you *must* construct exactly * one SkImage from the returned value, using SkImage::MakeFromCrossContextImageData. * * The texture will be decoded and uploaded to be suitable for use with surfaces that have the * supplied destination color space. The color space of the texture itself will be determined * from the encoded data. */ static std::unique_ptr MakeFromEncoded( GrContext*, sk_sp, SkColorSpace* dstColorSpace); private: SkCrossContextImageData(sk_sp image) : fImage(std::move(image)) { SkASSERT(!fImage->isTextureBacked()); } #if SK_SUPPORT_GPU SkCrossContextImageData(const GrBackendTextureDesc& desc, std::unique_ptr textureData, SkAlphaType alphaType, sk_sp colorSpace) : fAlphaType(alphaType) , fColorSpace(std::move(colorSpace)) , fDesc(desc) , fTextureData(std::move(textureData)) { // Point our texture desc at our copy of the backend information fDesc.fTextureHandle = fTextureData->getBackendObject(); } #endif // For non-GPU backed images sk_sp fImage; #if SK_SUPPORT_GPU // GPU-backed images store some generic information (needed to reconstruct the SkImage), // and some backend-specific info (to reconstruct the texture). SkAlphaType fAlphaType; sk_sp fColorSpace; GrBackendTextureDesc fDesc; std::unique_ptr fTextureData; #endif friend class SkImage; }; #endif