aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-06-27 14:35:50 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-27 19:20:17 +0000
commit0bb0411f59aff6362cedcd90b6ca272c53e19c4c (patch)
tree732465a84473894bf861727e54b371e1b0d69d5d
parent42c5af786f755d29bfd5e489df1359c5faa8c131 (diff)
2pt conical stage for concentric case
If the circles are concentric, we can use the radial stage and post-massage t with a 2x3 stage. Change-Id: I744bc889d509d5f9ff162c179e8ec7ca35410e3c Reviewed-on: https://skia-review.googlesource.com/20972 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Florin Malita <fmalita@chromium.org>
-rw-r--r--src/shaders/gradients/SkTwoPointConicalGradient.cpp28
-rw-r--r--src/shaders/gradients/SkTwoPointConicalGradient.h4
2 files changed, 32 insertions, 0 deletions
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
index 399bce6675..846b5f41d6 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
@@ -422,3 +422,31 @@ void SkTwoPointConicalGradient::toString(SkString* str) const {
str->append(")");
}
#endif
+
+bool SkTwoPointConicalGradient::adjustMatrixAndAppendStages(SkArenaAlloc* alloc,
+ SkMatrix* matrix,
+ SkRasterPipeline* p) const {
+ // When the two circles are concentric, we can pretend we're radial (with a tiny *twist).
+ if (SkScalarNearlyZero((fCenter1 - fCenter2).length())) {
+ matrix->postTranslate(-fCenter1.fX, -fCenter1.fY);
+ matrix->postScale(1 / fRadius2, 1 / fRadius2);
+ p->append(SkRasterPipeline::xy_to_radius);
+
+ // Tiny twist: radial computes a t for [0, r2], but we want a t for [r1, r2].
+ auto dR = fRadius2 - fRadius1;
+ SkASSERT(dR > 0);
+ auto scale = fRadius2 / dR;
+ auto bias = -fRadius1 / dR;
+
+ auto mad_matrix = SkMatrix::Concat(SkMatrix::MakeTrans(bias, 0),
+ SkMatrix::MakeScale(scale, 1));
+ auto m = alloc->makeArrayDefault<float>(6);
+ SkAssertResult(mad_matrix.asAffine(m));
+ p->append(SkRasterPipeline::matrix_2x3, m);
+
+ return true;
+ }
+
+ // TODO
+ return false;
+}
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.h b/src/shaders/gradients/SkTwoPointConicalGradient.h
index b32f52c1e0..8b61b8e9d2 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.h
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.h
@@ -79,6 +79,10 @@ protected:
Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
+ bool adjustMatrixAndAppendStages(SkArenaAlloc* alloc,
+ SkMatrix* matrix,
+ SkRasterPipeline* p) const final;
+
private:
SkPoint fCenter1;
SkPoint fCenter2;