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 "Sk4fGradientBase.h" | 8 #include "Sk4fGradientBase.h" |
9 | 9 |
10 #include <functional> | 10 #include <functional> |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 } | 319 } |
320 } | 320 } |
321 | 321 |
322 template<DstType dstType, ApplyPremul premul, SkShader::TileMode tileMode> | 322 template<DstType dstType, ApplyPremul premul, SkShader::TileMode tileMode> |
323 void SkGradientShaderBase:: | 323 void SkGradientShaderBase:: |
324 GradientShaderBase4fContext::shadeSpanInternal(int x, int y, | 324 GradientShaderBase4fContext::shadeSpanInternal(int x, int y, |
325 typename DstTraits<dstType, premu
l>::Type dst[], | 325 typename DstTraits<dstType, premu
l>::Type dst[], |
326 int count) const { | 326 int count) const { |
327 static const int kBufSize = 128; | 327 static const int kBufSize = 128; |
328 SkScalar ts[kBufSize]; | 328 SkScalar ts[kBufSize]; |
329 TSampler<dstType, tileMode> sampler(*this); | 329 TSampler<dstType, premul, tileMode> sampler(*this); |
330 | 330 |
331 SkASSERT(count > 0); | 331 SkASSERT(count > 0); |
332 do { | 332 do { |
333 const int n = SkTMin(kBufSize, count); | 333 const int n = SkTMin(kBufSize, count); |
334 this->mapTs(x, y, ts, n); | 334 this->mapTs(x, y, ts, n); |
335 for (int i = 0; i < n; ++i) { | 335 for (int i = 0; i < n; ++i) { |
336 const Sk4f c = sampler.sample(ts[i]); | 336 const Sk4f c = sampler.sample(ts[i]); |
337 DstTraits<dstType, premul>::store(c, dst++); | 337 DstTraits<dstType, premul>::store(c, dst++); |
338 } | 338 } |
339 x += n; | 339 x += n; |
340 count -= n; | 340 count -= n; |
341 } while (count > 0); | 341 } while (count > 0); |
342 } | 342 } |
343 | 343 |
344 template<DstType dstType, SkShader::TileMode tileMode> | 344 template<DstType dstType, ApplyPremul premul, SkShader::TileMode tileMode> |
345 class SkGradientShaderBase::GradientShaderBase4fContext::TSampler { | 345 class SkGradientShaderBase::GradientShaderBase4fContext::TSampler { |
346 public: | 346 public: |
347 TSampler(const GradientShaderBase4fContext& ctx) | 347 TSampler(const GradientShaderBase4fContext& ctx) |
348 : fFirstInterval(ctx.fIntervals.begin()) | 348 : fFirstInterval(ctx.fIntervals.begin()) |
349 , fLastInterval(ctx.fIntervals.end() - 1) | 349 , fLastInterval(ctx.fIntervals.end() - 1) |
350 , fInterval(nullptr) { | 350 , fInterval(nullptr) { |
351 SkASSERT(fLastInterval >= fFirstInterval); | 351 SkASSERT(fLastInterval >= fFirstInterval); |
352 } | 352 } |
353 | 353 |
354 Sk4f sample(SkScalar t) { | 354 Sk4f sample(SkScalar t) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 if (i < fFirstInterval) { | 417 if (i < fFirstInterval) { |
418 i = fLastInterval; | 418 i = fLastInterval; |
419 } | 419 } |
420 } while (tiled_t < i->fP0 || tiled_t >= i->fP1); | 420 } while (tiled_t < i->fP0 || tiled_t >= i->fP1); |
421 } | 421 } |
422 | 422 |
423 return i; | 423 return i; |
424 } | 424 } |
425 | 425 |
426 void loadIntervalData(const Interval* i) { | 426 void loadIntervalData(const Interval* i) { |
427 fCc = DstTraits<dstType>::load(i->fC0); | 427 fCc = DstTraits<dstType, premul>::load(i->fC0); |
428 fDc = DstTraits<dstType>::load(i->fDc); | 428 fDc = DstTraits<dstType, premul>::load(i->fDc); |
429 } | 429 } |
430 | 430 |
431 const Interval* fFirstInterval; | 431 const Interval* fFirstInterval; |
432 const Interval* fLastInterval; | 432 const Interval* fLastInterval; |
433 const Interval* fInterval; | 433 const Interval* fInterval; |
434 SkScalar fPrevT; | 434 SkScalar fPrevT; |
435 Sk4f fCc; | 435 Sk4f fCc; |
436 Sk4f fDc; | 436 Sk4f fDc; |
437 }; | 437 }; |
OLD | NEW |