Coverage Report

Created: 2024-09-14 07:19

/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