| 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 "Sk4x4f.h" |
| 10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 const SkScalar f = SkScalarFraction(fx); | 93 const SkScalar f = SkScalarFraction(fx); |
| 94 return f < 0 ? f + 1 : f; | 94 return f < 0 ? f + 1 : f; |
| 95 } | 95 } |
| 96 | 96 |
| 97 template<> | 97 template<> |
| 98 SkScalar pinFx<SkShader::kMirror_TileMode>(SkScalar fx) { | 98 SkScalar pinFx<SkShader::kMirror_TileMode>(SkScalar fx) { |
| 99 const SkScalar f = SkScalarMod(fx, 2.0f); | 99 const SkScalar f = SkScalarMod(fx, 2.0f); |
| 100 return f < 0 ? f + 2 : f; | 100 return f < 0 ? f + 2 : f; |
| 101 } | 101 } |
| 102 | 102 |
| 103 // true when x is in [k1,k2) | 103 // true when x is in [k1,k2), or [k2, k1) when the interval is reversed. |
| 104 // TODO(fmalita): hoist the reversed interval check out of this helper. |
| 104 bool in_range(SkScalar x, SkScalar k1, SkScalar k2) { | 105 bool in_range(SkScalar x, SkScalar k1, SkScalar k2) { |
| 105 SkASSERT(k1 != k2); | 106 SkASSERT(k1 != k2); |
| 106 return (k1 < k2) | 107 return (k1 < k2) |
| 107 ? (x >= k1 && x < k2) | 108 ? (x >= k1 && x < k2) |
| 108 : (x >= k2 && x < k1); | 109 : (x > k2 && x <= k1); |
| 109 } | 110 } |
| 110 | 111 |
| 111 } // anonymous namespace | 112 } // anonymous namespace |
| 112 | 113 |
| 113 SkLinearGradient:: | 114 SkLinearGradient:: |
| 114 LinearGradient4fContext::LinearGradient4fContext(const SkLinearGradient& shader, | 115 LinearGradient4fContext::LinearGradient4fContext(const SkLinearGradient& shader, |
| 115 const ContextRec& rec) | 116 const ContextRec& rec) |
| 116 : INHERITED(shader, rec) { | 117 : INHERITED(shader, rec) { |
| 117 | 118 |
| 118 // Our fast path expects interval points to be monotonically increasing in x
. | 119 // Our fast path expects interval points to be monotonically increasing in x
. |
| 119 const bool reverseIntervals = this->isFast() && fDstToPos.getScaleX() < 0; | 120 const bool reverseIntervals = this->isFast() && signbit(fDstToPos.getScaleX(
)); |
| 120 this->buildIntervals(shader, rec, reverseIntervals); | 121 this->buildIntervals(shader, rec, reverseIntervals); |
| 121 | 122 |
| 122 SkASSERT(fIntervals.count() > 0); | 123 SkASSERT(fIntervals.count() > 0); |
| 123 fCachedInterval = fIntervals.begin(); | 124 fCachedInterval = fIntervals.begin(); |
| 124 } | 125 } |
| 125 | 126 |
| 126 const SkGradientShaderBase::GradientShaderBase4fContext::Interval* | 127 const SkGradientShaderBase::GradientShaderBase4fContext::Interval* |
| 127 SkLinearGradient::LinearGradient4fContext::findInterval(SkScalar fx) const { | 128 SkLinearGradient::LinearGradient4fContext::findInterval(SkScalar fx) const { |
| 128 SkASSERT(in_range(fx, fIntervals.front().fP0, fIntervals.back().fP1)); | 129 SkASSERT(in_range(fx, fIntervals.front().fP0, fIntervals.back().fP1)); |
| 129 | 130 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 SkScalar fx, | 284 SkScalar fx, |
| 284 SkScalar dx, | 285 SkScalar dx, |
| 285 bool is_vertical) | 286 bool is_vertical) |
| 286 : fAdvX((i->fP1 - fx) / dx) | 287 : fAdvX((i->fP1 - fx) / dx) |
| 287 , fFirstInterval(firstInterval) | 288 , fFirstInterval(firstInterval) |
| 288 , fLastInterval(lastInterval) | 289 , fLastInterval(lastInterval) |
| 289 , fInterval(i) | 290 , fInterval(i) |
| 290 , fDx(dx) | 291 , fDx(dx) |
| 291 , fIsVertical(is_vertical) | 292 , fIsVertical(is_vertical) |
| 292 { | 293 { |
| 294 SkASSERT(fAdvX >= 0); |
| 293 SkASSERT(firstInterval <= lastInterval); | 295 SkASSERT(firstInterval <= lastInterval); |
| 294 SkASSERT(in_range(fx, i->fP0, i->fP1)); | 296 SkASSERT(in_range(fx, i->fP0, i->fP1)); |
| 295 this->compute_interval_props(fx - i->fP0); | 297 this->compute_interval_props(fx - i->fP0); |
| 296 } | 298 } |
| 297 | 299 |
| 298 SkScalar currentAdvance() const { | 300 SkScalar currentAdvance() const { |
| 299 SkASSERT(fAdvX >= 0); | 301 SkASSERT(fAdvX >= 0); |
| 300 SkASSERT(fAdvX <= (fInterval->fP1 - fInterval->fP0) / fDx); | 302 SkASSERT(fAdvX <= (fInterval->fP1 - fInterval->fP0) / fDx); |
| 301 return fAdvX; | 303 return fAdvX; |
| 302 } | 304 } |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 static_cast<const LinearGradient4fContext*>(state->fCtx); | 474 static_cast<const LinearGradient4fContext*>(state->fCtx); |
| 473 | 475 |
| 474 if (ctx->fColorsArePremul) { | 476 if (ctx->fColorsArePremul) { |
| 475 ctx->shadePremulSpan<DstType::F16, ApplyPremul::False>( | 477 ctx->shadePremulSpan<DstType::F16, ApplyPremul::False>( |
| 476 x, y, dst.writable_addr64(x, y), count); | 478 x, y, dst.writable_addr64(x, y), count); |
| 477 } else { | 479 } else { |
| 478 ctx->shadePremulSpan<DstType::F16, ApplyPremul::True>( | 480 ctx->shadePremulSpan<DstType::F16, ApplyPremul::True>( |
| 479 x, y, dst.writable_addr64(x, y), count); | 481 x, y, dst.writable_addr64(x, y), count); |
| 480 } | 482 } |
| 481 } | 483 } |
| OLD | NEW |