Fix some ref leaks
Review URL: http://codereview.appspot.com/4837068/
git-svn-id: http://skia.googlecode.com/svn/trunk@2082 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp
index 620a895..692df0e 100644
--- a/gpu/src/GrGpuGL.cpp
+++ b/gpu/src/GrGpuGL.cpp
@@ -598,7 +598,7 @@
kTextureRenderTarget_GrPlatformSurfaceType == desc.fSurfaceType;
GrGLRenderTarget::Desc rtDesc;
- GrGLStencilBuffer* sb = NULL;
+ SkAutoTUnref<GrGLStencilBuffer> sb;
if (isRenderTarget) {
rtDesc.fRTFBOID = desc.fPlatformRenderTarget;
@@ -638,8 +638,8 @@
format.fPacked = false;
format.fStencilBits = desc.fStencilBits;
format.fTotalBits = desc.fStencilBits;
- sb = new GrGLStencilBuffer(this, 0, desc.fWidth,
- desc.fHeight, rtDesc.fSampleCnt, format);
+ sb.reset(new GrGLStencilBuffer(this, 0, desc.fWidth, desc.fHeight,
+ rtDesc.fSampleCnt, format));
}
rtDesc.fOwnIDs = false;
}
@@ -667,7 +667,7 @@
params.invalidate(); // rather than do glGets.
if (isRenderTarget) {
GrTexture* tex = new GrGLTexture(this, texDesc, rtDesc, params);
- tex->asRenderTarget()->setStencilBuffer(sb);
+ tex->asRenderTarget()->setStencilBuffer(sb.get());
return tex;
} else {
return new GrGLTexture(this, texDesc, params);
@@ -680,7 +680,7 @@
viewport.fHeight = desc.fHeight;
GrGLRenderTarget* rt = new GrGLRenderTarget(this, rtDesc, viewport);
- rt->setStencilBuffer(sb);
+ rt->setStencilBuffer(sb.get());
return rt;
}
}
@@ -839,7 +839,7 @@
int stencilBits = get_fbo_stencil_bits(arbFBO);
GR_GL_GetIntegerv(GR_GL_SAMPLES, &rtDesc.fSampleCnt);
- GrGLStencilBuffer* sb = NULL;
+ SkAutoTUnref<GrGLStencilBuffer> sb;
if (stencilBits) {
GrGLStencilBuffer::Format format;
// we could query this but we don't really need it
@@ -847,9 +847,9 @@
format.fPacked = false;
format.fStencilBits = stencilBits;
format.fTotalBits = stencilBits;
- sb = new GrGLStencilBuffer(this, 0, viewport.fWidth,
- viewport.fHeight, rtDesc.fSampleCnt,
- format);
+ sb.reset(new GrGLStencilBuffer(this, 0, viewport.fWidth,
+ viewport.fHeight, rtDesc.fSampleCnt,
+ format));
}
GrGLenum fmat = get_fbo_color_format();
@@ -865,7 +865,7 @@
rtDesc.fOwnIDs = false;
GrGLRenderTarget* target = new GrGLRenderTarget(this, rtDesc, viewport);
- target->setStencilBuffer(sb);
+ target->setStencilBuffer(sb.get());
return target;
}
diff --git a/include/core/SkRefCnt.h b/include/core/SkRefCnt.h
index 6dbf720..4c9376b 100644
--- a/include/core/SkRefCnt.h
+++ b/include/core/SkRefCnt.h
@@ -101,11 +101,16 @@
*/
template <typename T> class SkAutoTUnref : SkNoncopyable {
public:
- SkAutoTUnref(T* obj) : fObj(obj) {}
+ explicit SkAutoTUnref(T* obj = NULL) : fObj(obj) {}
~SkAutoTUnref() { SkSafeUnref(fObj); }
T* get() const { return fObj; }
+ void reset(T* obj) {
+ SkSafeUnref(fObj);
+ fObj = obj;
+ }
+
/**
* Return the hosted object (which may be null), transferring ownership.
* The reference count is not modified, and the internal ptr is set to NULL
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index c3754dc..874ed8e 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -130,8 +130,10 @@
}
static SkBitmap make_bitmap(GrContext* context, GrRenderTarget* renderTarget) {
+ SkAutoTUnref<GrRenderTarget> rtunref;
if (SkGpuDevice::Current3DApiRenderTarget() == renderTarget) {
renderTarget = context->createRenderTargetFrom3DApiState();
+ rtunref.reset(renderTarget);
}
GrTexture* texture = renderTarget->asTexture();
GrPixelConfig config = texture ? texture->config() : kRGBA_8888_GrPixelConfig;