Move SkGammaColorFilter to tools, limit to sRGB

Similarly, limit GrGammaEffect to sRGB (and rename it).

BUG=skia:

Change-Id: I88feef11ab7040bca2fa4c2eed71923ded87a0d0
Reviewed-on: https://skia-review.googlesource.com/7375
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/tests/ApplyGammaTest.cpp b/tests/ApplyGammaTest.cpp
index 4f1f828..dbb7210 100644
--- a/tests/ApplyGammaTest.cpp
+++ b/tests/ApplyGammaTest.cpp
@@ -12,60 +12,63 @@
 #include "GrContext.h"
 
 #include "SkCanvas.h"
-#include "SkGammaColorFilter.h"
+#include "SkColorFilter.h"
 #include "SkSurface.h"
 #include "SkUtils.h"
+#include "sk_tool_utils.h"
 
- // using anonymous namespace because these functions are used as template params.
-namespace {
 /** convert 0..1 linear value to 0..1 srgb */
-float linear_to_srgb(float linear) {
+static float linear_to_srgb(float linear) {
     if (linear <= 0.0031308) {
         return linear * 12.92f;
     } else {
         return 1.055f * powf(linear, 1.f / 2.4f) - 0.055f;
     }
 }
+
+/** convert 0..1 srgb value to 0..1 linear */
+static float srgb_to_linear(float srgb) {
+    if (srgb <= 0.04045f) {
+        return srgb / 12.92f;
+    } else {
+        return powf((srgb + 0.055f) / 1.055f, 2.4f);
+    }
 }
 
-bool check_gamma(uint32_t src, uint32_t dst, float gamma, float error, uint32_t* expected) {
-    if (SkScalarNearlyEqual(gamma, 1.f)) {
-        *expected = src;
-        return src == dst;
-    } else {
-        bool result = true;
-        uint32_t expectedColor = src & 0xff000000;
+bool check_gamma(uint32_t src, uint32_t dst, bool toSRGB, float error,
+                 uint32_t* expected) {
+    bool result = true;
+    uint32_t expectedColor = src & 0xff000000;
 
-        // Alpha should always be exactly preserved.
-        if ((src & 0xff000000) != (dst & 0xff000000)) {
+    // Alpha should always be exactly preserved.
+    if ((src & 0xff000000) != (dst & 0xff000000)) {
+        result = false;
+    }
+
+    for (int c = 0; c < 3; ++c) {
+        uint8_t srcComponent = (src & (0xff << (c * 8))) >> (c * 8);
+        float lower = SkTMax(0.f, (float)srcComponent - error);
+        float upper = SkTMin(255.f, (float)srcComponent + error);
+        if (toSRGB) {
+            lower = linear_to_srgb(lower / 255.f);
+            upper = linear_to_srgb(upper / 255.f);
+        } else {
+            lower = srgb_to_linear(lower / 255.f);
+            upper = srgb_to_linear(upper / 255.f);
+        }
+        SkASSERT(lower >= 0.f && lower <= 255.f);
+        SkASSERT(upper >= 0.f && upper <= 255.f);
+        uint8_t dstComponent = (dst & (0xff << (c * 8))) >> (c * 8);
+        if (dstComponent < SkScalarFloorToInt(lower * 255.f) ||
+            dstComponent > SkScalarCeilToInt(upper * 255.f)) {
             result = false;
         }
-
-        for (int c = 0; c < 3; ++c) {
-            uint8_t srcComponent = (src & (0xff << (c * 8))) >> (c * 8);
-            float lower = SkTMax(0.f, (float)srcComponent - error);
-            float upper = SkTMin(255.f, (float)srcComponent + error);
-            if (SkScalarNearlyEqual(gamma, 1.0f / 2.2f)) {
-                lower = linear_to_srgb(lower / 255.f);
-                upper = linear_to_srgb(upper / 255.f);
-            } else {
-                lower = powf(lower / 255.f, gamma);
-                upper = powf(upper / 255.f, gamma);
-            }
-            SkASSERT(lower >= 0.f && lower <= 255.f);
-            SkASSERT(upper >= 0.f && upper <= 255.f);
-            uint8_t dstComponent = (dst & (0xff << (c * 8))) >> (c * 8);
-            if (dstComponent < SkScalarFloorToInt(lower * 255.f) ||
-                dstComponent > SkScalarCeilToInt(upper * 255.f)) {
-                result = false;
-            }
-            uint8_t expectedComponent = SkScalarRoundToInt((lower + upper) * 127.5f);
-            expectedColor |= expectedComponent << (c * 8);
-        }
-
-        *expected = expectedColor;
-        return result;
+        uint8_t expectedComponent = SkScalarRoundToInt((lower + upper) * 127.5f);
+        expectedColor |= expectedComponent << (c * 8);
     }
+
+    *expected = expectedColor;
+    return result;
 }
 
 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ApplyGamma, reporter, ctxInfo) {
@@ -94,48 +97,46 @@
     // We allow more error on GPUs with lower precision shader variables.
     float error = context->caps()->shaderCaps()->floatPrecisionVaries() ? 1.2f : 0.5f;
 
-    for (auto dOrigin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin }) {
-        for (auto gamma : { 1.0f, 1.0f / 1.8f, 1.0f / 2.2f }) {
-            sk_sp<SkSurface> dst(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, 
-                                                             ii, 0, dOrigin, nullptr));
+    for (auto toSRGB : { false, true }) {
+        sk_sp<SkSurface> dst(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, ii));
 
-            if (!dst) {
-                ERRORF(reporter, "Could not create surfaces for copy surface test.");
-                continue;
-            }
+        if (!dst) {
+            ERRORF(reporter, "Could not create surfaces for copy surface test.");
+            continue;
+        }
 
-            SkCanvas* dstCanvas = dst->getCanvas();
+        SkCanvas* dstCanvas = dst->getCanvas();
 
-            dstCanvas->clear(SK_ColorRED);
-            dstCanvas->flush();
+        dstCanvas->clear(SK_ColorRED);
+        dstCanvas->flush();
 
-            SkPaint gammaPaint;
-            gammaPaint.setBlendMode(SkBlendMode::kSrc);
-            gammaPaint.setColorFilter(SkGammaColorFilter::Make(gamma));
+        SkPaint gammaPaint;
+        gammaPaint.setBlendMode(SkBlendMode::kSrc);
+        gammaPaint.setColorFilter(toSRGB ? sk_tool_utils::MakeLinearToSRGBColorFilter()
+                                         : sk_tool_utils::MakeSRGBToLinearColorFilter());
 
-            dstCanvas->drawBitmap(bm, 0, 0, &gammaPaint);
-            dstCanvas->flush();
+        dstCanvas->drawBitmap(bm, 0, 0, &gammaPaint);
+        dstCanvas->flush();
 
-            sk_memset32(read.get(), 0, kW * kH);
-            if (!dstCanvas->readPixels(ii, read.get(), kRowBytes, 0, 0)) {
-                ERRORF(reporter, "Error calling readPixels");
-                continue;
-            }
+        sk_memset32(read.get(), 0, kW * kH);
+        if (!dstCanvas->readPixels(ii, read.get(), kRowBytes, 0, 0)) {
+            ERRORF(reporter, "Error calling readPixels");
+            continue;
+        }
 
-            bool abort = false;
-            // Validate that pixels were copied/transformed correctly.
-            for (int y = 0; y < kH && !abort; ++y) {
-                for (int x = 0; x < kW && !abort; ++x) {
-                    uint32_t r = read.get()[y * kW + x];
-                    uint32_t s = srcPixels.get()[y * kW + x];
-                    uint32_t expected;
-                    if (!check_gamma(s, r, gamma, error, &expected)) {
-                        ERRORF(reporter, "Expected dst %d,%d to contain 0x%08x "
-                                "from src 0x%08x and gamma %f. Got %08x",
-                                x, y, expected, s, gamma, r);
-                        abort = true;
-                        break;
-                    }
+        bool abort = false;
+        // Validate that pixels were copied/transformed correctly.
+        for (int y = 0; y < kH && !abort; ++y) {
+            for (int x = 0; x < kW && !abort; ++x) {
+                uint32_t r = read.get()[y * kW + x];
+                uint32_t s = srcPixels.get()[y * kW + x];
+                uint32_t expected;
+                if (!check_gamma(s, r, toSRGB, error, &expected)) {
+                    ERRORF(reporter, "Expected dst %d,%d to contain 0x%08x "
+                           "from src 0x%08x and mode %s. Got %08x", x, y, expected, s,
+                           toSRGB ? "ToSRGB" : "ToLinear", r);
+                    abort = true;
+                    break;
                 }
             }
         }