Merge pull request #9 from fusijie/fix_spritepolygon2

fix memory leakage about operation=
This commit is contained in:
Hao Wu 2015-06-10 10:08:28 +08:00
commit db07e21a71
2 changed files with 48 additions and 49 deletions

View File

@ -35,6 +35,8 @@ THE SOFTWARE.
USING_NS_CC; USING_NS_CC;
static unsigned short quadIndices[]={0,1,2, 3,2,1};
PolygonInfo::PolygonInfo(const PolygonInfo& other): PolygonInfo::PolygonInfo(const PolygonInfo& other):
triangles(), triangles(),
isVertsOwner(true), isVertsOwner(true),
@ -51,28 +53,11 @@ rect()
memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short)); memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short));
}; };
void PolygonInfo::setQuad(V3F_C4B_T2F_Quad *quad)
{
if(nullptr != triangles.verts && isVertsOwner)
{
CC_SAFE_DELETE_ARRAY(triangles.verts);
}
if(nullptr != triangles.indices)
{
CC_SAFE_DELETE_ARRAY(triangles.indices);
}
isVertsOwner = false;
triangles.indices = new unsigned short[6]{0,1,2, 3,2,1};
triangles.vertCount = 4;
triangles.indexCount = 6;
triangles.verts = (V3F_C4B_T2F*)quad;
}
PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other) PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other)
{ {
if(this != &other) if(this != &other)
{ {
releaseVertsAndIndices();
filename = other.filename; filename = other.filename;
isVertsOwner = other.isVertsOwner; isVertsOwner = other.isVertsOwner;
rect = other.rect; rect = other.rect;
@ -85,18 +70,38 @@ PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other)
} }
return *this; return *this;
} }
PolygonInfo::~PolygonInfo() PolygonInfo::~PolygonInfo()
{ {
if(nullptr != triangles.verts && isVertsOwner) releaseVertsAndIndices();
{ }
CC_SAFE_DELETE_ARRAY(triangles.verts);
}
if(nullptr != triangles.indices) void PolygonInfo::setQuad(V3F_C4B_T2F_Quad *quad)
{
releaseVertsAndIndices();
isVertsOwner = false;
triangles.indices = quadIndices;
triangles.vertCount = 4;
triangles.indexCount = 6;
triangles.verts = (V3F_C4B_T2F*)quad;
}
void PolygonInfo::releaseVertsAndIndices()
{
if(isVertsOwner)
{ {
CC_SAFE_DELETE_ARRAY(triangles.indices); if(nullptr != triangles.verts)
{
CC_SAFE_DELETE_ARRAY(triangles.verts);
}
if(nullptr != triangles.indices)
{
CC_SAFE_DELETE_ARRAY(triangles.indices);
}
} }
} }
const unsigned int PolygonInfo::getVertCount() const const unsigned int PolygonInfo::getVertCount() const
{ {
return (unsigned int)triangles.vertCount; return (unsigned int)triangles.vertCount;
@ -117,8 +122,6 @@ const float PolygonInfo::getArea() const
return area; return area;
} }
AutoPolygon::AutoPolygon(const std::string &filename) AutoPolygon::AutoPolygon(const std::string &filename)
:_image(nullptr) :_image(nullptr)
,_data(nullptr) ,_data(nullptr)
@ -150,7 +153,6 @@ std::vector<Vec2> AutoPolygon::trace(const Rect& rect, const float& threshold)
Vec2 AutoPolygon::findFirstNoneTransparentPixel(const Rect& rect, const float& threshold) Vec2 AutoPolygon::findFirstNoneTransparentPixel(const Rect& rect, const float& threshold)
{ {
Vec2 first(rect.origin);
bool found = false; bool found = false;
Vec2 i; Vec2 i;
for(i.y = rect.origin.y; i.y < rect.origin.y+rect.size.height; i.y++) for(i.y = rect.origin.y; i.y < rect.origin.y+rect.size.height; i.y++)
@ -174,9 +176,9 @@ unsigned char AutoPolygon::getAlphaByIndex(const unsigned int& i)
{ {
return *(_data+i*4+3); return *(_data+i*4+3);
} }
unsigned char AutoPolygon::getAlphaByPos(const Vec2& i) unsigned char AutoPolygon::getAlphaByPos(const Vec2& pos)
{ {
return *(_data+((int)i.y*_width+(int)i.x)*4+3); return *(_data+((int)pos.y*_width+(int)pos.x)*4+3);
} }
unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold) unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold)
@ -193,9 +195,6 @@ unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned i
//NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel //NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel
auto fixedRect = Rect(rect.origin, rect.size-Size(2,2)); auto fixedRect = Rect(rect.origin, rect.size-Size(2,2));
Vec2 tl = Vec2(x-1, y-1); Vec2 tl = Vec2(x-1, y-1);
sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0; sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0;
Vec2 tr = Vec2(x, y-1); Vec2 tr = Vec2(x, y-1);
@ -485,7 +484,6 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon); co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
co.Execute(solution, epsilon); co.Execute(solution, epsilon);
ClipperLib::PolyNode* p = solution.GetFirst(); ClipperLib::PolyNode* p = solution.GetFirst();
if(!p) if(!p)
{ {
@ -499,7 +497,7 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
//turn the result into simply polygon (AKA, fix overlap) //turn the result into simply polygon (AKA, fix overlap)
//clamp into the specified rect //clamp into the specified rect
ClipperLib::Clipper cl= ClipperLib::Clipper(); ClipperLib::Clipper cl;
cl.StrictlySimple(true); cl.StrictlySimple(true);
cl.AddPath(p->Contour, ClipperLib::ptSubject, true); cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
//create the clipping rect //create the clipping rect
@ -524,11 +522,6 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
return outPoints; return outPoints;
} }
bool AutoPolygon::isAConvexPoint(const cocos2d::Vec2& p1, const cocos2d::Vec2& p2)
{
return p1.cross(p2) >0 ? true : false;
}
TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector<Vec2>& points) TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector<Vec2>& points)
{ {
// if there are less than 3 points, then we can't triangulate // if there are less than 3 points, then we can't triangulate

View File

@ -55,10 +55,14 @@ public:
* @return PolygonInfo object * @return PolygonInfo object
*/ */
PolygonInfo(): PolygonInfo():
triangles(),
isVertsOwner(true), isVertsOwner(true),
rect() rect(cocos2d::Rect::ZERO),
filename("")
{ {
triangles.verts = nullptr;
triangles.indices = nullptr;
triangles.vertCount = 0;
triangles.indexCount = 0;
}; };
/** /**
@ -85,10 +89,6 @@ public:
*/ */
void setQuad(V3F_C4B_T2F_Quad *quad); void setQuad(V3F_C4B_T2F_Quad *quad);
Rect rect;
std::string filename;
TrianglesCommand::Triangles triangles;
/** /**
* get vertex count * get vertex count
* @return number of vertices * @return number of vertices
@ -101,8 +101,15 @@ public:
*/ */
const float getArea() const; const float getArea() const;
Rect rect;
std::string filename;
TrianglesCommand::Triangles triangles;
protected: protected:
bool isVertsOwner; bool isVertsOwner;
private:
void releaseVertsAndIndices();
}; };
@ -238,7 +245,7 @@ protected:
unsigned int getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold); unsigned int getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold);
unsigned char getAlphaByIndex(const unsigned int& i); unsigned char getAlphaByIndex(const unsigned int& i);
unsigned char getAlphaByPos(const Vec2& i); unsigned char getAlphaByPos(const Vec2& pos);
int getIndexFromPos(const unsigned int& x, const unsigned int& y){return y*_width+x;}; int getIndexFromPos(const unsigned int& x, const unsigned int& y){return y*_width+x;};
cocos2d::Vec2 getPosFromIndex(const unsigned int& i){return cocos2d::Vec2(i%_width, i/_width);}; cocos2d::Vec2 getPosFromIndex(const unsigned int& i){return cocos2d::Vec2(i%_width, i/_width);};
@ -246,7 +253,6 @@ protected:
std::vector<cocos2d::Vec2> rdp(std::vector<cocos2d::Vec2> v, const float& optimization); std::vector<cocos2d::Vec2> rdp(std::vector<cocos2d::Vec2> v, const float& optimization);
float perpendicularDistance(const cocos2d::Vec2& i, const cocos2d::Vec2& start, const cocos2d::Vec2& end); float perpendicularDistance(const cocos2d::Vec2& i, const cocos2d::Vec2& start, const cocos2d::Vec2& end);
bool isAConvexPoint(const cocos2d::Vec2& p1, const cocos2d::Vec2& p2);
//real rect is the size that is in scale with the texture file //real rect is the size that is in scale with the texture file
Rect getRealRect(const Rect& rect); Rect getRealRect(const Rect& rect);