Index: src/effects/gradients/SkLinearGradient.cpp |
diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp |
index 1fbd96e40ebc5a2a75b58a8983016f08c4f97de3..cc8875cf8e83c69b939f7c268a07270b9a7d25c2 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)); |
} |