Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: include/codec/SkEncodedInfo.h

Issue 1820073002: Add SkEncodedInfo to report properties of encoded image data (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/codec/SkCodec.h ('k') | src/codec/SkBmpCodec.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « include/codec/SkCodec.h ('k') | src/codec/SkBmpCodec.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698