blob: 0c5bd0b4212a24fef4db6853ed83105a32692d5d [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,
msarettc30c4182016-04-20 11:53:35 -070024 };
25
26 /*
27 * We strive to make the number of components per pixel obvious through
28 * our naming conventions.
29 * Ex: kRGB has 3 components. kRGBA has 4 components.
30 *
31 * This sometimes results in redundant Alpha and Color information.
32 * Ex: kRGB images must also be kOpaque.
33 */
34 enum Color {
35 // PNG, WBMP
36 kGray_Color,
37
38 // PNG
39 kGrayAlpha_Color,
40
41 // PNG, GIF, BMP
42 kPalette_Color,
43
44 // PNG, RAW
45 kRGB_Color,
46 kRGBA_Color,
47
48 // BMP
49 kBGR_Color,
50 kBGRX_Color,
51 kBGRA_Color,
52
53 // JPEG, WEBP
54 kYUV_Color,
55
56 // WEBP
57 kYUVA_Color,
58
59 // JPEG
60 // Photoshop actually writes inverted CMYK data into JPEGs, where zero
61 // represents 100% ink coverage. For this reason, we treat CMYK JPEGs
62 // as having inverted CMYK. libjpeg-turbo warns that this may break
63 // other applications, but the CMYK JPEGs we see on the web expect to
64 // be treated as inverted CMYK.
65 kInvertedCMYK_Color,
66 kYCCK_Color,
msarettc30c4182016-04-20 11:53:35 -070067 };
68
69 static SkEncodedInfo Make(Color color, Alpha alpha, int bitsPerComponent) {
70 SkASSERT(1 == bitsPerComponent ||
71 2 == bitsPerComponent ||
72 4 == bitsPerComponent ||
73 8 == bitsPerComponent ||
74 16 == bitsPerComponent);
75
76 switch (color) {
77 case kGray_Color:
78 SkASSERT(kOpaque_Alpha == alpha);
79 break;
80 case kGrayAlpha_Color:
81 SkASSERT(kOpaque_Alpha != alpha);
82 break;
83 case kPalette_Color:
84 SkASSERT(16 != bitsPerComponent);
85 break;
86 case kRGB_Color:
87 case kBGR_Color:
88 case kBGRX_Color:
89 SkASSERT(kOpaque_Alpha == alpha);
90 SkASSERT(bitsPerComponent >= 8);
91 break;
92 case kYUV_Color:
93 case kInvertedCMYK_Color:
94 case kYCCK_Color:
95 SkASSERT(kOpaque_Alpha == alpha);
96 SkASSERT(8 == bitsPerComponent);
97 break;
98 case kRGBA_Color:
99 SkASSERT(kOpaque_Alpha != alpha);
100 SkASSERT(bitsPerComponent >= 8);
101 break;
102 case kBGRA_Color:
103 case kYUVA_Color:
104 SkASSERT(kOpaque_Alpha != alpha);
105 SkASSERT(8 == bitsPerComponent);
106 break;
107 default:
108 SkASSERT(false);
109 break;
110 }
111
112 return SkEncodedInfo(color, alpha, bitsPerComponent);
113 }
114
115 /*
116 * Returns an SkImageInfo with Skia color and alpha types that are the
117 * closest possible match to the encoded info.
118 */
119 SkImageInfo makeImageInfo(int width, int height) const {
herb9bc22352016-04-20 15:07:32 -0700120 SkColorProfileType profileType = SkDefaultColorProfile();
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,
125 kOpaque_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700126 case kGrayAlpha_Color:
127 SkASSERT(kOpaque_Alpha != fAlpha);
128 return SkImageInfo::Make(width, height, kN32_SkColorType,
herb9bc22352016-04-20 15:07:32 -0700129 kUnpremul_SkAlphaType, profileType);
msarettc30c4182016-04-20 11:53:35 -0700130 case kPalette_Color: {
131 SkAlphaType alphaType = (kOpaque_Alpha == fAlpha) ? kOpaque_SkAlphaType :
132 kUnpremul_SkAlphaType;
herb9bc22352016-04-20 15:07:32 -0700133 return SkImageInfo::Make(width, height, kIndex_8_SkColorType,
134 alphaType, profileType);
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,
144 kOpaque_SkAlphaType, profileType);
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,
150 kUnpremul_SkAlphaType, profileType);
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; }
159 uint8_t bitsPerComponent() const { return fBitsPerComponent; }
160
161 uint8_t bitsPerPixel() const {
162 switch (fColor) {
163 case kGray_Color:
164 return fBitsPerComponent;
165 case kGrayAlpha_Color:
166 return 2 * fBitsPerComponent;
167 case kPalette_Color:
168 return fBitsPerComponent;
169 case kRGB_Color:
170 case kBGR_Color:
171 case kYUV_Color:
172 return 3 * fBitsPerComponent;
173 case kRGBA_Color:
174 case kBGRA_Color:
175 case kBGRX_Color:
176 case kYUVA_Color:
177 case kInvertedCMYK_Color:
178 case kYCCK_Color:
179 return 4 * fBitsPerComponent;
180 default:
181 SkASSERT(false);
182 return 0;
183 }
184 }
185
msarettc30c4182016-04-20 11:53:35 -0700186private:
187
188 SkEncodedInfo(Color color, Alpha alpha, uint8_t bitsPerComponent)
189 : fColor(color)
190 , fAlpha(alpha)
191 , fBitsPerComponent(bitsPerComponent)
192 {}
193
msaretta45a6682016-04-22 13:18:37 -0700194 void setColor(Color color) {
195 fColor = color;
196 }
197
msarettc30c4182016-04-20 11:53:35 -0700198 Color fColor;
199 Alpha fAlpha;
200 uint8_t fBitsPerComponent;
msaretta45a6682016-04-22 13:18:37 -0700201
202 friend class SkJpegCodec;
msarettc30c4182016-04-20 11:53:35 -0700203};
204
205#endif