aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-10-26 13:55:50 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-26 19:43:27 +0000
commit97293503f50d01d7e5054d7a1f9d93644cce9964 (patch)
tree4acd3bda2813d4be5a14057c05bb193a7e949bbb /src
parentf7a209d7c8a3a690209b62f6a5ef5955061cf486 (diff)
Stop using fixed point recs for gradient positioning info
The fixed point gradient records are historical relics. Instead of round-tripping through FP, just use the float positions directly. We can remove the recs completely in a follow-up, after rebaselining the existing clients. Change-Id: I85d1e0f469006de320dbc842f50e69bcbb3aa668 Reviewed-on: https://skia-review.googlesource.com/64102 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/shaders/gradients/SkGradientShader.cpp22
-rw-r--r--src/shaders/gradients/SkGradientShaderPriv.h5
2 files changed, 16 insertions, 11 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 8e24919c94..1975692faa 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -498,11 +498,15 @@ bool SkGradientShaderBase::onAsLuminanceColor(SkColor* lum) const {
return true;
}
+#ifdef SK_SUPPORT_LEGACY_FIXED_GRADIENT_POS
static inline int SkFixedToFFFF(SkFixed x) {
SkASSERT((unsigned)x <= SK_Fixed1);
return x - (x >> 16);
}
+static constexpr unsigned kCacheShift = 8;
+#endif
+
static constexpr int kGradientTextureSize = 256;
void SkGradientShaderBase::initLinearBitmap(SkBitmap* bitmap, GradientBitmapType bitmapType) const {
@@ -540,13 +544,14 @@ void SkGradientShaderBase::initLinearBitmap(SkBitmap* bitmap, GradientBitmapType
// our own CS for identity/no transform.
auto* cs = bitmapType != GradientBitmapType::kLegacy ? fColorSpace.get() : nullptr;
- // TODO: refactor to avoid using fRecs.
- static constexpr unsigned kCacheShift = 8;
-
int prevIndex = 0;
for (int i = 1; i < fColorCount; i++) {
+#ifdef SK_SUPPORT_LEGACY_FIXED_GRADIENT_POS
int nextIndex = (fColorCount == 2) ? (kGradientTextureSize - 1)
: SkFixedToFFFF(fRecs[i].fPos) >> kCacheShift;
+#else
+ int nextIndex = SkScalarRoundToInt(this->getPos(i) * (kGradientTextureSize - 1));
+#endif
SkASSERT(nextIndex < kGradientTextureSize);
if (nextIndex > prevIndex) {
@@ -654,13 +659,8 @@ void SkGradientShaderBase::commonAsAGradient(GradientInfo* info) const {
memcpy(info->fColors, fOrigColors, fColorCount * sizeof(SkColor));
}
if (info->fColorOffsets) {
- if (fColorCount == 2) {
- info->fColorOffsets[0] = 0;
- info->fColorOffsets[1] = SK_Scalar1;
- } else if (fColorCount > 2) {
- for (int i = 0; i < fColorCount; ++i) {
- info->fColorOffsets[i] = SkFixedToScalar(fRecs[i].fPos);
- }
+ for (int i = 0; i < fColorCount; ++i) {
+ info->fColorOffsets[i] = this->getPos(i);
}
}
}
@@ -685,7 +685,7 @@ void SkGradientShaderBase::toString(SkString* str) const {
if (fColorCount > 2) {
str->append(" points: (");
for (int i = 0; i < fColorCount; ++i) {
- str->appendScalar(SkFixedToScalar(fRecs[i].fPos));
+ str->appendScalar(this->getPos(i));
if (i < fColorCount-1) {
str->append(", ");
}
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index 9aad102491..983c3ef124 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -125,6 +125,11 @@ private:
};
SkColor fStorage[(kStorageSize + 3) >> 2];
public:
+ SkScalar getPos(int i) const {
+ SkASSERT(i < fColorCount);
+ return fOrigPos ? fOrigPos[i] : SkIntToScalar(i) / (fColorCount - 1);
+ }
+
SkColor* fOrigColors; // original colors, before modulation by paint in context.
SkColor4f* fOrigColors4f; // original colors, as linear floats
SkScalar* fOrigPos; // original positions