michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "GrRenderTarget.h" michael@0: michael@0: #include "GrContext.h" michael@0: #include "GrGpu.h" michael@0: #include "GrStencilBuffer.h" michael@0: michael@0: bool GrRenderTarget::readPixels(int left, int top, int width, int height, michael@0: GrPixelConfig config, michael@0: void* buffer, michael@0: size_t rowBytes, michael@0: uint32_t pixelOpsFlags) { michael@0: // go through context so that all necessary flushing occurs michael@0: GrContext* context = this->getContext(); michael@0: if (NULL == context) { michael@0: return false; michael@0: } michael@0: return context->readRenderTargetPixels(this, michael@0: left, top, width, height, michael@0: config, buffer, rowBytes, michael@0: pixelOpsFlags); michael@0: } michael@0: michael@0: void GrRenderTarget::writePixels(int left, int top, int width, int height, michael@0: GrPixelConfig config, michael@0: const void* buffer, michael@0: size_t rowBytes, michael@0: uint32_t pixelOpsFlags) { michael@0: // go through context so that all necessary flushing occurs michael@0: GrContext* context = this->getContext(); michael@0: if (NULL == context) { michael@0: return; michael@0: } michael@0: context->writeRenderTargetPixels(this, michael@0: left, top, width, height, michael@0: config, buffer, rowBytes, michael@0: pixelOpsFlags); michael@0: } michael@0: michael@0: void GrRenderTarget::resolve() { michael@0: // go through context so that all necessary flushing occurs michael@0: GrContext* context = this->getContext(); michael@0: if (NULL == context) { michael@0: return; michael@0: } michael@0: context->resolveRenderTarget(this); michael@0: } michael@0: michael@0: size_t GrRenderTarget::sizeInBytes() const { michael@0: size_t colorBits; michael@0: if (kUnknown_GrPixelConfig == fDesc.fConfig) { michael@0: colorBits = 32; // don't know, make a guess michael@0: } else { michael@0: colorBits = GrBytesPerPixel(fDesc.fConfig); michael@0: } michael@0: uint64_t size = fDesc.fWidth; michael@0: size *= fDesc.fHeight; michael@0: size *= colorBits; michael@0: size *= GrMax(1, fDesc.fSampleCnt); michael@0: return (size_t)(size / 8); michael@0: } michael@0: michael@0: void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) { michael@0: if (kCanResolve_ResolveType == getResolveType()) { michael@0: if (NULL != rect) { michael@0: fResolveRect.join(*rect); michael@0: if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { michael@0: fResolveRect.setEmpty(); michael@0: } michael@0: } else { michael@0: fResolveRect.setLTRB(0, 0, this->width(), this->height()); michael@0: } michael@0: } michael@0: } michael@0: michael@0: void GrRenderTarget::overrideResolveRect(const SkIRect rect) { michael@0: fResolveRect = rect; michael@0: if (fResolveRect.isEmpty()) { michael@0: fResolveRect.setLargestInverted(); michael@0: } else { michael@0: if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { michael@0: fResolveRect.setLargestInverted(); michael@0: } michael@0: } michael@0: } michael@0: michael@0: void GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) { michael@0: SkRefCnt_SafeAssign(fStencilBuffer, stencilBuffer); michael@0: } michael@0: michael@0: void GrRenderTarget::onRelease() { michael@0: this->setStencilBuffer(NULL); michael@0: michael@0: INHERITED::onRelease(); michael@0: } michael@0: michael@0: void GrRenderTarget::onAbandon() { michael@0: this->setStencilBuffer(NULL); michael@0: michael@0: INHERITED::onAbandon(); michael@0: }