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