blob: 2bde24baf5f566f4e27a973a74be54186cd3f40e [file] [log] [blame]
/*
* 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<SkColorSpace> 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);
}