1/*
2 * Copyright 2016 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 SkYUVASizeInfo_DEFINED
9#define SkYUVASizeInfo_DEFINED
10
11#include "include/codec/SkEncodedOrigin.h"
12#include "include/core/SkImageInfo.h"
13#include "include/core/SkSize.h"
14
15struct SK_API SkYUVASizeInfo {
16 static constexpr auto kMaxCount = 4;
17
18 SkISize fSizes[kMaxCount];
19
20 /**
21 * While the widths of the Y, U, V and A planes are not restricted, the
22 * implementation often requires that the width of the memory allocated
23 * for each plane be a multiple of 8.
24 *
25 * This struct allows us to inform the client how many "widthBytes"
26 * that we need. Note that we use the new idea of "widthBytes"
27 * because this idea is distinct from "rowBytes" (used elsewhere in
28 * Skia). "rowBytes" allow the last row of the allocation to not
29 * include any extra padding, while, in this case, every single row of
30 * the allocation must be at least "widthBytes".
31 */
32 size_t fWidthBytes[kMaxCount];
33
34 /**
35 * YUVA data often comes from formats like JPEG that support EXIF orientation.
36 * Code that operates on the raw YUV data often needs to know that orientation.
37 */
38 SkEncodedOrigin fOrigin = kDefault_SkEncodedOrigin;
39
40 bool operator==(const SkYUVASizeInfo& that) const {
41 for (int i = 0; i < kMaxCount; ++i) {
42 SkASSERT((!fSizes[i].isEmpty() && fWidthBytes[i]) ||
43 (fSizes[i].isEmpty() && !fWidthBytes[i]));
44 if (fSizes[i] != that.fSizes[i] || fWidthBytes[i] != that.fWidthBytes[i]) {
45 return false;
46 }
47 }
48
49 return true;
50 }
51
52 size_t computeTotalBytes() const;
53
54 void computePlanes(void* base, void* planes[kMaxCount]) const;
55
56};
57
58#endif // SkYUVASizeInfo_DEFINED
59