1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "GrRenderTarget.h" 11 12 #include "GrContext.h" 13 #include "GrGpu.h" 14 #include "GrStencilBuffer.h" 15 16 bool GrRenderTarget::readPixels(int left, int top, int width, int height, 17 GrPixelConfig config, 18 void* buffer, 19 size_t rowBytes, 20 uint32_t pixelOpsFlags) { 21 // go through context so that all necessary flushing occurs 22 GrContext* context = this->getContext(); 23 if (NULL == context) { 24 return false; 25 } 26 return context->readRenderTargetPixels(this, 27 left, top, width, height, 28 config, buffer, rowBytes, 29 pixelOpsFlags); 30 } 31 32 void GrRenderTarget::writePixels(int left, int top, int width, int height, 33 GrPixelConfig config, 34 const void* buffer, 35 size_t rowBytes, 36 uint32_t pixelOpsFlags) { 37 // go through context so that all necessary flushing occurs 38 GrContext* context = this->getContext(); 39 if (NULL == context) { 40 return; 41 } 42 context->writeRenderTargetPixels(this, 43 left, top, width, height, 44 config, buffer, rowBytes, 45 pixelOpsFlags); 46 } 47 48 void GrRenderTarget::resolve() { 49 // go through context so that all necessary flushing occurs 50 GrContext* context = this->getContext(); 51 if (NULL == context) { 52 return; 53 } 54 context->resolveRenderTarget(this); 55 } 56 57 size_t GrRenderTarget::sizeInBytes() const { 58 size_t colorBits; 59 if (kUnknown_GrPixelConfig == fDesc.fConfig) { 60 colorBits = 32; // don't know, make a guess 61 } else { 62 colorBits = GrBytesPerPixel(fDesc.fConfig); 63 } 64 uint64_t size = fDesc.fWidth; 65 size *= fDesc.fHeight; 66 size *= colorBits; 67 size *= GrMax(1, fDesc.fSampleCnt); 68 return (size_t)(size / 8); 69 } 70 71 void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) { 72 if (kCanResolve_ResolveType == getResolveType()) { 73 if (NULL != rect) { 74 fResolveRect.join(*rect); 75 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 76 fResolveRect.setEmpty(); 77 } 78 } else { 79 fResolveRect.setLTRB(0, 0, this->width(), this->height()); 80 } 81 } 82 } 83 84 void GrRenderTarget::overrideResolveRect(const SkIRect rect) { 85 fResolveRect = rect; 86 if (fResolveRect.isEmpty()) { 87 fResolveRect.setLargestInverted(); 88 } else { 89 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 90 fResolveRect.setLargestInverted(); 91 } 92 } 93 } 94 95 void GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) { 96 SkRefCnt_SafeAssign(fStencilBuffer, stencilBuffer); 97 } 98 99 void GrRenderTarget::onRelease() { 100 this->setStencilBuffer(NULL); 101 102 INHERITED::onRelease(); 103 } 104 105 void GrRenderTarget::onAbandon() { 106 this->setStencilBuffer(NULL); 107 108 INHERITED::onAbandon(); 109 } 110