OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "SkLinearGradient.h" | 8 #include "SkLinearGradient.h" |
9 | 9 |
10 static const float kInv255Float = 1.0f / 255; | 10 static const float kInv255Float = 1.0f / 255; |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 const Sk4f dc = diffc * dx4 * Sk4f(scale); | 661 const Sk4f dc = diffc * dx4 * Sk4f(scale); |
662 | 662 |
663 int n; | 663 int n; |
664 if (dx_is_pos) { | 664 if (dx_is_pos) { |
665 n = SkTMin((int)((p1 - fx) * invDx) + 1, count); | 665 n = SkTMin((int)((p1 - fx) * invDx) + 1, count); |
666 } else { | 666 } else { |
667 n = SkTMin((int)((p0 - fx) * invDx) + 1, count); | 667 n = SkTMin((int)((p0 - fx) * invDx) + 1, count); |
668 } | 668 } |
669 | 669 |
670 fx += n * dx; | 670 fx += n * dx; |
671 count -= n; | 671 // fx should now outside of the p0..p1 interval. However, due to float p
recision loss, |
672 SkASSERT(count >= 0); | 672 // its possible that fx is slightly too small/large, so we clamp it. |
673 if (dx_is_pos) { | 673 if (dx_is_pos) { |
674 SkASSERT(0 == count || fx >= p1); | 674 fx = SkTMax(fx, p1); |
675 } else { | 675 } else { |
676 SkASSERT(0 == count || fx <= p0); | 676 fx = SkTMin(fx, p0); |
677 } | 677 } |
678 | 678 |
679 ramp<apply_alpha>(dstC, n, c, dc, dither0, dither1); | 679 ramp<apply_alpha>(dstC, n, c, dc, dither0, dither1); |
680 dstC += n; | 680 dstC += n; |
681 SkASSERT(dstC <= endDstC); | 681 SkASSERT(dstC <= endDstC); |
682 | 682 |
683 if (n & 1) { | 683 if (n & 1) { |
684 SkTSwap(dither0, dither1); | 684 SkTSwap(dither0, dither1); |
685 } | 685 } |
| 686 |
| 687 count -= n; |
| 688 SkASSERT(count >= 0); |
686 } | 689 } |
687 } | 690 } |
688 | 691 |
689 void SkLinearGradient::LinearGradientContext::shade4_clamp(int x, int y, SkPMCol
or dstC[], | 692 void SkLinearGradient::LinearGradientContext::shade4_clamp(int x, int y, SkPMCol
or dstC[], |
690 int count) { | 693 int count) { |
691 SkASSERT(count > 0); | 694 SkASSERT(count > 0); |
692 SkASSERT(kLinear_MatrixClass == fDstToIndexClass); | 695 SkASSERT(kLinear_MatrixClass == fDstToIndexClass); |
693 | 696 |
694 SkPoint srcPt; | 697 SkPoint srcPt; |
695 fDstToIndexProc(fDstToIndex, x + SK_ScalarHalf, y + SK_ScalarHalf, &srcPt); | 698 fDstToIndexProc(fDstToIndex, x + SK_ScalarHalf, y + SK_ScalarHalf, &srcPt); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 } | 736 } |
734 } else { | 737 } else { |
735 if (fApplyAlphaAfterInterp) { | 738 if (fApplyAlphaAfterInterp) { |
736 this->shade4_dx_clamp<true, false>(dstC, count, fx, dx, invDx, dithe
r); | 739 this->shade4_dx_clamp<true, false>(dstC, count, fx, dx, invDx, dithe
r); |
737 } else { | 740 } else { |
738 this->shade4_dx_clamp<false, false>(dstC, count, fx, dx, invDx, dith
er); | 741 this->shade4_dx_clamp<false, false>(dstC, count, fx, dx, invDx, dith
er); |
739 } | 742 } |
740 } | 743 } |
741 } | 744 } |
742 | 745 |
OLD | NEW |