зеркало из https://github.com/mozilla/moz-skia.git
Fix leaks in blurrect benchs and gm.
Review URL: https://codereview.appspot.com/7071060 git-svn-id: http://skia.googlecode.com/svn/trunk@7142 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
b00d670114
Коммит
33cdbdea3d
|
@ -91,6 +91,7 @@ protected:
|
|||
SkMask mask;
|
||||
SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style,
|
||||
SkBlurMask::kHigh_Quality);
|
||||
SkMask::FreeImage(mask.fImage);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -104,12 +105,18 @@ public:
|
|||
} else {
|
||||
name.printf("blurrect_separable_%d", SkScalarRound(rad));
|
||||
}
|
||||
|
||||
setName(name);
|
||||
fSrcMask.fImage = NULL;
|
||||
}
|
||||
|
||||
~BlurRectSeparableBench() {
|
||||
SkMask::FreeImage(fSrcMask.fImage);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
|
||||
SkMask::FreeImage(fSrcMask.fImage);
|
||||
|
||||
r.roundOut(&fSrcMask.fBounds);
|
||||
fSrcMask.fFormat = SkMask::kA8_Format;
|
||||
fSrcMask.fRowBytes = fSrcMask.fBounds.width();
|
||||
|
@ -123,6 +130,7 @@ protected:
|
|||
SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(),
|
||||
SkBlurMask::kNormal_Style,
|
||||
SkBlurMask::kHigh_Quality);
|
||||
SkMask::FreeImage(mask.fImage);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -140,11 +140,11 @@ class BlurRectCompareGM : public skiagm::GM {
|
|||
unsigned int fRectWidth, fRectHeight;
|
||||
SkScalar fRadius;
|
||||
public:
|
||||
BlurRectCompareGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, float radius) :
|
||||
fName(name)
|
||||
, fRectWidth( rectWidth )
|
||||
, fRectHeight( rectHeight )
|
||||
, fRadius( radius )
|
||||
BlurRectCompareGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, float radius)
|
||||
: fName(name)
|
||||
, fRectWidth(rectWidth)
|
||||
, fRectHeight(rectHeight)
|
||||
, fRadius(radius)
|
||||
{}
|
||||
|
||||
int width() const { return fRectWidth; }
|
||||
|
@ -160,7 +160,7 @@ protected:
|
|||
return SkISize::Make(640, 480);
|
||||
}
|
||||
|
||||
virtual void makeMask( SkMask *m, const SkRect& ) = 0;
|
||||
virtual void makeMask(SkMask *m, const SkRect&) = 0;
|
||||
|
||||
virtual void onDraw(SkCanvas* canvas) {
|
||||
SkRect r;
|
||||
|
@ -168,7 +168,8 @@ protected:
|
|||
|
||||
SkMask mask;
|
||||
|
||||
makeMask(&mask, r);
|
||||
this->makeMask(&mask, r);
|
||||
SkAutoMaskFreeImage amfi(mask.fImage);
|
||||
|
||||
SkBitmap bm;
|
||||
bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(), mask.fBounds.height());
|
||||
|
@ -186,10 +187,10 @@ class BlurRectFastGM: public BlurRectCompareGM {
|
|||
public:
|
||||
BlurRectFastGM(const char name[], unsigned int rect_width,
|
||||
unsigned int rect_height, float blur_radius) :
|
||||
BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
|
||||
BlurRectCompareGM(name, rect_width, rect_height, blur_radius) {}
|
||||
protected:
|
||||
virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
|
||||
SkBlurMask::BlurRect( m, r, radius(), SkBlurMask::kNormal_Style,
|
||||
virtual void makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
|
||||
SkBlurMask::BlurRect(m, r, radius(), SkBlurMask::kNormal_Style,
|
||||
SkBlurMask::kHigh_Quality );
|
||||
}
|
||||
};
|
||||
|
@ -199,17 +200,18 @@ public:
|
|||
BlurRectSlowGM(const char name[], unsigned int rect_width, unsigned int rect_height, float blur_radius) :
|
||||
BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
|
||||
protected:
|
||||
virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
|
||||
virtual void makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
|
||||
SkMask src;
|
||||
r.roundOut(&src.fBounds);
|
||||
src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin
|
||||
src.fFormat = SkMask::kA8_Format;
|
||||
src.fRowBytes = src.fBounds.width();
|
||||
src.fImage = SkMask::AllocImage( src.computeTotalImageSize() );
|
||||
SkAutoMaskFreeImage amfi(src.fImage);
|
||||
|
||||
memset( src.fImage, 0xff, src.computeTotalImageSize() );
|
||||
memset(src.fImage, 0xff, src.computeTotalImageSize());
|
||||
|
||||
SkBlurMask::BlurSeparable( m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality );
|
||||
SkBlurMask::BlurSeparable(m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -852,7 +852,7 @@ static void clamp_with_orig(uint8_t dst[], int dstRowBytes,
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// we use a local funciton to wrap the class static method to work around
|
||||
// we use a local function to wrap the class static method to work around
|
||||
// a bug in gcc98
|
||||
void SkMask_FreeImage(uint8_t* image);
|
||||
void SkMask_FreeImage(uint8_t* image) {
|
||||
|
@ -1086,7 +1086,7 @@ static int compute_profile( SkScalar radius, unsigned int **profile_out ) {
|
|||
int size = SkScalarFloorToInt(radius * 3 + 1);
|
||||
int center = size >> 1;
|
||||
|
||||
unsigned int *profile = new unsigned int [size];
|
||||
unsigned int *profile = SkNEW_ARRAY(unsigned int, size);
|
||||
|
||||
float invr = 1.0f/radius;
|
||||
|
||||
|
@ -1118,6 +1118,7 @@ bool SkBlurMask::BlurRect(SkMask *dst, const SkRect &src,
|
|||
float radius = SkScalarToFloat( SkScalarMul( provided_radius, kBlurRadiusFudgeFactor ) );
|
||||
|
||||
profile_size = compute_profile( radius, &profile );
|
||||
SkAutoTDeleteArray<unsigned int> ada(profile);
|
||||
|
||||
int pad = (int) (radius * 1.5f + 1);
|
||||
if (margin) {
|
||||
|
@ -1142,8 +1143,6 @@ bool SkBlurMask::BlurRect(SkMask *dst, const SkRect &src,
|
|||
|
||||
dst->fImage = dp;
|
||||
|
||||
SkAutoTCallVProc<uint8_t, SkMask_FreeImage> autoCall(dp);
|
||||
|
||||
int dst_height = dst->fBounds.height();
|
||||
int dst_width = dst->fBounds.width();
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче