diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkReadBuffer.h | 1 | ||||
-rw-r--r-- | src/effects/gradients/SkGradientShader.cpp | 361 | ||||
-rw-r--r-- | src/effects/gradients/SkGradientShaderPriv.h | 7 | ||||
-rw-r--r-- | src/effects/gradients/SkLinearGradient.cpp | 5 | ||||
-rw-r--r-- | src/effects/gradients/SkRadialGradient.cpp | 5 | ||||
-rw-r--r-- | src/effects/gradients/SkSweepGradient.cpp | 5 | ||||
-rw-r--r-- | src/effects/gradients/SkTwoPointConicalGradient.cpp | 5 |
7 files changed, 259 insertions, 130 deletions
diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h index d29fef842f..3e6742fde0 100644 --- a/src/core/SkReadBuffer.h +++ b/src/core/SkReadBuffer.h @@ -68,6 +68,7 @@ public: kAnnotationsMovedToCanvas_Version = 44, kLightingShaderWritesInvNormRotation = 45, kBlurMaskFilterWritesOccluder = 47, + kGradientShaderFloatColor_Version = 49, }; /** diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp index 0faf006d73..df230394ad 100644 --- a/src/effects/gradients/SkGradientShader.cpp +++ b/src/effects/gradients/SkGradientShader.cpp @@ -13,57 +13,134 @@ #include "SkTwoPointConicalGradient.h" #include "SkSweepGradient.h" +enum GradientSerializationFlags { + // Bits 29:31 used for various boolean flags + kHasPosition_GSF = 0x80000000, + kHasLocalMatrix_GSF = 0x40000000, + kHasColorSpace_GSF = 0x20000000, + + // Bits 12:28 unused + + // Bits 8:11 for fTileMode + kTileModeShift_GSF = 8, + kTileModeMask_GSF = 0xF, + + // Bits 0:7 for fGradFlags (note that kForce4fContext_PrivateFlag is 0x80) + kGradFlagsShift_GSF = 0, + kGradFlagsMask_GSF = 0xFF, +}; + void SkGradientShaderBase::Descriptor::flatten(SkWriteBuffer& buffer) const { - buffer.writeColorArray(fColors, fCount); - // TODO: Flatten fColors4f and fColorSpace + uint32_t flags = 0; + if (fPos) { + flags |= kHasPosition_GSF; + } + if (fLocalMatrix) { + flags |= kHasLocalMatrix_GSF; + } + sk_sp<SkData> colorSpaceData = fColorSpace ? fColorSpace->serialize() : nullptr; + if (colorSpaceData) { + flags |= kHasColorSpace_GSF; + } + SkASSERT(static_cast<uint32_t>(fTileMode) <= kTileModeMask_GSF); + flags |= (fTileMode << kTileModeShift_GSF); + SkASSERT(fGradFlags <= kGradFlagsMask_GSF); + flags |= (fGradFlags << kGradFlagsShift_GSF); + + buffer.writeUInt(flags); + + buffer.writeColor4fArray(fColors, fCount); + if (colorSpaceData) { + buffer.writeDataAsByteArray(colorSpaceData.get()); + } if (fPos) { - buffer.writeBool(true); buffer.writeScalarArray(fPos, fCount); - } else { - buffer.writeBool(false); } - buffer.write32(fTileMode); - buffer.write32(fGradFlags); if (fLocalMatrix) { - buffer.writeBool(true); buffer.writeMatrix(*fLocalMatrix); - } else { - buffer.writeBool(false); } } bool SkGradientShaderBase::DescriptorScope::unflatten(SkReadBuffer& buffer) { - // TODO: Unflatten fColors4f and fColorSpace - fCount = buffer.getArrayCount(); - if (fCount > kStorageCount) { - size_t allocSize = (sizeof(SkColor) + sizeof(SkScalar)) * fCount; - fDynamicStorage.reset(allocSize); - fColors = (SkColor*)fDynamicStorage.get(); - fPos = (SkScalar*)(fColors + fCount); - } else { - fColors = fColorStorage; - fPos = fPosStorage; - } + if (buffer.isVersionLT(SkReadBuffer::kGradientShaderFloatColor_Version)) { + fCount = buffer.getArrayCount(); + if (fCount > kStorageCount) { + size_t allocSize = (sizeof(SkColor4f) + sizeof(SkScalar)) * fCount; + fDynamicStorage.reset(allocSize); + fColors = (SkColor4f*)fDynamicStorage.get(); + fPos = (SkScalar*)(fColors + fCount); + } else { + fColors = fColorStorage; + fPos = fPosStorage; + } - if (!buffer.readColorArray(const_cast<SkColor*>(fColors), fCount)) { - return false; - } - if (buffer.readBool()) { - if (!buffer.readScalarArray(const_cast<SkScalar*>(fPos), fCount)) { + // Old gradients serialized SkColor. Read that to a temporary location, then convert. + SkSTArray<2, SkColor, true> colors; + colors.resize_back(fCount); + if (!buffer.readColorArray(colors.begin(), fCount)) { return false; } - } else { - fPos = nullptr; - } + for (int i = 0; i < fCount; ++i) { + mutableColors()[i] = SkColor4f::FromColor(colors[i]); + } + + if (buffer.readBool()) { + if (!buffer.readScalarArray(const_cast<SkScalar*>(fPos), fCount)) { + return false; + } + } else { + fPos = nullptr; + } - fTileMode = (SkShader::TileMode)buffer.read32(); - fGradFlags = buffer.read32(); + fColorSpace = nullptr; + fTileMode = (SkShader::TileMode)buffer.read32(); + fGradFlags = buffer.read32(); - if (buffer.readBool()) { - fLocalMatrix = &fLocalMatrixStorage; - buffer.readMatrix(&fLocalMatrixStorage); + if (buffer.readBool()) { + fLocalMatrix = &fLocalMatrixStorage; + buffer.readMatrix(&fLocalMatrixStorage); + } else { + fLocalMatrix = nullptr; + } } else { - fLocalMatrix = nullptr; + // New gradient format. Includes floating point color, color space, densely packed flags + uint32_t flags = buffer.readUInt(); + + fTileMode = (SkShader::TileMode)((flags >> kTileModeShift_GSF) & kTileModeMask_GSF); + fGradFlags = (flags >> kGradFlagsShift_GSF) & kGradFlagsMask_GSF; + + fCount = buffer.getArrayCount(); + if (fCount > kStorageCount) { + size_t allocSize = (sizeof(SkColor4f) + sizeof(SkScalar)) * fCount; + fDynamicStorage.reset(allocSize); + fColors = (SkColor4f*)fDynamicStorage.get(); + fPos = (SkScalar*)(fColors + fCount); + } else { + fColors = fColorStorage; + fPos = fPosStorage; + } + if (!buffer.readColor4fArray(mutableColors(), fCount)) { + return false; + } + if (SkToBool(flags & kHasColorSpace_GSF)) { + sk_sp<SkData> data = buffer.readByteArrayAsData(); + fColorSpace = SkColorSpace::Deserialize(data->data(), data->size()); + } else { + fColorSpace = nullptr; + } + if (SkToBool(flags & kHasPosition_GSF)) { + if (!buffer.readScalarArray(mutablePos(), fCount)) { + return false; + } + } else { + fPos = nullptr; + } + if (SkToBool(flags & kHasLocalMatrix_GSF)) { + fLocalMatrix = &fLocalMatrixStorage; + buffer.readMatrix(&fLocalMatrixStorage); + } else { + fLocalMatrix = nullptr; + } } return buffer.isValid(); } @@ -110,8 +187,7 @@ SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri if (desc.fPos) { size += sizeof(SkScalar); } - fOrigColors = reinterpret_cast<SkColor*>( - sk_malloc_throw(size * fColorCount)); + fOrigColors = reinterpret_cast<SkColor*>(sk_malloc_throw(size * fColorCount)); } else { fOrigColors = fStorage; @@ -119,50 +195,31 @@ SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri fOrigColors4f = (SkColor4f*)(fOrigColors + fColorCount); - // We should have been supplied with either fColors *or* (fColors4f and fColorSpace) - if (desc.fColors) { - // TODO: Should we support alternate gamma-encoded colorspaces with SkColor inputs? - SkASSERT(!desc.fColors4f && !desc.fColorSpace); - - // Now copy over the colors, adding the dummies as needed - SkColor* origColors = fOrigColors; - if (dummyFirst) { - *origColors++ = desc.fColors[0]; - } - memcpy(origColors, desc.fColors, desc.fCount * sizeof(SkColor)); - if (dummyLast) { - origColors += desc.fCount; - *origColors = desc.fColors[desc.fCount - 1]; - } + // Now copy over the colors, adding the dummies as needed + SkColor4f* origColors = fOrigColors4f; + if (dummyFirst) { + *origColors++ = desc.fColors[0]; + } + memcpy(origColors, desc.fColors, desc.fCount * sizeof(SkColor4f)); + if (dummyLast) { + origColors += desc.fCount; + *origColors = desc.fColors[desc.fCount - 1]; + } - // Convert our SkColor colors to SkColor4f as well - for (int i = 0; i < fColorCount; ++i) { - fOrigColors4f[i] = SkColor4f::FromColor(fOrigColors[i]); - } + // Convert our SkColor4f colors to SkColor as well. Note that this is incorrect if the + // source colors are not in sRGB gamut. We would need to do a gamut transformation, but + // SkColorSpaceXform can't do that (yet). GrColorSpaceXform can, but we may not have GPU + // support compiled in here. For the common case (sRGB colors), this does the right thing. + for (int i = 0; i < fColorCount; ++i) { + fOrigColors[i] = fOrigColors4f[i].toSkColor(); + } - // Color space refers to fColors4f, so it's always linear gamma + if (!desc.fColorSpace) { + // This happens if we were constructed from SkColors, so our colors are really sRGB fColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGBLinear_Named); } else { - SkASSERT(desc.fColors4f && desc.fColorSpace && desc.fColorSpace->gammaIsLinear()); - - // Now copy over the colors, adding the dummies as needed - SkColor4f* origColors = fOrigColors4f; - if (dummyFirst) { - *origColors++ = desc.fColors4f[0]; - } - memcpy(origColors, desc.fColors4f, desc.fCount * sizeof(SkColor4f)); - if (dummyLast) { - origColors += desc.fCount; - *origColors = desc.fColors4f[desc.fCount - 1]; - } - - // Convert our SkColor4f colors to SkColor as well. Note that this is incorrect if the - // source colors are not in sRGB gamut. We would need to do a gamut transformation, but - // SkColorSpaceXform can't do that (yet). GrColorSpaceXform can, but we may not have GPU - // support compiled in here. - for (int i = 0; i < fColorCount; ++i) { - fOrigColors[i] = fOrigColors4f[i].toSkColor(); - } + // The color space refers to the float colors, so it must be linear gamma + SkASSERT(desc.fColorSpace->gammaIsLinear()); fColorSpace = desc.fColorSpace; } @@ -256,8 +313,7 @@ void SkGradientShaderBase::initCommon() { void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { Descriptor desc; - desc.fColors = fOrigColors; - desc.fColors4f = fOrigColors4f; + desc.fColors = fOrigColors4f; desc.fColorSpace = fColorSpace; desc.fPos = fOrigPos; desc.fCount = fColorCount; @@ -772,18 +828,19 @@ void SkGradientShaderBase::toString(SkString* str) const { // Return true if these parameters are valid/legal/safe to construct a gradient // -static bool valid_grad(const SkColor colors[], const SkScalar pos[], int count, unsigned tileMode) { +static bool valid_grad(const SkColor4f colors[], const SkScalar pos[], int count, + unsigned tileMode) { return nullptr != colors && count >= 1 && tileMode < (unsigned)SkShader::kTileModeCount; } static void desc_init(SkGradientShaderBase::Descriptor* desc, - const SkColor colors[], const SkScalar pos[], int colorCount, + const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace, + const SkScalar pos[], int colorCount, SkShader::TileMode mode, uint32_t flags, const SkMatrix* localMatrix) { SkASSERT(colorCount > 1); desc->fColors = colors; - desc->fColors4f = nullptr; - desc->fColorSpace = nullptr; // SkColor is always sRGB + desc->fColorSpace = std::move(colorSpace); desc->fPos = pos; desc->fCount = colorCount; desc->fTileMode = mode; @@ -791,9 +848,9 @@ static void desc_init(SkGradientShaderBase::Descriptor* desc, desc->fLocalMatrix = localMatrix; } -// assumes colors is SkColor* and pos is SkScalar* +// assumes colors is SkColor4f* and pos is SkScalar* #define EXPAND_1_COLOR(count) \ - SkColor tmp[2]; \ + SkColor4f tmp[2]; \ do { \ if (1 == count) { \ tmp[0] = tmp[1] = colors[0]; \ @@ -804,7 +861,7 @@ static void desc_init(SkGradientShaderBase::Descriptor* desc, } while (0) struct ColorStopOptimizer { - ColorStopOptimizer(const SkColor* colors, const SkScalar* pos, + ColorStopOptimizer(const SkColor4f* colors, const SkScalar* pos, int count, SkShader::TileMode mode) : fColors(colors) , fPos(pos) @@ -841,9 +898,19 @@ struct ColorStopOptimizer { } } - const SkColor* fColors; - const SkScalar* fPos; - int fCount; + const SkColor4f* fColors; + const SkScalar* fPos; + int fCount; +}; + +struct ColorConverter { + ColorConverter(const SkColor* colors, int count) { + for (int i = 0; i < count; ++i) { + fColors4f.push_back(SkColor4f::FromColor(colors[i])); + } + } + + SkSTArray<2, SkColor4f, true> fColors4f; }; sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], @@ -852,6 +919,18 @@ sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], SkShader::TileMode mode, uint32_t flags, const SkMatrix* localMatrix) { + ColorConverter converter(colors, colorCount); + return MakeLinear(pts, converter.fColors4f.begin(), nullptr, pos, colorCount, mode, flags, + localMatrix); +} + +sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], + const SkColor4f colors[], + sk_sp<SkColorSpace> colorSpace, + const SkScalar pos[], int colorCount, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* localMatrix) { if (!pts || !SkScalarIsFinite((pts[1] - pts[0]).length())) { return nullptr; } @@ -859,22 +938,35 @@ sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2], return nullptr; } if (1 == colorCount) { - return SkShader::MakeColorShader(colors[0]); + return SkShader::MakeColorShader(colors[0], std::move(colorSpace)); } ColorStopOptimizer opt(colors, pos, colorCount, mode); SkGradientShaderBase::Descriptor desc; - desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix); + desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, mode, flags, + localMatrix); return sk_make_sp<SkLinearGradient>(pts, desc); } sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar radius, - const SkColor colors[], - const SkScalar pos[], int colorCount, - SkShader::TileMode mode, - uint32_t flags, - const SkMatrix* localMatrix) { + const SkColor colors[], + const SkScalar pos[], int colorCount, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* localMatrix) { + ColorConverter converter(colors, colorCount); + return MakeRadial(center, radius, converter.fColors4f.begin(), nullptr, pos, colorCount, mode, + flags, localMatrix); +} + +sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar radius, + const SkColor4f colors[], + sk_sp<SkColorSpace> colorSpace, + const SkScalar pos[], int colorCount, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* localMatrix) { if (radius <= 0) { return nullptr; } @@ -882,26 +974,43 @@ sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad return nullptr; } if (1 == colorCount) { - return SkShader::MakeColorShader(colors[0]); + return SkShader::MakeColorShader(colors[0], std::move(colorSpace)); } ColorStopOptimizer opt(colors, pos, colorCount, mode); SkGradientShaderBase::Descriptor desc; - desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix); + desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, mode, flags, + localMatrix); return sk_make_sp<SkRadialGradient>(center, radius, desc); } sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, - SkScalar startRadius, - const SkPoint& end, - SkScalar endRadius, - const SkColor colors[], - const SkScalar pos[], - int colorCount, - SkShader::TileMode mode, - uint32_t flags, - const SkMatrix* localMatrix) { + SkScalar startRadius, + const SkPoint& end, + SkScalar endRadius, + const SkColor colors[], + const SkScalar pos[], + int colorCount, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* localMatrix) { + ColorConverter converter(colors, colorCount); + return MakeTwoPointConical(start, startRadius, end, endRadius, converter.fColors4f.begin(), + nullptr, pos, colorCount, mode, flags, localMatrix); +} + +sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, + SkScalar startRadius, + const SkPoint& end, + SkScalar endRadius, + const SkColor4f colors[], + sk_sp<SkColorSpace> colorSpace, + const SkScalar pos[], + int colorCount, + SkShader::TileMode mode, + uint32_t flags, + const SkMatrix* localMatrix) { if (startRadius < 0 || endRadius < 0) { return nullptr; } @@ -922,11 +1031,12 @@ sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, SkGradientShaderBase::Descriptor desc; if (!flipGradient) { - desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix); + desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, mode, flags, + localMatrix); return sk_make_sp<SkTwoPointConicalGradient>(start, startRadius, end, endRadius, flipGradient, desc); } else { - SkAutoSTArray<8, SkColor> colorsNew(opt.fCount); + SkAutoSTArray<8, SkColor4f> colorsNew(opt.fCount); SkAutoSTArray<8, SkScalar> posNew(opt.fCount); for (int i = 0; i < opt.fCount; ++i) { colorsNew[i] = opt.fColors[opt.fCount - i - 1]; @@ -936,9 +1046,11 @@ sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, for (int i = 0; i < opt.fCount; ++i) { posNew[i] = 1 - opt.fPos[opt.fCount - i - 1]; } - desc_init(&desc, colorsNew.get(), posNew.get(), opt.fCount, mode, flags, localMatrix); + desc_init(&desc, colorsNew.get(), std::move(colorSpace), posNew.get(), opt.fCount, mode, + flags, localMatrix); } else { - desc_init(&desc, colorsNew.get(), nullptr, opt.fCount, mode, flags, localMatrix); + desc_init(&desc, colorsNew.get(), std::move(colorSpace), nullptr, opt.fCount, mode, + flags, localMatrix); } return sk_make_sp<SkTwoPointConicalGradient>(end, endRadius, start, startRadius, @@ -947,16 +1059,28 @@ sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start, } sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, - const SkColor colors[], - const SkScalar pos[], - int colorCount, - uint32_t flags, - const SkMatrix* localMatrix) { + const SkColor colors[], + const SkScalar pos[], + int colorCount, + uint32_t flags, + const SkMatrix* localMatrix) { + ColorConverter converter(colors, colorCount); + return MakeSweep(cx, cy, converter.fColors4f.begin(), nullptr, pos, colorCount, flags, + localMatrix); +} + +sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, + const SkColor4f colors[], + sk_sp<SkColorSpace> colorSpace, + const SkScalar pos[], + int colorCount, + uint32_t flags, + const SkMatrix* localMatrix) { if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { return nullptr; } if (1 == colorCount) { - return SkShader::MakeColorShader(colors[0]); + return SkShader::MakeColorShader(colors[0], std::move(colorSpace)); } auto mode = SkShader::kClamp_TileMode; @@ -964,7 +1088,8 @@ sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy, ColorStopOptimizer opt(colors, pos, colorCount, mode); SkGradientShaderBase::Descriptor desc; - desc_init(&desc, opt.fColors, opt.fPos, opt.fCount, mode, flags, localMatrix); + desc_init(&desc, opt.fColors, std::move(colorSpace), opt.fPos, opt.fCount, mode, flags, + localMatrix); return sk_make_sp<SkSweepGradient>(cx, cy, desc); } diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h index 4e6a325c8a..df7ac786f4 100644 --- a/src/effects/gradients/SkGradientShaderPriv.h +++ b/src/effects/gradients/SkGradientShaderPriv.h @@ -84,8 +84,7 @@ public: } const SkMatrix* fLocalMatrix; - const SkColor* fColors; - const SkColor4f* fColors4f; + const SkColor4f* fColors; sk_sp<SkColorSpace> fColorSpace; const SkScalar* fPos; int fCount; @@ -103,14 +102,14 @@ public: // fColors and fPos always point into local memory, so they can be safely mutated // - SkColor* mutableColors() { return const_cast<SkColor*>(fColors); } + SkColor4f* mutableColors() { return const_cast<SkColor4f*>(fColors); } SkScalar* mutablePos() { return const_cast<SkScalar*>(fPos); } private: enum { kStorageCount = 16 }; - SkColor fColorStorage[kStorageCount]; + SkColor4f fColorStorage[kStorageCount]; SkScalar fPosStorage[kStorageCount]; SkMatrix fLocalMatrixStorage; SkAutoMalloc fDynamicStorage; diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index 4bf5e3cc20..3372499a63 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -63,8 +63,9 @@ sk_sp<SkFlattenable> SkLinearGradient::CreateProc(SkReadBuffer& buffer) { SkPoint pts[2]; pts[0] = buffer.readPoint(); pts[1] = buffer.readPoint(); - return SkGradientShader::MakeLinear(pts, desc.fColors, desc.fPos, desc.fCount, desc.fTileMode, - desc.fGradFlags, desc.fLocalMatrix); + return SkGradientShader::MakeLinear(pts, desc.fColors, std::move(desc.fColorSpace), desc.fPos, + desc.fCount, desc.fTileMode, desc.fGradFlags, + desc.fLocalMatrix); } void SkLinearGradient::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp index 6eaecffedd..15d2da40f2 100644 --- a/src/effects/gradients/SkRadialGradient.cpp +++ b/src/effects/gradients/SkRadialGradient.cpp @@ -67,8 +67,9 @@ sk_sp<SkFlattenable> SkRadialGradient::CreateProc(SkReadBuffer& buffer) { } const SkPoint center = buffer.readPoint(); const SkScalar radius = buffer.readScalar(); - return SkGradientShader::MakeRadial(center, radius, desc.fColors, desc.fPos, desc.fCount, - desc.fTileMode, desc.fGradFlags, desc.fLocalMatrix); + return SkGradientShader::MakeRadial(center, radius, desc.fColors, std::move(desc.fColorSpace), + desc.fPos, desc.fCount, desc.fTileMode, desc.fGradFlags, + desc.fLocalMatrix); } void SkRadialGradient::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp index 58bb8aa8ed..9ca207a5d5 100644 --- a/src/effects/gradients/SkSweepGradient.cpp +++ b/src/effects/gradients/SkSweepGradient.cpp @@ -35,8 +35,9 @@ sk_sp<SkFlattenable> SkSweepGradient::CreateProc(SkReadBuffer& buffer) { return nullptr; } const SkPoint center = buffer.readPoint(); - return SkGradientShader::MakeSweep(center.x(), center.y(), desc.fColors, desc.fPos, - desc.fCount, desc.fGradFlags, desc.fLocalMatrix); + return SkGradientShader::MakeSweep(center.x(), center.y(), desc.fColors, + std::move(desc.fColorSpace), desc.fPos, desc.fCount, + desc.fGradFlags, desc.fLocalMatrix); } void SkSweepGradient::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/gradients/SkTwoPointConicalGradient.cpp b/src/effects/gradients/SkTwoPointConicalGradient.cpp index 8e3671b1f9..fd48a62679 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient.cpp @@ -318,7 +318,7 @@ sk_sp<SkFlattenable> SkTwoPointConicalGradient::CreateProc(SkReadBuffer& buffer) SkTSwap(c1, c2); SkTSwap(r1, r2); - SkColor* colors = desc.mutableColors(); + SkColor4f* colors = desc.mutableColors(); SkScalar* pos = desc.mutablePos(); const int last = desc.fCount - 1; const int half = desc.fCount >> 1; @@ -337,7 +337,8 @@ sk_sp<SkFlattenable> SkTwoPointConicalGradient::CreateProc(SkReadBuffer& buffer) } } - return SkGradientShader::MakeTwoPointConical(c1, r1, c2, r2, desc.fColors, desc.fPos, + return SkGradientShader::MakeTwoPointConical(c1, r1, c2, r2, desc.fColors, + std::move(desc.fColorSpace), desc.fPos, desc.fCount, desc.fTileMode, desc.fGradFlags, desc.fLocalMatrix); } |