diff options
author | Ben Wagner <bungeman@google.com> | 2018-05-10 23:00:51 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-11 17:12:57 +0000 |
commit | 1b17adb0f8bb19445aa66754a5dce9629f7ac560 (patch) | |
tree | dc22eca69f9ee8d34d7f0178970722ec00f952e1 /src/core/SkMask.h | |
parent | b35002d323134e2a441ce2f912a305cd9b3bd321 (diff) |
Avoid possible memory leak with inner blurs.
If the inner blur dst is too big, SkBlurMask::BoxBlur can return without
freeing the intermediate blur mask. Fix this by using SkAutoMaskFreeImage.
Use SkAutoMaskFreeImage instead of custom SkAutoTCallVProc in
SkBlurMask::BlurGroundTruth.
Make SkAutoMaskFreeImage a special kind of std::unique_ptr.
Change-Id: I93dc54265416ca69254633b00f14be75009d990f
Reviewed-on: https://skia-review.googlesource.com/127402
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Ben Wagner <bungeman@google.com>
Diffstat (limited to 'src/core/SkMask.h')
-rw-r--r-- | src/core/SkMask.h | 24 |
1 files changed, 4 insertions, 20 deletions
diff --git a/src/core/SkMask.h b/src/core/SkMask.h index 395eecc44b..337664d9da 100644 --- a/src/core/SkMask.h +++ b/src/core/SkMask.h @@ -14,6 +14,8 @@ #include "SkRect.h" #include "SkTemplates.h" +#include <memory> + /** \class SkMask SkMask is used to describe alpha bitmaps, either 1bit, 8bit, or the 3-channel 3D format. These are passed to SkMaskFilter objects. @@ -229,30 +231,12 @@ template <> struct SkMask::AlphaIter<SkMask::kLCD16_Format> { /////////////////////////////////////////////////////////////////////////////// /** - * \class SkAutoMaskImage + * \using SkAutoMaskImage * * Stack class used to manage the fImage buffer in a SkMask. * When this object loses scope, the buffer is freed with SkMask::FreeImage(). */ -class SkAutoMaskFreeImage { -public: - SkAutoMaskFreeImage(uint8_t* maskImage) { - fImage = maskImage; - } - - ~SkAutoMaskFreeImage() { - SkMask::FreeImage(fImage); - } - - uint8_t* release() { - uint8_t* tmp = fImage; - fImage = nullptr; - return tmp; - } - -private: - uint8_t* fImage; -}; +using SkAutoMaskFreeImage = std::unique_ptr<uint8_t,SkFunctionWrapper<void,void,SkMask::FreeImage>>; #define SkAutoMaskFreeImage(...) SK_REQUIRE_LOCAL_VAR(SkAutoMaskFreeImage) #endif |