/src/skia/include/core/SkImageInfo.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2013 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 SkImageInfo_DEFINED |
9 | | #define SkImageInfo_DEFINED |
10 | | |
11 | | #include "include/core/SkAlphaType.h" |
12 | | #include "include/core/SkColorType.h" |
13 | | #include "include/core/SkRect.h" |
14 | | #include "include/core/SkRefCnt.h" |
15 | | #include "include/core/SkSize.h" |
16 | | #include "include/private/base/SkAPI.h" |
17 | | #include "include/private/base/SkDebug.h" |
18 | | #include "include/private/base/SkMath.h" |
19 | | #include "include/private/base/SkTFitsIn.h" |
20 | | |
21 | | #include <cstddef> |
22 | | #include <cstdint> |
23 | | #include <utility> |
24 | | |
25 | | class SkColorSpace; |
26 | | |
27 | | /** Returns the number of bytes required to store a pixel, including unused padding. |
28 | | Returns zero if ct is kUnknown_SkColorType or invalid. |
29 | | |
30 | | @return bytes per pixel |
31 | | */ |
32 | | SK_API int SkColorTypeBytesPerPixel(SkColorType ct); |
33 | | |
34 | | /** Returns true if SkColorType always decodes alpha to 1.0, making the pixel |
35 | | fully opaque. If true, SkColorType does not reserve bits to encode alpha. |
36 | | |
37 | | @return true if alpha is always set to 1.0 |
38 | | */ |
39 | | SK_API bool SkColorTypeIsAlwaysOpaque(SkColorType ct); |
40 | | |
41 | | /** Returns true if canonical can be set to a valid SkAlphaType for colorType. If |
42 | | there is more than one valid canonical SkAlphaType, set to alphaType, if valid. |
43 | | If true is returned and canonical is not nullptr, store valid SkAlphaType. |
44 | | |
45 | | Returns false only if alphaType is kUnknown_SkAlphaType, color type is not |
46 | | kUnknown_SkColorType, and SkColorType is not always opaque. If false is returned, |
47 | | canonical is ignored. |
48 | | |
49 | | @param canonical storage for SkAlphaType |
50 | | @return true if valid SkAlphaType can be associated with colorType |
51 | | */ |
52 | | SK_API bool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType, |
53 | | SkAlphaType* canonical = nullptr); |
54 | | |
55 | | /** \enum SkImageInfo::SkYUVColorSpace |
56 | | Describes color range of YUV pixels. The color mapping from YUV to RGB varies |
57 | | depending on the source. YUV pixels may be generated by JPEG images, standard |
58 | | video streams, or high definition video streams. Each has its own mapping from |
59 | | YUV to RGB. |
60 | | |
61 | | JPEG YUV values encode the full range of 0 to 255 for all three components. |
62 | | Video YUV values often range from 16 to 235 for Y and from 16 to 240 for U and V (limited). |
63 | | Details of encoding and conversion to RGB are described in YCbCr color space. |
64 | | |
65 | | The identity colorspace exists to provide a utility mapping from Y to R, U to G and V to B. |
66 | | It can be used to visualize the YUV planes or to explicitly post process the YUV channels. |
67 | | */ |
68 | | enum SkYUVColorSpace : int { |
69 | | kJPEG_Full_SkYUVColorSpace, //!< describes full range |
70 | | kRec601_Limited_SkYUVColorSpace, //!< describes SDTV range |
71 | | kRec709_Full_SkYUVColorSpace, //!< describes HDTV range |
72 | | kRec709_Limited_SkYUVColorSpace, |
73 | | kBT2020_8bit_Full_SkYUVColorSpace, //!< describes UHDTV range, non-constant-luminance |
74 | | kBT2020_8bit_Limited_SkYUVColorSpace, |
75 | | kBT2020_10bit_Full_SkYUVColorSpace, |
76 | | kBT2020_10bit_Limited_SkYUVColorSpace, |
77 | | kBT2020_12bit_Full_SkYUVColorSpace, |
78 | | kBT2020_12bit_Limited_SkYUVColorSpace, |
79 | | kFCC_Full_SkYUVColorSpace, //!< describes FCC range |
80 | | kFCC_Limited_SkYUVColorSpace, |
81 | | kSMPTE240_Full_SkYUVColorSpace, //!< describes SMPTE240M range |
82 | | kSMPTE240_Limited_SkYUVColorSpace, |
83 | | kYDZDX_Full_SkYUVColorSpace, //!< describes YDZDX range |
84 | | kYDZDX_Limited_SkYUVColorSpace, |
85 | | kGBR_Full_SkYUVColorSpace, //!< describes GBR range |
86 | | kGBR_Limited_SkYUVColorSpace, |
87 | | kYCgCo_8bit_Full_SkYUVColorSpace, //!< describes YCgCo matrix |
88 | | kYCgCo_8bit_Limited_SkYUVColorSpace, |
89 | | kYCgCo_10bit_Full_SkYUVColorSpace, |
90 | | kYCgCo_10bit_Limited_SkYUVColorSpace, |
91 | | kYCgCo_12bit_Full_SkYUVColorSpace, |
92 | | kYCgCo_12bit_Limited_SkYUVColorSpace, |
93 | | kIdentity_SkYUVColorSpace, //!< maps Y->R, U->G, V->B |
94 | | |
95 | | kLastEnum_SkYUVColorSpace = kIdentity_SkYUVColorSpace, //!< last valid value |
96 | | |
97 | | // Legacy (deprecated) names: |
98 | | kJPEG_SkYUVColorSpace = kJPEG_Full_SkYUVColorSpace, |
99 | | kRec601_SkYUVColorSpace = kRec601_Limited_SkYUVColorSpace, |
100 | | kRec709_SkYUVColorSpace = kRec709_Limited_SkYUVColorSpace, |
101 | | kBT2020_SkYUVColorSpace = kBT2020_8bit_Limited_SkYUVColorSpace, |
102 | | }; |
103 | | |
104 | | /** \struct SkColorInfo |
105 | | Describes pixel and encoding. SkImageInfo can be created from SkColorInfo by |
106 | | providing dimensions. |
107 | | |
108 | | It encodes how pixel bits describe alpha, transparency; color components red, blue, |
109 | | and green; and SkColorSpace, the range and linearity of colors. |
110 | | */ |
111 | | class SK_API SkColorInfo { |
112 | | public: |
113 | | /** Creates an SkColorInfo with kUnknown_SkColorType, kUnknown_SkAlphaType, |
114 | | and no SkColorSpace. |
115 | | |
116 | | @return empty SkImageInfo |
117 | | */ |
118 | | SkColorInfo(); |
119 | | ~SkColorInfo(); |
120 | | |
121 | | /** Creates SkColorInfo from SkColorType ct, SkAlphaType at, and optionally SkColorSpace cs. |
122 | | |
123 | | If SkColorSpace cs is nullptr and SkColorInfo is part of drawing source: SkColorSpace |
124 | | defaults to sRGB, mapping into SkSurface SkColorSpace. |
125 | | |
126 | | Parameters are not validated to see if their values are legal, or that the |
127 | | combination is supported. |
128 | | @return created SkColorInfo |
129 | | */ |
130 | | SkColorInfo(SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs); |
131 | | |
132 | | SkColorInfo(const SkColorInfo&); |
133 | | SkColorInfo(SkColorInfo&&); |
134 | | |
135 | | SkColorInfo& operator=(const SkColorInfo&); |
136 | | SkColorInfo& operator=(SkColorInfo&&); |
137 | | |
138 | | SkColorSpace* colorSpace() const; |
139 | | sk_sp<SkColorSpace> refColorSpace() const; |
140 | 15.8M | SkColorType colorType() const { return fColorType; } |
141 | 5.12M | SkAlphaType alphaType() const { return fAlphaType; } |
142 | | |
143 | 411k | bool isOpaque() const { |
144 | 411k | return SkAlphaTypeIsOpaque(fAlphaType) |
145 | 411k | || SkColorTypeIsAlwaysOpaque(fColorType); |
146 | 411k | } |
147 | | |
148 | | bool gammaCloseToSRGB() const; |
149 | | |
150 | | /** Does other represent the same color type, alpha type, and color space? */ |
151 | | bool operator==(const SkColorInfo& other) const; |
152 | | |
153 | | /** Does other represent a different color type, alpha type, or color space? */ |
154 | | bool operator!=(const SkColorInfo& other) const; |
155 | | |
156 | | /** Creates SkColorInfo with same SkColorType, SkColorSpace, with SkAlphaType set |
157 | | to newAlphaType. |
158 | | |
159 | | Created SkColorInfo contains newAlphaType even if it is incompatible with |
160 | | SkColorType, in which case SkAlphaType in SkColorInfo is ignored. |
161 | | */ |
162 | | SkColorInfo makeAlphaType(SkAlphaType newAlphaType) const; |
163 | | |
164 | | /** Creates new SkColorInfo with same SkAlphaType, SkColorSpace, with SkColorType |
165 | | set to newColorType. |
166 | | */ |
167 | | SkColorInfo makeColorType(SkColorType newColorType) const; |
168 | | |
169 | | /** Creates SkColorInfo with same SkAlphaType, SkColorType, with SkColorSpace |
170 | | set to cs. cs may be nullptr. |
171 | | */ |
172 | | SkColorInfo makeColorSpace(sk_sp<SkColorSpace> cs) const; |
173 | | |
174 | | /** Returns number of bytes per pixel required by SkColorType. |
175 | | Returns zero if colorType() is kUnknown_SkColorType. |
176 | | |
177 | | @return bytes in pixel |
178 | | |
179 | | example: https://fiddle.skia.org/c/@ImageInfo_bytesPerPixel |
180 | | */ |
181 | | int bytesPerPixel() const; |
182 | | |
183 | | /** Returns bit shift converting row bytes to row pixels. |
184 | | Returns zero for kUnknown_SkColorType. |
185 | | |
186 | | @return one of: 0, 1, 2, 3, 4; left shift to convert pixels to bytes |
187 | | |
188 | | example: https://fiddle.skia.org/c/@ImageInfo_shiftPerPixel |
189 | | */ |
190 | | int shiftPerPixel() const; |
191 | | |
192 | | private: |
193 | | sk_sp<SkColorSpace> fColorSpace; |
194 | | SkColorType fColorType = kUnknown_SkColorType; |
195 | | SkAlphaType fAlphaType = kUnknown_SkAlphaType; |
196 | | }; |
197 | | |
198 | | /** \struct SkImageInfo |
199 | | Describes pixel dimensions and encoding. SkBitmap, SkImage, PixMap, and SkSurface |
200 | | can be created from SkImageInfo. SkImageInfo can be retrieved from SkBitmap and |
201 | | SkPixmap, but not from SkImage and SkSurface. For example, SkImage and SkSurface |
202 | | implementations may defer pixel depth, so may not completely specify SkImageInfo. |
203 | | |
204 | | SkImageInfo contains dimensions, the pixel integral width and height. It encodes |
205 | | how pixel bits describe alpha, transparency; color components red, blue, |
206 | | and green; and SkColorSpace, the range and linearity of colors. |
207 | | */ |
208 | | struct SK_API SkImageInfo { |
209 | | public: |
210 | | |
211 | | /** Creates an empty SkImageInfo with kUnknown_SkColorType, kUnknown_SkAlphaType, |
212 | | a width and height of zero, and no SkColorSpace. |
213 | | |
214 | | @return empty SkImageInfo |
215 | | */ |
216 | 583k | SkImageInfo() = default; |
217 | | |
218 | | /** Creates SkImageInfo from integral dimensions width and height, SkColorType ct, |
219 | | SkAlphaType at, and optionally SkColorSpace cs. |
220 | | |
221 | | If SkColorSpace cs is nullptr and SkImageInfo is part of drawing source: SkColorSpace |
222 | | defaults to sRGB, mapping into SkSurface SkColorSpace. |
223 | | |
224 | | Parameters are not validated to see if their values are legal, or that the |
225 | | combination is supported. |
226 | | |
227 | | @param width pixel column count; must be zero or greater |
228 | | @param height pixel row count; must be zero or greater |
229 | | @param cs range of colors; may be nullptr |
230 | | @return created SkImageInfo |
231 | | */ |
232 | | static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at); |
233 | | static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at, |
234 | | sk_sp<SkColorSpace> cs); |
235 | | static SkImageInfo Make(SkISize dimensions, SkColorType ct, SkAlphaType at); |
236 | | static SkImageInfo Make(SkISize dimensions, SkColorType ct, SkAlphaType at, |
237 | | sk_sp<SkColorSpace> cs); |
238 | | |
239 | | /** Creates SkImageInfo from integral dimensions and SkColorInfo colorInfo, |
240 | | |
241 | | Parameters are not validated to see if their values are legal, or that the |
242 | | combination is supported. |
243 | | |
244 | | @param dimensions pixel column and row count; must be zeros or greater |
245 | | @param SkColorInfo the pixel encoding consisting of SkColorType, SkAlphaType, and |
246 | | SkColorSpace (which may be nullptr) |
247 | | @return created SkImageInfo |
248 | | */ |
249 | 497k | static SkImageInfo Make(SkISize dimensions, const SkColorInfo& colorInfo) { |
250 | 497k | return SkImageInfo(dimensions, colorInfo); |
251 | 497k | } |
252 | 953k | static SkImageInfo Make(SkISize dimensions, SkColorInfo&& colorInfo) { |
253 | 953k | return SkImageInfo(dimensions, std::move(colorInfo)); |
254 | 953k | } |
255 | | |
256 | | /** Creates SkImageInfo from integral dimensions width and height, kN32_SkColorType, |
257 | | SkAlphaType at, and optionally SkColorSpace cs. kN32_SkColorType will equal either |
258 | | kBGRA_8888_SkColorType or kRGBA_8888_SkColorType, whichever is optimal. |
259 | | |
260 | | If SkColorSpace cs is nullptr and SkImageInfo is part of drawing source: SkColorSpace |
261 | | defaults to sRGB, mapping into SkSurface SkColorSpace. |
262 | | |
263 | | Parameters are not validated to see if their values are legal, or that the |
264 | | combination is supported. |
265 | | |
266 | | @param width pixel column count; must be zero or greater |
267 | | @param height pixel row count; must be zero or greater |
268 | | @param cs range of colors; may be nullptr |
269 | | @return created SkImageInfo |
270 | | */ |
271 | | static SkImageInfo MakeN32(int width, int height, SkAlphaType at); |
272 | | static SkImageInfo MakeN32(int width, int height, SkAlphaType at, sk_sp<SkColorSpace> cs); |
273 | | |
274 | | /** Creates SkImageInfo from integral dimensions width and height, kN32_SkColorType, |
275 | | SkAlphaType at, with sRGB SkColorSpace. |
276 | | |
277 | | Parameters are not validated to see if their values are legal, or that the |
278 | | combination is supported. |
279 | | |
280 | | @param width pixel column count; must be zero or greater |
281 | | @param height pixel row count; must be zero or greater |
282 | | @return created SkImageInfo |
283 | | |
284 | | example: https://fiddle.skia.org/c/@ImageInfo_MakeS32 |
285 | | */ |
286 | | static SkImageInfo MakeS32(int width, int height, SkAlphaType at); |
287 | | |
288 | | /** Creates SkImageInfo from integral dimensions width and height, kN32_SkColorType, |
289 | | kPremul_SkAlphaType, with optional SkColorSpace. |
290 | | |
291 | | If SkColorSpace cs is nullptr and SkImageInfo is part of drawing source: SkColorSpace |
292 | | defaults to sRGB, mapping into SkSurface SkColorSpace. |
293 | | |
294 | | Parameters are not validated to see if their values are legal, or that the |
295 | | combination is supported. |
296 | | |
297 | | @param width pixel column count; must be zero or greater |
298 | | @param height pixel row count; must be zero or greater |
299 | | @param cs range of colors; may be nullptr |
300 | | @return created SkImageInfo |
301 | | */ |
302 | | static SkImageInfo MakeN32Premul(int width, int height); |
303 | | static SkImageInfo MakeN32Premul(int width, int height, sk_sp<SkColorSpace> cs); |
304 | | |
305 | | /** Creates SkImageInfo from integral dimensions width and height, kN32_SkColorType, |
306 | | kPremul_SkAlphaType, with SkColorSpace set to nullptr. |
307 | | |
308 | | If SkImageInfo is part of drawing source: SkColorSpace defaults to sRGB, mapping |
309 | | into SkSurface SkColorSpace. |
310 | | |
311 | | Parameters are not validated to see if their values are legal, or that the |
312 | | combination is supported. |
313 | | |
314 | | @param dimensions width and height, each must be zero or greater |
315 | | @param cs range of colors; may be nullptr |
316 | | @return created SkImageInfo |
317 | | */ |
318 | | static SkImageInfo MakeN32Premul(SkISize dimensions); |
319 | | static SkImageInfo MakeN32Premul(SkISize dimensions, sk_sp<SkColorSpace> cs); |
320 | | |
321 | | /** Creates SkImageInfo from integral dimensions width and height, kAlpha_8_SkColorType, |
322 | | kPremul_SkAlphaType, with SkColorSpace set to nullptr. |
323 | | |
324 | | @param width pixel column count; must be zero or greater |
325 | | @param height pixel row count; must be zero or greater |
326 | | @return created SkImageInfo |
327 | | */ |
328 | | static SkImageInfo MakeA8(int width, int height); |
329 | | /** Creates SkImageInfo from integral dimensions, kAlpha_8_SkColorType, |
330 | | kPremul_SkAlphaType, with SkColorSpace set to nullptr. |
331 | | |
332 | | @param dimensions pixel row and column count; must be zero or greater |
333 | | @return created SkImageInfo |
334 | | */ |
335 | | static SkImageInfo MakeA8(SkISize dimensions); |
336 | | |
337 | | /** Creates SkImageInfo from integral dimensions width and height, kUnknown_SkColorType, |
338 | | kUnknown_SkAlphaType, with SkColorSpace set to nullptr. |
339 | | |
340 | | Returned SkImageInfo as part of source does not draw, and as part of destination |
341 | | can not be drawn to. |
342 | | |
343 | | @param width pixel column count; must be zero or greater |
344 | | @param height pixel row count; must be zero or greater |
345 | | @return created SkImageInfo |
346 | | */ |
347 | | static SkImageInfo MakeUnknown(int width, int height); |
348 | | |
349 | | /** Creates SkImageInfo from integral dimensions width and height set to zero, |
350 | | kUnknown_SkColorType, kUnknown_SkAlphaType, with SkColorSpace set to nullptr. |
351 | | |
352 | | Returned SkImageInfo as part of source does not draw, and as part of destination |
353 | | can not be drawn to. |
354 | | |
355 | | @return created SkImageInfo |
356 | | */ |
357 | 627k | static SkImageInfo MakeUnknown() { |
358 | 627k | return MakeUnknown(0, 0); |
359 | 627k | } |
360 | | |
361 | | /** Returns pixel count in each row. |
362 | | |
363 | | @return pixel width |
364 | | */ |
365 | 36.5M | int width() const { return fDimensions.width(); } |
366 | | |
367 | | /** Returns pixel row count. |
368 | | |
369 | | @return pixel height |
370 | | */ |
371 | 33.8M | int height() const { return fDimensions.height(); } |
372 | | |
373 | 14.3M | SkColorType colorType() const { return fColorInfo.colorType(); } |
374 | | |
375 | 4.53M | SkAlphaType alphaType() const { return fColorInfo.alphaType(); } |
376 | | |
377 | | /** Returns SkColorSpace, the range of colors. The reference count of |
378 | | SkColorSpace is unchanged. The returned SkColorSpace is immutable. |
379 | | |
380 | | @return SkColorSpace, or nullptr |
381 | | */ |
382 | | SkColorSpace* colorSpace() const; |
383 | | |
384 | | /** Returns smart pointer to SkColorSpace, the range of colors. The smart pointer |
385 | | tracks the number of objects sharing this SkColorSpace reference so the memory |
386 | | is released when the owners destruct. |
387 | | |
388 | | The returned SkColorSpace is immutable. |
389 | | |
390 | | @return SkColorSpace wrapped in a smart pointer |
391 | | */ |
392 | | sk_sp<SkColorSpace> refColorSpace() const; |
393 | | |
394 | | /** Returns if SkImageInfo describes an empty area of pixels by checking if either |
395 | | width or height is zero or smaller. |
396 | | |
397 | | @return true if either dimension is zero or smaller |
398 | | */ |
399 | 418k | bool isEmpty() const { return fDimensions.isEmpty(); } |
400 | | |
401 | | /** Returns the dimensionless SkColorInfo that represents the same color type, |
402 | | alpha type, and color space as this SkImageInfo. |
403 | | */ |
404 | 704k | const SkColorInfo& colorInfo() const { return fColorInfo; } |
405 | | |
406 | | /** Returns true if SkAlphaType is set to hint that all pixels are opaque; their |
407 | | alpha value is implicitly or explicitly 1.0. If true, and all pixels are |
408 | | not opaque, Skia may draw incorrectly. |
409 | | |
410 | | Does not check if SkColorType allows alpha, or if any pixel value has |
411 | | transparency. |
412 | | |
413 | | @return true if SkAlphaType is kOpaque_SkAlphaType |
414 | | */ |
415 | 411k | bool isOpaque() const { return fColorInfo.isOpaque(); } |
416 | | |
417 | | /** Returns SkISize { width(), height() }. |
418 | | |
419 | | @return integral size of width() and height() |
420 | | */ |
421 | 1.03M | SkISize dimensions() const { return fDimensions; } |
422 | | |
423 | | /** Returns SkIRect { 0, 0, width(), height() }. |
424 | | |
425 | | @return integral rectangle from origin to width() and height() |
426 | | */ |
427 | 109k | SkIRect bounds() const { return SkIRect::MakeSize(fDimensions); } |
428 | | |
429 | | /** Returns true if associated SkColorSpace is not nullptr, and SkColorSpace gamma |
430 | | is approximately the same as sRGB. |
431 | | This includes the |
432 | | |
433 | | @return true if SkColorSpace gamma is approximately the same as sRGB |
434 | | */ |
435 | 0 | bool gammaCloseToSRGB() const { return fColorInfo.gammaCloseToSRGB(); } |
436 | | |
437 | | /** Creates SkImageInfo with the same SkColorType, SkColorSpace, and SkAlphaType, |
438 | | with dimensions set to width and height. |
439 | | |
440 | | @param newWidth pixel column count; must be zero or greater |
441 | | @param newHeight pixel row count; must be zero or greater |
442 | | @return created SkImageInfo |
443 | | */ |
444 | 62.3k | SkImageInfo makeWH(int newWidth, int newHeight) const { |
445 | 62.3k | return Make({newWidth, newHeight}, fColorInfo); |
446 | 62.3k | } |
447 | | |
448 | | /** Creates SkImageInfo with the same SkColorType, SkColorSpace, and SkAlphaType, |
449 | | with dimensions set to newDimensions. |
450 | | |
451 | | @param newSize pixel column and row count; must be zero or greater |
452 | | @return created SkImageInfo |
453 | | */ |
454 | 435k | SkImageInfo makeDimensions(SkISize newSize) const { |
455 | 435k | return Make(newSize, fColorInfo); |
456 | 435k | } |
457 | | |
458 | | /** Creates SkImageInfo with same SkColorType, SkColorSpace, width, and height, |
459 | | with SkAlphaType set to newAlphaType. |
460 | | |
461 | | Created SkImageInfo contains newAlphaType even if it is incompatible with |
462 | | SkColorType, in which case SkAlphaType in SkImageInfo is ignored. |
463 | | |
464 | | @return created SkImageInfo |
465 | | */ |
466 | 842k | SkImageInfo makeAlphaType(SkAlphaType newAlphaType) const { |
467 | 842k | return Make(fDimensions, fColorInfo.makeAlphaType(newAlphaType)); |
468 | 842k | } |
469 | | |
470 | | /** Creates SkImageInfo with same SkAlphaType, SkColorSpace, width, and height, |
471 | | with SkColorType set to newColorType. |
472 | | |
473 | | @return created SkImageInfo |
474 | | */ |
475 | 11.8k | SkImageInfo makeColorType(SkColorType newColorType) const { |
476 | 11.8k | return Make(fDimensions, fColorInfo.makeColorType(newColorType)); |
477 | 11.8k | } |
478 | | |
479 | | /** Creates SkImageInfo with same SkAlphaType, SkColorType, width, and height, |
480 | | with SkColorSpace set to cs. |
481 | | |
482 | | @param cs range of colors; may be nullptr |
483 | | @return created SkImageInfo |
484 | | */ |
485 | | SkImageInfo makeColorSpace(sk_sp<SkColorSpace> cs) const; |
486 | | |
487 | | /** Returns number of bytes per pixel required by SkColorType. |
488 | | Returns zero if colorType( is kUnknown_SkColorType. |
489 | | |
490 | | @return bytes in pixel |
491 | | */ |
492 | 4.64M | int bytesPerPixel() const { return fColorInfo.bytesPerPixel(); } |
493 | | |
494 | | /** Returns bit shift converting row bytes to row pixels. |
495 | | Returns zero for kUnknown_SkColorType. |
496 | | |
497 | | @return one of: 0, 1, 2, 3; left shift to convert pixels to bytes |
498 | | */ |
499 | 3.35M | int shiftPerPixel() const { return fColorInfo.shiftPerPixel(); } |
500 | | |
501 | | /** Returns minimum bytes per row, computed from pixel width() and SkColorType, which |
502 | | specifies bytesPerPixel(). SkBitmap maximum value for row bytes must fit |
503 | | in 31 bits. |
504 | | |
505 | | @return width() times bytesPerPixel() as unsigned 64-bit integer |
506 | | */ |
507 | 2.37M | uint64_t minRowBytes64() const { |
508 | 2.37M | return (uint64_t)sk_64_mul(this->width(), this->bytesPerPixel()); |
509 | 2.37M | } |
510 | | |
511 | | /** Returns minimum bytes per row, computed from pixel width() and SkColorType, which |
512 | | specifies bytesPerPixel(). SkBitmap maximum value for row bytes must fit |
513 | | in 31 bits. |
514 | | |
515 | | @return width() times bytesPerPixel() as size_t |
516 | | */ |
517 | 816k | size_t minRowBytes() const { |
518 | 816k | uint64_t minRowBytes = this->minRowBytes64(); |
519 | 816k | if (!SkTFitsIn<int32_t>(minRowBytes)) { |
520 | 25 | return 0; |
521 | 25 | } |
522 | 816k | return (size_t)minRowBytes; |
523 | 816k | } |
524 | | |
525 | | /** Returns byte offset of pixel from pixel base address. |
526 | | |
527 | | Asserts in debug build if x or y is outside of bounds. Does not assert if |
528 | | rowBytes is smaller than minRowBytes(), even though result may be incorrect. |
529 | | |
530 | | @param x column index, zero or greater, and less than width() |
531 | | @param y row index, zero or greater, and less than height() |
532 | | @param rowBytes size of pixel row or larger |
533 | | @return offset within pixel array |
534 | | |
535 | | example: https://fiddle.skia.org/c/@ImageInfo_computeOffset |
536 | | */ |
537 | | size_t computeOffset(int x, int y, size_t rowBytes) const; |
538 | | |
539 | | /** Compares SkImageInfo with other, and returns true if width, height, SkColorType, |
540 | | SkAlphaType, and SkColorSpace are equivalent. |
541 | | |
542 | | @param other SkImageInfo to compare |
543 | | @return true if SkImageInfo equals other |
544 | | */ |
545 | 0 | bool operator==(const SkImageInfo& other) const { |
546 | 0 | return fDimensions == other.fDimensions && fColorInfo == other.fColorInfo; |
547 | 0 | } |
548 | | |
549 | | /** Compares SkImageInfo with other, and returns true if width, height, SkColorType, |
550 | | SkAlphaType, and SkColorSpace are not equivalent. |
551 | | |
552 | | @param other SkImageInfo to compare |
553 | | @return true if SkImageInfo is not equal to other |
554 | | */ |
555 | 0 | bool operator!=(const SkImageInfo& other) const { |
556 | 0 | return !(*this == other); |
557 | 0 | } |
558 | | |
559 | | /** Returns storage required by pixel array, given SkImageInfo dimensions, SkColorType, |
560 | | and rowBytes. rowBytes is assumed to be at least as large as minRowBytes(). |
561 | | |
562 | | Returns zero if height is zero. |
563 | | Returns SIZE_MAX if answer exceeds the range of size_t. |
564 | | |
565 | | @param rowBytes size of pixel row or larger |
566 | | @return memory required by pixel buffer |
567 | | */ |
568 | | size_t computeByteSize(size_t rowBytes) const; |
569 | | |
570 | | /** Returns storage required by pixel array, given SkImageInfo dimensions, and |
571 | | SkColorType. Uses minRowBytes() to compute bytes for pixel row. |
572 | | |
573 | | Returns zero if height is zero. |
574 | | Returns SIZE_MAX if answer exceeds the range of size_t. |
575 | | |
576 | | @return least memory required by pixel buffer |
577 | | */ |
578 | 16.8k | size_t computeMinByteSize() const { |
579 | 16.8k | return this->computeByteSize(this->minRowBytes()); |
580 | 16.8k | } |
581 | | |
582 | | /** Returns true if byteSize equals SIZE_MAX. computeByteSize() and |
583 | | computeMinByteSize() return SIZE_MAX if size_t can not hold buffer size. |
584 | | |
585 | | @param byteSize result of computeByteSize() or computeMinByteSize() |
586 | | @return true if computeByteSize() or computeMinByteSize() result exceeds size_t |
587 | | */ |
588 | 391k | static bool ByteSizeOverflowed(size_t byteSize) { |
589 | 391k | return SIZE_MAX == byteSize; |
590 | 391k | } |
591 | | |
592 | | /** Returns true if rowBytes is valid for this SkImageInfo. |
593 | | |
594 | | @param rowBytes size of pixel row including padding |
595 | | @return true if rowBytes is large enough to contain pixel row and is properly |
596 | | aligned |
597 | | */ |
598 | 904k | bool validRowBytes(size_t rowBytes) const { |
599 | 904k | if (rowBytes < this->minRowBytes64()) { |
600 | 0 | return false; |
601 | 0 | } |
602 | 904k | int shift = this->shiftPerPixel(); |
603 | 904k | size_t alignedRowBytes = rowBytes >> shift << shift; |
604 | 904k | return alignedRowBytes == rowBytes; |
605 | 904k | } |
606 | | |
607 | | /** Creates an empty SkImageInfo with kUnknown_SkColorType, kUnknown_SkAlphaType, |
608 | | a width and height of zero, and no SkColorSpace. |
609 | | */ |
610 | 0 | void reset() { *this = {}; } |
611 | | |
612 | | /** Asserts if internal values are illegal or inconsistent. Only available if |
613 | | SK_DEBUG is defined at compile time. |
614 | | */ |
615 | | SkDEBUGCODE(void validate() const;) |
616 | | |
617 | | private: |
618 | | SkColorInfo fColorInfo; |
619 | | SkISize fDimensions = {0, 0}; |
620 | | |
621 | | SkImageInfo(SkISize dimensions, const SkColorInfo& colorInfo) |
622 | 497k | : fColorInfo(colorInfo), fDimensions(dimensions) {} |
623 | | |
624 | | SkImageInfo(SkISize dimensions, SkColorInfo&& colorInfo) |
625 | 7.24M | : fColorInfo(std::move(colorInfo)), fDimensions(dimensions) {} |
626 | | }; |
627 | | |
628 | | #endif |