blob: 310c9756dc942b4104dae8da5538a95c84568aa3 [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkYUVAIndex_DEFINED
#define SkYUVAIndex_DEFINED
#include "include/core/SkColor.h"
#include "include/core/SkTypes.h"
/** \struct SkYUVAIndex
Describes from which image source and which channel to read each individual YUVA plane.
SkYUVAIndex contains a index for which image source to read from and a enum for which channel
to read from.
*/
struct SK_API SkYUVAIndex {
bool operator==(const SkYUVAIndex& that) const {
return this->fIndex == that.fIndex && this->fChannel == that.fChannel;
}
bool operator!=(const SkYUVAIndex& that) const {
return !(*this == that);
}
// Index in the array of SkYUVAIndex
// TODO: rename as Component
enum Index {
kY_Index = 0,
kU_Index = 1,
kV_Index = 2,
kA_Index = 3,
kLast_Index = kA_Index
};
static constexpr int kIndexCount = kLast_Index + 1;
/** The index is a number between -1..3 which defines which image source to read from, where -1
* means the image source doesn't exist. The assumption is we will always have image sources for
* each of YUV planes, but optionally have image source for A plane. */
int fIndex;
/** The channel describes from which channel to read the info from. Currently we only deal with
* YUV and NV12 and channel info is ignored. */
SkColorChannel fChannel;
static bool AreValidIndices(const SkYUVAIndex yuvaIndices[4], int* numPlanes) {
// Note that 'numPlanes' is always filled in even if the indices are not valid.
// This means it can always be used to process the backing resources (but be careful
// of empty intervening slots).
int maxSlotUsed = -1;
bool used[4] = { false, false, false, false };
bool valid = true;
for (int i = 0; i < 4; ++i) {
if (yuvaIndices[i].fIndex < 0) {
if (SkYUVAIndex::kA_Index != i) {
valid = false; // only the 'A' plane can be omitted
}
} else if (yuvaIndices[i].fIndex > 3) {
valid = false; // A maximum of four input textures is allowed
} else {
maxSlotUsed = SkTMax(yuvaIndices[i].fIndex, maxSlotUsed);
used[i] = true;
}
}
// All the used slots should be packed starting at 0 with no gaps
for (int i = 0; i <= maxSlotUsed; ++i) {
if (!used[i]) {
valid = false;
}
}
*numPlanes = maxSlotUsed + 1;
return valid;
}
};
#endif