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 "Sk4fLinearGradient.h" | 8 #include "Sk4fLinearGradient.h" |
| 9 #include "SkGradientShaderPriv.h" | 9 #include "SkGradientShaderPriv.h" |
| 10 #include "SkLinearGradient.h" | 10 #include "SkLinearGradient.h" |
| 11 #include "SkRadialGradient.h" | 11 #include "SkRadialGradient.h" |
| 12 #include "SkTwoPointConicalGradient.h" | 12 #include "SkTwoPointConicalGradient.h" |
| 13 #include "SkSweepGradient.h" | 13 #include "SkSweepGradient.h" |
| 14 #include "SkColorShader.h" | |
| 14 | 15 |
| 15 void SkGradientShaderBase::Descriptor::flatten(SkWriteBuffer& buffer) const { | 16 void SkGradientShaderBase::Descriptor::flatten(SkWriteBuffer& buffer) const { |
| 16 buffer.writeColorArray(fColors, fCount); | 17 buffer.writeColorArray(fColors, fCount); |
| 17 if (fPos) { | 18 if (fPos) { |
| 18 buffer.writeBool(true); | 19 buffer.writeBool(true); |
| 19 buffer.writeScalarArray(fPos, fCount); | 20 buffer.writeScalarArray(fPos, fCount); |
| 20 } else { | 21 } else { |
| 21 buffer.writeBool(false); | 22 buffer.writeBool(false); |
| 22 } | 23 } |
| 23 buffer.write32(fTileMode); | 24 buffer.write32(fTileMode); |
| (...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 735 | 736 |
| 736 /////////////////////////////////////////////////////////////////////////////// | 737 /////////////////////////////////////////////////////////////////////////////// |
| 737 /////////////////////////////////////////////////////////////////////////////// | 738 /////////////////////////////////////////////////////////////////////////////// |
| 738 | 739 |
| 739 // Return true if these parameters are valid/legal/safe to construct a gradient | 740 // Return true if these parameters are valid/legal/safe to construct a gradient |
| 740 // | 741 // |
| 741 static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { | 742 static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { |
| 742 return nullptr != colors && count >= 1 && tileMode < (unsigned)SkShader::kTi leModeCount; | 743 return nullptr != colors && count >= 1 && tileMode < (unsigned)SkShader::kTi leModeCount; |
| 743 } | 744 } |
| 744 | 745 |
| 745 // assumes colors is SkColor* and pos is SkScalar* | |
| 746 #define EXPAND_1_COLOR(count) \ | |
| 747 SkColor tmp[2]; \ | |
| 748 do { \ | |
| 749 if (1 == count) { \ | |
| 750 tmp[0] = tmp[1] = colors[0]; \ | |
| 751 colors = tmp; \ | |
| 752 pos = nullptr; \ | |
| 753 count = 2; \ | |
| 754 } \ | |
| 755 } while (0) | |
| 756 | |
| 757 static void desc_init(SkGradientShaderBase::Descriptor* desc, | 746 static void desc_init(SkGradientShaderBase::Descriptor* desc, |
| 758 const SkColor colors[], const SkScalar pos[], int colorCou nt, | 747 const SkColor colors[], const SkScalar pos[], int colorCou nt, |
| 759 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) { | 748 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) { |
| 760 SkASSERT(colorCount > 1); | 749 SkASSERT(colorCount > 1); |
| 761 | 750 |
| 762 desc->fColors = colors; | 751 desc->fColors = colors; |
| 763 desc->fPos = pos; | 752 desc->fPos = pos; |
| 764 desc->fCount = colorCount; | 753 desc->fCount = colorCount; |
| 765 desc->fTileMode = mode; | 754 desc->fTileMode = mode; |
| 766 desc->fGradFlags = flags; | 755 desc->fGradFlags = flags; |
| 767 desc->fLocalMatrix = localMatrix; | 756 desc->fLocalMatrix = localMatrix; |
| 768 } | 757 } |
| 769 | 758 |
| 770 sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], | 759 sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], |
| 771 const SkColor colors[], | 760 const SkColor colors[], |
| 772 const SkScalar pos[], int colorCount, | 761 const SkScalar pos[], int colorCount, |
| 773 SkShader::TileMode mode, | 762 SkShader::TileMode mode, |
| 774 uint32_t flags, | 763 uint32_t flags, |
| 775 const SkMatrix* localMatrix) { | 764 const SkMatrix* localMatrix) { |
| 776 if (!pts || !SkScalarIsFinite((pts[1] - pts[0]).length())) { | 765 if (!pts || !SkScalarIsFinite((pts[1] - pts[0]).length())) { |
| 777 return nullptr; | 766 return nullptr; |
| 778 } | 767 } |
| 779 if (!valid_grad(colors, pos, colorCount, mode)) { | 768 if (!valid_grad(colors, pos, colorCount, mode)) { |
| 780 return nullptr; | 769 return nullptr; |
| 781 } | 770 } |
| 782 EXPAND_1_COLOR(colorCount); | 771 if (1 == colorCount) { |
| 772 return sk_make_sp<SkColorShader>(colors[0]); | |
|
reed1
2016/08/18 19:20:17
SkShader::MakeColorShader(colors[0])
| |
| 773 } | |
| 783 | 774 |
| 784 SkGradientShaderBase::Descriptor desc; | 775 SkGradientShaderBase::Descriptor desc; |
| 785 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 776 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 786 return sk_make_sp<SkLinearGradient>(pts, desc); | 777 return sk_make_sp<SkLinearGradient>(pts, desc); |
| 787 } | 778 } |
| 788 | 779 |
| 789 sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad ius, | 780 sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad ius, |
| 790 const SkColor colors[], | 781 const SkColor colors[], |
| 791 const SkScalar pos[], int colorCount, | 782 const SkScalar pos[], int colorCount, |
| 792 SkShader::TileMode mode, | 783 SkShader::TileMode mode, |
| 793 uint32_t flags, | 784 uint32_t flags, |
| 794 const SkMatrix* localMatrix) { | 785 const SkMatrix* localMatrix) { |
| 795 if (radius <= 0) { | 786 if (radius <= 0) { |
| 796 return nullptr; | 787 return nullptr; |
| 797 } | 788 } |
| 798 if (!valid_grad(colors, pos, colorCount, mode)) { | 789 if (!valid_grad(colors, pos, colorCount, mode)) { |
| 799 return nullptr; | 790 return nullptr; |
| 800 } | 791 } |
| 801 EXPAND_1_COLOR(colorCount); | 792 if (1 == colorCount) { |
| 793 return sk_make_sp<SkColorShader>(colors[0]); | |
|
reed1
2016/08/18 19:20:17
ditto
| |
| 794 } | |
| 802 | 795 |
| 803 SkGradientShaderBase::Descriptor desc; | 796 SkGradientShaderBase::Descriptor desc; |
| 804 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 797 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 805 return sk_make_sp<SkRadialGradient>(center, radius, desc); | 798 return sk_make_sp<SkRadialGradient>(center, radius, desc); |
| 806 } | 799 } |
| 807 | 800 |
| 808 sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, | 801 sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, |
| 809 SkScalar startRadius, | 802 SkScalar startRadius, |
| 810 const SkPoint& end, | 803 const SkPoint& end, |
| 811 SkScalar endRadius, | 804 SkScalar endRadius, |
| 812 const SkColor colors[], | 805 const SkColor colors[], |
| 813 const SkScalar pos[], | 806 const SkScalar pos[], |
| 814 int colorCount, | 807 int colorCount, |
| 815 SkShader::TileMode mode, | 808 SkShader::TileMode mode, |
| 816 uint32_t flags, | 809 uint32_t flags, |
| 817 const SkMatrix* localMatrix) { | 810 const SkMatrix* localMatrix) { |
| 818 if (startRadius < 0 || endRadius < 0) { | 811 if (startRadius < 0 || endRadius < 0) { |
| 819 return nullptr; | 812 return nullptr; |
| 820 } | 813 } |
| 821 if (!valid_grad(colors, pos, colorCount, mode)) { | 814 if (!valid_grad(colors, pos, colorCount, mode)) { |
| 822 return nullptr; | 815 return nullptr; |
| 823 } | 816 } |
| 824 if (startRadius == endRadius) { | 817 if (startRadius == endRadius) { |
| 825 if (start == end || startRadius == 0) { | 818 if (start == end || startRadius == 0) { |
| 826 return SkShader::MakeEmptyShader(); | 819 return SkShader::MakeEmptyShader(); |
| 827 } | 820 } |
| 828 } | 821 } |
| 829 | 822 if (1 == colorCount) { |
| 830 EXPAND_1_COLOR(colorCount); | 823 return sk_make_sp<SkColorShader>(colors[0]); |
| 824 } | |
| 831 | 825 |
| 832 bool flipGradient = startRadius > endRadius; | 826 bool flipGradient = startRadius > endRadius; |
| 833 | 827 |
| 834 SkGradientShaderBase::Descriptor desc; | 828 SkGradientShaderBase::Descriptor desc; |
| 835 | 829 |
| 836 if (!flipGradient) { | 830 if (!flipGradient) { |
| 837 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 831 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 838 return sk_make_sp<SkTwoPointConicalGradient>(start, startRadius, end, en dRadius, | 832 return sk_make_sp<SkTwoPointConicalGradient>(start, startRadius, end, en dRadius, |
| 839 flipGradient, desc); | 833 flipGradient, desc); |
| 840 } else { | 834 } else { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 860 | 854 |
| 861 sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, | 855 sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, |
| 862 const SkColor colors[], | 856 const SkColor colors[], |
| 863 const SkScalar pos[], | 857 const SkScalar pos[], |
| 864 int colorCount, | 858 int colorCount, |
| 865 uint32_t flags, | 859 uint32_t flags, |
| 866 const SkMatrix* localMatrix) { | 860 const SkMatrix* localMatrix) { |
| 867 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { | 861 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { |
| 868 return nullptr; | 862 return nullptr; |
| 869 } | 863 } |
| 870 EXPAND_1_COLOR(colorCount); | 864 if (1 == colorCount) { |
| 865 return sk_make_sp<SkColorShader>(colors[0]); | |
| 866 } | |
| 871 | 867 |
| 872 SkGradientShaderBase::Descriptor desc; | 868 SkGradientShaderBase::Descriptor desc; |
| 873 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, localMatrix); | 869 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags, localMatrix); |
| 874 return sk_make_sp<SkSweepGradient>(cx, cy, desc); | 870 return sk_make_sp<SkSweepGradient>(cx, cy, desc); |
| 875 } | 871 } |
| 876 | 872 |
| 877 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) | 873 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |
| 878 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) | 874 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) |
| 879 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) | 875 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) |
| 880 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) | 876 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1427 (*stops)[i] = stop; | 1423 (*stops)[i] = stop; |
| 1428 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; | 1424 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; |
| 1429 } | 1425 } |
| 1430 } | 1426 } |
| 1431 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); | 1427 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); |
| 1432 | 1428 |
| 1433 return outColors; | 1429 return outColors; |
| 1434 } | 1430 } |
| 1435 | 1431 |
| 1436 #endif | 1432 #endif |
| OLD | NEW |