| 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 #ifndef SkRasterPipeline_opts_DEFINED | 8 #ifndef SkRasterPipeline_opts_DEFINED |
| 9 #define SkRasterPipeline_opts_DEFINED | 9 #define SkRasterPipeline_opts_DEFINED |
| 10 | 10 |
| 11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 12 #include "SkColorSpace_Base.h" |
| 12 #include "SkHalf.h" | 13 #include "SkHalf.h" |
| 14 #include "SkMatrix44.h" |
| 13 #include "SkPM4f.h" | 15 #include "SkPM4f.h" |
| 14 #include "SkPM4fPriv.h" | 16 #include "SkPM4fPriv.h" |
| 15 #include "SkRasterPipeline.h" | 17 #include "SkRasterPipeline.h" |
| 16 #include "SkSRGB.h" | 18 #include "SkSRGB.h" |
| 17 #include "SkUtils.h" | 19 #include "SkUtils.h" |
| 18 #include <utility> | 20 #include <utility> |
| 19 | 21 |
| 20 namespace { | 22 namespace { |
| 21 | 23 |
| 22 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 | 24 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 } | 426 } |
| 425 | 427 |
| 426 STAGE(store_srgb, false) { | 428 STAGE(store_srgb, false) { |
| 427 auto ptr = *(uint32_t**)ctx + x; | 429 auto ptr = *(uint32_t**)ctx + x; |
| 428 store<kIsTail>(tail, ( sk_linear_to_srgb(r) << SK_R32_SHIFT | 430 store<kIsTail>(tail, ( sk_linear_to_srgb(r) << SK_R32_SHIFT |
| 429 | sk_linear_to_srgb(g) << SK_G32_SHIFT | 431 | sk_linear_to_srgb(g) << SK_G32_SHIFT |
| 430 | sk_linear_to_srgb(b) << SK_B32_SHIFT | 432 | sk_linear_to_srgb(b) << SK_B32_SHIFT |
| 431 | SkNx_cast<int>(0.5f + 255.0f * a) << SK_A32_SHIFT), (
int*)ptr); | 433 | SkNx_cast<int>(0.5f + 255.0f * a) << SK_A32_SHIFT), (
int*)ptr); |
| 432 } | 434 } |
| 433 | 435 |
| 436 STAGE(load_s_8888, true) { |
| 437 auto ptr = *(const uint32_t**)ctx + x; |
| 438 |
| 439 auto px = load<kIsTail>(tail, ptr); |
| 440 auto to_int = [](const SkNx<N, uint32_t>& v) { return SkNi::Load(&v); }; |
| 441 r = (1/255.0f)*SkNx_cast<float>(to_int((px >> 0) & 0xff)); |
| 442 g = (1/255.0f)*SkNx_cast<float>(to_int((px >> 8) & 0xff)); |
| 443 b = (1/255.0f)*SkNx_cast<float>(to_int((px >> 16) & 0xff)); |
| 444 a = (1/255.0f)*SkNx_cast<float>(to_int(px >> 24)); |
| 445 } |
| 446 |
| 447 STAGE(store_8888, false) { |
| 448 auto ptr = *(uint32_t**)ctx + x; |
| 449 store<kIsTail>(tail, ( SkNx_cast<int>(255.0f * r + 0.5f) << 0 |
| 450 | SkNx_cast<int>(255.0f * g + 0.5f) << 8 |
| 451 | SkNx_cast<int>(255.0f * b + 0.5f) << 16 |
| 452 | SkNx_cast<int>(255.0f * a + 0.5f) << 24 ), (int*)ptr)
; |
| 453 } |
| 454 |
| 434 RGBA_XFERMODE(clear) { return 0.0f; } | 455 RGBA_XFERMODE(clear) { return 0.0f; } |
| 435 //RGBA_XFERMODE(src) { return s; } // This would be a no-op stage, so we
just omit it. | 456 //RGBA_XFERMODE(src) { return s; } // This would be a no-op stage, so we
just omit it. |
| 436 RGBA_XFERMODE(dst) { return d; } | 457 RGBA_XFERMODE(dst) { return d; } |
| 437 | 458 |
| 438 RGBA_XFERMODE(srcatop) { return s*da + d*inv(sa); } | 459 RGBA_XFERMODE(srcatop) { return s*da + d*inv(sa); } |
| 439 RGBA_XFERMODE(srcin) { return s * da; } | 460 RGBA_XFERMODE(srcin) { return s * da; } |
| 440 RGBA_XFERMODE(srcout) { return s * inv(da); } | 461 RGBA_XFERMODE(srcout) { return s * inv(da); } |
| 441 RGBA_XFERMODE(srcover) { return SkNx_fma(d, inv(sa), s); } | 462 RGBA_XFERMODE(srcover) { return SkNx_fma(d, inv(sa), s); } |
| 442 RGBA_XFERMODE(dstatop) { return srcatop_kernel(d,da,s,sa); } | 463 RGBA_XFERMODE(dstatop) { return srcatop_kernel(d,da,s,sa); } |
| 443 RGBA_XFERMODE(dstin) { return srcin_kernel (d,da,s,sa); } | 464 RGBA_XFERMODE(dstin) { return srcin_kernel (d,da,s,sa); } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 liteDst = m.rsqrt().invert() - m, // Used in case 3. | 504 liteDst = m.rsqrt().invert() - m, // Used in case 3. |
| 484 liteSrc = d*sa + da*(s2 - sa) * (4.0f*d <= da).thenElse(darkDst, liteDs
t); // 2 or 3? | 505 liteSrc = d*sa + da*(s2 - sa) * (4.0f*d <= da).thenElse(darkDst, liteDs
t); // 2 or 3? |
| 485 return s*inv(da) + d*inv(sa) + (s2 <= sa).thenElse(darkSrc, liteSrc); // 1
or (2 or 3)? | 506 return s*inv(da) + d*inv(sa) + (s2 <= sa).thenElse(darkSrc, liteSrc); // 1
or (2 or 3)? |
| 486 } | 507 } |
| 487 | 508 |
| 488 STAGE(luminance_to_alpha, true) { | 509 STAGE(luminance_to_alpha, true) { |
| 489 a = SK_LUM_COEFF_R*r + SK_LUM_COEFF_G*g + SK_LUM_COEFF_B*b; | 510 a = SK_LUM_COEFF_R*r + SK_LUM_COEFF_G*g + SK_LUM_COEFF_B*b; |
| 490 r = g = b = 0; | 511 r = g = b = 0; |
| 491 } | 512 } |
| 492 | 513 |
| 514 STAGE(matrix_3x4, true) { |
| 515 auto m = (const float*)ctx; |
| 516 |
| 517 auto fma = [](const SkNf& f, const SkNf& m, const SkNf& a) { return SkNx_fma
(f,m,a); }; |
| 518 auto R = fma(r,m[0], fma(g,m[3], fma(b,m[6], m[ 9]))), |
| 519 G = fma(r,m[1], fma(g,m[4], fma(b,m[7], m[10]))), |
| 520 B = fma(r,m[2], fma(g,m[5], fma(b,m[8], m[11]))); |
| 521 r = R; |
| 522 g = G; |
| 523 b = B; |
| 524 } |
| 525 |
| 493 STAGE(matrix_4x5, true) { | 526 STAGE(matrix_4x5, true) { |
| 494 auto m = (const float*)ctx; | 527 auto m = (const float*)ctx; |
| 495 | 528 |
| 496 auto fma = [](const SkNf& f, const SkNf& m, const SkNf& a) { return SkNx_fma
(f,m,a); }; | 529 auto fma = [](const SkNf& f, const SkNf& m, const SkNf& a) { return SkNx_fma
(f,m,a); }; |
| 497 auto R = fma(r,m[0], fma(g,m[4], fma(b,m[ 8], fma(a,m[12], m[16])))), | 530 auto R = fma(r,m[0], fma(g,m[4], fma(b,m[ 8], fma(a,m[12], m[16])))), |
| 498 G = fma(r,m[1], fma(g,m[5], fma(b,m[ 9], fma(a,m[13], m[17])))), | 531 G = fma(r,m[1], fma(g,m[5], fma(b,m[ 9], fma(a,m[13], m[17])))), |
| 499 B = fma(r,m[2], fma(g,m[6], fma(b,m[10], fma(a,m[14], m[18])))), | 532 B = fma(r,m[2], fma(g,m[6], fma(b,m[10], fma(a,m[14], m[18])))), |
| 500 A = fma(r,m[3], fma(g,m[7], fma(b,m[11], fma(a,m[15], m[19])))); | 533 A = fma(r,m[3], fma(g,m[7], fma(b,m[11], fma(a,m[15], m[19])))); |
| 501 r = R; | 534 r = R; |
| 502 g = G; | 535 g = G; |
| 503 b = B; | 536 b = B; |
| 504 a = A; | 537 a = A; |
| 505 } | 538 } |
| 506 | 539 |
| 540 STAGE(fn_1_r, true) { |
| 541 auto fn = (const std::function<float(float)>*)ctx; |
| 542 float result[N]; |
| 543 for (int i = 0; i < N; ++i) { |
| 544 result[i] = (*fn)(r[i]); |
| 545 } |
| 546 r = SkNf::Load(result); |
| 547 } |
| 548 |
| 549 STAGE(fn_1_g, true) { |
| 550 auto fn = (const std::function<float(float)>*)ctx; |
| 551 float result[N]; |
| 552 for (int i = 0; i < N; ++i) { |
| 553 result[i] = (*fn)(g[i]); |
| 554 } |
| 555 g = SkNf::Load(result); |
| 556 } |
| 557 |
| 558 STAGE(fn_1_b, true) { |
| 559 auto fn = (const std::function<float(float)>*)ctx; |
| 560 float result[N]; |
| 561 for (int i = 0; i < N; ++i) { |
| 562 result[i] = (*fn)(b[i]); |
| 563 } |
| 564 b = SkNf::Load(result); |
| 565 } |
| 566 |
| 567 STAGE(color_lookup_table, true) { |
| 568 const SkColorLookUpTable* colorLUT = (const SkColorLookUpTable*)ctx; |
| 569 float rgb[3]; |
| 570 alignas(alignof(SkNf)) float result[3][N]; |
| 571 for (int i = 0; i < N; ++i) { |
| 572 rgb[0] = r[i]; |
| 573 rgb[1] = g[i]; |
| 574 rgb[2] = b[i]; |
| 575 colorLUT->interp3D(rgb, rgb); |
| 576 result[0][i] = rgb[0]; |
| 577 result[1][i] = rgb[1]; |
| 578 result[2][i] = rgb[2]; |
| 579 } |
| 580 r = SkNf::Load(result[0]); |
| 581 g = SkNf::Load(result[1]); |
| 582 b = SkNf::Load(result[2]); |
| 583 } |
| 584 |
| 585 STAGE(lab_to_xyz, true) { |
| 586 const auto lab_l = r * 100.0f; |
| 587 const auto lab_a = g * 255.0f - 128.0f; |
| 588 const auto lab_b = b * 255.0f - 128.0f; |
| 589 auto Y = (lab_l + 16.0f) * (1/116.0f); |
| 590 auto X = lab_a * (1/500.0f) + Y; |
| 591 auto Z = Y - (lab_b * (1/200.0f)); |
| 592 |
| 593 auto X3 = X*X*X; |
| 594 X = (X3 > 0.008856f).thenElse(X3, (X - (16/116.0f)) * (1/7.787f)); |
| 595 auto Y3 = Y*Y*Y; |
| 596 Y = (Y3 > 0.008856f).thenElse(Y3, (Y - (16/116.0f)) * (1/7.787f)); |
| 597 auto Z3 = Z*Z*Z; |
| 598 Z = (Z3 > 0.008856f).thenElse(Z3, (Z - (16/116.0f)) * (1/7.787f)); |
| 599 |
| 600 // adjust to D50 illuminant |
| 601 X *= 0.96422f; |
| 602 Y *= 1.00000f; |
| 603 Z *= 0.82521f; |
| 604 |
| 605 r = X; |
| 606 g = Y; |
| 607 b = Z; |
| 608 } |
| 609 |
| 610 STAGE(swap_rb, true) { |
| 611 SkNf tmp = r; |
| 612 r = b; |
| 613 b = tmp; |
| 614 //SkTSwap(r, b); |
| 615 } |
| 616 |
| 507 template <typename Fn> | 617 template <typename Fn> |
| 508 SI Fn enum_to_Fn(SkRasterPipeline::StockStage st) { | 618 SI Fn enum_to_Fn(SkRasterPipeline::StockStage st) { |
| 509 switch (st) { | 619 switch (st) { |
| 510 #define M(stage) case SkRasterPipeline::stage: return stage; | 620 #define M(stage) case SkRasterPipeline::stage: return stage; |
| 511 SK_RASTER_PIPELINE_STAGES(M) | 621 SK_RASTER_PIPELINE_STAGES(M) |
| 512 #undef M | 622 #undef M |
| 513 } | 623 } |
| 514 SkASSERT(false); | 624 SkASSERT(false); |
| 515 return just_return; | 625 return just_return; |
| 516 } | 626 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 } | 707 } |
| 598 | 708 |
| 599 } // namespace SK_OPTS_NS | 709 } // namespace SK_OPTS_NS |
| 600 | 710 |
| 601 #undef SI | 711 #undef SI |
| 602 #undef STAGE | 712 #undef STAGE |
| 603 #undef RGBA_XFERMODE | 713 #undef RGBA_XFERMODE |
| 604 #undef RGB_XFERMODE | 714 #undef RGB_XFERMODE |
| 605 | 715 |
| 606 #endif//SkRasterPipeline_opts_DEFINED | 716 #endif//SkRasterPipeline_opts_DEFINED |
| OLD | NEW |