• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 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 SkYUVAIndex_DEFINED
9 #define SkYUVAIndex_DEFINED
10 
11 #include "include/core/SkColor.h"
12 #include "include/core/SkTypes.h"
13 
14 /** \struct SkYUVAIndex
15     Describes from which image source and which channel to read each individual YUVA plane.
16 
17     SkYUVAIndex contains a index for which image source to read from and a enum for which channel
18     to read from.
19 */
20 struct SK_API SkYUVAIndex {
21     bool operator==(const SkYUVAIndex& that) const {
22         return this->fIndex == that.fIndex && this->fChannel == that.fChannel;
23     }
24 
25     bool operator!=(const SkYUVAIndex& that) const {
26         return !(*this == that);
27     }
28 
29     // Index in the array of SkYUVAIndex
30     // TODO: rename as Component
31     enum Index {
32         kY_Index = 0,
33         kU_Index = 1,
34         kV_Index = 2,
35         kA_Index = 3,
36 
37         kLast_Index = kA_Index
38     };
39     static constexpr int kIndexCount = kLast_Index + 1;
40 
41     /** The index is a number between -1..3 which defines which image source to read from, where -1
42      * means the image source doesn't exist. The assumption is we will always have image sources for
43      * each of YUV planes, but optionally have image source for A plane. */
44     int            fIndex;
45     /** The channel describes from which channel to read the info from. Currently we only deal with
46      * YUV and NV12 and channel info is ignored. */
47     SkColorChannel fChannel;
48 
AreValidIndicesSkYUVAIndex49     static bool AreValidIndices(const SkYUVAIndex yuvaIndices[4], int* numPlanes) {
50         // Note that 'numPlanes' is always filled in even if the indices are not valid.
51         // This means it can always be used to process the backing resources (but be careful
52         // of empty intervening slots).
53         int maxSlotUsed = -1;
54         bool used[4] = { false, false, false, false };
55         bool valid = true;
56         for (int i = 0; i < 4; ++i) {
57             if (yuvaIndices[i].fIndex < 0) {
58                 if (SkYUVAIndex::kA_Index != i) {
59                     valid = false; // only the 'A' plane can be omitted
60                 }
61             } else if (yuvaIndices[i].fIndex > 3) {
62                 valid = false; // A maximum of four input textures is allowed
63             } else {
64                 maxSlotUsed = std::max(yuvaIndices[i].fIndex, maxSlotUsed);
65                 used[i] = true;
66             }
67         }
68 
69         // All the used slots should be packed starting at 0 with no gaps
70         for (int i = 0; i <= maxSlotUsed; ++i) {
71             if (!used[i]) {
72                 valid = false;
73             }
74         }
75 
76         *numPlanes = maxSlotUsed + 1;
77         return valid;
78     }
79 };
80 
81 #endif
82