aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/shaders/gradients/SkGradientShader.cpp59
-rw-r--r--src/shaders/gradients/SkGradientShaderPriv.h16
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;
};