| /* | |
| * 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 "GrDrawingManager.h" | |
| #include "GrOpList.h" | |
| #include "GrRecordingContext.h" | |
| #include "GrRecordingContextPriv.h" | |
| #include "SkGr.h" | |
| #include "../private/GrAuditTrail.h" | |
| #define ASSERT_SINGLE_OWNER \ | |
| SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(this->singleOwner());) | |
| #define RETURN_FALSE_IF_ABANDONED if (this->fContext->priv().abandoned()) { return false; } | |
| // 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(GrRecordingContext* context, | |
| GrPixelConfig config, | |
| sk_sp<SkColorSpace> colorSpace) | |
| : fContext(context) | |
| , fColorSpaceInfo(std::move(colorSpace), config) { | |
| } | |
| GrAuditTrail* GrSurfaceContext::auditTrail() { | |
| return fContext->priv().auditTrail(); | |
| } | |
| GrDrawingManager* GrSurfaceContext::drawingManager() { | |
| return fContext->priv().drawingManager(); | |
| } | |
| const GrDrawingManager* GrSurfaceContext::drawingManager() const { | |
| return fContext->priv().drawingManager(); | |
| } | |
| #ifdef SK_DEBUG | |
| GrSingleOwner* GrSurfaceContext::singleOwner() { | |
| return fContext->priv().singleOwner(); | |
| } | |
| #endif | |
| bool GrSurfaceContext::readPixels(const SkImageInfo& dstInfo, void* dstBuffer, | |
| size_t dstRowBytes, int x, int y, uint32_t flags) { | |
| ASSERT_SINGLE_OWNER | |
| RETURN_FALSE_IF_ABANDONED | |
| SkDEBUGCODE(this->validate();) | |
| GR_AUDIT_TRAIL_AUTO_FRAME(this->auditTrail(), "GrSurfaceContext::readPixels"); | |
| // TODO: this seems to duplicate code in SkImage_Gpu::onReadPixels | |
| if (kUnpremul_SkAlphaType == dstInfo.alphaType() && | |
| !GrPixelConfigIsOpaque(this->asSurfaceProxy()->config())) { | |
| flags |= GrContextPriv::kUnpremul_PixelOpsFlag; | |
| } | |
| auto colorType = SkColorTypeToGrColorType(dstInfo.colorType()); | |
| if (GrColorType::kUnknown == colorType) { | |
| return false; | |
| } | |
| auto direct = fContext->priv().asDirectContext(); | |
| if (!direct) { | |
| return false; | |
| } | |
| return direct->priv().readSurfacePixels(this, x, y, dstInfo.width(), dstInfo.height(), | |
| colorType, dstInfo.colorSpace(), dstBuffer, | |
| dstRowBytes, flags); | |
| } | |
| bool GrSurfaceContext::writePixels(const SkImageInfo& srcInfo, const void* srcBuffer, | |
| size_t srcRowBytes, int x, int y, uint32_t flags) { | |
| ASSERT_SINGLE_OWNER | |
| RETURN_FALSE_IF_ABANDONED | |
| SkDEBUGCODE(this->validate();) | |
| GR_AUDIT_TRAIL_AUTO_FRAME(this->auditTrail(), "GrSurfaceContext::writePixels"); | |
| if (kUnpremul_SkAlphaType == srcInfo.alphaType()) { | |
| flags |= GrContextPriv::kUnpremul_PixelOpsFlag; | |
| } | |
| auto colorType = SkColorTypeToGrColorType(srcInfo.colorType()); | |
| if (GrColorType::kUnknown == colorType) { | |
| return false; | |
| } | |
| auto direct = fContext->priv().asDirectContext(); | |
| if (!direct) { | |
| return false; | |
| } | |
| return direct->priv().writeSurfacePixels(this, x, y, srcInfo.width(), srcInfo.height(), | |
| colorType, srcInfo.colorSpace(), srcBuffer, | |
| srcRowBytes, flags); | |
| } | |
| bool GrSurfaceContext::copy(GrSurfaceProxy* src, const SkIRect& srcRect, const SkIPoint& dstPoint) { | |
| ASSERT_SINGLE_OWNER | |
| RETURN_FALSE_IF_ABANDONED | |
| SkDEBUGCODE(this->validate();) | |
| GR_AUDIT_TRAIL_AUTO_FRAME(this->auditTrail(), "GrSurfaceContext::copy"); | |
| if (!fContext->priv().caps()->canCopySurface(this->asSurfaceProxy(), src, srcRect, | |
| dstPoint)) { | |
| return false; | |
| } | |
| return this->getOpList()->copySurface(fContext, this->asSurfaceProxy(), | |
| src, srcRect, dstPoint); | |
| } |