Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CCSpriteCache] allow re-add plist & add testcase #19175

Merged
merged 5 commits into from
Nov 19, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 16 additions & 14 deletions cocos/2d/CCSpriteFrameCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,11 +349,11 @@ void SpriteFrameCache::addSpriteFramesWithDictionary(ValueMap& dict, const std::
}

void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist, Texture2D *texture)
{
if (_spriteFramesCache.hasPlist(plist))
{
return; // We already added it
}
{ //// allow redundant adding
//if (_spriteFramesCache.hasPlist(plist))
//{
// return; // We already added it
//}

std::string fullPath = FileUtils::getInstance()->fullPathForFilename(plist);
ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(fullPath);
Expand All @@ -370,10 +370,11 @@ void SpriteFrameCache::addSpriteFramesWithFileContent(const std::string& plist_c
void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist, const std::string& textureFileName)
{
CCASSERT(textureFileName.size()>0, "texture name should not be null");
if (_spriteFramesCache.hasPlist(plist))
{
return; // We already added it
}
//// allow redundant adding
PatriceJiang marked this conversation as resolved.
Show resolved Hide resolved
//if (_spriteFramesCache.hasPlist(plist))
//{
// return; // We already added it
//}
const std::string fullPath = FileUtils::getInstance()->fullPathForFilename(plist);
ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(fullPath);
addSpriteFramesWithDictionary(dict, textureFileName, plist);
Expand All @@ -391,8 +392,8 @@ void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist)
return;
}

if (!_spriteFramesCache.hasPlist(plist))
{
//if (!_spriteFramesCache.hasPlist(plist)) //should allow redundant adding
//{
ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(fullPath);

string texturePath("");
Expand Down Expand Up @@ -424,7 +425,7 @@ void SpriteFrameCache::addSpriteFramesWithFile(const std::string& plist)
CCLOG("cocos2d: SpriteFrameCache: Trying to use file %s as texture", texturePath.c_str());
}
addSpriteFramesWithDictionary(dict, texturePath, plist);
PatriceJiang marked this conversation as resolved.
Show resolved Hide resolved
}
//}
}

bool SpriteFrameCache::isSpriteFramesWithFileLoaded(const std::string& plist) const
Expand Down Expand Up @@ -813,8 +814,9 @@ bool SpriteFrameCache::PlistFramesCache::hasFrame(const std::string &frame) cons

bool SpriteFrameCache::PlistFramesCache::hasPlist(const std::string &plist) const
drelaptop marked this conversation as resolved.
Show resolved Hide resolved
{
return _indexPlist2Frames.find(plist) != _indexPlist2Frames.end();
}
auto frames = _indexPlist2Frames.find(plist);
return frames != _indexPlist2Frames.end() && frames->second.size() > 0;
}

SpriteFrame * SpriteFrameCache::PlistFramesCache::at(const std::string &frame)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ USING_NS_CC;
SpriteFrameCacheTests::SpriteFrameCacheTests()
{
ADD_TEST_CASE(SpriteFrameCachePixelFormatTest);
ADD_TEST_CASE(SpriteFrameCacheLoadMultipleTimes);
}

SpriteFrameCachePixelFormatTest::SpriteFrameCachePixelFormatTest()
Expand Down Expand Up @@ -82,6 +83,46 @@ void SpriteFrameCachePixelFormatTest::loadSpriteFrames(const std::string &file,
const std::string textureInfo = StringUtils::format("%s: %.2f KB\r\n", texture->getStringForFormat(), memorySize);
infoLabel->setString(infoLabel->getString() + textureInfo);

SpriteFrameCache::getInstance()->removeSpriteFramesFromFile(file);
Director::getInstance()->getTextureCache()->removeTexture(texture);
}




SpriteFrameCacheLoadMultipleTimes::SpriteFrameCacheLoadMultipleTimes()
{
const Size screenSize = Director::getInstance()->getWinSize();

infoLabel = Label::create();
infoLabel->setAnchorPoint(Point(0.5f, 1.0f));
infoLabel->setAlignment(cocos2d::TextHAlignment::CENTER);
infoLabel->setPosition(screenSize.width * 0.5f, screenSize.height * 0.7f);
addChild(infoLabel);

// load atlas definition with specified PixelFormat and check that it matches to expected format
loadSpriteFrames("Images/sprite_frames_test/test_RGBA8888.plist", Texture2D::PixelFormat::RGBA8888);
loadSpriteFrames("Images/sprite_frames_test/test_RGBA8888.plist", Texture2D::PixelFormat::RGBA8888);
loadSpriteFrames("Images/sprite_frames_test/test_RGBA8888.plist", Texture2D::PixelFormat::RGBA8888);
loadSpriteFrames("Images/sprite_frames_test/test_RGBA8888.plist", Texture2D::PixelFormat::RGBA8888);


}


void SpriteFrameCacheLoadMultipleTimes::loadSpriteFrames(const std::string &file, cocos2d::Texture2D::PixelFormat expectedFormat)
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(file);
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(file);
SpriteFrame *spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("grossini.png");
Texture2D *texture = spriteFrame->getTexture();
const ssize_t bitsPerKB = 8 * 1024;
drelaptop marked this conversation as resolved.
Show resolved Hide resolved
const double memorySize = 1.0 * texture->getBitsPerPixelForFormat() * texture->getContentSizeInPixels().width * texture->getContentSizeInPixels().height / bitsPerKB;
CC_ASSERT(texture->getPixelFormat() == expectedFormat);

const std::string textureInfo = StringUtils::format("%s: %.2f KB\r\n", texture->getStringForFormat(), memorySize);
infoLabel->setString(infoLabel->getString() + textureInfo);

SpriteFrameCache::getInstance()->removeSpriteFramesFromFile(file);
Director::getInstance()->getTextureCache()->removeTexture(texture);
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,23 @@ class SpriteFrameCachePixelFormatTest : public TestCase
private:
void loadSpriteFrames(const std::string &file, cocos2d::Texture2D::PixelFormat expectedFormat);

private:
cocos2d::Label *infoLabel;
};

class SpriteFrameCacheLoadMultipleTimes : public TestCase
{
public:
CREATE_FUNC(SpriteFrameCacheLoadMultipleTimes);

virtual std::string title() const override { return "Load same plist multiple times"; }
virtual std::string subtitle() const override { return "It shouldn't crash"; }

SpriteFrameCacheLoadMultipleTimes();

private:
void loadSpriteFrames(const std::string &file, cocos2d::Texture2D::PixelFormat expectedFormat);

private:
cocos2d::Label *infoLabel;
};