1 /*
2  * Copyright 2015 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 #ifndef GrYUVProvider_DEFINED
9 #define GrYUVProvider_DEFINED
10 
11 #include "GrTypes.h"
12 #include "SkImageInfo.h"
13 
14 class GrContext;
15 class GrTexture;
16 
17 /**
18  *  There are at least 2 different ways to extract/retrieve YUV planar data...
19  *  - SkPixelRef
20  *  - SkImageGeneartor
21  *
22  *  To share common functionality around using the planar data, we use this abstract base-class
23  *  to represent accessing that data.
24  */
25 class GrYUVProvider {
26 public:
~GrYUVProvider()27     virtual ~GrYUVProvider() {}
28 
29     /**
30      *  On success, this returns a texture that has converted the YUV data from the provider
31      *  into a form that is supported by the GPU (typically transformed into RGB). If useCache
32      *  is true, then the texture will automatically have a key added, so it can be retrieved
33      *  from the cache (assuming it is requested by a provider w/ the same genID).
34      *
35      *  On failure (e.g. the provider had no data), this returns NULL.
36      */
37     GrTexture* refAsTexture(GrContext*, const GrSurfaceDesc&, bool useCache);
38 
39     virtual uint32_t onGetID() = 0;
40 
41     enum {
42         kY_Index = 0,
43         kU_Index = 1,
44         kV_Index = 2,
45 
46         kPlaneCount = 3
47     };
48 
49     // These are not meant to be called by a client, only by the implementation
50 
51     /**
52      *  Return the 3 dimensions for each plane and return true. On failure, return false and
53      *  ignore the sizes parameter. Typical failure is that the provider does not contain YUV
54      *  data, and may just be an RGB src.
55      */
56     virtual bool onGetYUVSizes(SkISize sizes[kPlaneCount]) = 0;
57 
58     /**
59      *  On success, return true, and set sizes, rowbytes and colorspace to the appropriate values.
60      *  planes[] will have already been allocated by the client (based on the worst-case sizes
61      *  returned by onGetYUVSizes(). This method copies its planar data into those buffers.
62      *
63      *  On failure, return false and ignore other parameters.
64      */
65     virtual bool onGetYUVPlanes(SkISize sizes[kPlaneCount], void* planes[kPlaneCount],
66                                 size_t rowBytes[kPlaneCount], SkYUVColorSpace*) = 0;
67 };
68 
69 #endif
70