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. | |
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(Color color, Alpha alpha, int bitsPerComponent) { | |
77 SkASSERT(1 == bitsPerComponent || | |
78 2 == bitsPerComponent || | |
79 4 == bitsPerComponent || | |
80 8 == bitsPerComponent || | |
81 16 == bitsPerComponent); | |
82 | |
83 switch (color) { | |
84 case kGray_Color: | |
85 SkASSERT(kOpaque_Alpha == alpha); | |
86 break; | |
87 case kGrayAlpha_Color: | |
88 SkASSERT(kOpaque_Alpha != alpha); | |
89 break; | |
90 case kPalette_Color: | |
91 SkASSERT(16 != bitsPerComponent); | |
92 break; | |
93 case kRGB_Color: | |
94 case kBGR_Color: | |
95 case kBGRX_Color: | |
96 SkASSERT(kOpaque_Alpha == alpha); | |
97 SkASSERT(bitsPerComponent >= 8); | |
98 break; | |
99 case kYUV_Color: | |
100 case kInvertedCMYK_Color: | |
101 case kYCCK_Color: | |
102 SkASSERT(kOpaque_Alpha == alpha); | |
103 SkASSERT(8 == bitsPerComponent); | |
104 break; | |
105 case kRGBA_Color: | |
106 SkASSERT(kOpaque_Alpha != alpha); | |
107 SkASSERT(bitsPerComponent >= 8); | |
108 break; | |
109 case kBGRA_Color: | |
110 case kYUVA_Color: | |
111 SkASSERT(kOpaque_Alpha != alpha); | |
112 SkASSERT(8 == bitsPerComponent); | |
113 break; | |
114 default: | |
115 SkASSERT(false); | |
116 break; | |
117 } | |
118 | |
119 return SkEncodedInfo(color, alpha, bitsPerComponent); | |
120 } | |
121 | |
122 /* | |
123 * Returns an SkImageInfo with Skia color and alpha types that are the | |
124 * closest possible match to the encoded info. | |
125 */ | |
126 SkImageInfo makeImageInfo(int width, int height) const { | |
127 switch (fColor) { | |
128 case kGray_Color: | |
129 SkASSERT(kOpaque_Alpha == fAlpha); | |
130 return SkImageInfo::Make(width, height, kGray_8_SkColorType, kOp
aque_SkAlphaType); | |
131 case kGrayAlpha_Color: | |
132 SkASSERT(kOpaque_Alpha != fAlpha); | |
133 return SkImageInfo::Make(width, height, kN32_SkColorType, | |
134 kUnpremul_SkAlphaType); | |
135 case kPalette_Color: { | |
136 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAl
phaType : | |
137 kUnpremul_SkAlphaType; | |
138 return SkImageInfo::Make(width, height, kIndex_8_SkColorType, al
phaType); | |
139 } | |
140 case kRGB_Color: | |
141 case kBGR_Color: | |
142 case kBGRX_Color: | |
143 case kYUV_Color: | |
144 case kInvertedCMYK_Color: | |
145 case kYCCK_Color: | |
146 SkASSERT(kOpaque_Alpha == fAlpha); | |
147 return SkImageInfo::Make(width, height, kN32_SkColorType, kOpaqu
e_SkAlphaType); | |
148 case kRGBA_Color: | |
149 case kBGRA_Color: | |
150 case kYUVA_Color: | |
151 SkASSERT(kOpaque_Alpha != fAlpha); | |
152 return SkImageInfo::Make(width, height, kN32_SkColorType, kUnpre
mul_SkAlphaType); | |
153 default: | |
154 SkASSERT(false); | |
155 return SkImageInfo::MakeUnknown(); | |
156 } | |
157 } | |
158 | |
159 SkEncodedInfo() | |
160 : fColor(kUnknown_Color) | |
161 , fAlpha(kUnknown_Alpha) | |
162 , fBitsPerComponent(0) | |
163 {} | |
164 | |
165 private: | |
166 | |
167 SkEncodedInfo(Color color, Alpha alpha, uint8_t bitsPerComponent) | |
168 : fColor(color) | |
169 , fAlpha(alpha) | |
170 , fBitsPerComponent(bitsPerComponent) | |
171 {} | |
172 | |
173 Color fColor; | |
174 Alpha fAlpha; | |
175 uint8_t fBitsPerComponent; | |
176 }; | |
177 | |
178 #endif | |
OLD | NEW |