• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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