Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 "SkGradientShaderPriv.h" | 8 #include "SkGradientShaderPriv.h" |
| 9 #include "SkLinearGradient.h" | 9 #include "SkLinearGradient.h" |
| 10 #include "SkRadialGradient.h" | 10 #include "SkRadialGradient.h" |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 728 str->append(" "); | 728 str->append(" "); |
| 729 str->append(gTileModeName[fTileMode]); | 729 str->append(gTileModeName[fTileMode]); |
| 730 | 730 |
| 731 this->INHERITED::toString(str); | 731 this->INHERITED::toString(str); |
| 732 } | 732 } |
| 733 #endif | 733 #endif |
| 734 | 734 |
| 735 /////////////////////////////////////////////////////////////////////////////// | 735 /////////////////////////////////////////////////////////////////////////////// |
| 736 /////////////////////////////////////////////////////////////////////////////// | 736 /////////////////////////////////////////////////////////////////////////////// |
| 737 | 737 |
| 738 // Return true if these parameters are valid/legal/safe to construct a gradient | |
| 739 // | |
| 740 static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { | |
|
Stephen White
2015/01/06 14:53:30
Nit: pos is unused here (presumably because NULL i
| |
| 741 return NULL != colors && count >= 1 && tileMode < (unsigned)SkShader::kTileM odeCount; | |
| 742 } | |
| 743 | |
| 738 // assumes colors is SkColor* and pos is SkScalar* | 744 // assumes colors is SkColor* and pos is SkScalar* |
| 739 #define EXPAND_1_COLOR(count) \ | 745 #define EXPAND_1_COLOR(count) \ |
| 740 SkColor tmp[2]; \ | 746 SkColor tmp[2]; \ |
| 741 do { \ | 747 do { \ |
| 742 if (1 == count) { \ | 748 if (1 == count) { \ |
| 743 tmp[0] = tmp[1] = colors[0]; \ | 749 tmp[0] = tmp[1] = colors[0]; \ |
| 744 colors = tmp; \ | 750 colors = tmp; \ |
| 745 pos = NULL; \ | 751 pos = NULL; \ |
| 746 count = 2; \ | 752 count = 2; \ |
| 747 } \ | 753 } \ |
| 748 } while (0) | 754 } while (0) |
| 749 | 755 |
| 750 static void desc_init(SkGradientShaderBase::Descriptor* desc, | 756 static void desc_init(SkGradientShaderBase::Descriptor* desc, |
| 751 const SkColor colors[], const SkScalar pos[], int colorCou nt, | 757 const SkColor colors[], const SkScalar pos[], int colorCou nt, |
| 752 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) { | 758 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) { |
| 753 desc->fColors = colors; | 759 desc->fColors = colors; |
| 754 desc->fPos = pos; | 760 desc->fPos = pos; |
| 755 desc->fCount = colorCount; | 761 desc->fCount = colorCount; |
| 756 desc->fTileMode = mode; | 762 desc->fTileMode = mode; |
| 757 desc->fGradFlags = flags; | 763 desc->fGradFlags = flags; |
| 758 desc->fLocalMatrix = localMatrix; | 764 desc->fLocalMatrix = localMatrix; |
| 759 } | 765 } |
| 760 | 766 |
| 761 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], | 767 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], |
| 762 const SkColor colors[], | 768 const SkColor colors[], |
| 763 const SkScalar pos[], int colorCount, | 769 const SkScalar pos[], int colorCount, |
| 764 SkShader::TileMode mode, | 770 SkShader::TileMode mode, |
| 765 uint32_t flags, | 771 uint32_t flags, |
| 766 const SkMatrix* localMatrix) { | 772 const SkMatrix* localMatrix) { |
| 767 if (NULL == pts || NULL == colors || colorCount < 1) { | 773 if (!pts) { |
| 774 return NULL; | |
| 775 } | |
| 776 if (!valid_grad(colors, pos, colorCount, mode)) { | |
| 768 return NULL; | 777 return NULL; |
| 769 } | 778 } |
| 770 EXPAND_1_COLOR(colorCount); | 779 EXPAND_1_COLOR(colorCount); |
| 771 | 780 |
| 772 SkGradientShaderBase::Descriptor desc; | 781 SkGradientShaderBase::Descriptor desc; |
| 773 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 782 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 774 return SkNEW_ARGS(SkLinearGradient, (pts, desc)); | 783 return SkNEW_ARGS(SkLinearGradient, (pts, desc)); |
| 775 } | 784 } |
| 776 | 785 |
| 777 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, | 786 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
| 778 const SkColor colors[], | 787 const SkColor colors[], |
| 779 const SkScalar pos[], int colorCount, | 788 const SkScalar pos[], int colorCount, |
| 780 SkShader::TileMode mode, | 789 SkShader::TileMode mode, |
| 781 uint32_t flags, | 790 uint32_t flags, |
| 782 const SkMatrix* localMatrix) { | 791 const SkMatrix* localMatrix) { |
| 783 if (radius <= 0 || NULL == colors || colorCount < 1) { | 792 if (radius <= 0) { |
| 793 return NULL; | |
| 794 } | |
| 795 if (!valid_grad(colors, pos, colorCount, mode)) { | |
| 784 return NULL; | 796 return NULL; |
| 785 } | 797 } |
| 786 EXPAND_1_COLOR(colorCount); | 798 EXPAND_1_COLOR(colorCount); |
| 787 | 799 |
| 788 SkGradientShaderBase::Descriptor desc; | 800 SkGradientShaderBase::Descriptor desc; |
| 789 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 801 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 790 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); | 802 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); |
| 791 } | 803 } |
| 792 | 804 |
| 793 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, | 805 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, |
| 794 SkScalar startRadius, | 806 SkScalar startRadius, |
| 795 const SkPoint& end, | 807 const SkPoint& end, |
| 796 SkScalar endRadius, | 808 SkScalar endRadius, |
| 797 const SkColor colors[], | 809 const SkColor colors[], |
| 798 const SkScalar pos[], | 810 const SkScalar pos[], |
| 799 int colorCount, | 811 int colorCount, |
| 800 SkShader::TileMode mode, | 812 SkShader::TileMode mode, |
| 801 uint32_t flags, | 813 uint32_t flags, |
| 802 const SkMatrix* localMatrix) { | 814 const SkMatrix* localMatrix) { |
| 803 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { | 815 if (startRadius < 0 || endRadius < 0) { |
| 816 return NULL; | |
| 817 } | |
| 818 if (!valid_grad(colors, pos, colorCount, mode)) { | |
| 804 return NULL; | 819 return NULL; |
| 805 } | 820 } |
| 806 EXPAND_1_COLOR(colorCount); | 821 EXPAND_1_COLOR(colorCount); |
| 807 | 822 |
| 808 SkGradientShaderBase::Descriptor desc; | 823 SkGradientShaderBase::Descriptor desc; |
| 809 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 824 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 810 return SkNEW_ARGS(SkTwoPointRadialGradient, | 825 return SkNEW_ARGS(SkTwoPointRadialGradient, |
| 811 (start, startRadius, end, endRadius, desc)); | 826 (start, startRadius, end, endRadius, desc)); |
| 812 } | 827 } |
| 813 | 828 |
| 814 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, | 829 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
| 815 SkScalar startRadius, | 830 SkScalar startRadius, |
| 816 const SkPoint& end, | 831 const SkPoint& end, |
| 817 SkScalar endRadius, | 832 SkScalar endRadius, |
| 818 const SkColor colors[], | 833 const SkColor colors[], |
| 819 const SkScalar pos[], | 834 const SkScalar pos[], |
| 820 int colorCount, | 835 int colorCount, |
| 821 SkShader::TileMode mode, | 836 SkShader::TileMode mode, |
| 822 uint32_t flags, | 837 uint32_t flags, |
| 823 const SkMatrix* localMatrix) { | 838 const SkMatrix* localMatrix) { |
| 824 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { | 839 if (startRadius < 0 || endRadius < 0) { |
| 840 return NULL; | |
| 841 } | |
| 842 if (!valid_grad(colors, pos, colorCount, mode)) { | |
| 825 return NULL; | 843 return NULL; |
| 826 } | 844 } |
| 827 if (start == end && startRadius == endRadius) { | 845 if (start == end && startRadius == endRadius) { |
| 828 return SkShader::CreateEmptyShader(); | 846 return SkShader::CreateEmptyShader(); |
| 829 } | 847 } |
| 830 | 848 |
| 831 EXPAND_1_COLOR(colorCount); | 849 EXPAND_1_COLOR(colorCount); |
| 832 | 850 |
| 833 bool flipGradient = startRadius > endRadius; | 851 bool flipGradient = startRadius > endRadius; |
| 834 | 852 |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 858 (end, endRadius, start, startRadius, flipGradient, des c)); | 876 (end, endRadius, start, startRadius, flipGradient, des c)); |
| 859 } | 877 } |
| 860 } | 878 } |
| 861 | 879 |
| 862 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, | 880 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |
| 863 const SkColor colors[], | 881 const SkColor colors[], |
| 864 const SkScalar pos[], | 882 const SkScalar pos[], |
| 865 int colorCount, | 883 int colorCount, |
| 866 uint32_t flags, | 884 uint32_t flags, |
| 867 const SkMatrix* localMatrix) { | 885 const SkMatrix* localMatrix) { |
| 868 if (NULL == colors || colorCount < 1) { | 886 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { |
| 869 return NULL; | 887 return NULL; |
| 870 } | 888 } |
| 871 EXPAND_1_COLOR(colorCount); | 889 EXPAND_1_COLOR(colorCount); |
| 872 | 890 |
| 873 SkGradientShaderBase::Descriptor desc; | 891 SkGradientShaderBase::Descriptor desc; |
| 874 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, localMatrix); | 892 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, localMatrix); |
| 875 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); | 893 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); |
| 876 } | 894 } |
| 877 | 895 |
| 878 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) | 896 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1182 (*stops)[i] = stop; | 1200 (*stops)[i] = stop; |
| 1183 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; | 1201 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; |
| 1184 } | 1202 } |
| 1185 } | 1203 } |
| 1186 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); | 1204 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); |
| 1187 | 1205 |
| 1188 return outColors; | 1206 return outColors; |
| 1189 } | 1207 } |
| 1190 | 1208 |
| 1191 #endif | 1209 #endif |
| OLD | NEW |