Change SkAutoMaskImage so that we're less likely to write leaky code.

http://codereview.appspot.com/5180047/


git-svn-id: http://skia.googlecode.com/svn/trunk@2409 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
bungeman@google.com 2011-10-04 21:25:00 +00:00
parent a30bc82a2e
commit 02f5584185
5 changed files with 12 additions and 18 deletions

View File

@ -97,16 +97,13 @@ protected:
Stack class used to manage the fImage buffer in a SkMask.
When this object loses scope, the buffer is freed with SkMask::FreeImage().
*/
class SkAutoMaskImage {
class SkAutoMaskFreeImage {
public:
SkAutoMaskImage(SkMask* mask, bool alloc) {
if (alloc) {
mask->fImage = SkMask::AllocImage(mask->computeImageSize());
}
fImage = mask->fImage;
SkAutoMaskFreeImage(uint8_t* maskImage) {
fImage = maskImage;
}
~SkAutoMaskImage() {
~SkAutoMaskFreeImage() {
SkMask::FreeImage(fImage);
}
private:

View File

@ -1326,15 +1326,14 @@ bool SkBitmap::extractAlpha(SkBitmap* dst, const SkPaint* paint,
tmpBitmap.swap(*dst);
return true;
}
SkAutoMaskImage srcCleanup(&srcM, true);
srcM.fImage = SkMask::AllocImage(srcM.computeImageSize());
SkAutoMaskFreeImage srcCleanup(srcM.fImage);
GetBitmapAlpha(*this, srcM.fImage, srcM.fRowBytes);
if (!filter->filterMask(&dstM, srcM, identity, NULL)) {
goto NO_FILTER_CASE;
}
SkAutoMaskImage dstCleanup(&dstM, false);
SkAutoMaskFreeImage dstCleanup(dstM.fImage);
tmpBitmap.setConfig(SkBitmap::kA8_Config, dstM.fBounds.width(),
dstM.fBounds.height(), dstM.fRowBytes);

View File

@ -791,7 +791,7 @@ void SkDraw::drawDevMask(const SkMask& srcM, const SkPaint& paint) const {
} else {
dstM.fImage = NULL;
}
SkAutoMaskImage ami(&dstM, false);
SkAutoMaskFreeImage ami(dstM.fImage);
if (fBounder && !fBounder->doIRect(mask->fBounds)) {
return;

View File

@ -28,14 +28,13 @@ bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
return false;
}
SkAutoMaskImage autoSrc(&srcM, false);
SkAutoMaskFreeImage autoSrc(srcM.fImage);
if (!this->filterMask(&dstM, srcM, matrix, NULL)) {
return false;
}
SkAutoMaskFreeImage autoDst(dstM.fImage);
SkAutoMaskImage autoDst(&dstM, false);
SkRegion::Cliperator clipper(clip, dstM.fBounds);
if (!clipper.done() && (bounder == NULL || bounder->doIRect(dstM.fBounds))) {

View File

@ -926,14 +926,13 @@ static bool drawWithMaskFilter(GrContext* context, const SkPath& path,
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
return false;
}
SkAutoMaskImage autoSrc(&srcM, false);
SkAutoMaskFreeImage autoSrc(srcM.fImage);
if (!filter->filterMask(&dstM, srcM, matrix, NULL)) {
return false;
}
// this will free-up dstM when we're done (allocated in filterMask())
SkAutoMaskImage autoDst(&dstM, false);
SkAutoMaskFreeImage autoDst(dstM.fImage);
if (clip.quickReject(dstM.fBounds)) {
return false;