OLD | NEW |
---|---|
(Empty) | |
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 SkEncodedInfo_DEFINED | |
9 #define SkEncodedInfo_DEFINED | |
10 | |
11 #include "SkImageInfo.h" | |
12 | |
13 struct SkEncodedInfo { | |
14 public: | |
15 | |
16 enum Alpha { | |
17 kOpaque_Alpha, | |
18 kUnpremul_Alpha, | |
19 | |
20 // Each pixel is either fully opaque or fully transparent. | |
reed1
2016/04/07 15:08:01
Are there no native premul image formats (e.g. web
msarett
2016/04/07 15:24:49
As far as I know, nothing is kPremul. We allow li
| |
21 // There is no difference between requesting kPremul or kUnpremul. | |
22 kBinary_Alpha, | |
23 | |
24 // Allows us to have a default constructor. Should be treated as | |
25 // invalid. | |
26 kUnknown_Alpha, | |
27 }; | |
28 | |
29 /* | |
30 * We strive to make the number of components per pixel obvious through | |
31 * our naming conventions. | |
32 * Ex: kRGB has 3 components. kRGBA has 4 components. | |
33 * | |
34 * This sometimes results in redundant Alpha and Color information. | |
35 * Ex: kRGB images must also be kOpaque. | |
36 */ | |
37 enum Color { | |
38 // PNG, WBMP | |
39 kGray_Color, | |
40 | |
41 // PNG | |
42 kGrayAlpha_Color, | |
43 | |
44 // PNG, GIF, BMP | |
45 kPalette_Color, | |
46 | |
47 // PNG, RAW | |
48 kRGB_Color, | |
49 kRGBA_Color, | |
50 | |
51 // BMP | |
52 kBGR_Color, | |
53 kBGRX_Color, | |
54 kBGRA_Color, | |
55 | |
56 // JPEG, WEBP | |
57 kYUV_Color, | |
58 | |
59 // WEBP | |
60 kYUVA_Color, | |
61 | |
62 // JPEG | |
63 // Photoshop actually writes inverted CMYK data into JPEGs, where zero | |
64 // represents 100% ink coverage. For this reason, we treat CMYK JPEGs | |
65 // as having inverted CMYK. libjpeg-turbo warns that this may break | |
66 // other applications, but the CMYK JPEGs we see on the web expect to | |
67 // be treated as inverted CMYK. | |
68 kInvertedCMYK_Color, | |
69 kYCCK_Color, | |
70 | |
71 // Allows us to have a default constructor. Should be treated as | |
72 // invalid. | |
73 kUnknown_Color, | |
74 }; | |
75 | |
76 static SkEncodedInfo Make(const SkISize& size, Color color, Alpha alpha, int bitsPerComponent) { | |
77 return SkEncodedInfo::Make(size.width(), size.height(), color, alpha, bi tsPerComponent); | |
78 } | |
79 | |
80 static SkEncodedInfo Make(int width, int height, Color color, Alpha alpha, | |
81 int bitsPerComponent) { | |
82 SkASSERT(width > 0 && height > 0); | |
83 | |
84 SkASSERT(1 == bitsPerComponent || | |
85 2 == bitsPerComponent || | |
86 4 == bitsPerComponent || | |
87 8 == bitsPerComponent || | |
88 16 == bitsPerComponent); | |
89 | |
90 switch (color) { | |
91 case kGray_Color: | |
92 SkASSERT(kOpaque_Alpha == alpha); | |
93 break; | |
94 case kGrayAlpha_Color: | |
95 SkASSERT(kOpaque_Alpha != alpha); | |
96 break; | |
97 case kPalette_Color: | |
98 SkASSERT(16 != bitsPerComponent); | |
99 break; | |
100 case kRGB_Color: | |
101 case kBGR_Color: | |
102 case kBGRX_Color: | |
103 SkASSERT(kOpaque_Alpha == alpha); | |
104 SkASSERT(bitsPerComponent >= 8); | |
105 break; | |
106 case kYUV_Color: | |
107 case kInvertedCMYK_Color: | |
108 case kYCCK_Color: | |
109 SkASSERT(kOpaque_Alpha == alpha); | |
110 SkASSERT(8 == bitsPerComponent); | |
111 break; | |
112 case kRGBA_Color: | |
113 SkASSERT(kOpaque_Alpha != alpha); | |
114 SkASSERT(bitsPerComponent >= 8); | |
115 break; | |
116 case kBGRA_Color: | |
117 case kYUVA_Color: | |
118 SkASSERT(kOpaque_Alpha != alpha); | |
119 SkASSERT(8 == bitsPerComponent); | |
120 break; | |
121 default: | |
122 SkASSERT(false); | |
123 break; | |
124 } | |
125 | |
126 return SkEncodedInfo(width, height, color, alpha, bitsPerComponent); | |
127 } | |
128 | |
129 /* | |
130 * Returns an SkImageInfo with Skia color and alpha types that are the | |
131 * closest possible match to the encoded info. | |
132 */ | |
133 SkImageInfo makeImageInfo() const { | |
134 switch (fColor) { | |
135 case kGray_Color: | |
136 SkASSERT(kOpaque_Alpha == fAlpha); | |
137 return SkImageInfo::Make(fWidth, fHeight, kGray_8_SkColorType, k Opaque_SkAlphaType); | |
138 case kGrayAlpha_Color: | |
139 SkASSERT(kOpaque_Alpha != fAlpha); | |
140 return SkImageInfo::Make(fWidth, fHeight, kGray_8_SkColorType, | |
141 kUnpremul_SkAlphaType); | |
142 case kPalette_Color: { | |
143 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAl phaType : | |
144 kUnpremul_SkAlphaType; | |
145 return SkImageInfo::Make(fWidth, fHeight, kIndex_8_SkColorType, alphaType); | |
146 } | |
147 case kRGB_Color: | |
148 case kBGR_Color: | |
149 case kBGRX_Color: | |
150 case kYUV_Color: | |
151 case kInvertedCMYK_Color: | |
152 case kYCCK_Color: | |
153 SkASSERT(kOpaque_Alpha == fAlpha); | |
154 return SkImageInfo::Make(fWidth, fHeight, kN32_SkColorType, kOpa que_SkAlphaType); | |
155 case kRGBA_Color: | |
156 case kBGRA_Color: | |
157 case kYUVA_Color: | |
158 SkASSERT(kOpaque_Alpha != fAlpha); | |
159 return SkImageInfo::Make(fWidth, fHeight, kN32_SkColorType, kUnp remul_SkAlphaType); | |
160 default: | |
161 SkASSERT(false); | |
162 return SkImageInfo::MakeUnknown(); | |
163 } | |
164 } | |
165 | |
166 int width() const { return fWidth; } | |
167 int height() const { return fHeight; } | |
168 | |
169 SkEncodedInfo() | |
170 : fWidth(0) | |
171 , fHeight(0) | |
172 , fColor(kUnknown_Color) | |
173 , fAlpha(kUnknown_Alpha) | |
174 , fBitsPerComponent(0) | |
175 {} | |
176 | |
177 private: | |
178 | |
179 SkEncodedInfo(int width, int height, Color color, Alpha alpha, uint8_t bitsP erComponent) | |
180 : fWidth(width) | |
181 , fHeight(height) | |
182 , fColor(color) | |
183 , fAlpha(alpha) | |
184 , fBitsPerComponent(bitsPerComponent) | |
185 {} | |
186 | |
187 int fWidth; | |
188 int fHeight; | |
189 Color fColor; | |
190 Alpha fAlpha; | |
191 uint8_t fBitsPerComponent; | |
192 }; | |
193 | |
194 #endif | |
OLD | NEW |