aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2016-02-23 13:26:28 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-23 13:26:28 -0800
commit55430a620762e882c2b3018c57f9a7d51cf16071 (patch)
tree09ffdf9f327bbd1faf0237a98ab3203243a01440 /src
parentccb74b824a16d0009f7f9ebcf2a03fb53451af9a (diff)
Update 4f linear gradient selection heuristic
Use the 4f context when * dest type is 4f * there's no perpective Keeping the define and testing flag overrides for now. R=reed@google.com,herb@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1725793003 Review URL: https://codereview.chromium.org/1725793003
Diffstat (limited to 'src')
-rw-r--r--src/effects/gradients/SkLinearGradient.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp
index 1fbd96e40e..cc8875cf8e 100644
--- a/src/effects/gradients/SkLinearGradient.cpp
+++ b/src/effects/gradients/SkLinearGradient.cpp
@@ -9,7 +9,7 @@
#include "SkLinearGradient.h"
// define to test the 4f gradient path
-// #define USE_4fGRADIENTS
+// #define FORCE_4F_CONTEXT
static const float kInv255Float = 1.0f / 255;
@@ -47,11 +47,18 @@ static SkMatrix pts_to_unit_matrix(const SkPoint pts[2]) {
return matrix;
}
-static bool use_4f_context(uint32_t flags) {
-#ifdef USE_4fGRADIENTS
+static bool use_4f_context(const SkShader::ContextRec& rec, uint32_t flags) {
+#ifdef FORCE_4F_CONTEXT
return true;
#else
- return SkToBool(flags & SkLinearGradient::kForce4fContext_PrivateFlag);
+ // Perspective not supported in 4f yet.
+ if (rec.fMatrix->hasPerspective()
+ || (rec.fLocalMatrix && rec.fLocalMatrix->hasPerspective())) {
+ return false;
+ }
+
+ return rec.fPreferredDstType == SkShader::ContextRec::kPM4f_DstType
+ || SkToBool(flags & SkLinearGradient::kForce4fContext_PrivateFlag);
#endif
}
@@ -81,14 +88,14 @@ void SkLinearGradient::flatten(SkWriteBuffer& buffer) const {
buffer.writePoint(fEnd);
}
-size_t SkLinearGradient::contextSize(const ContextRec&) const {
- return use_4f_context(fGradFlags)
+size_t SkLinearGradient::contextSize(const ContextRec& rec) const {
+ return use_4f_context(rec, fGradFlags)
? sizeof(LinearGradient4fContext)
: sizeof(LinearGradientContext);
}
SkShader::Context* SkLinearGradient::onCreateContext(const ContextRec& rec, void* storage) const {
- return use_4f_context(fGradFlags)
+ return use_4f_context(rec, fGradFlags)
? static_cast<SkShader::Context*>(new (storage) LinearGradient4fContext(*this, rec))
: static_cast<SkShader::Context*>(new (storage) LinearGradientContext(*this, rec));
}