diff options
-rw-r--r-- | include/gpu/GrContext.h | 9 | ||||
-rw-r--r-- | samplecode/SampleApp.cpp | 31 | ||||
-rw-r--r-- | src/gpu/GrContext.cpp | 34 | ||||
-rw-r--r-- | tests/ApplyGammaTest.cpp | 22 |
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)) { |