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