Include 4f variants of random gradients during testing
authorBrian Osman <brianosman@google.com>
Mon, 17 Oct 2016 16:48:13 +0000 (12:48 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Tue, 18 Oct 2016 13:01:28 +0000 (13:01 +0000)
BUG=skia:

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3538

Change-Id: Ieee6e49cb830b6aab87b0ecd7865c65ffb90dfe8
Reviewed-on: https://skia-review.googlesource.com/3538
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>

src/effects/gradients/SkGradientShader.cpp
src/effects/gradients/SkGradientShaderPriv.h
src/effects/gradients/SkLinearGradient.cpp
src/effects/gradients/SkRadialGradient.cpp
src/effects/gradients/SkSweepGradient.cpp
src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp

index eee2cbf..03f03b2 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "Sk4fLinearGradient.h"
+#include "SkColorSpace_Base.h"
 #include "SkGradientShaderPriv.h"
 #include "SkHalf.h"
 #include "SkLinearGradient.h"
@@ -1733,6 +1734,7 @@ void GrGradientEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
 
 GrGradientEffect::RandomGradientParams::RandomGradientParams(SkRandom* random) {
     fColorCount = random->nextRangeU(1, kMaxRandomGradientColors);
+    fUseColors4f = random->nextBool();
 
     // if one color, omit stops, otherwise randomly decide whether or not to
     if (fColorCount == 1 || (fColorCount >= 2 && random->nextBool())) {
@@ -1741,9 +1743,24 @@ GrGradientEffect::RandomGradientParams::RandomGradientParams(SkRandom* random) {
         fStops = fStopStorage;
     }
 
+    // if using SkColor4f, attach a random (possibly null) color space (with linear gamma)
+    if (fUseColors4f) {
+        fColorSpace = GrTest::TestColorSpace(random);
+        if (fColorSpace) {
+            fColorSpace = as_CSB(fColorSpace)->makeLinearGamma();
+        }
+    }
+
     SkScalar stop = 0.f;
     for (int i = 0; i < fColorCount; ++i) {
-        fColors[i] = random->nextU();
+        if (fUseColors4f) {
+            fColors4f[i].fR = random->nextUScalar1();
+            fColors4f[i].fG = random->nextUScalar1();
+            fColors4f[i].fB = random->nextUScalar1();
+            fColors4f[i].fA = random->nextUScalar1();
+        } else {
+            fColors[i] = random->nextU();
+        }
         if (fStops) {
             fStops[i] = stop;
             stop = i < fColorCount - 1 ? stop + random->nextUScalar1() * (1.f - stop) : 1.f;
index 36ccab0..cbffea1 100644 (file)
@@ -401,16 +401,20 @@ public:
 
 protected:
     /** Helper struct that stores (and populates) parameters to construct a random gradient.
-        The constructor decides whether stop values should be used or not (fStops may be nullptr
-        after construction). fColorCount will be the number of color stops, and fColors and fStops
-        can be passed to the gradient factory.
-    */
+        If fUseColors4f is true, then the SkColor4f factory should be called, with fColors4f and
+        fColorSpace. Otherwise, the SkColor factory should be called, with fColors. fColorCount
+        will be the number of color stops in either case, and fColors and fStops can be passed to
+        the gradient factory. (The constructor may decide not to use stops, in which case fStops
+        will be nullptr). */
     struct RandomGradientParams {
         static const int kMaxRandomGradientColors = 4;
 
         RandomGradientParams(SkRandom* r);
 
+        bool fUseColors4f;
         SkColor fColors[kMaxRandomGradientColors];
+        SkColor4f fColors4f[kMaxRandomGradientColors];
+        sk_sp<SkColorSpace> fColorSpace;
         SkScalar fStopStorage[kMaxRandomGradientColors];
         SkShader::TileMode fTileMode;
         int fColorCount;
index 2fcaae1..a34515c 100644 (file)
@@ -415,8 +415,11 @@ sk_sp<GrFragmentProcessor> GrLinearGradient::TestCreate(GrProcessorTestData* d)
                         {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}};
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeLinear(points, params.fColors, params.fStops,
-                                               params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeLinear(points, params.fColors4f, params.fColorSpace, params.fStops,
+                                     params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeLinear(points, params.fColors, params.fStops,
+                                     params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
index f13deb1..5cf5245 100644 (file)
@@ -309,8 +309,11 @@ sk_sp<GrFragmentProcessor> GrRadialGradient::TestCreate(GrProcessorTestData* d)
     SkScalar radius = d->fRandom->nextUScalar1();
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeRadial(center, radius, params.fColors, params.fStops,
-                                               params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeRadial(center, radius, params.fColors4f, params.fColorSpace,
+                                     params.fStops, params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeRadial(center, radius, params.fColors,
+                                     params.fStops, params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
index d62e2e5..04fc2c7 100644 (file)
@@ -191,8 +191,11 @@ sk_sp<GrFragmentProcessor> GrSweepGradient::TestCreate(GrProcessorTestData* d) {
     SkPoint center = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
 
     RandomGradientParams params(d->fRandom);
-    sk_sp<SkShader> shader(SkGradientShader::MakeSweep(center.fX, center.fY,  params.fColors,
-                                                       params.fStops, params.fColorCount));
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeSweep(center.fX, center.fY, params.fColors4f, params.fColorSpace,
+                                    params.fStops, params.fColorCount) :
+        SkGradientShader::MakeSweep(center.fX, center.fY,  params.fColors,
+                                    params.fStops, params.fColorCount);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
index 00d8fac..8eb8b63 100644 (file)
@@ -200,9 +200,13 @@ sk_sp<GrFragmentProcessor> Edge2PtConicalEffect::TestCreate(GrProcessorTestData*
     radius2 = radius1 + diffLen;
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
-                                                        params.fColors, params.fStops,
-                                                        params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors4f, params.fColorSpace, params.fStops,
+                                              params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors, params.fStops,
+                                              params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
@@ -474,9 +478,13 @@ sk_sp<GrFragmentProcessor> FocalOutside2PtConicalEffect::TestCreate(GrProcessorT
     radius2 = d->fRandom->nextRangeF(0.f, diffLen);
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
-                                                        params.fColors, params.fStops,
-                                                        params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors4f, params.fColorSpace, params.fStops,
+                                              params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors, params.fStops,
+                                              params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
@@ -676,9 +684,13 @@ sk_sp<GrFragmentProcessor> FocalInside2PtConicalEffect::TestCreate(GrProcessorTe
     } while (radius1 == radius2 && center1 == center2);
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
-                                                        params.fColors, params.fStops,
-                                                        params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors4f, params.fColorSpace, params.fStops,
+                                              params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors, params.fStops,
+                                              params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
@@ -920,9 +932,13 @@ sk_sp<GrFragmentProcessor> CircleInside2PtConicalEffect::TestCreate(GrProcessorT
     } while (radius1 == radius2 && center1 == center2);
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
-                                                        params.fColors, params.fStops,
-                                                        params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors4f, params.fColorSpace, params.fStops,
+                                              params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors, params.fStops,
+                                              params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(
@@ -1151,9 +1167,13 @@ sk_sp<GrFragmentProcessor> CircleOutside2PtConicalEffect::TestCreate(GrProcessor
     radius2 = radius1 + d->fRandom->nextRangeF(0.f, diffLen);
 
     RandomGradientParams params(d->fRandom);
-    auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
-                                                        params.fColors, params.fStops,
-                                                        params.fColorCount, params.fTileMode);
+    auto shader = params.fUseColors4f ?
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors4f, params.fColorSpace, params.fStops,
+                                              params.fColorCount, params.fTileMode) :
+        SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
+                                              params.fColors, params.fStops,
+                                              params.fColorCount, params.fTileMode);
     SkMatrix viewMatrix = GrTest::TestMatrix(d->fRandom);
     auto dstColorSpace = GrTest::TestColorSpace(d->fRandom);
     sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(SkShader::AsFPArgs(