Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2017 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 
      9 #ifndef SkCrossContextImageData_DEFINED
     10 #define SkCrossContextImageData_DEFINED
     11 
     12 #include "SkImage.h"
     13 
     14 #if SK_SUPPORT_GPU
     15 #include "GrExternalTextureData.h"
     16 #endif
     17 
     18 class SK_API SkCrossContextImageData : SkNoncopyable {
     19 public:
     20     /**
     21      *  Decodes and uploads the encoded data to a texture using the supplied GrContext, then
     22      *  returns an instance of SkCrossContextImageData that can be used to transport that texture
     23      *  to a different GrContext, across thread boundaries. The GrContext used here, and the one
     24      *  used to reconstruct the texture-backed image later must be in the same GL share group,
     25      *  or otherwise be able to share resources. After calling this, you *must* construct exactly
     26      *  one SkImage from the returned value, using SkImage::MakeFromCrossContextImageData.
     27      *
     28      *  The texture will be decoded and uploaded to be suitable for use with surfaces that have the
     29      *  supplied destination color space. The color space of the texture itself will be determined
     30      *  from the encoded data.
     31      */
     32     static std::unique_ptr<SkCrossContextImageData> MakeFromEncoded(
     33         GrContext*, sk_sp<SkData>, SkColorSpace* dstColorSpace);
     34 
     35 private:
     36     SkCrossContextImageData(sk_sp<SkImage> image) : fImage(std::move(image)) {
     37         SkASSERT(!fImage->isTextureBacked());
     38     }
     39 
     40 #if SK_SUPPORT_GPU
     41     SkCrossContextImageData(const GrBackendTextureDesc& desc,
     42                             std::unique_ptr<GrExternalTextureData> textureData,
     43                             SkAlphaType alphaType, sk_sp<SkColorSpace> colorSpace)
     44             : fAlphaType(alphaType)
     45             , fColorSpace(std::move(colorSpace))
     46             , fDesc(desc)
     47             , fTextureData(std::move(textureData)) {
     48         // Point our texture desc at our copy of the backend information
     49         fDesc.fTextureHandle = fTextureData->getBackendObject();
     50     }
     51 #endif
     52 
     53     // For non-GPU backed images
     54     sk_sp<SkImage> fImage;
     55 
     56 #if SK_SUPPORT_GPU
     57     // GPU-backed images store some generic information (needed to reconstruct the SkImage),
     58     // and some backend-specific info (to reconstruct the texture).
     59     SkAlphaType fAlphaType;
     60     sk_sp<SkColorSpace> fColorSpace;
     61     GrBackendTextureDesc fDesc;
     62     std::unique_ptr<GrExternalTextureData> fTextureData;
     63 #endif
     64 
     65     friend class SkImage;
     66 };
     67 
     68 #endif
     69