CacheGif::~CacheGif() { if(m_frameData.size() > 0) for(std::vector<GifSprieFrame*>::iterator iter = m_frameData.begin(); iter != m_frameData.end(); ) { GifSprieFrame* sprite = *iter; ++iter; uint32_t index = sprite->Index(); std::string gifFrameName = getGifFrameName(index); do { SpriteFrame* spriteFrame = sprite->getSpriteFrame(); CC_BREAK_IF(spriteFrame == NULL); bool spriteFrameInCache = SpriteFrameCache::getInstance()->getSpriteFrameByName(gifFrameName.c_str()) == spriteFrame; //1. just GifSprieFrame retain //2. CCSpriteFrameCache and GifSprieFrame retain //more. other gif CacheGif retain if(spriteFrame->getReferenceCount() == 1 || (spriteFrame->getReferenceCount() ==2 && spriteFrameInCache)) { Texture2D* texture = sprite->getSpriteFrame()->getTexture(); Director::getInstance()->getTextureCache()->removeTexture(texture); SpriteFrameCache::getInstance()->removeSpriteFramesFromTexture(texture); } } while (0); delete sprite; } }
// get CCSpriteFrame from cache or create with Bitmap's data SpriteFrame* CacheGif::getGifSpriteFrame(Bitmap* bm, int index) { std::string gifFrameName = getGifFrameName(index); SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(gifFrameName.c_str()); if(spriteFrame != NULL) { return spriteFrame; } do { Texture2D* texture = createTexture(bm,index,true); CC_BREAK_IF(! texture); spriteFrame = SpriteFrame::createWithTexture(texture, Rect(0,0,texture->getContentSize().width, texture->getContentSize().height)); CC_BREAK_IF(! spriteFrame); SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, gifFrameName.c_str()); } while (0); return spriteFrame; }
InstantGif::~InstantGif() { CC_SAFE_DELETE(m_movie); std::string texture = getGifFrameName(0); cocos2d::Director::getInstance()->getTextureCache()->removeTextureForKey(texture.c_str()); }