diff options
author | Florin Malita <fmalita@chromium.org> | 2017-11-01 10:14:57 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-01 17:35:10 +0000 |
commit | 89ab2406f7845b8e62fb8dd479e5fff5bf5ccf10 (patch) | |
tree | 06b1998554a8ee1d56872ba51c2f3dd40572186c /src/shaders/gradients | |
parent | 85e98387a32e3e6e6c05986b23b47aee8c8c4aa7 (diff) |
Gradient cleanup pass
1) replace manual storage management with SkAutoSTMalloc
2) simplify explicit positions processing (remove redundant branch)
Change-Id: I7841e2018ac421768ed1d61c4e3ef6a1d28f6244
Reviewed-on: https://skia-review.googlesource.com/66146
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src/shaders/gradients')
-rw-r--r-- | src/shaders/gradients/SkGradientShader.cpp | 59 | ||||
-rw-r--r-- | src/shaders/gradients/SkGradientShaderPriv.h | 16 |
2 files changed, 21 insertions, 54 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp index 8b22430e91..3d4b2552a4 100644 --- a/src/shaders/gradients/SkGradientShader.cpp +++ b/src/shaders/gradients/SkGradientShader.cpp @@ -149,16 +149,10 @@ SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri fColorCount += dummyFirst + dummyLast; } - if (fColorCount > kColorStorageCount) { - size_t size = sizeof(SkColor4f); - if (desc.fPos) { - size += sizeof(SkScalar); - } - fOrigColors4f = reinterpret_cast<SkColor4f*>(sk_malloc_throw(size * fColorCount)); - } - else { - fOrigColors4f = fStorage; - } + size_t storageSize = fColorCount * (sizeof(SkColor4f) + (desc.fPos ? sizeof(SkScalar) : 0)); + fOrigColors4f = reinterpret_cast<SkColor4f*>(fStorage.reset(storageSize)); + fOrigPos = desc.fPos ? reinterpret_cast<SkScalar*>(fOrigColors4f + fColorCount) + : nullptr; // Now copy over the colors, adding the dummies as needed SkColor4f* origColors = fOrigColors4f; @@ -184,45 +178,20 @@ SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri fColorSpace = desc.fColorSpace; } - if (desc.fPos && fColorCount) { - fOrigPos = (SkScalar*)(fOrigColors4f + fColorCount); - } else { - fOrigPos = nullptr; - } - - if (fColorCount > 2) { - if (desc.fPos) { - SkScalar* origPosPtr = fOrigPos; - *origPosPtr++ = 0; - - int startIndex = dummyFirst ? 0 : 1; - int count = desc.fCount + dummyLast; - for (int i = startIndex; i < count; i++) { - // force the last value to be 1.0 - SkScalar curr; - if (i == desc.fCount) { // we're really at the dummyLast - curr = 1; - } else { - curr = SkScalarPin(desc.fPos[i], 0, 1); - } - *origPosPtr++ = curr; - } - } - } else if (desc.fPos) { - SkASSERT(2 == fColorCount); - fOrigPos[0] = SkScalarPin(desc.fPos[0], 0, 1); - fOrigPos[1] = SkScalarPin(desc.fPos[1], fOrigPos[0], 1); - if (0 == fOrigPos[0] && 1 == fOrigPos[1]) { - fOrigPos = nullptr; + if (desc.fPos) { + SkScalar* origPosPtr = fOrigPos; + *origPosPtr++ = 0; // force the first pos to 0 + + int startIndex = dummyFirst ? 0 : 1; + int count = desc.fCount + dummyLast; + for (int i = startIndex; i < count; i++) { + // force the last value to be 1.0 + *origPosPtr++ = (i == desc.fCount) ? 1 : SkScalarPin(desc.fPos[i], 0, 1); } } } -SkGradientShaderBase::~SkGradientShaderBase() { - if (fOrigColors4f != fStorage) { - sk_free(fOrigColors4f); - } -} +SkGradientShaderBase::~SkGradientShaderBase() {} void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { Descriptor desc; diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h index 7084dc67b8..0ef86265a4 100644 --- a/src/shaders/gradients/SkGradientShaderPriv.h +++ b/src/shaders/gradients/SkGradientShaderPriv.h @@ -117,14 +117,6 @@ protected: TileMode fTileMode; uint8_t fGradFlags; -private: - enum { - kColorStorageCount = 4, // more than this many colors, and we'll use sk_malloc for the space - - kStorageSize = kColorStorageCount * (sizeof(SkColor4f) + sizeof(SkScalar)) - }; - SkColor4f fStorage[(kStorageSize + sizeof(SkColor4f) - 1) / sizeof(SkColor4f)]; - public: SkScalar getPos(int i) const { SkASSERT(i < fColorCount); @@ -146,7 +138,13 @@ public: TileMode getTileMode() const { return fTileMode; } private: - bool fColorsAreOpaque; + // Reserve inline space for up to 4 stops. + static constexpr size_t kInlineStopCount = 4; + static constexpr size_t kInlineStorageSize = (sizeof(SkColor4f) + sizeof(SkScalar)) + * kInlineStopCount; + SkAutoSTMalloc<kInlineStorageSize, uint8_t> fStorage; + + bool fColorsAreOpaque; typedef SkShaderBase INHERITED; }; |