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