blob: dce88cadc1f0f9c8bc2028fbbf746b9f30faaf37 [file] [log] [blame]
msarettc30c4182016-04-20 11:53:35 -07001/*
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 SkEncodedInfo_DEFINED
9#define SkEncodedInfo_DEFINED
10
11#include "SkImageInfo.h"
msarett23c51102016-05-27 07:39:02 -070012
13class SkColorSpace;
msarettc30c4182016-04-20 11:53:35 -070014
15struct SkEncodedInfo {
16public:
17
18 enum Alpha {
19 kOpaque_Alpha,
20 kUnpremul_Alpha,
21
22 // Each pixel is either fully opaque or fully transparent.
23 // There is no difference between requesting kPremul or kUnpremul.
24 kBinary_Alpha,
msarettc30c4182016-04-20 11:53:35 -070025 };
26
27 /*
28 * We strive to make the number of components per pixel obvious through
29 * our naming conventions.
30 * Ex: kRGB has 3 components. kRGBA has 4 components.
31 *
32 * This sometimes results in redundant Alpha and Color information.
33 * Ex: kRGB images must also be kOpaque.
34 */
35 enum Color {
36 // PNG, WBMP
37 kGray_Color,
38
39 // PNG
40 kGrayAlpha_Color,
41
42 // PNG, GIF, BMP
43 kPalette_Color,
44
45 // PNG, RAW
46 kRGB_Color,
47 kRGBA_Color,
48
49 // BMP
50 kBGR_Color,
51 kBGRX_Color,
52 kBGRA_Color,
53
54 // JPEG, WEBP
55 kYUV_Color,
56
57 // WEBP
58 kYUVA_Color,
59
60 // JPEG
61 // Photoshop actually writes inverted CMYK data into JPEGs, where zero
62 // represents 100% ink coverage. For this reason, we treat CMYK JPEGs
63 // as having inverted CMYK. libjpeg-turbo warns that this may break
64 // other applications, but the CMYK JPEGs we see on the web expect to
65 // be treated as inverted CMYK.
66 kInvertedCMYK_Color,
67 kYCCK_Color,
msarettc30c4182016-04-20 11:53:35 -070068 };
69
70 static SkEncodedInfo Make(Color color, Alpha alpha, int bitsPerComponent) {
71 SkASSERT(1 == bitsPerComponent ||
72 2 == bitsPerComponent ||
73 4 == bitsPerComponent ||
74 8 == bitsPerComponent ||
75 16 == bitsPerComponent);
76
77 switch (color) {
78 case kGray_Color:
79 SkASSERT(kOpaque_Alpha == alpha);
80 break;
81 case kGrayAlpha_Color:
82 SkASSERT(kOpaque_Alpha != alpha);
83 break;
84 case kPalette_Color:
85 SkASSERT(16 != bitsPerComponent);
86 break;
87 case kRGB_Color:
88 case kBGR_Color:
89 case kBGRX_Color:
90 SkASSERT(kOpaque_Alpha == alpha);
91 SkASSERT(bitsPerComponent >= 8);
92 break;
93 case kYUV_Color:
94 case kInvertedCMYK_Color:
95 case kYCCK_Color:
96 SkASSERT(kOpaque_Alpha == alpha);
97 SkASSERT(8 == bitsPerComponent);
98 break;
99 case kRGBA_Color:
100 SkASSERT(kOpaque_Alpha != alpha);
101 SkASSERT(bitsPerComponent >= 8);
102 break;
103 case kBGRA_Color:
104 case kYUVA_Color:
105 SkASSERT(kOpaque_Alpha != alpha);
106 SkASSERT(8 == bitsPerComponent);
107 break;
108 default:
109 SkASSERT(false);
110 break;
111 }
112
113 return SkEncodedInfo(color, alpha, bitsPerComponent);
114 }
115
116 /*
117 * Returns an SkImageInfo with Skia color and alpha types that are the
118 * closest possible match to the encoded info.
119 */
msarett530c8442016-07-21 11:57:49 -0700120 SkImageInfo makeImageInfo(int width, int height, sk_sp<SkColorSpace> colorSpace) const {
msarettc30c4182016-04-20 11:53:35 -0700121 switch (fColor) {
122 case kGray_Color:
123 SkASSERT(kOpaque_Alpha == fAlpha);
herb9bc22352016-04-20 15:07:32 -0700124 return SkImageInfo::Make(width, height, kGray_8_SkColorType,
msarett23c51102016-05-27 07:39:02 -0700125 kOpaque_SkAlphaType, colorSpace);
msarettc30c4182016-04-20 11:53:35 -0700126 case kGrayAlpha_Color:
127 SkASSERT(kOpaque_Alpha != fAlpha);
128 return SkImageInfo::Make(width, height, kN32_SkColorType,
msarett23c51102016-05-27 07:39:02 -0700129 kUnpremul_SkAlphaType, colorSpace);
msarettc30c4182016-04-20 11:53:35 -0700130 case kPalette_Color: {
131 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAlphaType :
132 kUnpremul_SkAlphaType;
Leon Scroggins571b30f2017-07-11 17:35:31 +0000133 return SkImageInfo::Make(width, height, kN32_SkColorType,
msarett23c51102016-05-27 07:39:02 -0700134 alphaType, colorSpace);
msarettc30c4182016-04-20 11:53:35 -0700135 }
136 case kRGB_Color:
137 case kBGR_Color:
138 case kBGRX_Color:
139 case kYUV_Color:
140 case kInvertedCMYK_Color:
141 case kYCCK_Color:
142 SkASSERT(kOpaque_Alpha == fAlpha);
herb9bc22352016-04-20 15:07:32 -0700143 return SkImageInfo::Make(width, height, kN32_SkColorType,
msarett23c51102016-05-27 07:39:02 -0700144 kOpaque_SkAlphaType, colorSpace);
msarettc30c4182016-04-20 11:53:35 -0700145 case kRGBA_Color:
146 case kBGRA_Color:
147 case kYUVA_Color:
148 SkASSERT(kOpaque_Alpha != fAlpha);
herb9bc22352016-04-20 15:07:32 -0700149 return SkImageInfo::Make(width, height, kN32_SkColorType,
msarett530c8442016-07-21 11:57:49 -0700150 kUnpremul_SkAlphaType, std::move(colorSpace));
msarettc30c4182016-04-20 11:53:35 -0700151 default:
152 SkASSERT(false);
153 return SkImageInfo::MakeUnknown();
154 }
155 }
156
msaretta45a6682016-04-22 13:18:37 -0700157 Color color() const { return fColor; }
158 Alpha alpha() const { return fAlpha; }
Leon Scroggins III07418182017-08-15 12:24:02 -0400159 bool opaque() const { return fAlpha == kOpaque_Alpha; }
160
msaretta45a6682016-04-22 13:18:37 -0700161 uint8_t bitsPerComponent() const { return fBitsPerComponent; }
162
163 uint8_t bitsPerPixel() const {
164 switch (fColor) {
165 case kGray_Color:
166 return fBitsPerComponent;
167 case kGrayAlpha_Color:
168 return 2 * fBitsPerComponent;
169 case kPalette_Color:
170 return fBitsPerComponent;
171 case kRGB_Color:
172 case kBGR_Color:
173 case kYUV_Color:
174 return 3 * fBitsPerComponent;
175 case kRGBA_Color:
176 case kBGRA_Color:
177 case kBGRX_Color:
178 case kYUVA_Color:
179 case kInvertedCMYK_Color:
180 case kYCCK_Color:
181 return 4 * fBitsPerComponent;
182 default:
183 SkASSERT(false);
184 return 0;
185 }
186 }
187
msarettc30c4182016-04-20 11:53:35 -0700188private:
189
190 SkEncodedInfo(Color color, Alpha alpha, uint8_t bitsPerComponent)
191 : fColor(color)
192 , fAlpha(alpha)
193 , fBitsPerComponent(bitsPerComponent)
194 {}
195
196 Color fColor;
197 Alpha fAlpha;
198 uint8_t fBitsPerComponent;
msarettc30c4182016-04-20 11:53:35 -0700199};
200
201#endif