/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrSurfaceContext.h" #include "GrContextPriv.h" #include "SkColorSpace_Base.h" #include "SkGr.h" #include "../private/GrAuditTrail.h" // In MDB mode the reffing of the 'getLastOpList' call's result allows in-progress // GrOpLists to be picked up and added to by renderTargetContexts lower in the call // stack. When this occurs with a closed GrOpList, a new one will be allocated // when the renderTargetContext attempts to use it (via getOpList). GrSurfaceContext::GrSurfaceContext(GrContext* context, GrDrawingManager* drawingMgr, sk_sp colorSpace, GrAuditTrail* auditTrail, GrSingleOwner* singleOwner) : fContext(context) , fColorSpace(std::move(colorSpace)) , fAuditTrail(auditTrail) , fDrawingManager(drawingMgr) #ifdef SK_DEBUG , fSingleOwner(singleOwner) #endif { } bool GrSurfaceContext::readPixels(const SkImageInfo& dstInfo, void* dstBuffer, size_t dstRowBytes, int x, int y, uint32_t flags) { // TODO: teach GrRenderTarget to take ImageInfo directly to specify the src pixels GrPixelConfig config = SkImageInfo2GrPixelConfig(dstInfo, *fContext->caps()); if (kUnknown_GrPixelConfig == config) { return false; } // TODO: this seems to duplicate code in SkImage_Gpu::onReadPixels if (kUnpremul_SkAlphaType == dstInfo.alphaType()) { flags |= GrContextPriv::kUnpremul_PixelOpsFlag; } return fContext->contextPriv().readSurfacePixels(this, x, y, dstInfo.width(), dstInfo.height(), config, dstInfo.colorSpace(), dstBuffer, dstRowBytes, flags); } bool GrSurfaceContext::writePixels(const SkImageInfo& srcInfo, const void* srcBuffer, size_t srcRowBytes, int x, int y, uint32_t flags) { // TODO: teach GrRenderTarget to take ImageInfo directly to specify the src pixels GrPixelConfig config = SkImageInfo2GrPixelConfig(srcInfo, *fContext->caps()); if (kUnknown_GrPixelConfig == config) { return false; } if (kUnpremul_SkAlphaType == srcInfo.alphaType()) { flags |= GrContextPriv::kUnpremul_PixelOpsFlag; } return fContext->contextPriv().writeSurfacePixels(this, x, y, srcInfo.width(), srcInfo.height(), config, srcInfo.colorSpace(), srcBuffer, srcRowBytes, flags); }