Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: src/effects/gradients/SkGradientShader.cpp

Issue 2370063002: Gradients are serialized (and can be constructed) as SkColor4f + SkColorSpace (Closed)
Patch Set: Bump SKP version Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "SkHalf.h" 10 #include "SkHalf.h"
11 #include "SkLinearGradient.h" 11 #include "SkLinearGradient.h"
12 #include "SkRadialGradient.h" 12 #include "SkRadialGradient.h"
13 #include "SkTwoPointConicalGradient.h" 13 #include "SkTwoPointConicalGradient.h"
14 #include "SkSweepGradient.h" 14 #include "SkSweepGradient.h"
15 15
16 enum GradientSerializationFlags {
f(malita) 2016/09/28 15:41:52 nit: enum class + drop _GSF suffix?
Brian Osman 2016/09/28 15:46:17 Seems like that would make all of my usage harder
f(malita) 2016/09/28 15:54:46 Ack, good point.
17 kHasPosition_GSF = 0x80000000,
18 kHasLocalMatrix_GSF = 0x40000000,
19 kHasColorSpace_GSF = 0x20000000,
20
21 kTileModeShift_GSF = 16,
22 kTileModeMask_GSF = 0xF,
23
24 kGradFlagsShift_GSF = 0,
25 kGradFlagsMask_GSF = 0xF,
26 };
27
16 void SkGradientShaderBase::Descriptor::flatten(SkWriteBuffer& buffer) const { 28 void SkGradientShaderBase::Descriptor::flatten(SkWriteBuffer& buffer) const {
17 buffer.writeColorArray(fColors, fCount); 29 uint32_t flags = 0;
18 // TODO: Flatten fColors4f and fColorSpace
19 if (fPos) { 30 if (fPos) {
20 buffer.writeBool(true); 31 flags |= kHasPosition_GSF;
32 }
33 if (fLocalMatrix) {
34 flags |= kHasLocalMatrix_GSF;
35 }
36 sk_sp<SkData> colorSpaceData = fColorSpace ? fColorSpace->serialize() : null ptr;
37 if (colorSpaceData) {
38 flags |= kHasColorSpace_GSF;
39 }
40 SkASSERT(fTileMode <= kTileModeMask_GSF);
41 flags |= (fTileMode << kTileModeShift_GSF);
42 SkASSERT(fGradFlags <= kGradFlagsMask_GSF);
43 flags |= (fGradFlags << kGradFlagsShift_GSF);
44
45 buffer.writeUInt(flags);
46
47 buffer.writeColor4fArray(fColors, fCount);
48 if (colorSpaceData) {
49 buffer.writeDataAsByteArray(colorSpaceData.get());
50 }
51 if (fPos) {
21 buffer.writeScalarArray(fPos, fCount); 52 buffer.writeScalarArray(fPos, fCount);
22 } else {
23 buffer.writeBool(false);
24 } 53 }
25 buffer.write32(fTileMode);
26 buffer.write32(fGradFlags);
27 if (fLocalMatrix) { 54 if (fLocalMatrix) {
28 buffer.writeBool(true);
29 buffer.writeMatrix(*fLocalMatrix); 55 buffer.writeMatrix(*fLocalMatrix);
30 } else {
31 buffer.writeBool(false);
32 } 56 }
33 } 57 }
34 58
35 bool SkGradientShaderBase::DescriptorScope::unflatten(SkReadBuffer& buffer) { 59 bool SkGradientShaderBase::DescriptorScope::unflatten(SkReadBuffer& buffer) {
36 // TODO: Unflatten fColors4f and fColorSpace 60 if (buffer.isVersionLT(SkReadBuffer::kGradientShaderFloatColor_Version)) {
37 fCount = buffer.getArrayCount(); 61 fCount = buffer.getArrayCount();
38 if (fCount > kStorageCount) { 62 if (fCount > kStorageCount) {
39 size_t allocSize = (sizeof(SkColor) + sizeof(SkScalar)) * fCount; 63 size_t allocSize = (sizeof(SkColor4f) + sizeof(SkScalar)) * fCount;
40 fDynamicStorage.reset(allocSize); 64 fDynamicStorage.reset(allocSize);
41 fColors = (SkColor*)fDynamicStorage.get(); 65 fColors = (SkColor4f*)fDynamicStorage.get();
42 fPos = (SkScalar*)(fColors + fCount); 66 fPos = (SkScalar*)(fColors + fCount);
43 } else { 67 } else {
44 fColors = fColorStorage; 68 fColors = fColorStorage;
45 fPos = fPosStorage; 69 fPos = fPosStorage;
46 } 70 }
47 71
48 if (!buffer.readColorArray(const_cast<SkColor*>(fColors), fCount)) { 72 // Old gradients serialized SkColor. Read that to a temporary location, then convert.
49 return false; 73 SkSTArray<2, SkColor, true> colors;
50 } 74 colors.resize_back(fCount);
51 if (buffer.readBool()) { 75 if (!buffer.readColorArray(colors.begin(), fCount)) {
52 if (!buffer.readScalarArray(const_cast<SkScalar*>(fPos), fCount)) {
53 return false; 76 return false;
54 } 77 }
78 for (int i = 0; i < fCount; ++i) {
79 mutableColors()[i] = SkColor4f::FromColor(colors[i]);
80 }
81
82 if (buffer.readBool()) {
83 if (!buffer.readScalarArray(const_cast<SkScalar*>(fPos), fCount)) {
84 return false;
85 }
86 } else {
87 fPos = nullptr;
88 }
89
90 fColorSpace = nullptr;
91 fTileMode = (SkShader::TileMode)buffer.read32();
92 fGradFlags = buffer.read32();
93
94 if (buffer.readBool()) {
95 fLocalMatrix = &fLocalMatrixStorage;
96 buffer.readMatrix(&fLocalMatrixStorage);
97 } else {
98 fLocalMatrix = nullptr;
99 }
55 } else { 100 } else {
56 fPos = nullptr; 101 // New gradient format. Includes floating point color, color space, dens ely packed flags
57 } 102 uint32_t flags = buffer.readUInt();
58 103
59 fTileMode = (SkShader::TileMode)buffer.read32(); 104 fTileMode = (SkShader::TileMode)((flags >> kTileModeShift_GSF) & kTileMo deMask_GSF);
60 fGradFlags = buffer.read32(); 105 fGradFlags = (flags >> kGradFlagsShift_GSF) & kGradFlagsMask_GSF;
61 106
62 if (buffer.readBool()) { 107 fCount = buffer.getArrayCount();
63 fLocalMatrix = &fLocalMatrixStorage; 108 if (fCount > kStorageCount) {
64 buffer.readMatrix(&fLocalMatrixStorage); 109 size_t allocSize = (sizeof(SkColor4f) + sizeof(SkScalar)) * fCount;
65 } else { 110 fDynamicStorage.reset(allocSize);
66 fLocalMatrix = nullptr; 111 fColors = (SkColor4f*)fDynamicStorage.get();
112 fPos = (SkScalar*)(fColors + fCount);
113 } else {
114 fColors = fColorStorage;
115 fPos = fPosStorage;
116 }
117 if (!buffer.readColor4fArray(mutableColors(), fCount)) {
118 return false;
119 }
120 if (SkToBool(flags & kHasColorSpace_GSF)) {
121 sk_sp<SkData> data = buffer.readByteArrayAsData();
122 fColorSpace = SkColorSpace::Deserialize(data->data(), data->size());
123 } else {
124 fColorSpace = nullptr;
125 }
126 if (SkToBool(flags & kHasPosition_GSF)) {
127 if (!buffer.readScalarArray(mutablePos(), fCount)) {
128 return false;
129 }
130 } else {
131 fPos = nullptr;
132 }
133 if (SkToBool(flags & kHasLocalMatrix_GSF)) {
134 fLocalMatrix = &fLocalMatrixStorage;
135 buffer.readMatrix(&fLocalMatrixStorage);
136 } else {
137 fLocalMatrix = nullptr;
138 }
67 } 139 }
68 return buffer.isValid(); 140 return buffer.isValid();
69 } 141 }
70 142
71 //////////////////////////////////////////////////////////////////////////////// //////////// 143 //////////////////////////////////////////////////////////////////////////////// ////////////
72 144
73 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri x& ptsToUnit) 145 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri x& ptsToUnit)
74 : INHERITED(desc.fLocalMatrix) 146 : INHERITED(desc.fLocalMatrix)
75 , fPtsToUnit(ptsToUnit) 147 , fPtsToUnit(ptsToUnit)
76 { 148 {
(...skipping 26 matching lines...) Expand all
103 dummyFirst = desc.fPos[0] != 0; 175 dummyFirst = desc.fPos[0] != 0;
104 dummyLast = desc.fPos[desc.fCount - 1] != SK_Scalar1; 176 dummyLast = desc.fPos[desc.fCount - 1] != SK_Scalar1;
105 fColorCount += dummyFirst + dummyLast; 177 fColorCount += dummyFirst + dummyLast;
106 } 178 }
107 179
108 if (fColorCount > kColorStorageCount) { 180 if (fColorCount > kColorStorageCount) {
109 size_t size = sizeof(SkColor) + sizeof(SkColor4f) + sizeof(Rec); 181 size_t size = sizeof(SkColor) + sizeof(SkColor4f) + sizeof(Rec);
110 if (desc.fPos) { 182 if (desc.fPos) {
111 size += sizeof(SkScalar); 183 size += sizeof(SkScalar);
112 } 184 }
113 fOrigColors = reinterpret_cast<SkColor*>( 185 fOrigColors = reinterpret_cast<SkColor*>(sk_malloc_throw(size * fColorCo unt));
114 sk_malloc_throw(size * fColorCount));
115 } 186 }
116 else { 187 else {
117 fOrigColors = fStorage; 188 fOrigColors = fStorage;
118 } 189 }
119 190
120 fOrigColors4f = (SkColor4f*)(fOrigColors + fColorCount); 191 fOrigColors4f = (SkColor4f*)(fOrigColors + fColorCount);
121 192
122 // We should have been supplied with either fColors *or* (fColors4f and fCol orSpace) 193 // Now copy over the colors, adding the dummies as needed
123 if (desc.fColors) { 194 SkColor4f* origColors = fOrigColors4f;
124 // TODO: Should we support alternate gamma-encoded colorspaces with SkCo lor inputs? 195 if (dummyFirst) {
125 SkASSERT(!desc.fColors4f && !desc.fColorSpace); 196 *origColors++ = desc.fColors[0];
197 }
198 memcpy(origColors, desc.fColors, desc.fCount * sizeof(SkColor4f));
199 if (dummyLast) {
200 origColors += desc.fCount;
201 *origColors = desc.fColors[desc.fCount - 1];
202 }
126 203
127 // Now copy over the colors, adding the dummies as needed 204 // Convert our SkColor4f colors to SkColor as well. Note that this is incorr ect if the
128 SkColor* origColors = fOrigColors; 205 // source colors are not in sRGB gamut. We would need to do a gamut transfor mation, but
129 if (dummyFirst) { 206 // SkColorSpaceXform can't do that (yet). GrColorSpaceXform can, but we may not have GPU
130 *origColors++ = desc.fColors[0]; 207 // support compiled in here. For the common case (sRGB colors), this does th e right thing.
131 } 208 for (int i = 0; i < fColorCount; ++i) {
132 memcpy(origColors, desc.fColors, desc.fCount * sizeof(SkColor)); 209 fOrigColors[i] = fOrigColors4f[i].toSkColor();
133 if (dummyLast) { 210 }
134 origColors += desc.fCount;
135 *origColors = desc.fColors[desc.fCount - 1];
136 }
137 211
138 // Convert our SkColor colors to SkColor4f as well 212 if (!desc.fColorSpace) {
139 for (int i = 0; i < fColorCount; ++i) { 213 // This happens if we were constructed from SkColors, so our colors are really sRGB
140 fOrigColors4f[i] = SkColor4f::FromColor(fOrigColors[i]);
141 }
142
143 // Color space refers to fColors4f, so it's always linear gamma
144 fColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGBLinear_Named); 214 fColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGBLinear_Named);
145 } else { 215 } else {
146 SkASSERT(desc.fColors4f && desc.fColorSpace && desc.fColorSpace->gammaIs Linear()); 216 // The color space refers to the float colors, so it must be linear gamm a
147 217 SkASSERT(desc.fColorSpace->gammaIsLinear());
148 // Now copy over the colors, adding the dummies as needed
149 SkColor4f* origColors = fOrigColors4f;
150 if (dummyFirst) {
151 *origColors++ = desc.fColors4f[0];
152 }
153 memcpy(origColors, desc.fColors4f, desc.fCount * sizeof(SkColor4f));
154 if (dummyLast) {
155 origColors += desc.fCount;
156 *origColors = desc.fColors4f[desc.fCount - 1];
157 }
158
159 // Convert our SkColor4f colors to SkColor as well. Note that this is in correct if the
160 // source colors are not in sRGB gamut. We would need to do a gamut tran sformation, but
161 // SkColorSpaceXform can't do that (yet). GrColorSpaceXform can, but we may not have GPU
162 // support compiled in here.
163 for (int i = 0; i < fColorCount; ++i) {
164 fOrigColors[i] = fOrigColors4f[i].toSkColor();
165 }
166 fColorSpace = desc.fColorSpace; 218 fColorSpace = desc.fColorSpace;
167 } 219 }
168 220
169 if (desc.fPos && fColorCount) { 221 if (desc.fPos && fColorCount) {
170 fOrigPos = (SkScalar*)(fOrigColors4f + fColorCount); 222 fOrigPos = (SkScalar*)(fOrigColors4f + fColorCount);
171 fRecs = (Rec*)(fOrigPos + fColorCount); 223 fRecs = (Rec*)(fOrigPos + fColorCount);
172 } else { 224 } else {
173 fOrigPos = nullptr; 225 fOrigPos = nullptr;
174 fRecs = (Rec*)(fOrigColors4f + fColorCount); 226 fRecs = (Rec*)(fOrigColors4f + fColorCount);
175 } 227 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 void SkGradientShaderBase::initCommon() { 301 void SkGradientShaderBase::initCommon() {
250 unsigned colorAlpha = 0xFF; 302 unsigned colorAlpha = 0xFF;
251 for (int i = 0; i < fColorCount; i++) { 303 for (int i = 0; i < fColorCount; i++) {
252 colorAlpha &= SkColorGetA(fOrigColors[i]); 304 colorAlpha &= SkColorGetA(fOrigColors[i]);
253 } 305 }
254 fColorsAreOpaque = colorAlpha == 0xFF; 306 fColorsAreOpaque = colorAlpha == 0xFF;
255 } 307 }
256 308
257 void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { 309 void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const {
258 Descriptor desc; 310 Descriptor desc;
259 desc.fColors = fOrigColors; 311 desc.fColors = fOrigColors4f;
260 desc.fColors4f = fOrigColors4f;
261 desc.fColorSpace = fColorSpace; 312 desc.fColorSpace = fColorSpace;
262 desc.fPos = fOrigPos; 313 desc.fPos = fOrigPos;
263 desc.fCount = fColorCount; 314 desc.fCount = fColorCount;
264 desc.fTileMode = fTileMode; 315 desc.fTileMode = fTileMode;
265 desc.fGradFlags = fGradFlags; 316 desc.fGradFlags = fGradFlags;
266 317
267 const SkMatrix& m = this->getLocalMatrix(); 318 const SkMatrix& m = this->getLocalMatrix();
268 desc.fLocalMatrix = m.isIdentity() ? nullptr : &m; 319 desc.fLocalMatrix = m.isIdentity() ? nullptr : &m;
269 desc.flatten(buffer); 320 desc.flatten(buffer);
270 } 321 }
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 816
766 this->INHERITED::toString(str); 817 this->INHERITED::toString(str);
767 } 818 }
768 #endif 819 #endif
769 820
770 /////////////////////////////////////////////////////////////////////////////// 821 ///////////////////////////////////////////////////////////////////////////////
771 /////////////////////////////////////////////////////////////////////////////// 822 ///////////////////////////////////////////////////////////////////////////////
772 823
773 // Return true if these parameters are valid/legal/safe to construct a gradient 824 // Return true if these parameters are valid/legal/safe to construct a gradient
774 // 825 //
775 static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { 826 static bool valid_grad(const SkColor4f colors[], const SkScalar pos[], int count ,
827 unsigned tileMode) {
776 return nullptr != colors && count >= 1 && tileMode < (unsigned)SkShader::kTi leModeCount; 828 return nullptr != colors && count >= 1 && tileMode < (unsigned)SkShader::kTi leModeCount;
777 } 829 }
778 830
779 static void desc_init(SkGradientShaderBase::Descriptor* desc, 831 static void desc_init(SkGradientShaderBase::Descriptor* desc,
780 const SkColor colors[], const SkScalar pos[], int colorCou nt, 832 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
833 const SkScalar pos[], int colorCount,
781 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) { 834 SkShader::TileMode mode, uint32_t flags, const SkMatrix* l ocalMatrix) {
782 SkASSERT(colorCount > 1); 835 SkASSERT(colorCount > 1);
783 836
784 desc->fColors = colors; 837 desc->fColors = colors;
785 desc->fColors4f = nullptr; 838 desc->fColorSpace = std::move(colorSpace);
786 desc->fColorSpace = nullptr; // SkColor is always sRGB
787 desc->fPos = pos; 839 desc->fPos = pos;
788 desc->fCount = colorCount; 840 desc->fCount = colorCount;
789 desc->fTileMode = mode; 841 desc->fTileMode = mode;
790 desc->fGradFlags = flags; 842 desc->fGradFlags = flags;
791 desc->fLocalMatrix = localMatrix; 843 desc->fLocalMatrix = localMatrix;
792 } 844 }
793 845
794 // assumes colors is SkColor* and pos is SkScalar* 846 // assumes colors is SkColor4f* and pos is SkScalar*
795 #define EXPAND_1_COLOR(count) \ 847 #define EXPAND_1_COLOR(count) \
796 SkColor tmp[2]; \ 848 SkColor4f tmp[2]; \
797 do { \ 849 do { \
798 if (1 == count) { \ 850 if (1 == count) { \
799 tmp[0] = tmp[1] = colors[0]; \ 851 tmp[0] = tmp[1] = colors[0]; \
800 colors = tmp; \ 852 colors = tmp; \
801 pos = nullptr; \ 853 pos = nullptr; \
802 count = 2; \ 854 count = 2; \
803 } \ 855 } \
804 } while (0) 856 } while (0)
805 857
806 struct ColorStopOptimizer { 858 struct ColorStopOptimizer {
807 ColorStopOptimizer(const SkColor* colors, const SkScalar* pos, 859 ColorStopOptimizer(const SkColor4f* colors, const SkScalar* pos,
808 int count, SkShader::TileMode mode) 860 int count, SkShader::TileMode mode)
809 : fColors(colors) 861 : fColors(colors)
810 , fPos(pos) 862 , fPos(pos)
811 , fCount(count) { 863 , fCount(count) {
812 864
813 if (!pos || count != 3) { 865 if (!pos || count != 3) {
814 return; 866 return;
815 } 867 }
816 868
817 if (SkScalarNearlyEqual(pos[0], 0.0f) && 869 if (SkScalarNearlyEqual(pos[0], 0.0f) &&
(...skipping 16 matching lines...) Expand all
834 if (SkShader::kRepeat_TileMode == mode || 886 if (SkShader::kRepeat_TileMode == mode ||
835 SkShader::kMirror_TileMode == mode || 887 SkShader::kMirror_TileMode == mode ||
836 colors[1] == colors[2]) { 888 colors[1] == colors[2]) {
837 889
838 // Ignore the rightmost color/pos. 890 // Ignore the rightmost color/pos.
839 fCount = 2; 891 fCount = 2;
840 } 892 }
841 } 893 }
842 } 894 }
843 895
844 const SkColor* fColors; 896 const SkColor4f* fColors;
845 const SkScalar* fPos; 897 const SkScalar* fPos;
846 int fCount; 898 int fCount;
899 };
900
901 struct ColorConverter {
902 ColorConverter(const SkColor* colors, int count) {
903 for (int i = 0; i < count; ++i) {
904 fColors4f.push_back(SkColor4f::FromColor(colors[i]));
905 }
906 }
907
908 SkSTArray<2, SkColor4f, true> fColors4f;
847 }; 909 };
848 910
849 sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], 911 sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2],
850 const SkColor colors[], 912 const SkColor colors[],
851 const SkScalar pos[], int colorCoun t, 913 const SkScalar pos[], int colorCoun t,
852 SkShader::TileMode mode, 914 SkShader::TileMode mode,
853 uint32_t flags, 915 uint32_t flags,
854 const SkMatrix* localMatrix) { 916 const SkMatrix* localMatrix) {
917 ColorConverter converter(colors, colorCount);
918 return MakeLinear(pts, converter.fColors4f.begin(), nullptr, pos, colorCount , mode, flags,
919 localMatrix);
920 }
921
922 sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2],
923 const SkColor4f colors[],
924 sk_sp<SkColorSpace> colorSpace,
925 const SkScalar pos[], int colorCoun t,
926 SkShader::TileMode mode,
927 uint32_t flags,
928 const SkMatrix* localMatrix) {
855 if (!pts || !SkScalarIsFinite((pts[1] - pts[0]).length())) { 929 if (!pts || !SkScalarIsFinite((pts[1] - pts[0]).length())) {
856 return nullptr; 930 return nullptr;
857 } 931 }
858 if (!valid_grad(colors, pos, colorCount, mode)) { 932 if (!valid_grad(colors, pos, colorCount, mode)) {
859 return nullptr; 933 return nullptr;
860 } 934 }
861 if (1 == colorCount) { 935 if (1 == colorCount) {
862 return SkShader::MakeColorShader(colors[0]); 936 return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
863 } 937 }
864 938
865 ColorStopOptimizer opt(colors, pos, colorCount, mode); 939 ColorStopOptimizer opt(colors, pos, colorCount, mode);
866 940
867 SkGradientShaderBase::Descriptor desc; 941 SkGradientShaderBase::Descriptor desc;
868 desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix ); 942 desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, m ode, flags,
943 localMatrix);
869 return sk_make_sp<SkLinearGradient>(pts, desc); 944 return sk_make_sp<SkLinearGradient>(pts, desc);
870 } 945 }
871 946
872 sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad ius, 947 sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad ius,
873 const SkColor colors[], 948 const SkColor colors[],
874 const SkScalar pos[], int colorCount, 949 const SkScalar pos[], int colorCoun t,
875 SkShader::TileMode mode, 950 SkShader::TileMode mode,
876 uint32_t flags, 951 uint32_t flags,
877 const SkMatrix* localMatrix) { 952 const SkMatrix* localMatrix) {
953 ColorConverter converter(colors, colorCount);
954 return MakeRadial(center, radius, converter.fColors4f.begin(), nullptr, pos, colorCount, mode,
955 flags, localMatrix);
956 }
957
958 sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad ius,
959 const SkColor4f colors[],
960 sk_sp<SkColorSpace> colorSpace,
961 const SkScalar pos[], int colorCoun t,
962 SkShader::TileMode mode,
963 uint32_t flags,
964 const SkMatrix* localMatrix) {
878 if (radius <= 0) { 965 if (radius <= 0) {
879 return nullptr; 966 return nullptr;
880 } 967 }
881 if (!valid_grad(colors, pos, colorCount, mode)) { 968 if (!valid_grad(colors, pos, colorCount, mode)) {
882 return nullptr; 969 return nullptr;
883 } 970 }
884 if (1 == colorCount) { 971 if (1 == colorCount) {
885 return SkShader::MakeColorShader(colors[0]); 972 return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
886 } 973 }
887 974
888 ColorStopOptimizer opt(colors, pos, colorCount, mode); 975 ColorStopOptimizer opt(colors, pos, colorCount, mode);
889 976
890 SkGradientShaderBase::Descriptor desc; 977 SkGradientShaderBase::Descriptor desc;
891 desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix ); 978 desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, m ode, flags,
979 localMatrix);
892 return sk_make_sp<SkRadialGradient>(center, radius, desc); 980 return sk_make_sp<SkRadialGradient>(center, radius, desc);
893 } 981 }
894 982
895 sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, 983 sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start,
896 SkScalar startRadius, 984 SkScalar startRadius,
897 const SkPoint& end, 985 const SkPoint& end,
898 SkScalar endRadius, 986 SkScalar endRadius,
899 const SkColor colors[], 987 const SkColor colors[],
900 const SkScalar pos[], 988 const SkScalar pos[],
901 int colorCount, 989 int colorCount,
902 SkShader::TileMode mode, 990 SkShader::TileMode mode,
903 uint32_t flags, 991 uint32_t flags,
904 const SkMatrix* localMatrix) { 992 const SkMatrix* localMatri x) {
993 ColorConverter converter(colors, colorCount);
994 return MakeTwoPointConical(start, startRadius, end, endRadius, converter.fCo lors4f.begin(),
995 nullptr, pos, colorCount, mode, flags, localMatri x);
996 }
997
998 sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start,
999 SkScalar startRadius,
1000 const SkPoint& end,
1001 SkScalar endRadius,
1002 const SkColor4f colors[],
1003 sk_sp<SkColorSpace> colorS pace,
1004 const SkScalar pos[],
1005 int colorCount,
1006 SkShader::TileMode mode,
1007 uint32_t flags,
1008 const SkMatrix* localMatri x) {
905 if (startRadius < 0 || endRadius < 0) { 1009 if (startRadius < 0 || endRadius < 0) {
906 return nullptr; 1010 return nullptr;
907 } 1011 }
908 if (!valid_grad(colors, pos, colorCount, mode)) { 1012 if (!valid_grad(colors, pos, colorCount, mode)) {
909 return nullptr; 1013 return nullptr;
910 } 1014 }
911 if (startRadius == endRadius) { 1015 if (startRadius == endRadius) {
912 if (start == end || startRadius == 0) { 1016 if (start == end || startRadius == 0) {
913 return SkShader::MakeEmptyShader(); 1017 return SkShader::MakeEmptyShader();
914 } 1018 }
915 } 1019 }
916 EXPAND_1_COLOR(colorCount); 1020 EXPAND_1_COLOR(colorCount);
917 1021
918 ColorStopOptimizer opt(colors, pos, colorCount, mode); 1022 ColorStopOptimizer opt(colors, pos, colorCount, mode);
919 1023
920 bool flipGradient = startRadius > endRadius; 1024 bool flipGradient = startRadius > endRadius;
921 1025
922 SkGradientShaderBase::Descriptor desc; 1026 SkGradientShaderBase::Descriptor desc;
923 1027
924 if (!flipGradient) { 1028 if (!flipGradient) {
925 desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMa trix); 1029 desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCoun t, mode, flags,
1030 localMatrix);
926 return sk_make_sp<SkTwoPointConicalGradient>(start, startRadius, end, en dRadius, 1031 return sk_make_sp<SkTwoPointConicalGradient>(start, startRadius, end, en dRadius,
927 flipGradient, desc); 1032 flipGradient, desc);
928 } else { 1033 } else {
929 SkAutoSTArray<8, SkColor> colorsNew(opt.fCount); 1034 SkAutoSTArray<8, SkColor4f> colorsNew(opt.fCount);
930 SkAutoSTArray<8, SkScalar> posNew(opt.fCount); 1035 SkAutoSTArray<8, SkScalar> posNew(opt.fCount);
931 for (int i = 0; i < opt.fCount; ++i) { 1036 for (int i = 0; i < opt.fCount; ++i) {
932 colorsNew[i] = opt.fColors[opt.fCount - i - 1]; 1037 colorsNew[i] = opt.fColors[opt.fCount - i - 1];
933 } 1038 }
934 1039
935 if (pos) { 1040 if (pos) {
936 for (int i = 0; i < opt.fCount; ++i) { 1041 for (int i = 0; i < opt.fCount; ++i) {
937 posNew[i] = 1 - opt.fPos[opt.fCount - i - 1]; 1042 posNew[i] = 1 - opt.fPos[opt.fCount - i - 1];
938 } 1043 }
939 desc_init(&desc, colorsNew.get(), posNew.get(), opt.fCount, mode, fl ags, localMatrix); 1044 desc_init(&desc, colorsNew.get(), std::move(colorSpace), posNew.get( ), opt.fCount, mode,
1045 flags, localMatrix);
940 } else { 1046 } else {
941 desc_init(&desc, colorsNew.get(), nullptr, opt.fCount, mode, flags, localMatrix); 1047 desc_init(&desc, colorsNew.get(), std::move(colorSpace), nullptr, op t.fCount, mode,
1048 flags, localMatrix);
942 } 1049 }
943 1050
944 return sk_make_sp<SkTwoPointConicalGradient>(end, endRadius, start, star tRadius, 1051 return sk_make_sp<SkTwoPointConicalGradient>(end, endRadius, start, star tRadius,
945 flipGradient, desc); 1052 flipGradient, desc);
946 } 1053 }
947 } 1054 }
948 1055
949 sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, 1056 sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy,
950 const SkColor colors[], 1057 const SkColor colors[],
951 const SkScalar pos[], 1058 const SkScalar pos[],
952 int colorCount, 1059 int colorCount,
953 uint32_t flags, 1060 uint32_t flags,
954 const SkMatrix* localMatrix) { 1061 const SkMatrix* localMatrix) {
1062 ColorConverter converter(colors, colorCount);
1063 return MakeSweep(cx, cy, converter.fColors4f.begin(), nullptr, pos, colorCou nt, flags,
1064 localMatrix);
1065 }
1066
1067 sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy,
1068 const SkColor4f colors[],
1069 sk_sp<SkColorSpace> colorSpace,
1070 const SkScalar pos[],
1071 int colorCount,
1072 uint32_t flags,
1073 const SkMatrix* localMatrix) {
955 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { 1074 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) {
956 return nullptr; 1075 return nullptr;
957 } 1076 }
958 if (1 == colorCount) { 1077 if (1 == colorCount) {
959 return SkShader::MakeColorShader(colors[0]); 1078 return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
960 } 1079 }
961 1080
962 auto mode = SkShader::kClamp_TileMode; 1081 auto mode = SkShader::kClamp_TileMode;
963 1082
964 ColorStopOptimizer opt(colors, pos, colorCount, mode); 1083 ColorStopOptimizer opt(colors, pos, colorCount, mode);
965 1084
966 SkGradientShaderBase::Descriptor desc; 1085 SkGradientShaderBase::Descriptor desc;
967 desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix ); 1086 desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, m ode, flags,
1087 localMatrix);
968 return sk_make_sp<SkSweepGradient>(cx, cy, desc); 1088 return sk_make_sp<SkSweepGradient>(cx, cy, desc);
969 } 1089 }
970 1090
971 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) 1091 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader)
972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) 1092 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient)
973 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) 1093 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient)
974 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) 1094 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient)
975 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) 1095 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient)
976 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1096 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
977 1097
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
1613 (*stops)[i] = stop; 1733 (*stops)[i] = stop;
1614 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; 1734 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f;
1615 } 1735 }
1616 } 1736 }
1617 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); 1737 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount));
1618 1738
1619 return outColors; 1739 return outColors;
1620 } 1740 }
1621 1741
1622 #endif 1742 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698