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:
parent
a30bc82a2e
commit
02f5584185
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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))) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user