Remove GrContext::applyGamma
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2191323002

Review-Url: https://codereview.chromium.org/2191323002
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index deddb46..667301e 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -295,15 +295,6 @@
                             uint32_t pixelOpsFlags = 0);
 
     /**
-     * Copies contents of src to dst, while applying a gamma curve. Fails if the two surfaces
-     * are not identically sized.
-     * @param dst           the surface to copy to.
-     * @param src           the texture to copy from.
-     * @param gamma         the gamma value to apply.
-     */
-    bool applyGamma(GrRenderTarget* dst, GrTexture* src, SkScalar gamma);
-
-    /**
      * Copies a rectangle of texels from src to dst.
      * @param dst           the surface to copy to.
      * @param src           the surface to copy from.
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 0c9c3f0..39ee44d 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -15,6 +15,7 @@
 #include "SkCommandLineFlags.h"
 #include "SkData.h"
 #include "SkDocument.h"
+#include "SkGammaColorFilter.h"
 #include "SkGraphics.h"
 #include "SkImage_Base.h"
 #include "SkImageEncoder.h"
@@ -36,8 +37,6 @@
 #if SK_SUPPORT_GPU
 #   include "gl/GrGLInterface.h"
 #   include "gl/GrGLUtil.h"
-#   include "GrDrawContext.h"
-#   include "GrRenderTarget.h"
 #   include "GrContext.h"
 #   include "SkGr.h"
 #   if SK_ANGLE
@@ -314,39 +313,37 @@
     }
 
     void publishCanvas(SampleWindow::DeviceType dType,
-                       SkCanvas* canvas, SampleWindow* win) override {
+                       SkCanvas* renderingCanvas, SampleWindow* win) override {
 #if SK_SUPPORT_GPU
-        if (fCurContext) {
-            // in case we have queued drawing calls
-            fCurContext->flush();
-        }
-
         if (!IsGpuDeviceType(dType) ||
             kRGBA_F16_SkColorType == win->info().colorType() ||
             fActualColorBits > 24) {
             // We made/have an off-screen surface. Get the contents as an SkImage:
             SkBitmap bm;
             bm.allocPixels(win->info());
-            canvas->readPixels(&bm, 0, 0);
+            renderingCanvas->readPixels(&bm, 0, 0);
             SkPixmap pm;
             bm.peekPixels(&pm);
             sk_sp<SkImage> image(SkImage::MakeTextureFromPixmap(fCurContext, pm,
                                                                 SkBudgeted::kNo));
 
-            SkCanvas* canvas = fGpuSurface->getCanvas();
-
-            // Temporary code until applyGamma is replaced
-            GrDrawContext* dc = canvas->internal_private_accessTopLayerDrawContext();
-            GrRenderTarget* rt = dc->accessRenderTarget();
-            GrTexture* texture = image->getTexture();
-            SkASSERT(texture);
+            SkCanvas* gpuCanvas = fGpuSurface->getCanvas();
 
             // With ten-bit output, we need to manually apply the gamma of the output device
             // (unless we're in non-gamma correct mode, in which case our data is already
             // fake-sRGB, like we're expected to put in the 10-bit buffer):
             bool doGamma = (fActualColorBits == 30) && SkImageInfoIsGammaCorrect(win->info());
-            fCurContext->applyGamma(rt, texture, doGamma ? 1.0f / 2.2f : 1.0f);
+
+            SkPaint gammaPaint;
+            gammaPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+            if (doGamma) {
+                gammaPaint.setColorFilter(SkGammaColorFilter::Make(1.0f / 2.2f));
+            }
+
+            gpuCanvas->drawImage(image, 0, 0, &gammaPaint);
         }
+
+        fGpuSurface->prepareForExternalIO();
 #endif
 
         win->present();
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index cbee287..078cfbdb 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -527,40 +527,6 @@
     return true;
 }
 
-bool GrContext::applyGamma(GrRenderTarget* dst, GrTexture* src, SkScalar gamma){
-    ASSERT_SINGLE_OWNER
-    RETURN_FALSE_IF_ABANDONED
-    ASSERT_OWNED_RESOURCE(dst);
-    ASSERT_OWNED_RESOURCE(src);
-    GR_AUDIT_TRAIL_AUTO_FRAME(&fAuditTrail, "GrContext::applyGamma");
-
-    // Dimensions must match exactly.
-    if (dst->width() != src->width() || dst->height() != src->height()) {
-        return false;
-    }
-
-    // TODO: Supply color space?
-    sk_sp<GrDrawContext> drawContext(this->makeDrawContext(sk_ref_sp(dst), nullptr));
-    if (!drawContext) {
-        return false;
-    }
-
-    GrPaint paint;
-    paint.addColorTextureProcessor(src, nullptr, GrCoordTransform::MakeDivByTextureWHMatrix(src));
-    if (!SkScalarNearlyEqual(gamma, 1.0f)) {
-        paint.addColorFragmentProcessor(GrGammaEffect::Make(gamma));
-    }
-    paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
-    paint.setGammaCorrect(true);
-
-    SkRect rect;
-    src->getBoundsRect(&rect);
-    drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect);
-
-    this->flushSurfaceWrites(dst);
-    return true;
-}
-
 void GrContext::prepareSurfaceForExternalIO(GrSurface* surface) {
     ASSERT_SINGLE_OWNER
     RETURN_IF_ABANDONED
diff --git a/tests/ApplyGammaTest.cpp b/tests/ApplyGammaTest.cpp
index 8db8fe0..6e6e23a 100644
--- a/tests/ApplyGammaTest.cpp
+++ b/tests/ApplyGammaTest.cpp
@@ -10,11 +10,9 @@
 
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
-#include "GrDrawContext.h"
-#include "GrTexture.h"
-#include "GrTextureProvider.h"
 
 #include "SkCanvas.h"
+#include "SkGammaColorFilter.h"
 #include "SkPixmap.h"
 #include "SkSurface.h"
 #include "SkUtils.h"
@@ -113,20 +111,12 @@
             dstCanvas->clear(SK_ColorRED);
             dstCanvas->flush();
 
-            // Temporary code until applyGamma is replaced
-            GrDrawContext* dc = dstCanvas->internal_private_accessTopLayerDrawContext();
-            GrRenderTarget* rt = dc->accessRenderTarget();
-            GrTexture* texture = src->getTexture();
-            SkASSERT(texture);
+            SkPaint gammaPaint;
+            gammaPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+            gammaPaint.setColorFilter(SkGammaColorFilter::Make(gamma));
 
-            bool result = context->applyGamma(rt, texture, gamma);
-
-            // To make the copied src rect correct we would apply any dst clipping
-            // back to the src rect, but we don't use it again so don't bother.
-            if (!result) {
-                ERRORF(reporter, "Unexpected failure from applyGamma.");
-                continue;
-            }
+            dstCanvas->drawImage(src, 0, 0, &gammaPaint);
+            dstCanvas->flush();
 
             sk_memset32(read.get(), 0, kW * kH);
             if (!dstCanvas->readPixels(ii, read.get(), kRowBytes, 0, 0)) {