aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/gpu/GrContext.h9
-rw-r--r--samplecode/SampleApp.cpp31
-rw-r--r--src/gpu/GrContext.cpp34
-rw-r--r--tests/ApplyGammaTest.cpp22
4 files changed, 20 insertions, 76 deletions
diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h
index deddb462d6..667301e61d 100644
--- a/include/gpu/GrContext.h
+++ b/include/gpu/GrContext.h
@@ -295,15 +295,6 @@ public:
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 0c9c3f0276..39ee44da7e 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 @@ public:
}
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 cbee2874ed..078cfbdb2c 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -527,40 +527,6 @@ bool GrContext::readSurfacePixels(GrSurface* src,
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 8db8fe09f6..6e6e23a9ae 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 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ApplyGamma, reporter, ctxInfo) {
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)) {