xref: /aosp_15_r20/external/skia/src/core/SkImageInfoPriv.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2017 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 SkImageInfoPriv_DEFINED
9 #define SkImageInfoPriv_DEFINED
10 
11 #include "include/core/SkColor.h"
12 #include "include/core/SkColorType.h"
13 #include "include/core/SkImageInfo.h"
14 
SkColorTypeChannelFlags(SkColorType ct)15 static inline uint32_t SkColorTypeChannelFlags(SkColorType ct) {
16     switch (ct) {
17         case kUnknown_SkColorType:            return 0;
18         case kAlpha_8_SkColorType:            return kAlpha_SkColorChannelFlag;
19         case kRGB_565_SkColorType:            return kRGB_SkColorChannelFlags;
20         case kARGB_4444_SkColorType:          return kRGBA_SkColorChannelFlags;
21         case kRGBA_8888_SkColorType:          return kRGBA_SkColorChannelFlags;
22         case kRGB_888x_SkColorType:           return kRGB_SkColorChannelFlags;
23         case kBGRA_8888_SkColorType:          return kRGBA_SkColorChannelFlags;
24         case kRGBA_1010102_SkColorType:       return kRGBA_SkColorChannelFlags;
25         case kRGB_101010x_SkColorType:        return kRGB_SkColorChannelFlags;
26         case kBGRA_1010102_SkColorType:       return kRGBA_SkColorChannelFlags;
27         case kBGR_101010x_SkColorType:        return kRGB_SkColorChannelFlags;
28         case kBGR_101010x_XR_SkColorType:     return kRGB_SkColorChannelFlags;
29         case kBGRA_10101010_XR_SkColorType:   return kRGBA_SkColorChannelFlags;
30         case kRGBA_10x6_SkColorType:          return kRGBA_SkColorChannelFlags;
31         case kGray_8_SkColorType:             return kGray_SkColorChannelFlag;
32         case kRGBA_F16Norm_SkColorType:       return kRGBA_SkColorChannelFlags;
33         case kRGBA_F16_SkColorType:           return kRGBA_SkColorChannelFlags;
34         case kRGB_F16F16F16x_SkColorType:     return kRGB_SkColorChannelFlags;
35         case kRGBA_F32_SkColorType:           return kRGBA_SkColorChannelFlags;
36         case kR8G8_unorm_SkColorType:         return kRG_SkColorChannelFlags;
37         case kA16_unorm_SkColorType:          return kAlpha_SkColorChannelFlag;
38         case kR16G16_unorm_SkColorType:       return kRG_SkColorChannelFlags;
39         case kA16_float_SkColorType:          return kAlpha_SkColorChannelFlag;
40         case kR16G16_float_SkColorType:       return kRG_SkColorChannelFlags;
41         case kR16G16B16A16_unorm_SkColorType: return kRGBA_SkColorChannelFlags;
42         case kSRGBA_8888_SkColorType:         return kRGBA_SkColorChannelFlags;
43         case kR8_unorm_SkColorType:           return kRed_SkColorChannelFlag;
44     }
45     SkUNREACHABLE;
46 }
47 
SkColorTypeIsAlphaOnly(SkColorType ct)48 static inline bool SkColorTypeIsAlphaOnly(SkColorType ct) {
49     return SkColorTypeChannelFlags(ct) == kAlpha_SkColorChannelFlag;
50 }
51 
SkAlphaTypeIsValid(unsigned value)52 static inline bool SkAlphaTypeIsValid(unsigned value) {
53     return value <= kLastEnum_SkAlphaType;
54 }
55 
SkColorTypeShiftPerPixel(SkColorType ct)56 static int SkColorTypeShiftPerPixel(SkColorType ct) {
57     switch (ct) {
58         case kUnknown_SkColorType:            return 0;
59         case kAlpha_8_SkColorType:            return 0;
60         case kRGB_565_SkColorType:            return 1;
61         case kARGB_4444_SkColorType:          return 1;
62         case kRGBA_8888_SkColorType:          return 2;
63         case kRGB_888x_SkColorType:           return 2;
64         case kBGRA_8888_SkColorType:          return 2;
65         case kRGBA_1010102_SkColorType:       return 2;
66         case kRGB_101010x_SkColorType:        return 2;
67         case kBGRA_1010102_SkColorType:       return 2;
68         case kBGR_101010x_SkColorType:        return 2;
69         case kBGR_101010x_XR_SkColorType:     return 2;
70         case kBGRA_10101010_XR_SkColorType:   return 3;
71         case kRGBA_10x6_SkColorType:          return 3;
72         case kGray_8_SkColorType:             return 0;
73         case kRGBA_F16Norm_SkColorType:       return 3;
74         case kRGBA_F16_SkColorType:           return 3;
75         case kRGB_F16F16F16x_SkColorType:     return 3;
76         case kRGBA_F32_SkColorType:           return 4;
77         case kR8G8_unorm_SkColorType:         return 1;
78         case kA16_unorm_SkColorType:          return 1;
79         case kR16G16_unorm_SkColorType:       return 2;
80         case kA16_float_SkColorType:          return 1;
81         case kR16G16_float_SkColorType:       return 2;
82         case kR16G16B16A16_unorm_SkColorType: return 3;
83         case kSRGBA_8888_SkColorType:         return 2;
84         case kR8_unorm_SkColorType:           return 0;
85     }
86     SkUNREACHABLE;
87 }
88 
SkColorTypeMinRowBytes(SkColorType ct,int width)89 static inline size_t SkColorTypeMinRowBytes(SkColorType ct, int width) {
90     return (size_t)(width * SkColorTypeBytesPerPixel(ct));
91 }
92 
SkColorTypeIsValid(unsigned value)93 static inline bool SkColorTypeIsValid(unsigned value) {
94     return value <= kLastEnum_SkColorType;
95 }
96 
SkColorTypeComputeOffset(SkColorType ct,int x,int y,size_t rowBytes)97 static inline size_t SkColorTypeComputeOffset(SkColorType ct, int x, int y, size_t rowBytes) {
98     if (kUnknown_SkColorType == ct) {
99         return 0;
100     }
101     return (size_t)y * rowBytes + ((size_t)x << SkColorTypeShiftPerPixel(ct));
102 }
103 
SkColorTypeIsNormalized(SkColorType ct)104 static inline bool SkColorTypeIsNormalized(SkColorType ct) {
105     switch (ct) {
106         case kUnknown_SkColorType:
107         case kAlpha_8_SkColorType:
108         case kRGB_565_SkColorType:
109         case kARGB_4444_SkColorType:
110         case kRGBA_8888_SkColorType:
111         case kRGB_888x_SkColorType:
112         case kBGRA_8888_SkColorType:
113         case kRGBA_1010102_SkColorType:
114         case kRGB_101010x_SkColorType:
115         case kBGRA_1010102_SkColorType:
116         case kBGR_101010x_SkColorType:
117         case kRGBA_10x6_SkColorType:
118         case kGray_8_SkColorType:
119         case kRGBA_F16Norm_SkColorType:
120         case kR8G8_unorm_SkColorType:
121         case kA16_unorm_SkColorType:
122         case kA16_float_SkColorType:          /*subtle... alpha is always [0,1]*/
123         case kR16G16_unorm_SkColorType:
124         case kR16G16B16A16_unorm_SkColorType:
125         case kSRGBA_8888_SkColorType:
126         case kR8_unorm_SkColorType:
127             return true;
128 
129         case kBGRA_10101010_XR_SkColorType:
130         case kBGR_101010x_XR_SkColorType:
131         case kRGB_F16F16F16x_SkColorType:
132         case kRGBA_F16_SkColorType:
133         case kRGBA_F32_SkColorType:
134         case kR16G16_float_SkColorType:
135             return false;
136     }
137     SkUNREACHABLE;
138 }
139 
SkColorTypeMaxBitsPerChannel(SkColorType ct)140 static inline int SkColorTypeMaxBitsPerChannel(SkColorType ct) {
141     switch (ct) {
142         case kUnknown_SkColorType:
143             return 0;
144 
145         case kARGB_4444_SkColorType:
146             return 4;
147 
148         case kRGB_565_SkColorType:
149             return 6;
150 
151         case kAlpha_8_SkColorType:
152         case kRGBA_8888_SkColorType:
153         case kRGB_888x_SkColorType:
154         case kBGRA_8888_SkColorType:
155         case kGray_8_SkColorType:
156         case kR8G8_unorm_SkColorType:
157         case kSRGBA_8888_SkColorType:
158         case kR8_unorm_SkColorType:
159             return 8;
160 
161         case kRGBA_1010102_SkColorType:
162         case kRGB_101010x_SkColorType:
163         case kBGRA_1010102_SkColorType:
164         case kBGR_101010x_SkColorType:
165         case kBGR_101010x_XR_SkColorType:
166         case kBGRA_10101010_XR_SkColorType:
167         case kRGBA_10x6_SkColorType:
168             return 10;
169 
170         case kRGBA_F16Norm_SkColorType:
171         case kA16_unorm_SkColorType:
172         case kA16_float_SkColorType:
173         case kR16G16_unorm_SkColorType:
174         case kR16G16B16A16_unorm_SkColorType:
175         case kRGBA_F16_SkColorType:
176         case kRGB_F16F16F16x_SkColorType:
177         case kR16G16_float_SkColorType:
178             return 16;
179 
180         case kRGBA_F32_SkColorType:
181             return 32;
182     }
183     SkUNREACHABLE;
184 }
185 
186 /**
187  *  Returns true if |info| contains a valid colorType and alphaType.
188  */
SkColorInfoIsValid(const SkColorInfo & info)189 static inline bool SkColorInfoIsValid(const SkColorInfo& info) {
190     return info.colorType() != kUnknown_SkColorType && info.alphaType() != kUnknown_SkAlphaType;
191 }
192 
193 /**
194  *  Returns true if |info| contains a valid combination of width, height and colorInfo.
195  */
SkImageInfoIsValid(const SkImageInfo & info)196 static inline bool SkImageInfoIsValid(const SkImageInfo& info) {
197     if (info.width() <= 0 || info.height() <= 0) {
198         return false;
199     }
200 
201     const int kMaxDimension = SK_MaxS32 >> 2;
202     if (info.width() > kMaxDimension || info.height() > kMaxDimension) {
203         return false;
204     }
205 
206     return SkColorInfoIsValid(info.colorInfo());
207 }
208 
209 /**
210  *  Returns true if Skia has defined a pixel conversion from the |src| to the |dst|.
211  *  Returns false otherwise.
212  */
SkImageInfoValidConversion(const SkImageInfo & dst,const SkImageInfo & src)213 static inline bool SkImageInfoValidConversion(const SkImageInfo& dst, const SkImageInfo& src) {
214     return SkImageInfoIsValid(dst) && SkImageInfoIsValid(src);
215 }
216 #endif  // SkImageInfoPriv_DEFINED
217