blob: 60bfdc5a1e5b02ec765f468d56cd7bcc7b2efa0f [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"
herb9bc22352016-04-20 15:07:32 -070012#include "../private/SkImageInfoPriv.h"
msarettc30c4182016-04-20 11:53:35 -070013
14struct SkEncodedInfo {
15public:
16
17 enum Alpha {
18 kOpaque_Alpha,
19 kUnpremul_Alpha,
20
21 // Each pixel is either fully opaque or fully transparent.
22 // There is no difference between requesting kPremul or kUnpremul.
23 kBinary_Alpha,
24
25 // Allows us to have a default constructor. Should be treated as
26 // invalid.
27 kUnknown_Alpha,
28 };
29
30 /*
31 * We strive to make the number of components per pixel obvious through
32 * our naming conventions.
33 * Ex: kRGB has 3 components. kRGBA has 4 components.
34 *
35 * This sometimes results in redundant Alpha and Color information.
36 * Ex: kRGB images must also be kOpaque.
37 */
38 enum Color {
39 // PNG, WBMP
40 kGray_Color,
41
42 // PNG
43 kGrayAlpha_Color,
44
45 // PNG, GIF, BMP
46 kPalette_Color,
47
48 // PNG, RAW
49 kRGB_Color,
50 kRGBA_Color,
51
52 // BMP
53 kBGR_Color,
54 kBGRX_Color,
55 kBGRA_Color,
56
57 // JPEG, WEBP
58 kYUV_Color,
59
60 // WEBP
61 kYUVA_Color,
62
63 // JPEG
64 // Photoshop actually writes inverted CMYK data into JPEGs, where zero
65 // represents 100% ink coverage. For this reason, we treat CMYK JPEGs
66 // as having inverted CMYK. libjpeg-turbo warns that this may break
67 // other applications, but the CMYK JPEGs we see on the web expect to
68 // be treated as inverted CMYK.
69 kInvertedCMYK_Color,
70 kYCCK_Color,
71
msaretta45a6682016-04-22 13:18:37 -070072 // Used internally to indicate that the decoding library has
73 // pre-swizzled to the desired output format.
74 kPreSwizzled_Color,
75
msarettc30c4182016-04-20 11:53:35 -070076 // Allows us to have a default constructor. Should be treated as
77 // invalid.
78 kUnknown_Color,
79 };
80
81 static SkEncodedInfo Make(Color color, Alpha alpha, int bitsPerComponent) {
82 SkASSERT(1 == bitsPerComponent ||
83 2 == bitsPerComponent ||
84 4 == bitsPerComponent ||
85 8 == bitsPerComponent ||
86 16 == bitsPerComponent);
87
88 switch (color) {
89 case kGray_Color:
90 SkASSERT(kOpaque_Alpha == alpha);
91 break;
92 case kGrayAlpha_Color:
93 SkASSERT(kOpaque_Alpha != alpha);
94 break;
95 case kPalette_Color:
96 SkASSERT(16 != bitsPerComponent);
97 break;
98 case kRGB_Color:
99 case kBGR_Color:
100 case kBGRX_Color:
101 SkASSERT(kOpaque_Alpha == alpha);
102 SkASSERT(bitsPerComponent >= 8);
103 break;
104 case kYUV_Color:
105 case kInvertedCMYK_Color:
106 case kYCCK_Color:
107 SkASSERT(kOpaque_Alpha == alpha);
108 SkASSERT(8 == bitsPerComponent);
109 break;
110 case kRGBA_Color:
111 SkASSERT(kOpaque_Alpha != alpha);
112 SkASSERT(bitsPerComponent >= 8);
113 break;
114 case kBGRA_Color:
115 case kYUVA_Color:
116 SkASSERT(kOpaque_Alpha != alpha);
117 SkASSERT(8 == bitsPerComponent);
118 break;
119 default:
120 SkASSERT(false);
121 break;
122 }
123
124 return SkEncodedInfo(color, alpha, bitsPerComponent);
125 }
126
127 /*
128 * Returns an SkImageInfo with Skia color and alpha types that are the
129 * closest possible match to the encoded info.
130 */
131 SkImageInfo makeImageInfo(int width, int height) const {
herb9bc22352016-04-20 15:07:32 -0700132 SkColorProfileType profileType = SkDefaultColorProfile();
msarettc30c4182016-04-20 11:53:35 -0700133 switch (fColor) {
134 case kGray_Color:
135 SkASSERT(kOpaque_Alpha == fAlpha);
herb9bc22352016-04-20 15:07:32 -0700136 return SkImageInfo::Make(width, height, kGray_8_SkColorType,
137 kOpaque_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700138 case kGrayAlpha_Color:
139 SkASSERT(kOpaque_Alpha != fAlpha);
140 return SkImageInfo::Make(width, height, kN32_SkColorType,
herb9bc22352016-04-20 15:07:32 -0700141 kUnpremul_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700142 case kPalette_Color: {
143 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAlphaType :
144 kUnpremul_SkAlphaType;
herb9bc22352016-04-20 15:07:32 -0700145 return SkImageInfo::Make(width, height, kIndex_8_SkColorType,
146 alphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700147 }
148 case kRGB_Color:
149 case kBGR_Color:
150 case kBGRX_Color:
151 case kYUV_Color:
152 case kInvertedCMYK_Color:
153 case kYCCK_Color:
154 SkASSERT(kOpaque_Alpha == fAlpha);
herb9bc22352016-04-20 15:07:32 -0700155 return SkImageInfo::Make(width, height, kN32_SkColorType,
156 kOpaque_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700157 case kRGBA_Color:
158 case kBGRA_Color:
159 case kYUVA_Color:
160 SkASSERT(kOpaque_Alpha != fAlpha);
herb9bc22352016-04-20 15:07:32 -0700161 return SkImageInfo::Make(width, height, kN32_SkColorType,
162 kUnpremul_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700163 default:
164 SkASSERT(false);
165 return SkImageInfo::MakeUnknown();
166 }
167 }
168
msaretta45a6682016-04-22 13:18:37 -0700169 Color color() const { return fColor; }
170 Alpha alpha() const { return fAlpha; }
171 uint8_t bitsPerComponent() const { return fBitsPerComponent; }
172
173 uint8_t bitsPerPixel() const {
174 switch (fColor) {
175 case kGray_Color:
176 return fBitsPerComponent;
177 case kGrayAlpha_Color:
178 return 2 * fBitsPerComponent;
179 case kPalette_Color:
180 return fBitsPerComponent;
181 case kRGB_Color:
182 case kBGR_Color:
183 case kYUV_Color:
184 return 3 * fBitsPerComponent;
185 case kRGBA_Color:
186 case kBGRA_Color:
187 case kBGRX_Color:
188 case kYUVA_Color:
189 case kInvertedCMYK_Color:
190 case kYCCK_Color:
191 return 4 * fBitsPerComponent;
192 default:
193 SkASSERT(false);
194 return 0;
195 }
196 }
197
msarettc30c4182016-04-20 11:53:35 -0700198 SkEncodedInfo()
199 : fColor(kUnknown_Color)
200 , fAlpha(kUnknown_Alpha)
201 , fBitsPerComponent(0)
202 {}
203
204private:
205
206 SkEncodedInfo(Color color, Alpha alpha, uint8_t bitsPerComponent)
207 : fColor(color)
208 , fAlpha(alpha)
209 , fBitsPerComponent(bitsPerComponent)
210 {}
211
msaretta45a6682016-04-22 13:18:37 -0700212 void setColor(Color color) {
213 fColor = color;
214 }
215
msarettc30c4182016-04-20 11:53:35 -0700216 Color fColor;
217 Alpha fAlpha;
218 uint8_t fBitsPerComponent;
msaretta45a6682016-04-22 13:18:37 -0700219
220 friend class SkJpegCodec;
msarettc30c4182016-04-20 11:53:35 -0700221};
222
223#endif