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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 if (v >= 254.5f) { | 254 if (v >= 254.5f) { |
255 return 255; | 255 return 255; |
256 } else if (v >= 0.5f) { | 256 } else if (v >= 0.5f) { |
257 return (uint8_t) (v + 0.5f); | 257 return (uint8_t) (v + 0.5f); |
258 } else { | 258 } else { |
259 return 0; | 259 return 0; |
260 } | 260 } |
261 } | 261 } |
262 | 262 |
263 static const int kDstGammaTableSize = | 263 static const int kDstGammaTableSize = |
264 SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed, kNone_Colo
rSpaceMatch> | 264 SkColorSpaceXform_Base<kNonStandard_SkGammaNamed, kNone_ColorSpaceMatch> |
265 ::kDstGammaTableSize; | 265 ::kDstGammaTableSize; |
266 | 266 |
267 static void build_table_linear_to_gamma(uint8_t* outTable, float exponent) { | 267 static void build_table_linear_to_gamma(uint8_t* outTable, float exponent) { |
268 float toGammaExp = 1.0f / exponent; | 268 float toGammaExp = 1.0f / exponent; |
269 | 269 |
270 for (int i = 0; i < kDstGammaTableSize; i++) { | 270 for (int i = 0; i < kDstGammaTableSize; i++) { |
271 float x = ((float) i) * (1.0f / ((float) (kDstGammaTableSize - 1))); | 271 float x = ((float) i) * (1.0f / ((float) (kDstGammaTableSize - 1))); |
272 outTable[i] = clamp_normalized_float_to_byte(powf(x, toGammaExp)); | 272 outTable[i] = clamp_normalized_float_to_byte(powf(x, toGammaExp)); |
273 } | 273 } |
274 } | 274 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 linear_to_2dot2_table, | 373 linear_to_2dot2_table, |
374 &build_table_linear_to_gamma, | 374 &build_table_linear_to_gamma, |
375 &build_table_linear_to_gamma, | 375 &build_table_linear_to_gamma, |
376 &build_table_linear_to_gamma, | 376 &build_table_linear_to_gamma, |
377 }; | 377 }; |
378 | 378 |
379 // Build tables to transform src gamma to linear. | 379 // Build tables to transform src gamma to linear. |
380 template <typename T> | 380 template <typename T> |
381 static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage,
int gammaTableSize, | 381 static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage,
int gammaTableSize, |
382 const sk_sp<SkColorSpace>& space, const GammaFns<
T>& fns) { | 382 const sk_sp<SkColorSpace>& space, const GammaFns<
T>& fns) { |
383 switch (space->gammaNamed()) { | 383 switch (as_CSB(space)->gammaNamed()) { |
384 case SkColorSpace::kSRGB_GammaNamed: | 384 case kSRGB_SkGammaNamed: |
385 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = fns.fSRG
BTable; | 385 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = fns.fSRG
BTable; |
386 break; | 386 break; |
387 case SkColorSpace::k2Dot2Curve_GammaNamed: | 387 case k2Dot2Curve_SkGammaNamed: |
388 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = fns.f2Do
t2Table; | 388 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = fns.f2Do
t2Table; |
389 break; | 389 break; |
390 case SkColorSpace::kLinear_GammaNamed: | 390 case kLinear_SkGammaNamed: |
391 (*fns.fBuildFromValue)(gammaTableStorage, 1.0f); | 391 (*fns.fBuildFromValue)(gammaTableStorage, 1.0f); |
392 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = gammaTab
leStorage; | 392 outGammaTables[0] = outGammaTables[1] = outGammaTables[2] = gammaTab
leStorage; |
393 break; | 393 break; |
394 default: { | 394 default: { |
395 const SkGammas* gammas = as_CSB(space)->gammas(); | 395 const SkGammas* gammas = as_CSB(space)->gammas(); |
396 SkASSERT(gammas); | 396 SkASSERT(gammas); |
397 | 397 |
398 for (int i = 0; i < 3; i++) { | 398 for (int i = 0; i < 3; i++) { |
399 if (i > 0) { | 399 if (i > 0) { |
400 // Check if this curve matches the first curve. In this cas
e, we can | 400 // Check if this curve matches the first curve. In this cas
e, we can |
401 // share the same table pointer. This should almost always
be true. | 401 // share the same table pointer. This should almost always
be true. |
402 // I've never seen a profile where all three gamma curves di
dn't match. | 402 // I've never seen a profile where all three gamma curves di
dn't match. |
403 // But it is possible that they won't. | 403 // But it is possible that they won't. |
404 if (gammas->type(0) == gammas->type(i) && gammas->data(0) ==
gammas->data(i)) { | 404 if (gammas->type(0) == gammas->type(i) && gammas->data(0) ==
gammas->data(i)) { |
405 outGammaTables[i] = outGammaTables[0]; | 405 outGammaTables[i] = outGammaTables[0]; |
406 continue; | 406 continue; |
407 } | 407 } |
408 } | 408 } |
409 | 409 |
410 if (gammas->isNamed(i)) { | 410 if (gammas->isNamed(i)) { |
411 switch (gammas->data(i).fNamed) { | 411 switch (gammas->data(i).fNamed) { |
412 case SkColorSpace::kSRGB_GammaNamed: | 412 case kSRGB_SkGammaNamed: |
413 outGammaTables[i] = fns.fSRGBTable; | 413 outGammaTables[i] = fns.fSRGBTable; |
414 break; | 414 break; |
415 case SkColorSpace::k2Dot2Curve_GammaNamed: | 415 case k2Dot2Curve_SkGammaNamed: |
416 outGammaTables[i] = fns.f2Dot2Table; | 416 outGammaTables[i] = fns.f2Dot2Table; |
417 break; | 417 break; |
418 case SkColorSpace::kLinear_GammaNamed: | 418 case kLinear_SkGammaNamed: |
419 (*fns.fBuildFromValue)(&gammaTableStorage[i * gammaT
ableSize], 1.0f); | 419 (*fns.fBuildFromValue)(&gammaTableStorage[i * gammaT
ableSize], 1.0f); |
420 outGammaTables[i] = &gammaTableStorage[i * gammaTabl
eSize]; | 420 outGammaTables[i] = &gammaTableStorage[i * gammaTabl
eSize]; |
421 break; | 421 break; |
422 default: | 422 default: |
423 SkASSERT(false); | 423 SkASSERT(false); |
424 break; | 424 break; |
425 } | 425 } |
426 } else if (gammas->isValue(i)) { | 426 } else if (gammas->isValue(i)) { |
427 (*fns.fBuildFromValue)(&gammaTableStorage[i * gammaTableSize
], | 427 (*fns.fBuildFromValue)(&gammaTableStorage[i * gammaTableSize
], |
428 gammas->data(i).fValue); | 428 gammas->data(i).fValue); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 csm = kFull_ColorSpaceMatch; | 484 csm = kFull_ColorSpaceMatch; |
485 } else if (!compute_gamut_xform(&srcToDst, srcSpace->xyz(), dstSpace->xyz())
) { | 485 } else if (!compute_gamut_xform(&srcToDst, srcSpace->xyz(), dstSpace->xyz())
) { |
486 return nullptr; | 486 return nullptr; |
487 } else if (is_almost_identity(srcToDst)) { | 487 } else if (is_almost_identity(srcToDst)) { |
488 srcToDst.setIdentity(); | 488 srcToDst.setIdentity(); |
489 csm = kGamut_ColorSpaceMatch; | 489 csm = kGamut_ColorSpaceMatch; |
490 } | 490 } |
491 | 491 |
492 switch (csm) { | 492 switch (csm) { |
493 case kNone_ColorSpaceMatch: | 493 case kNone_ColorSpaceMatch: |
494 switch (dstSpace->gammaNamed()) { | 494 switch (as_CSB(dstSpace)->gammaNamed()) { |
495 case SkColorSpace::kSRGB_GammaNamed: | 495 case kSRGB_SkGammaNamed: |
496 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 496 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
497 <SkColorSpace::kSRGB_GammaNamed, kNone_ColorSpaceMat
ch> | 497 <kSRGB_SkGammaNamed, kNone_ColorSpaceMatch> |
498 (srcSpace, srcToDst, dstSpace)); | 498 (srcSpace, srcToDst, dstSpace)); |
499 case SkColorSpace::k2Dot2Curve_GammaNamed: | 499 case k2Dot2Curve_SkGammaNamed: |
500 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 500 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
501 <SkColorSpace::k2Dot2Curve_GammaNamed, kNone_ColorSp
aceMatch> | 501 <k2Dot2Curve_SkGammaNamed, kNone_ColorSpaceMatch> |
502 (srcSpace, srcToDst, dstSpace)); | 502 (srcSpace, srcToDst, dstSpace)); |
503 default: | 503 default: |
504 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 504 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
505 <SkColorSpace::kNonStandard_GammaNamed, kNone_ColorS
paceMatch> | 505 <kNonStandard_SkGammaNamed, kNone_ColorSpaceMatch> |
506 (srcSpace, srcToDst, dstSpace)); | 506 (srcSpace, srcToDst, dstSpace)); |
507 } | 507 } |
508 case kGamut_ColorSpaceMatch: | 508 case kGamut_ColorSpaceMatch: |
509 switch (dstSpace->gammaNamed()) { | 509 switch (as_CSB(dstSpace)->gammaNamed()) { |
510 case SkColorSpace::kSRGB_GammaNamed: | 510 case kSRGB_SkGammaNamed: |
511 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 511 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
512 <SkColorSpace::kSRGB_GammaNamed, kGamut_ColorSpaceMa
tch> | 512 <kSRGB_SkGammaNamed, kGamut_ColorSpaceMatch> |
513 (srcSpace, srcToDst, dstSpace)); | 513 (srcSpace, srcToDst, dstSpace)); |
514 case SkColorSpace::k2Dot2Curve_GammaNamed: | 514 case k2Dot2Curve_SkGammaNamed: |
515 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 515 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
516 <SkColorSpace::k2Dot2Curve_GammaNamed, kGamut_ColorS
paceMatch> | 516 <k2Dot2Curve_SkGammaNamed, kGamut_ColorSpaceMatch> |
517 (srcSpace, srcToDst, dstSpace)); | 517 (srcSpace, srcToDst, dstSpace)); |
518 default: | 518 default: |
519 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 519 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
520 <SkColorSpace::kNonStandard_GammaNamed, kGamut_Color
SpaceMatch> | 520 <kNonStandard_SkGammaNamed, kGamut_ColorSpaceMatch> |
521 (srcSpace, srcToDst, dstSpace)); | 521 (srcSpace, srcToDst, dstSpace)); |
522 } | 522 } |
523 case kFull_ColorSpaceMatch: | 523 case kFull_ColorSpaceMatch: |
524 switch (dstSpace->gammaNamed()) { | 524 switch (as_CSB(dstSpace)->gammaNamed()) { |
525 case SkColorSpace::kSRGB_GammaNamed: | 525 case kSRGB_SkGammaNamed: |
526 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 526 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
527 <SkColorSpace::kSRGB_GammaNamed, kFull_ColorSpaceMat
ch> | 527 <kSRGB_SkGammaNamed, kFull_ColorSpaceMatch> |
528 (srcSpace, srcToDst, dstSpace)); | 528 (srcSpace, srcToDst, dstSpace)); |
529 case SkColorSpace::k2Dot2Curve_GammaNamed: | 529 case k2Dot2Curve_SkGammaNamed: |
530 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 530 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
531 <SkColorSpace::k2Dot2Curve_GammaNamed, kFull_ColorSp
aceMatch> | 531 <k2Dot2Curve_SkGammaNamed, kFull_ColorSpaceMatch> |
532 (srcSpace, srcToDst, dstSpace)); | 532 (srcSpace, srcToDst, dstSpace)); |
533 default: | 533 default: |
534 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 534 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
535 <SkColorSpace::kNonStandard_GammaNamed, kFull_ColorS
paceMatch> | 535 <kNonStandard_SkGammaNamed, kFull_ColorSpaceMatch> |
536 (srcSpace, srcToDst, dstSpace)); | 536 (srcSpace, srcToDst, dstSpace)); |
537 } | 537 } |
538 default: | 538 default: |
539 SkASSERT(false); | 539 SkASSERT(false); |
540 return nullptr; | 540 return nullptr; |
541 } | 541 } |
542 } | 542 } |
543 | 543 |
544 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 544 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
545 | 545 |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 rgba = Sk4f::Min(Sk4f::Max(1023.0f * rgba, 0.0f), 1023.0f); | 961 rgba = Sk4f::Min(Sk4f::Max(1023.0f * rgba, 0.0f), 1023.0f); |
962 | 962 |
963 Sk4i indices = Sk4f_round(rgba); | 963 Sk4i indices = Sk4f_round(rgba); |
964 | 964 |
965 *((uint32_t*) dst) = dstTables[0][indices[0]] << kRShift | 965 *((uint32_t*) dst) = dstTables[0][indices[0]] << kRShift |
966 | dstTables[1][indices[1]] << kGShift | 966 | dstTables[1][indices[1]] << kGShift |
967 | dstTables[2][indices[2]] << kBShift | 967 | dstTables[2][indices[2]] << kBShift |
968 | (*src & 0xFF000000); | 968 | (*src & 0xFF000000); |
969 } | 969 } |
970 | 970 |
971 template <SkColorSpace::GammaNamed kDstGamma, | 971 template <SkGammaNamed kDstGamma, |
972 ColorSpaceMatch kCSM, | 972 ColorSpaceMatch kCSM, |
973 SkAlphaType kAlphaType, | 973 SkAlphaType kAlphaType, |
974 SwapRB kSwapRB> | 974 SwapRB kSwapRB> |
975 static void color_xform_RGBA(void* dst, const uint32_t* src, int len, | 975 static void color_xform_RGBA(void* dst, const uint32_t* src, int len, |
976 const float* const srcTables[3], const float matrix
[16], | 976 const float* const srcTables[3], const float matrix
[16], |
977 const uint8_t* const dstTables[3]) { | 977 const uint8_t* const dstTables[3]) { |
978 decltype(store_srgb )* store; | 978 decltype(store_srgb )* store; |
979 decltype(store_srgb_1 )* store_1; | 979 decltype(store_srgb_1 )* store_1; |
980 decltype(load_rgb_from_tables )* load; | 980 decltype(load_rgb_from_tables )* load; |
981 decltype(load_rgb_from_tables_1)* load_1; | 981 decltype(load_rgb_from_tables_1)* load_1; |
982 size_t sizeOfDstPixel; | 982 size_t sizeOfDstPixel; |
983 switch (kDstGamma) { | 983 switch (kDstGamma) { |
984 case SkColorSpace::kSRGB_GammaNamed: | 984 case kSRGB_SkGammaNamed: |
985 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : | 985 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : |
986 load_rgb_from_tables
; | 986 load_rgb_from_tables
; |
987 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : | 987 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : |
988 load_rgb_from_tables
_1; | 988 load_rgb_from_tables
_1; |
989 store = store_srgb; | 989 store = store_srgb; |
990 store_1 = store_srgb_1; | 990 store_1 = store_srgb_1; |
991 sizeOfDstPixel = 4; | 991 sizeOfDstPixel = 4; |
992 break; | 992 break; |
993 case SkColorSpace::k2Dot2Curve_GammaNamed: | 993 case k2Dot2Curve_SkGammaNamed: |
994 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : | 994 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : |
995 load_rgb_from_tables
; | 995 load_rgb_from_tables
; |
996 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : | 996 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : |
997 load_rgb_from_tables
_1; | 997 load_rgb_from_tables
_1; |
998 store = store_2dot2; | 998 store = store_2dot2; |
999 store_1 = store_2dot2_1; | 999 store_1 = store_2dot2_1; |
1000 sizeOfDstPixel = 4; | 1000 sizeOfDstPixel = 4; |
1001 break; | 1001 break; |
1002 case SkColorSpace::kLinear_GammaNamed: | 1002 case kLinear_SkGammaNamed: |
1003 load = load_rgba_from_tables; | 1003 load = load_rgba_from_tables; |
1004 load_1 = load_rgba_from_tables_1; | 1004 load_1 = load_rgba_from_tables_1; |
1005 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque : | 1005 store = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_opaque : |
1006 store_f16; | 1006 store_f16; |
1007 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque : | 1007 store_1 = (kOpaque_SkAlphaType == kAlphaType) ? store_f16_1_opaque : |
1008 store_f16_1; | 1008 store_f16_1; |
1009 sizeOfDstPixel = 8; | 1009 sizeOfDstPixel = 8; |
1010 break; | 1010 break; |
1011 case SkColorSpace::kNonStandard_GammaNamed: | 1011 case kNonStandard_SkGammaNamed: |
1012 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : | 1012 load = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s : |
1013 load_rgb_from_tables
; | 1013 load_rgb_from_tables
; |
1014 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : | 1014 load_1 = (kPremul_SkAlphaType == kAlphaType) ? load_rgba_from_table
s_1 : |
1015 load_rgb_from_tables
_1; | 1015 load_rgb_from_tables
_1; |
1016 store = store_generic; | 1016 store = store_generic; |
1017 store_1 = store_generic_1; | 1017 store_1 = store_generic_1; |
1018 sizeOfDstPixel = 4; | 1018 sizeOfDstPixel = 4; |
1019 break; | 1019 break; |
1020 } | 1020 } |
1021 | 1021 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 store_1(dst, src, rgba, a, dstTables, kSwapRB); | 1091 store_1(dst, src, rgba, a, dstTables, kSwapRB); |
1092 | 1092 |
1093 src += 1; | 1093 src += 1; |
1094 len -= 1; | 1094 len -= 1; |
1095 dst = SkTAddOffset<void>(dst, sizeOfDstPixel); | 1095 dst = SkTAddOffset<void>(dst, sizeOfDstPixel); |
1096 } | 1096 } |
1097 } | 1097 } |
1098 | 1098 |
1099 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 1099 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
1100 | 1100 |
1101 template <SkColorSpace::GammaNamed kDst, ColorSpaceMatch kCSM> | 1101 template <SkGammaNamed kDst, ColorSpaceMatch kCSM> |
1102 SkColorSpaceXform_Base<kDst, kCSM>::SkColorSpaceXform_Base(const sk_sp<SkColorSp
ace>& srcSpace, | 1102 SkColorSpaceXform_Base<kDst, kCSM>::SkColorSpaceXform_Base(const sk_sp<SkColorSp
ace>& srcSpace, |
1103 const SkMatrix44& src
ToDst, | 1103 const SkMatrix44& src
ToDst, |
1104 const sk_sp<SkColorSp
ace>& dstSpace) | 1104 const sk_sp<SkColorSp
ace>& dstSpace) |
1105 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) | 1105 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) |
1106 { | 1106 { |
1107 srcToDst.asRowMajorf(fSrcToDst); | 1107 srcToDst.asRowMajorf(fSrcToDst); |
1108 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT
oLinear); | 1108 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT
oLinear); |
1109 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz
e, dstSpace, | 1109 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz
e, dstSpace, |
1110 kFromLinear); | 1110 kFromLinear); |
1111 } | 1111 } |
1112 | 1112 |
1113 template <SkColorSpace::GammaNamed kDst, ColorSpaceMatch kCSM> | 1113 template <SkGammaNamed kDst, ColorSpaceMatch kCSM> |
1114 void SkColorSpaceXform_Base<kDst, kCSM> | 1114 void SkColorSpaceXform_Base<kDst, kCSM> |
1115 ::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlp
haType dstAlphaType) | 1115 ::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlp
haType dstAlphaType) |
1116 const | 1116 const |
1117 { | 1117 { |
1118 if (kFull_ColorSpaceMatch == kCSM) { | 1118 if (kFull_ColorSpaceMatch == kCSM) { |
1119 switch (dstAlphaType) { | 1119 switch (dstAlphaType) { |
1120 case kPremul_SkAlphaType: | 1120 case kPremul_SkAlphaType: |
1121 // We can't skip the xform since we need to perform a premultipl
y in the | 1121 // We can't skip the xform since we need to perform a premultipl
y in the |
1122 // linear space. | 1122 // linear space. |
1123 break; | 1123 break; |
(...skipping 29 matching lines...) Expand all Loading... |
1153 switch (dstAlphaType) { | 1153 switch (dstAlphaType) { |
1154 case kPremul_SkAlphaType: | 1154 case kPremul_SkAlphaType: |
1155 switch (dstColorType) { | 1155 switch (dstColorType) { |
1156 case kRGBA_8888_SkColorType: | 1156 case kRGBA_8888_SkColorType: |
1157 return color_xform_RGBA<kDst, kCSM, kPremul_SkAlphaType, kNo
_SwapRB> | 1157 return color_xform_RGBA<kDst, kCSM, kPremul_SkAlphaType, kNo
_SwapRB> |
1158 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1158 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1159 case kBGRA_8888_SkColorType: | 1159 case kBGRA_8888_SkColorType: |
1160 return color_xform_RGBA<kDst, kCSM, kPremul_SkAlphaType, kYe
s_SwapRB> | 1160 return color_xform_RGBA<kDst, kCSM, kPremul_SkAlphaType, kYe
s_SwapRB> |
1161 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1161 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1162 case kRGBA_F16_SkColorType: | 1162 case kRGBA_F16_SkColorType: |
1163 return color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, kC
SM, | 1163 return color_xform_RGBA<kLinear_SkGammaNamed, kCSM, |
1164 kPremul_SkAlphaType, kNo_SwapRB> | 1164 kPremul_SkAlphaType, kNo_SwapRB> |
1165 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1165 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1166 default: | 1166 default: |
1167 SkASSERT(false); | 1167 SkASSERT(false); |
1168 return; | 1168 return; |
1169 } | 1169 } |
1170 break; | 1170 break; |
1171 case kUnpremul_SkAlphaType: | 1171 case kUnpremul_SkAlphaType: |
1172 switch (dstColorType) { | 1172 switch (dstColorType) { |
1173 case kRGBA_8888_SkColorType: | 1173 case kRGBA_8888_SkColorType: |
1174 return color_xform_RGBA<kDst, kCSM, kUnpremul_SkAlphaType, k
No_SwapRB> | 1174 return color_xform_RGBA<kDst, kCSM, kUnpremul_SkAlphaType, k
No_SwapRB> |
1175 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1175 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1176 case kBGRA_8888_SkColorType: | 1176 case kBGRA_8888_SkColorType: |
1177 return color_xform_RGBA<kDst, kCSM, kUnpremul_SkAlphaType, k
Yes_SwapRB> | 1177 return color_xform_RGBA<kDst, kCSM, kUnpremul_SkAlphaType, k
Yes_SwapRB> |
1178 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1178 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1179 case kRGBA_F16_SkColorType: | 1179 case kRGBA_F16_SkColorType: |
1180 return color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, kC
SM, | 1180 return color_xform_RGBA<kLinear_SkGammaNamed, kCSM, |
1181 kUnpremul_SkAlphaType, kNo_SwapRB> | 1181 kUnpremul_SkAlphaType, kNo_SwapRB> |
1182 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1182 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1183 default: | 1183 default: |
1184 SkASSERT(false); | 1184 SkASSERT(false); |
1185 return; | 1185 return; |
1186 } | 1186 } |
1187 case kOpaque_SkAlphaType: | 1187 case kOpaque_SkAlphaType: |
1188 switch (dstColorType) { | 1188 switch (dstColorType) { |
1189 case kRGBA_8888_SkColorType: | 1189 case kRGBA_8888_SkColorType: |
1190 return color_xform_RGBA<kDst, kCSM, kOpaque_SkAlphaType, kNo
_SwapRB> | 1190 return color_xform_RGBA<kDst, kCSM, kOpaque_SkAlphaType, kNo
_SwapRB> |
1191 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1191 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1192 case kBGRA_8888_SkColorType: | 1192 case kBGRA_8888_SkColorType: |
1193 return color_xform_RGBA<kDst, kCSM, kOpaque_SkAlphaType, kYe
s_SwapRB> | 1193 return color_xform_RGBA<kDst, kCSM, kOpaque_SkAlphaType, kYe
s_SwapRB> |
1194 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1194 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1195 case kRGBA_F16_SkColorType: | 1195 case kRGBA_F16_SkColorType: |
1196 return color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, kC
SM, | 1196 return color_xform_RGBA<kLinear_SkGammaNamed, kCSM, |
1197 kOpaque_SkAlphaType, kNo_SwapRB> | 1197 kOpaque_SkAlphaType, kNo_SwapRB> |
1198 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); | 1198 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGamm
aTables); |
1199 default: | 1199 default: |
1200 SkASSERT(false); | 1200 SkASSERT(false); |
1201 return; | 1201 return; |
1202 } | 1202 } |
1203 default: | 1203 default: |
1204 SkASSERT(false); | 1204 SkASSERT(false); |
1205 return; | 1205 return; |
1206 } | 1206 } |
1207 } | 1207 } |
1208 | 1208 |
1209 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { | 1209 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { |
1210 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base | 1210 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
1211 <SkColorSpace::kNonStandard_GammaNamed, kNone_ColorSpaceMatch> | 1211 <kNonStandard_SkGammaNamed, kNone_ColorSpaceMatch> |
1212 (space, SkMatrix::I(), space)); | 1212 (space, SkMatrix::I(), space)); |
1213 } | 1213 } |
OLD | NEW |