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