Just clamp to limit-epsilon.
authorMike Klein <mtklein@chromium.org>
Fri, 20 Jan 2017 16:45:01 +0000 (11:45 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 20 Jan 2017 17:43:27 +0000 (17:43 +0000)
I think the -0.5f was an implementation detail of Herb's bilerp that we
don't need here.  It happened to also be clamping us to something less
than limit (limit-0.5), so we do need to replace that with a little
nudge to keep us on tile.

Change-Id: I4ebd32e0ad38c724a17dc8bc35d9ea228eeeca32
Reviewed-on: https://skia-review.googlesource.com/7338
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Herb Derby <herb@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
src/effects/gradients/SkLinearGradient.cpp
src/opts/SkRasterPipeline_opts.h

index 91c0e20..aab1ac7 100644 (file)
@@ -129,10 +129,7 @@ bool SkLinearGradient::onAppendStages(SkRasterPipeline* p, SkColorSpace* cs, SkA
     auto* limit = alloc->make<float>(1.0f);
 
     switch (fTileMode) {
-        case kClamp_TileMode:
-            *limit += 0.5f; // why is clamp_x offsetting its limit?
-            p->append(SkRasterPipeline::clamp_x, limit);
-            break;
+        case kClamp_TileMode:  p->append(SkRasterPipeline:: clamp_x, limit); break;
         case kMirror_TileMode: p->append(SkRasterPipeline::mirror_x, limit); break;
         case kRepeat_TileMode: p->append(SkRasterPipeline::repeat_x, limit); break;
     }
index 2376c10..aa66d73 100644 (file)
@@ -872,7 +872,7 @@ SI SkNf assert_in_tile(const SkNf& v, float limit) {
 }
 
 SI SkNf clamp(const SkNf& v, float limit) {
-    SkNf result = SkNf::Max(0, SkNf::Min(v, limit - 0.5f));
+    SkNf result = SkNf::Max(0, SkNf::Min(v, nextafterf(limit, 0)));
     return assert_in_tile(result, limit);
 }
 SI SkNf repeat(const SkNf& v, float limit) {