diff options
author | 2017-06-27 14:35:50 -0400 | |
---|---|---|
committer | 2017-06-27 19:20:17 +0000 | |
commit | 0bb0411f59aff6362cedcd90b6ca272c53e19c4c (patch) | |
tree | 732465a84473894bf861727e54b371e1b0d69d5d | |
parent | 42c5af786f755d29bfd5e489df1359c5faa8c131 (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.cpp | 28 | ||||
-rw-r--r-- | src/shaders/gradients/SkTwoPointConicalGradient.h | 4 |
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; |