| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkColorPriv.h" | 8 #include "SkColorPriv.h" |
| 9 #include "SkColorSpace_Base.h" | 9 #include "SkColorSpace_Base.h" |
| 10 #include "SkColorSpacePriv.h" | 10 #include "SkColorSpacePriv.h" |
| (...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 | 901 |
| 902 template <SwapRB kSwapRB> | 902 template <SwapRB kSwapRB> |
| 903 static inline void store_f16_1(void* dst, const uint32_t* src, | 903 static inline void store_f16_1(void* dst, const uint32_t* src, |
| 904 Sk4f& rgba, const Sk4f& a, | 904 Sk4f& rgba, const Sk4f& a, |
| 905 const uint8_t* const[3]) { | 905 const uint8_t* const[3]) { |
| 906 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); | 906 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); |
| 907 SkFloatToHalf_finite_ftz(rgba).store((uint64_t*) dst); | 907 SkFloatToHalf_finite_ftz(rgba).store((uint64_t*) dst); |
| 908 } | 908 } |
| 909 | 909 |
| 910 template <SwapRB kSwapRB> | 910 template <SwapRB kSwapRB> |
| 911 static inline void store_f32(void* dst, const uint32_t* src, |
| 912 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, |
| 913 const uint8_t* const[3]) { |
| 914 Sk4f_store4(dst, dr, dg, db, da); |
| 915 } |
| 916 |
| 917 template <SwapRB kSwapRB> |
| 918 static inline void store_f32_1(void* dst, const uint32_t* src, |
| 919 Sk4f& rgba, const Sk4f& a, |
| 920 const uint8_t* const[3]) { |
| 921 rgba = Sk4f(rgba[0], rgba[1], rgba[2], a[3]); |
| 922 rgba.store((float*) dst); |
| 923 } |
| 924 |
| 925 template <SwapRB kSwapRB> |
| 911 static inline void store_f16_opaque(void* dst, const uint32_t* src, | 926 static inline void store_f16_opaque(void* dst, const uint32_t* src, |
| 912 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f& da, | 927 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, |
| 913 const uint8_t* const[3]) { | 928 const uint8_t* const[3]) { |
| 914 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), | 929 Sk4h_store4(dst, SkFloatToHalf_finite_ftz(dr), |
| 915 SkFloatToHalf_finite_ftz(dg), | 930 SkFloatToHalf_finite_ftz(dg), |
| 916 SkFloatToHalf_finite_ftz(db), | 931 SkFloatToHalf_finite_ftz(db), |
| 917 SK_Half1); | 932 SK_Half1); |
| 918 } | 933 } |
| 919 | 934 |
| 920 template <SwapRB kSwapRB> | 935 template <SwapRB kSwapRB> |
| 921 static inline void store_f16_1_opaque(void* dst, const uint32_t* src, | 936 static inline void store_f16_1_opaque(void* dst, const uint32_t* src, |
| 922 Sk4f& rgba, const Sk4f& a, | 937 Sk4f& rgba, const Sk4f&, |
| 923 const uint8_t* const[3]) { | 938 const uint8_t* const[3]) { |
| 924 uint64_t tmp; | 939 uint64_t tmp; |
| 925 SkFloatToHalf_finite_ftz(rgba).store(&tmp); | 940 SkFloatToHalf_finite_ftz(rgba).store(&tmp); |
| 926 tmp |= static_cast<uint64_t>(SK_Half1) << 48; | 941 tmp |= static_cast<uint64_t>(SK_Half1) << 48; |
| 927 *((uint64_t*) dst) = tmp; | 942 *((uint64_t*) dst) = tmp; |
| 928 } | 943 } |
| 929 | 944 |
| 930 template <SwapRB kSwapRB> | 945 template <SwapRB kSwapRB> |
| 931 static inline void store_generic(void* dst, const uint32_t* src, | 946 static inline void store_generic(void* dst, const uint32_t* src, |
| 932 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, | 947 Sk4f& dr, Sk4f& dg, Sk4f& db, Sk4f&, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 kRGBA_8888_Linear_SrcFormat, | 1097 kRGBA_8888_Linear_SrcFormat, |
| 1083 kRGBA_8888_Table_SrcFormat, | 1098 kRGBA_8888_Table_SrcFormat, |
| 1084 }; | 1099 }; |
| 1085 | 1100 |
| 1086 enum DstFormat { | 1101 enum DstFormat { |
| 1087 k8888_Linear_DstFormat, | 1102 k8888_Linear_DstFormat, |
| 1088 k8888_SRGB_DstFormat, | 1103 k8888_SRGB_DstFormat, |
| 1089 k8888_2Dot2_DstFormat, | 1104 k8888_2Dot2_DstFormat, |
| 1090 k8888_Table_DstFormat, | 1105 k8888_Table_DstFormat, |
| 1091 kF16_Linear_DstFormat, | 1106 kF16_Linear_DstFormat, |
| 1107 kF32_Linear_DstFormat, |
| 1092 }; | 1108 }; |
| 1093 | 1109 |
| 1094 template <SrcFormat kSrc, | 1110 template <SrcFormat kSrc, |
| 1095 DstFormat kDst, | 1111 DstFormat kDst, |
| 1096 SkAlphaType kAlphaType, | 1112 SkAlphaType kAlphaType, |
| 1097 ColorSpaceMatch kCSM, | 1113 ColorSpaceMatch kCSM, |
| 1098 SwapRB kSwapRB> | 1114 SwapRB kSwapRB> |
| 1099 static void color_xform_RGBA(void* dst, const uint32_t* src, int len, | 1115 static void color_xform_RGBA(void* dst, const uint32_t* src, int len, |
| 1100 const float* const srcTables[3], const float matrix
[16], | 1116 const float* const srcTables[3], const float matrix
[16], |
| 1101 const uint8_t* const dstTables[3]) { | 1117 const uint8_t* const dstTables[3]) { |
| 1102 LoadFn load; | 1118 LoadFn load; |
| 1103 Load1Fn load_1; | 1119 Load1Fn load_1; |
| 1120 static constexpr bool loadAlpha = (kPremul_SkAlphaType == kAlphaType) || |
| 1121 (kF16_Linear_DstFormat == kDst) || |
| 1122 (kF32_Linear_DstFormat == kDst); |
| 1104 switch (kSrc) { | 1123 switch (kSrc) { |
| 1105 case kRGBA_8888_Linear_SrcFormat: | 1124 case kRGBA_8888_Linear_SrcFormat: |
| 1106 if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kD
st) { | 1125 if (loadAlpha) { |
| 1107 load = load_rgba_linear; | 1126 load = load_rgba_linear; |
| 1108 load_1 = load_rgba_linear_1; | 1127 load_1 = load_rgba_linear_1; |
| 1109 } else { | 1128 } else { |
| 1110 load = load_rgb_linear; | 1129 load = load_rgb_linear; |
| 1111 load_1 = load_rgb_linear_1; | 1130 load_1 = load_rgb_linear_1; |
| 1112 } | 1131 } |
| 1113 break; | 1132 break; |
| 1114 case kRGBA_8888_Table_SrcFormat: | 1133 case kRGBA_8888_Table_SrcFormat: |
| 1115 if (kPremul_SkAlphaType == kAlphaType || kF16_Linear_DstFormat == kD
st) { | 1134 if (loadAlpha) { |
| 1116 load = load_rgba_from_tables; | 1135 load = load_rgba_from_tables; |
| 1117 load_1 = load_rgba_from_tables_1; | 1136 load_1 = load_rgba_from_tables_1; |
| 1118 } else { | 1137 } else { |
| 1119 load = load_rgb_from_tables; | 1138 load = load_rgb_from_tables; |
| 1120 load_1 = load_rgb_from_tables_1; | 1139 load_1 = load_rgb_from_tables_1; |
| 1121 } | 1140 } |
| 1122 break; | 1141 break; |
| 1123 } | 1142 } |
| 1124 | 1143 |
| 1125 StoreFn store; | 1144 StoreFn store; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1146 store_1 = store_generic_1<kSwapRB>; | 1165 store_1 = store_generic_1<kSwapRB>; |
| 1147 sizeOfDstPixel = 4; | 1166 sizeOfDstPixel = 4; |
| 1148 break; | 1167 break; |
| 1149 case kF16_Linear_DstFormat: | 1168 case kF16_Linear_DstFormat: |
| 1150 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque<kSw
apRB> : | 1169 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque<kSw
apRB> : |
| 1151 store_f16<kSwapRB>; | 1170 store_f16<kSwapRB>; |
| 1152 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque<k
SwapRB> : | 1171 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque<k
SwapRB> : |
| 1153 store_f16_1<kSwapRB>
; | 1172 store_f16_1<kSwapRB>
; |
| 1154 sizeOfDstPixel = 8; | 1173 sizeOfDstPixel = 8; |
| 1155 break; | 1174 break; |
| 1175 case kF32_Linear_DstFormat: |
| 1176 store = store_f32<kSwapRB>; |
| 1177 store_1 = store_f32_1<kSwapRB>; |
| 1178 sizeOfDstPixel = 16; |
| 1179 break; |
| 1156 } | 1180 } |
| 1157 | 1181 |
| 1158 do_color_xform<kAlphaType, kCSM> | 1182 do_color_xform<kAlphaType, kCSM> |
| 1159 (dst, src, len, srcTables, matrix, dstTables, load, load_1, store, s
tore_1, | 1183 (dst, src, len, srcTables, matrix, dstTables, load, load_1, store, s
tore_1, |
| 1160 sizeOfDstPixel); | 1184 sizeOfDstPixel); |
| 1161 } | 1185 } |
| 1162 | 1186 |
| 1163 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1187 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1164 | 1188 |
| 1165 static inline int num_tables(SkColorSpace* space) { | 1189 static inline int num_tables(SkColorSpace* space) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kCSM, kSwa
p> | 1262 return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kCSM, kSwa
p> |
| 1239 (dst, src, len, alphaType, nullptr, matrix, dstTables); | 1263 (dst, src, len, alphaType, nullptr, matrix, dstTables); |
| 1240 case kTable_SrcGamma: | 1264 case kTable_SrcGamma: |
| 1241 return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCSM, kSwap
> | 1265 return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCSM, kSwap
> |
| 1242 (dst, src, len, alphaType, srcTables, matrix, dstTables); | 1266 (dst, src, len, alphaType, srcTables, matrix, dstTables); |
| 1243 } | 1267 } |
| 1244 } | 1268 } |
| 1245 | 1269 |
| 1246 template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> | 1270 template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> |
| 1247 void SkColorSpaceXform_Base<kSrc, kDst, kCSM> | 1271 void SkColorSpaceXform_Base<kSrc, kDst, kCSM> |
| 1248 ::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlp
haType alphaType) | 1272 ::apply(void* dst, const uint32_t* src, int len, ColorFormat dstColorFormat, SkA
lphaType alphaType) |
| 1249 const | 1273 const |
| 1250 { | 1274 { |
| 1251 if (kFull_ColorSpaceMatch == kCSM) { | 1275 if (kFull_ColorSpaceMatch == kCSM) { |
| 1252 switch (alphaType) { | 1276 switch (alphaType) { |
| 1253 case kPremul_SkAlphaType: | 1277 case kPremul_SkAlphaType: |
| 1254 // We can't skip the xform since we need to perform a premultipl
y in the | 1278 // We can't skip the xform since we need to perform a premultipl
y in the |
| 1255 // linear space. | 1279 // linear space. |
| 1256 break; | 1280 break; |
| 1257 default: | 1281 default: |
| 1258 switch (dstColorType) { | 1282 switch (dstColorFormat) { |
| 1259 case kRGBA_8888_SkColorType: | 1283 case kRGBA_8888_ColorFormat: |
| 1260 return (void) memcpy(dst, src, len * sizeof(uint32_t)); | 1284 return (void) memcpy(dst, src, len * sizeof(uint32_t)); |
| 1261 case kBGRA_8888_SkColorType: | 1285 case kBGRA_8888_ColorFormat: |
| 1262 return SkOpts::RGBA_to_BGRA((uint32_t*) dst, src, len); | 1286 return SkOpts::RGBA_to_BGRA((uint32_t*) dst, src, len); |
| 1263 case kRGBA_F16_SkColorType: | 1287 case kRGBA_F16_ColorFormat: |
| 1264 // There's still work to do to xform to linear F16. | 1288 case kRGBA_F32_ColorFormat: |
| 1289 // There's still work to do to xform to linear floats. |
| 1265 break; | 1290 break; |
| 1266 default: | 1291 default: |
| 1267 SkASSERT(false); | 1292 SkASSERT(false); |
| 1268 return; | 1293 return; |
| 1269 } | 1294 } |
| 1270 } | 1295 } |
| 1271 } | 1296 } |
| 1272 | 1297 |
| 1273 if (fColorLUT) { | 1298 if (fColorLUT) { |
| 1274 size_t storageBytes = len * sizeof(uint32_t); | 1299 size_t storageBytes = len * sizeof(uint32_t); |
| 1275 #if defined(GOOGLE3) | 1300 #if defined(GOOGLE3) |
| 1276 // Stack frame size is limited in GOOGLE3. | 1301 // Stack frame size is limited in GOOGLE3. |
| 1277 SkAutoSMalloc<256 * sizeof(uint32_t)> storage(storageBytes); | 1302 SkAutoSMalloc<256 * sizeof(uint32_t)> storage(storageBytes); |
| 1278 #else | 1303 #else |
| 1279 SkAutoSMalloc<1024 * sizeof(uint32_t)> storage(storageBytes); | 1304 SkAutoSMalloc<1024 * sizeof(uint32_t)> storage(storageBytes); |
| 1280 #endif | 1305 #endif |
| 1281 | 1306 |
| 1282 handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get()); | 1307 handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get()); |
| 1283 src = (const uint32_t*) storage.get(); | 1308 src = (const uint32_t*) storage.get(); |
| 1284 } | 1309 } |
| 1285 | 1310 |
| 1286 switch (dstColorType) { | 1311 switch (dstColorFormat) { |
| 1287 case kRGBA_8888_SkColorType: | 1312 case kRGBA_8888_ColorFormat: |
| 1288 switch (kDst) { | 1313 switch (kDst) { |
| 1289 case kLinear_DstGamma: | 1314 case kLinear_DstGamma: |
| 1290 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo
_SwapRB> | 1315 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kNo
_SwapRB> |
| 1291 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1316 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1292 case kSRGB_DstGamma: | 1317 case kSRGB_DstGamma: |
| 1293 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kNo_S
wapRB> | 1318 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kNo_S
wapRB> |
| 1294 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1319 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1295 case k2Dot2_DstGamma: | 1320 case k2Dot2_DstGamma: |
| 1296 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kNo_
SwapRB> | 1321 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kNo_
SwapRB> |
| 1297 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1322 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1298 case kTable_DstGamma: | 1323 case kTable_DstGamma: |
| 1299 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_
SwapRB> | 1324 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kNo_
SwapRB> |
| 1300 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, fDstGammaTables); | 1325 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, fDstGammaTables); |
| 1301 } | 1326 } |
| 1302 case kBGRA_8888_SkColorType: | 1327 case kBGRA_8888_ColorFormat: |
| 1303 switch (kDst) { | 1328 switch (kDst) { |
| 1304 case kLinear_DstGamma: | 1329 case kLinear_DstGamma: |
| 1305 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYe
s_SwapRB> | 1330 return apply_set_src<kSrc, k8888_Linear_DstFormat, kCSM, kYe
s_SwapRB> |
| 1306 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1331 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1307 case kSRGB_DstGamma: | 1332 case kSRGB_DstGamma: |
| 1308 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kYes_
SwapRB> | 1333 return apply_set_src<kSrc, k8888_SRGB_DstFormat, kCSM, kYes_
SwapRB> |
| 1309 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1334 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1310 case k2Dot2_DstGamma: | 1335 case k2Dot2_DstGamma: |
| 1311 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kYes
_SwapRB> | 1336 return apply_set_src<kSrc, k8888_2Dot2_DstFormat, kCSM, kYes
_SwapRB> |
| 1312 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1337 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1313 case kTable_DstGamma: | 1338 case kTable_DstGamma: |
| 1314 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes
_SwapRB> | 1339 return apply_set_src<kSrc, k8888_Table_DstFormat, kCSM, kYes
_SwapRB> |
| 1315 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, fDstGammaTables); | 1340 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, fDstGammaTables); |
| 1316 } | 1341 } |
| 1317 case kRGBA_F16_SkColorType: | 1342 case kRGBA_F16_ColorFormat: |
| 1318 switch (kDst) { | 1343 switch (kDst) { |
| 1319 case kLinear_DstGamma: | 1344 case kLinear_DstGamma: |
| 1320 return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_
SwapRB> | 1345 return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM, kNo_
SwapRB> |
| 1321 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); | 1346 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1322 default: | 1347 default: |
| 1323 SkASSERT(false); | 1348 SkASSERT(false); |
| 1324 return; | 1349 return; |
| 1325 } | 1350 } |
| 1351 case kRGBA_F32_ColorFormat: |
| 1352 switch (kDst) { |
| 1353 case kLinear_DstGamma: |
| 1354 return apply_set_src<kSrc, kF32_Linear_DstFormat, kCSM, kNo_
SwapRB> |
| 1355 (dst, src, len, alphaType, fSrcGammaTables, fSrcToDs
t, nullptr); |
| 1356 default: |
| 1357 SkASSERT(false); |
| 1358 return; |
| 1359 } |
| 1326 default: | 1360 default: |
| 1327 SkASSERT(false); | 1361 SkASSERT(false); |
| 1328 return; | 1362 return; |
| 1329 } | 1363 } |
| 1330 } | 1364 } |
| 1331 | 1365 |
| 1332 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1366 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 1333 | 1367 |
| 1334 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { | 1368 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { |
| 1335 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base | 1369 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
| 1336 <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> | 1370 <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> |
| 1337 (space, SkMatrix::I(), space)); | 1371 (space, SkMatrix::I(), space)); |
| 1338 } | 1372 } |
| OLD | NEW |