aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/gradients/SkGradientShader.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-11-01 10:14:57 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-01 17:35:10 +0000
commit89ab2406f7845b8e62fb8dd479e5fff5bf5ccf10 (patch)
tree06b1998554a8ee1d56872ba51c2f3dd40572186c /src/shaders/gradients/SkGradientShader.cpp
parent85e98387a32e3e6e6c05986b23b47aee8c8c4aa7 (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/SkGradientShader.cpp')
-rw-r--r--src/shaders/gradients/SkGradientShader.cpp59
1 files changed, 14 insertions, 45 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;