Chromium Code Reviews| 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 "Sk4fLinearGradient.h" | 8 #include "Sk4fLinearGradient.h" |
| 9 #include "Sk4x4f.h" | |
| 9 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
| 10 | 11 |
| 11 namespace { | 12 namespace { |
| 12 | 13 |
| 13 template<DstType dstType, ApplyPremul premul> | 14 template<DstType dstType, ApplyPremul premul> |
| 14 void ramp(const Sk4f& c, const Sk4f& dc, typename DstTraits<dstType, premul>::Ty pe dst[], int n) { | 15 void ramp(const Sk4f& c, const Sk4f& dc, typename DstTraits<dstType, premul>::Ty pe dst[], int n) { |
| 15 SkASSERT(n > 0); | 16 SkASSERT(n > 0); |
| 16 | 17 |
| 17 const Sk4f dc2 = dc + dc; | 18 const Sk4f dc2 = dc + dc; |
| 18 const Sk4f dc4 = dc2 + dc2; | 19 const Sk4f dc4 = dc2 + dc2; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 35 if (n & 2) { | 36 if (n & 2) { |
| 36 DstTraits<dstType, premul>::store(c0, dst++); | 37 DstTraits<dstType, premul>::store(c0, dst++); |
| 37 DstTraits<dstType, premul>::store(c1, dst++); | 38 DstTraits<dstType, premul>::store(c1, dst++); |
| 38 c0 = c0 + dc2; | 39 c0 = c0 + dc2; |
| 39 } | 40 } |
| 40 if (n & 1) { | 41 if (n & 1) { |
| 41 DstTraits<dstType, premul>::store(c0, dst); | 42 DstTraits<dstType, premul>::store(c0, dst); |
| 42 } | 43 } |
| 43 } | 44 } |
| 44 | 45 |
| 46 // Planar version of ramp (S32 no-premul only). | |
| 47 template<> | |
| 48 void ramp<DstType::S32, ApplyPremul::False>(const Sk4f& c, const Sk4f& dc, SkPMC olor dst[], int n) { | |
| 49 SkASSERT(n > 0); | |
| 50 | |
| 51 const Sk4f dc4 = dc * 4; | |
| 52 const Sk4x4f dc4x = { Sk4f(dc4[0]), Sk4f(dc4[1]), Sk4f(dc4[2]), Sk4f(dc4[3]) }; | |
| 53 Sk4x4f c4x = Sk4x4f::Transpose(c, c + dc, c + dc * 2, c + dc * 3); | |
| 54 | |
| 55 while (n >= 4) { | |
| 56 const Sk4x4f cx4s32 = { c4x.r.sqrt(), c4x.g.sqrt(), c4x.b.sqrt(), c4x.a }; | |
| 57 cx4s32.transpose((uint8_t*)dst); | |
| 58 | |
| 59 c4x.r += dc4x.r; | |
| 60 c4x.g += dc4x.g; | |
| 61 c4x.b += dc4x.b; | |
| 62 c4x.a += dc4x.a; | |
| 63 | |
| 64 dst += 4; | |
| 65 n -= 4; | |
| 66 } | |
| 67 | |
| 68 if (n & 2) { | |
| 69 DstTraits<DstType::S32, ApplyPremul::False> | |
| 70 ::store(Sk4f(c4x.r[0], c4x.g[0], c4x.b[0], c4x.a[0]), dst++); | |
| 71 DstTraits<DstType::S32, ApplyPremul::False> | |
| 72 ::store(Sk4f(c4x.r[1], c4x.g[1], c4x.b[1], c4x.a[1]), dst++); | |
| 73 } | |
| 74 | |
| 75 if (n & 1) { | |
| 76 DstTraits<DstType::S32, ApplyPremul::False> | |
| 77 ::store(Sk4f(c4x.r[n & 2], c4x.g[n & 2], c4x.b[n & 2], c4x.a[n & 2]) , dst); | |
|
mtklein
2016/03/23 19:05:27
Wait, walk me through this one again?
mtklein
2016/03/23 19:12:57
ok, cute!
| |
| 78 } | |
| 79 } | |
| 80 | |
| 45 template<SkShader::TileMode> | 81 template<SkShader::TileMode> |
| 46 SkScalar pinFx(SkScalar); | 82 SkScalar pinFx(SkScalar); |
| 47 | 83 |
| 48 template<> | 84 template<> |
| 49 SkScalar pinFx<SkShader::kClamp_TileMode>(SkScalar fx) { | 85 SkScalar pinFx<SkShader::kClamp_TileMode>(SkScalar fx) { |
| 50 return fx; | 86 return fx; |
| 51 } | 87 } |
| 52 | 88 |
| 53 template<> | 89 template<> |
| 54 SkScalar pinFx<SkShader::kRepeat_TileMode>(SkScalar fx) { | 90 SkScalar pinFx<SkShader::kRepeat_TileMode>(SkScalar fx) { |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 435 static_cast<const LinearGradient4fContext*>(state->fCtx); | 471 static_cast<const LinearGradient4fContext*>(state->fCtx); |
| 436 | 472 |
| 437 if (ctx->fColorsArePremul) { | 473 if (ctx->fColorsArePremul) { |
| 438 ctx->shadePremulSpan<DstType::F16, ApplyPremul::False>( | 474 ctx->shadePremulSpan<DstType::F16, ApplyPremul::False>( |
| 439 x, y, dst.writable_addr64(x, y), count); | 475 x, y, dst.writable_addr64(x, y), count); |
| 440 } else { | 476 } else { |
| 441 ctx->shadePremulSpan<DstType::F16, ApplyPremul::True>( | 477 ctx->shadePremulSpan<DstType::F16, ApplyPremul::True>( |
| 442 x, y, dst.writable_addr64(x, y), count); | 478 x, y, dst.writable_addr64(x, y), count); |
| 443 } | 479 } |
| 444 } | 480 } |
| OLD | NEW |