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" |
11 #include "SkTwoPointRadialGradient.h" | 11 #include "SkTwoPointRadialGradient.h" |
12 #include "SkTwoPointConicalGradient.h" | 12 #include "SkTwoPointConicalGradient.h" |
13 #include "SkSweepGradient.h" | 13 #include "SkSweepGradient.h" |
14 | 14 |
15 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc) { | 15 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri
x* localMatrix) |
| 16 : INHERITED(localMatrix) |
| 17 { |
16 SkASSERT(desc.fCount > 1); | 18 SkASSERT(desc.fCount > 1); |
17 | 19 |
18 fMapper = desc.fMapper; | 20 fMapper = desc.fMapper; |
19 SkSafeRef(fMapper); | 21 SkSafeRef(fMapper); |
20 fGradFlags = SkToU8(desc.fGradFlags); | 22 fGradFlags = SkToU8(desc.fGradFlags); |
21 | 23 |
22 SkASSERT((unsigned)desc.fTileMode < SkShader::kTileModeCount); | 24 SkASSERT((unsigned)desc.fTileMode < SkShader::kTileModeCount); |
23 SkASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gTileProcs)); | 25 SkASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gTileProcs)); |
24 fTileMode = desc.fTileMode; | 26 fTileMode = desc.fTileMode; |
25 fTileProc = gTileProcs[desc.fTileMode]; | 27 fTileProc = gTileProcs[desc.fTileMode]; |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 desc->fTileMode = mode; | 779 desc->fTileMode = mode; |
778 desc->fMapper = mapper; | 780 desc->fMapper = mapper; |
779 desc->fGradFlags = flags; | 781 desc->fGradFlags = flags; |
780 } | 782 } |
781 | 783 |
782 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], | 784 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], |
783 const SkColor colors[], | 785 const SkColor colors[], |
784 const SkScalar pos[], int colorCount, | 786 const SkScalar pos[], int colorCount, |
785 SkShader::TileMode mode, | 787 SkShader::TileMode mode, |
786 SkUnitMapper* mapper, | 788 SkUnitMapper* mapper, |
787 uint32_t flags) { | 789 uint32_t flags, |
| 790 const SkMatrix* localMatrix) { |
788 if (NULL == pts || NULL == colors || colorCount < 1) { | 791 if (NULL == pts || NULL == colors || colorCount < 1) { |
789 return NULL; | 792 return NULL; |
790 } | 793 } |
791 EXPAND_1_COLOR(colorCount); | 794 EXPAND_1_COLOR(colorCount); |
792 | 795 |
793 SkGradientShaderBase::Descriptor desc; | 796 SkGradientShaderBase::Descriptor desc; |
794 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); | 797 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
795 return SkNEW_ARGS(SkLinearGradient, (pts, desc)); | 798 return SkNEW_ARGS(SkLinearGradient, (pts, desc, localMatrix)); |
796 } | 799 } |
797 | 800 |
798 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, | 801 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
799 const SkColor colors[], | 802 const SkColor colors[], |
800 const SkScalar pos[], int colorCount, | 803 const SkScalar pos[], int colorCount, |
801 SkShader::TileMode mode, | 804 SkShader::TileMode mode, |
802 SkUnitMapper* mapper, | 805 SkUnitMapper* mapper, |
803 uint32_t flags) { | 806 uint32_t flags, |
| 807 const SkMatrix* localMatrix) { |
804 if (radius <= 0 || NULL == colors || colorCount < 1) { | 808 if (radius <= 0 || NULL == colors || colorCount < 1) { |
805 return NULL; | 809 return NULL; |
806 } | 810 } |
807 EXPAND_1_COLOR(colorCount); | 811 EXPAND_1_COLOR(colorCount); |
808 | 812 |
809 SkGradientShaderBase::Descriptor desc; | 813 SkGradientShaderBase::Descriptor desc; |
810 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); | 814 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
811 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); | 815 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc, localMatrix)); |
812 } | 816 } |
813 | 817 |
814 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, | 818 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, |
815 SkScalar startRadius, | 819 SkScalar startRadius, |
816 const SkPoint& end, | 820 const SkPoint& end, |
817 SkScalar endRadius, | 821 SkScalar endRadius, |
818 const SkColor colors[], | 822 const SkColor colors[], |
819 const SkScalar pos[], | 823 const SkScalar pos[], |
820 int colorCount, | 824 int colorCount, |
821 SkShader::TileMode mode, | 825 SkShader::TileMode mode, |
822 SkUnitMapper* mapper, | 826 SkUnitMapper* mapper, |
823 uint32_t flags) { | 827 uint32_t flags, |
| 828 const SkMatrix* localMatrix) { |
824 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { | 829 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { |
825 return NULL; | 830 return NULL; |
826 } | 831 } |
827 EXPAND_1_COLOR(colorCount); | 832 EXPAND_1_COLOR(colorCount); |
828 | 833 |
829 SkGradientShaderBase::Descriptor desc; | 834 SkGradientShaderBase::Descriptor desc; |
830 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); | 835 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
831 return SkNEW_ARGS(SkTwoPointRadialGradient, | 836 return SkNEW_ARGS(SkTwoPointRadialGradient, |
832 (start, startRadius, end, endRadius, desc)); | 837 (start, startRadius, end, endRadius, desc, localMatrix)); |
833 } | 838 } |
834 | 839 |
835 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, | 840 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
836 SkScalar startRadius, | 841 SkScalar startRadius, |
837 const SkPoint& end, | 842 const SkPoint& end, |
838 SkScalar endRadius, | 843 SkScalar endRadius, |
839 const SkColor colors[], | 844 const SkColor colors[], |
840 const SkScalar pos[], | 845 const SkScalar pos[], |
841 int colorCount, | 846 int colorCount, |
842 SkShader::TileMode mode, | 847 SkShader::TileMode mode, |
843 SkUnitMapper* mapper, | 848 SkUnitMapper* mapper, |
844 uint32_t flags) { | 849 uint32_t flags, |
| 850 const SkMatrix* localMatrix) { |
845 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { | 851 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { |
846 return NULL; | 852 return NULL; |
847 } | 853 } |
848 if (start == end && startRadius == endRadius) { | 854 if (start == end && startRadius == endRadius) { |
849 return SkNEW(SkEmptyShader); | 855 return SkNEW(SkEmptyShader); |
850 } | 856 } |
851 | 857 |
852 EXPAND_1_COLOR(colorCount); | 858 EXPAND_1_COLOR(colorCount); |
853 | 859 |
854 bool flipGradient = startRadius > endRadius; | 860 bool flipGradient = startRadius > endRadius; |
855 | 861 |
856 SkGradientShaderBase::Descriptor desc; | 862 SkGradientShaderBase::Descriptor desc; |
857 | 863 |
858 if (!flipGradient) { | 864 if (!flipGradient) { |
859 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); | 865 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
860 return SkNEW_ARGS(SkTwoPointConicalGradient, | 866 return SkNEW_ARGS(SkTwoPointConicalGradient, |
861 (start, startRadius, end, endRadius, flipGradient, des
c)); | 867 (start, startRadius, end, endRadius, flipGradient, des
c, localMatrix)); |
862 } else { | 868 } else { |
863 SkAutoSTArray<8, SkColor> colorsNew(colorCount); | 869 SkAutoSTArray<8, SkColor> colorsNew(colorCount); |
864 SkAutoSTArray<8, SkScalar> posNew(colorCount); | 870 SkAutoSTArray<8, SkScalar> posNew(colorCount); |
865 for (int i = 0; i < colorCount; ++i) { | 871 for (int i = 0; i < colorCount; ++i) { |
866 colorsNew[i] = colors[colorCount - i - 1]; | 872 colorsNew[i] = colors[colorCount - i - 1]; |
867 } | 873 } |
868 | 874 |
869 if (pos) { | 875 if (pos) { |
870 for (int i = 0; i < colorCount; ++i) { | 876 for (int i = 0; i < colorCount; ++i) { |
871 posNew[i] = 1 - pos[colorCount - i - 1]; | 877 posNew[i] = 1 - pos[colorCount - i - 1]; |
872 } | 878 } |
873 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, ma
pper, flags); | 879 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, ma
pper, flags); |
874 } else { | 880 } else { |
875 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, mapper, fl
ags); | 881 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, mapper, fl
ags); |
876 } | 882 } |
877 | 883 |
878 return SkNEW_ARGS(SkTwoPointConicalGradient, | 884 return SkNEW_ARGS(SkTwoPointConicalGradient, |
879 (end, endRadius, start, startRadius, flipGradient, des
c)); | 885 (end, endRadius, start, startRadius, flipGradient, des
c, localMatrix)); |
880 } | 886 } |
881 } | 887 } |
882 | 888 |
883 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, | 889 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |
884 const SkColor colors[], | 890 const SkColor colors[], |
885 const SkScalar pos[], | 891 const SkScalar pos[], |
886 int colorCount, SkUnitMapper* mapper, | 892 int colorCount, SkUnitMapper* mapper, |
887 uint32_t flags) { | 893 uint32_t flags, |
| 894 const SkMatrix* localMatrix) { |
888 if (NULL == colors || colorCount < 1) { | 895 if (NULL == colors || colorCount < 1) { |
889 return NULL; | 896 return NULL; |
890 } | 897 } |
891 EXPAND_1_COLOR(colorCount); | 898 EXPAND_1_COLOR(colorCount); |
892 | 899 |
893 SkGradientShaderBase::Descriptor desc; | 900 SkGradientShaderBase::Descriptor desc; |
894 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, mapper,
flags); | 901 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, mapper,
flags); |
895 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); | 902 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc, localMatrix)); |
896 } | 903 } |
897 | 904 |
898 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) | 905 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |
899 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) | 906 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) |
900 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) | 907 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) |
901 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) | 908 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) |
902 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointRadialGradient) | 909 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointRadialGradient) |
903 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) | 910 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) |
904 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 911 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
905 | 912 |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 (*stops)[i] = stop; | 1211 (*stops)[i] = stop; |
1205 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; | 1212 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; |
1206 } | 1213 } |
1207 } | 1214 } |
1208 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); | 1215 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); |
1209 | 1216 |
1210 return outColors; | 1217 return outColors; |
1211 } | 1218 } |
1212 | 1219 |
1213 #endif | 1220 #endif |
OLD | NEW |