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