Merge branch 'develop' of https://github.com/cocos2d/cocos2d-x into Spine

This commit is contained in:
samuele3hu 2013-12-25 13:48:10 +08:00
commit 9fd64df099
61 changed files with 946 additions and 521 deletions

View File

@ -13,6 +13,7 @@ cocos2d-x-3.0beta0 ?? 2013
[FIX] Updates spine runtime to the latest version. [FIX] Updates spine runtime to the latest version.
[FIX] Uses `const std::string&` instead of `const char*`. [FIX] Uses `const std::string&` instead of `const char*`.
[FIX] LabelBMFont string can't be shown integrally. [FIX] LabelBMFont string can't be shown integrally.
[FIX] Deprecates FileUtils::getFileData, adds FileUtils::getStringFromFile/getDataFromFile.
[Android] [Android]
[NEW] build/android-build.sh: add supporting to generate .apk file [NEW] build/android-build.sh: add supporting to generate .apk file
[FIX] XMLHttpRequest receives wrong binary array. [FIX] XMLHttpRequest receives wrong binary array.

View File

@ -200,6 +200,11 @@ void ClippingNode::drawFullScreenQuadClearStencil()
void ClippingNode::visit() void ClippingNode::visit()
{ {
if(!_visible)
return;
kmGLPushMatrix();
transform();
//Add group command //Add group command
Renderer* renderer = Director::getInstance()->getRenderer(); Renderer* renderer = Director::getInstance()->getRenderer();
@ -222,7 +227,31 @@ void ClippingNode::visit()
afterDrawStencilCmd->func = CC_CALLBACK_0(ClippingNode::onAfterDrawStencil, this); afterDrawStencilCmd->func = CC_CALLBACK_0(ClippingNode::onAfterDrawStencil, this);
renderer->addCommand(afterDrawStencilCmd); renderer->addCommand(afterDrawStencilCmd);
Node::visit(); int i = 0;
if(!_children.empty())
{
sortAllChildren();
// draw children zOrder < 0
for( ; i < _children.size(); i++ )
{
auto node = _children.at(i);
if ( node && node->getZOrder() < 0 )
node->visit();
else
break;
}
// self draw
this->draw();
for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
(*it)->visit();
}
else
{
this->draw();
}
CustomCommand* afterVisitCmd = CustomCommand::getCommandPool().generateCommand(); CustomCommand* afterVisitCmd = CustomCommand::getCommandPool().generateCommand();
afterVisitCmd->init(0,_vertexZ); afterVisitCmd->init(0,_vertexZ);
@ -230,6 +259,8 @@ void ClippingNode::visit()
renderer->addCommand(afterVisitCmd); renderer->addCommand(afterVisitCmd);
renderer->popGroup(); renderer->popGroup();
kmGLPopMatrix();
} }
Node* ClippingNode::getStencil() const Node* ClippingNode::getStencil() const

View File

@ -1038,7 +1038,7 @@ CC_DEPRECATED_ATTRIBUTE typedef __Integer CCInteger;
CC_DEPRECATED_ATTRIBUTE typedef __Bool Bool; CC_DEPRECATED_ATTRIBUTE typedef __Bool Bool;
CC_DEPRECATED_ATTRIBUTE typedef __Bool CCBool; CC_DEPRECATED_ATTRIBUTE typedef __Bool CCBool;
CC_DEPRECATED_ATTRIBUTE typedef __String CCString; CC_DEPRECATED_ATTRIBUTE typedef __String CCString;
//CC_DEPRECATED_ATTRIBUTE typedef __String String; CC_DEPRECATED_ATTRIBUTE typedef __String String;
CC_DEPRECATED_ATTRIBUTE typedef __RGBAProtocol RGBAProtocol; CC_DEPRECATED_ATTRIBUTE typedef __RGBAProtocol RGBAProtocol;
CC_DEPRECATED_ATTRIBUTE typedef __NodeRGBA NodeRGBA; CC_DEPRECATED_ATTRIBUTE typedef __NodeRGBA NodeRGBA;

View File

@ -90,7 +90,6 @@ FT_Library FontFreeType::getFTLibrary()
FontFreeType::FontFreeType(bool dynamicGlyphCollection) FontFreeType::FontFreeType(bool dynamicGlyphCollection)
: _fontRef(nullptr), : _fontRef(nullptr),
_letterPadding(5), _letterPadding(5),
_ttfData(nullptr),
_dynamicGlyphCollection(dynamicGlyphCollection) _dynamicGlyphCollection(dynamicGlyphCollection)
{ {
if(_distanceFieldEnabled) if(_distanceFieldEnabled)
@ -101,13 +100,13 @@ bool FontFreeType::createFontObject(const std::string &fontName, int fontSize)
{ {
FT_Face face; FT_Face face;
ssize_t len = 0; _ttfData = FileUtils::getInstance()->getDataFromFile(fontName);
_ttfData = FileUtils::getInstance()->getFileData(fontName.c_str(), "rb", &len);
if (!_ttfData) if (_ttfData.isNull())
return false; return false;
// create the face from the data // create the face from the data
if (FT_New_Memory_Face(getFTLibrary(), _ttfData, len, 0, &face )) if (FT_New_Memory_Face(getFTLibrary(), _ttfData.getBytes(), _ttfData.getSize(), 0, &face ))
return false; return false;
//we want to use unicode //we want to use unicode
@ -136,11 +135,6 @@ FontFreeType::~FontFreeType()
{ {
FT_Done_Face(_fontRef); FT_Done_Face(_fontRef);
} }
if (_ttfData)
{
free(_ttfData);
_ttfData = nullptr;
}
} }
FontAtlas * FontFreeType::createFontAtlas() FontAtlas * FontFreeType::createFontAtlas()

View File

@ -25,11 +25,12 @@
#ifndef _FontFreetype_h_ #ifndef _FontFreetype_h_
#define _FontFreetype_h_ #define _FontFreetype_h_
#include "CCFont.h"
#include "CCData.h"
#include <string> #include <string>
#include <ft2build.h> #include <ft2build.h>
#include "CCFont.h"
#include FT_FREETYPE_H #include FT_FREETYPE_H
NS_CC_BEGIN NS_CC_BEGIN
@ -73,7 +74,7 @@ private:
FT_Face _fontRef; FT_Face _fontRef;
int _letterPadding; int _letterPadding;
std::string _fontName; std::string _fontName;
unsigned char* _ttfData; Data _ttfData;
bool _dynamicGlyphCollection; bool _dynamicGlyphCollection;
}; };

View File

@ -154,18 +154,18 @@ bool GLProgram::initWithVertexShaderByteArray(const GLchar* vShaderByteArray, co
bool GLProgram::initWithVertexShaderFilename(const char* vShaderFilename, const char* fShaderFilename) bool GLProgram::initWithVertexShaderFilename(const char* vShaderFilename, const char* fShaderFilename)
{ {
const GLchar * vertexSource = (GLchar*) String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(vShaderFilename).c_str())->getCString(); std::string vertexSource = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->fullPathForFilename(vShaderFilename).c_str());
const GLchar * fragmentSource = (GLchar*) String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(fShaderFilename).c_str())->getCString(); std::string fragmentSource = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->fullPathForFilename(fShaderFilename).c_str());
return initWithVertexShaderByteArray(vertexSource, fragmentSource); return initWithVertexShaderByteArray(vertexSource.c_str(), fragmentSource.c_str());
} }
std::string GLProgram::getDescription() const std::string GLProgram::getDescription() const
{ {
return String::createWithFormat("<GLProgram = " return StringUtils::format("<GLProgram = "
CC_FORMAT_PRINTF_SIZE_T CC_FORMAT_PRINTF_SIZE_T
" | Program = %i, VertexShader = %i, FragmentShader = %i>", " | Program = %i, VertexShader = %i, FragmentShader = %i>",
(size_t)this, _program, _vertShader, _fragShader)->getCString(); (size_t)this, _program, _vertShader, _fragShader);
} }
bool GLProgram::compileShader(GLuint * shader, GLenum type, const GLchar* source) bool GLProgram::compileShader(GLuint * shader, GLenum type, const GLchar* source)

View File

@ -184,13 +184,13 @@ std::set<unsigned int>* CCBMFontConfiguration::parseConfigFile(const std::string
{ {
std::string fullpath = FileUtils::getInstance()->fullPathForFilename(controlFile); std::string fullpath = FileUtils::getInstance()->fullPathForFilename(controlFile);
String *contents = String::createWithContentsOfFile(fullpath.c_str()); std::string contents = FileUtils::getInstance()->getStringFromFile(fullpath);
CCASSERT(contents, "CCBMFontConfiguration::parseConfigFile | Open file error.");
set<unsigned int> *validCharsString = new set<unsigned int>(); CCASSERT(!contents.empty(), "CCBMFontConfiguration::parseConfigFile | Open file error.");
std::set<unsigned int> *validCharsString = new std::set<unsigned int>();
if (!contents) if (contents.empty())
{ {
CCLOG("cocos2d: Error parsing FNTfile %s", controlFile.c_str()); CCLOG("cocos2d: Error parsing FNTfile %s", controlFile.c_str());
return nullptr; return nullptr;
@ -198,7 +198,7 @@ std::set<unsigned int>* CCBMFontConfiguration::parseConfigFile(const std::string
// parse spacing / padding // parse spacing / padding
std::string line; std::string line;
std::string strLeft = contents->getCString(); std::string strLeft(contents);
while (strLeft.length() > 0) while (strLeft.length() > 0)
{ {
size_t pos = strLeft.find('\n'); size_t pos = strLeft.find('\n');

View File

@ -673,7 +673,7 @@ bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat
std::string Texture2D::getDescription() const std::string Texture2D::getDescription() const
{ {
return String::createWithFormat("<Texture2D | Name = %u | Dimensions = %ld x %ld | Coordinates = (%.2f, %.2f)>", _name, (long)_pixelsWide, (long)_pixelsHigh, _maxS, _maxT)->getCString(); return StringUtils::format("<Texture2D | Name = %u | Dimensions = %ld x %ld | Coordinates = (%.2f, %.2f)>", _name, (long)_pixelsWide, (long)_pixelsHigh, _maxS, _maxT);
} }
// implementation Texture2D (Image) // implementation Texture2D (Image)

View File

@ -224,7 +224,7 @@ void TextureAtlas::listenBackToForeground(Object *obj)
std::string TextureAtlas::getDescription() const std::string TextureAtlas::getDescription() const
{ {
return String::createWithFormat("<TextureAtlas | totalQuads = %zd>", _totalQuads)->getCString(); return StringUtils::format("<TextureAtlas | totalQuads = %zd>", _totalQuads);
} }

View File

@ -89,7 +89,7 @@ void TextureCache::purgeSharedTextureCache()
std::string TextureCache::getDescription() const std::string TextureCache::getDescription() const
{ {
return String::createWithFormat("<TextureCache | Number of textures = %lu>", _textures.size() )->getCString(); return StringUtils::format("<TextureCache | Number of textures = %lu>", _textures.size());
} }
void TextureCache::addImageAsync(const std::string &path, Object *target, SEL_CallFuncO selector) void TextureCache::addImageAsync(const std::string &path, Object *target, SEL_CallFuncO selector)
@ -629,10 +629,10 @@ void VolatileTextureMgr::reloadAllTextures()
case VolatileTexture::kImageFile: case VolatileTexture::kImageFile:
{ {
Image* image = new Image(); Image* image = new Image();
ssize_t size = 0;
unsigned char* pBuffer = FileUtils::getInstance()->getFileData(vt->_fileName.c_str(), "rb", &size);
if (image && image->initWithImageData(pBuffer, size)) Data data = FileUtils::getInstance()->getDataFromFile(vt->_fileName);
if (image && image->initWithImageData(data.getBytes(), data.getSize()))
{ {
Texture2D::PixelFormat oldPixelFormat = Texture2D::getDefaultAlphaPixelFormat(); Texture2D::PixelFormat oldPixelFormat = Texture2D::getDefaultAlphaPixelFormat();
Texture2D::setDefaultAlphaPixelFormat(vt->_pixelFormat); Texture2D::setDefaultAlphaPixelFormat(vt->_pixelFormat);
@ -640,7 +640,6 @@ void VolatileTextureMgr::reloadAllTextures()
Texture2D::setDefaultAlphaPixelFormat(oldPixelFormat); Texture2D::setDefaultAlphaPixelFormat(oldPixelFormat);
} }
free(pBuffer);
CC_SAFE_RELEASE(image); CC_SAFE_RELEASE(image);
} }
break; break;

View File

@ -57,17 +57,16 @@ static tinyxml2::XMLElement* getXMLNodeForKey(const char* pKey, tinyxml2::XMLEle
{ {
tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument(); tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument();
*doc = xmlDoc; *doc = xmlDoc;
//CCFileData data(UserDefault::getInstance()->getXMLFilePath().c_str(),"rt");
ssize_t nSize; std::string xmlBuffer = FileUtils::getInstance()->getStringFromFile(UserDefault::getInstance()->getXMLFilePath());
char* pXmlBuffer = (char*)FileUtils::getInstance()->getFileData(UserDefault::getInstance()->getXMLFilePath().c_str(), "rb", &nSize);
//const char* pXmlBuffer = (const char*)data.getBuffer(); if (xmlBuffer.empty())
if(nullptr == pXmlBuffer)
{ {
CCLOG("can not read xml file"); CCLOG("can not read xml file");
break; break;
} }
xmlDoc->Parse(pXmlBuffer, nSize); xmlDoc->Parse(xmlBuffer.c_str(), xmlBuffer.size());
free(pXmlBuffer);
// get root node // get root node
*rootNode = xmlDoc->RootElement(); *rootNode = xmlDoc->RootElement();
if (nullptr == *rootNode) if (nullptr == *rootNode)
@ -288,12 +287,12 @@ string UserDefault::getStringForKey(const char* pKey, const std::string & defaul
return ret; return ret;
} }
Data* UserDefault::getDataForKey(const char* pKey) Data UserDefault::getDataForKey(const char* pKey)
{ {
return getDataForKey(pKey, nullptr); return getDataForKey(pKey, Data::Null);
} }
Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue) Data UserDefault::getDataForKey(const char* pKey, const Data& defaultValue)
{ {
const char* encodedData = nullptr; const char* encodedData = nullptr;
tinyxml2::XMLElement* rootNode; tinyxml2::XMLElement* rootNode;
@ -306,7 +305,7 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
encodedData = (const char*)(node->FirstChild()->Value()); encodedData = (const char*)(node->FirstChild()->Value());
} }
Data* ret = defaultValue; Data ret = defaultValue;
if (encodedData) if (encodedData)
{ {
@ -314,9 +313,7 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData); int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData);
if (decodedData) { if (decodedData) {
ret = Data::create(decodedData, decodedDataLen); ret.fastSet(decodedData, decodedDataLen);
free(decodedData);
} }
} }

View File

@ -104,12 +104,12 @@ public:
* @js NA * @js NA
* @lua NA * @lua NA
*/ */
Data* getDataForKey(const char* pKey); Data getDataForKey(const char* pKey);
/** /**
* @js NA * @js NA
* @lua NA * @lua NA
*/ */
Data* getDataForKey(const char* pKey, Data* defaultValue); Data getDataForKey(const char* pKey, const Data& defaultValue);
// set value methods // set value methods

View File

@ -73,16 +73,16 @@ static tinyxml2::XMLElement* getXMLNodeForKey(const char* pKey, tinyxml2::XMLDoc
{ {
tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument(); tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument();
*doc = xmlDoc; *doc = xmlDoc;
ssize_t size;
char* pXmlBuffer = (char*)FileUtils::getInstance()->getFileData(UserDefault::getInstance()->getXMLFilePath().c_str(), "rb", &size); std::string xmlBuffer = FileUtils::getInstance()->getStringFromFile(UserDefault::getInstance()->getXMLFilePath());
//const char* pXmlBuffer = (const char*)data.getBuffer();
if(nullptr == pXmlBuffer) if (xmlBuffer.empty())
{ {
NSLog(@"can not read xml file"); NSLog(@"can not read xml file");
break; break;
} }
xmlDoc->Parse(pXmlBuffer); xmlDoc->Parse(xmlBuffer.c_str(), xmlBuffer.size());
free(pXmlBuffer);
// get root node // get root node
rootNode = xmlDoc->RootElement(); rootNode = xmlDoc->RootElement();
if (nullptr == rootNode) if (nullptr == rootNode)
@ -363,12 +363,12 @@ string UserDefault::getStringForKey(const char* pKey, const std::string & defaul
} }
} }
Data* UserDefault::getDataForKey(const char* pKey) Data UserDefault::getDataForKey(const char* pKey)
{ {
return getDataForKey(pKey, nullptr); return getDataForKey(pKey, Data::Null);
} }
Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue) Data UserDefault::getDataForKey(const char* pKey, const Data& defaultValue)
{ {
#ifdef KEEP_COMPATABILITY #ifdef KEEP_COMPATABILITY
tinyxml2::XMLDocument* doc = nullptr; tinyxml2::XMLDocument* doc = nullptr;
@ -382,13 +382,12 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData); int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData);
if (decodedData) { if (decodedData) {
Data *ret = Data::create(decodedData, decodedDataLen); Data ret;
ret.fastSet(decodedData, decodedDataLen);
// set value in NSUserDefaults // set value in NSUserDefaults
setDataForKey(pKey, ret); setDataForKey(pKey, ret);
free(decodedData);
flush(); flush();
// delete xmle node // delete xmle node
@ -412,17 +411,8 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
} }
else else
{ {
unsigned char *bytes = {0}; Data ret;
int size = 0; ret.copy((unsigned char*)data.bytes, data.length);
if (data.length > 0) {
bytes = (unsigned char*)data.bytes;
size = static_cast<int>(data.length);
}
Data *ret = new Data(bytes, size);
ret->autorelease();
return ret; return ret;
} }
} }

View File

@ -75,15 +75,16 @@ static tinyxml2::XMLElement* getXMLNodeForKey(const char* pKey, tinyxml2::XMLDoc
tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument(); tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument();
*doc = xmlDoc; *doc = xmlDoc;
ssize_t size; ssize_t size;
char* pXmlBuffer = (char*)FileUtils::getInstance()->getFileData(UserDefault::getInstance()->getXMLFilePath().c_str(), "rb", &size);
//const char* pXmlBuffer = (const char*)data.getBuffer(); std::string xmlBuffer = FileUtils::getInstance()->getStringFromFile(UserDefault::getInstance()->getXMLFilePath().c_str());
if(nullptr == pXmlBuffer)
if (xmlBuffer.empty())
{ {
CCLOG("can not read xml file"); CCLOG("can not read xml file");
break; break;
} }
xmlDoc->Parse(pXmlBuffer); xmlDoc->Parse(xmlBuffer.c_str());
free(pXmlBuffer);
// get root node // get root node
rootNode = xmlDoc->RootElement(); rootNode = xmlDoc->RootElement();
if (nullptr == rootNode) if (nullptr == rootNode)
@ -335,12 +336,12 @@ string UserDefault::getStringForKey(const char* pKey, const std::string & defaul
return getStringForKeyJNI(pKey, defaultValue.c_str()); return getStringForKeyJNI(pKey, defaultValue.c_str());
} }
Data* UserDefault::getDataForKey(const char* pKey) Data UserDefault::getDataForKey(const char* pKey)
{ {
return getDataForKey(pKey, nullptr); return getDataForKey(pKey, Data::Null);
} }
Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue) Data UserDefault::getDataForKey(const char* pKey, const Data& defaultValue)
{ {
#ifdef KEEP_COMPATABILITY #ifdef KEEP_COMPATABILITY
tinyxml2::XMLDocument* doc = nullptr; tinyxml2::XMLDocument* doc = nullptr;
@ -355,12 +356,12 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData); int decodedDataLen = base64Decode((unsigned char*)encodedData, (unsigned int)strlen(encodedData), &decodedData);
if (decodedData) { if (decodedData) {
Data *ret = Data::create(decodedData, decodedDataLen); Data ret;
ret.fastSet(decodedData, decodedDataLen);
// set value in NSUserDefaults // set value in NSUserDefaults
setDataForKey(pKey, ret); setDataForKey(pKey, ret);
free(decodedData);
flush(); flush();
// delete xmle node // delete xmle node
@ -377,8 +378,8 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
} }
#endif #endif
char * encodedDefaultData = nullptr; char * encodedDefaultData = NULL;
unsigned int encodedDefaultDataLen = defaultValue ? base64Encode(defaultValue->getBytes(), defaultValue->getSize(), &encodedDefaultData) : 0; unsigned int encodedDefaultDataLen = !defaultValue.isNull() ? base64Encode(defaultValue.getBytes(), defaultValue.getSize(), &encodedDefaultData) : 0;
string encodedStr = getStringForKeyJNI(pKey, encodedDefaultData); string encodedStr = getStringForKeyJNI(pKey, encodedDefaultData);
@ -386,23 +387,19 @@ Data* UserDefault::getDataForKey(const char* pKey, Data* defaultValue)
free(encodedDefaultData); free(encodedDefaultData);
CCLOG("ENCODED STRING: --%s--%d", encodedStr.c_str(), encodedStr.length()); CCLOG("ENCODED STRING: --%s--%d", encodedStr.c_str(), encodedStr.length());
Data *ret = defaultValue; unsigned char * decodedData = NULL;
unsigned char * decodedData = nullptr;
int decodedDataLen = base64Decode((unsigned char*)encodedStr.c_str(), (unsigned int)encodedStr.length(), &decodedData); int decodedDataLen = base64Decode((unsigned char*)encodedStr.c_str(), (unsigned int)encodedStr.length(), &decodedData);
CCLOG("AFTER DECoDE. ret %p defaultValue %p", ret, defaultValue); CCLOG("DECODED DATA: %s %d", decodedData, decodedDataLen);
CCLOG("DECoDED DATA: %s %d", decodedData, decodedDataLen);
if (decodedData && decodedDataLen) { if (decodedData && decodedDataLen) {
ret = Data::create(decodedData, decodedDataLen); Data ret;
free(decodedData); ret.fastSet(decodedData, decodedDataLen);
return ret;
} }
CCLOG("RETURNED %p!", ret); return defaultValue;
return ret;
} }

View File

@ -26,6 +26,7 @@ THE SOFTWARE.
#include <stdlib.h> #include <stdlib.h>
#include "TGAlib.h" #include "TGAlib.h"
#include "CCData.h"
#include "platform/CCFileUtils.h" #include "platform/CCFileUtils.h"
NS_CC_BEGIN NS_CC_BEGIN
@ -272,15 +273,11 @@ tImageTGA* tgaLoadBuffer(unsigned char* buffer, long size)
// this is the function to call when we want to load an image // this is the function to call when we want to load an image
tImageTGA * tgaLoad(const char *filename) tImageTGA * tgaLoad(const char *filename)
{ {
ssize_t size = 0; Data data = FileUtils::getInstance()->getDataFromFile(filename);
unsigned char* buffer = FileUtils::getInstance()->getFileData(filename, "rb", &size);
if (buffer != nullptr) if (!data.isNull())
{ {
tImageTGA* data = tgaLoadBuffer(buffer, size); return tgaLoadBuffer(data.getBytes(), data.getSize());
free(buffer);
return data;
} }
return nullptr; return nullptr;

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "ZipUtils.h" #include "ZipUtils.h"
#include "CCData.h"
#include "ccMacros.h" #include "ccMacros.h"
#include "platform/CCFileUtils.h" #include "platform/CCFileUtils.h"
#include "unzip.h" #include "unzip.h"
@ -304,21 +305,15 @@ int ZipUtils::inflateGZipFile(const char *path, unsigned char **out)
bool ZipUtils::isCCZFile(const char *path) bool ZipUtils::isCCZFile(const char *path)
{ {
// load file into memory // load file into memory
unsigned char* compressed = nullptr; Data compressedData = FileUtils::getInstance()->getDataFromFile(path);
ssize_t fileLen = 0; if (compressedData.isNull())
compressed = FileUtils::getInstance()->getFileData(path, "rb", &fileLen);
if(compressed == nullptr || fileLen == 0)
{ {
CCLOG("cocos2d: ZipUtils: loading file failed"); CCLOG("cocos2d: ZipUtils: loading file failed");
return false; return false;
} }
bool ret = isCCZBuffer(compressed, fileLen); return isCCZBuffer(compressedData.getBytes(), compressedData.getSize());
free(compressed);
return ret;
} }
bool ZipUtils::isCCZBuffer(const unsigned char *buffer, ssize_t len) bool ZipUtils::isCCZBuffer(const unsigned char *buffer, ssize_t len)
@ -336,20 +331,15 @@ bool ZipUtils::isCCZBuffer(const unsigned char *buffer, ssize_t len)
bool ZipUtils::isGZipFile(const char *path) bool ZipUtils::isGZipFile(const char *path)
{ {
// load file into memory // load file into memory
unsigned char* compressed = nullptr; Data compressedData = FileUtils::getInstance()->getDataFromFile(path);
ssize_t fileLen = 0; if (compressedData.isNull())
compressed = FileUtils::getInstance()->getFileData(path, "rb", &fileLen);
if(nullptr == compressed || 0 == fileLen)
{ {
CCLOG("cocos2d: ZipUtils: loading file failed"); CCLOG("cocos2d: ZipUtils: loading file failed");
return false; return false;
} }
bool ret = isGZipBuffer(compressed, fileLen); return isGZipBuffer(compressedData.getBytes(), compressedData.getSize());
free(compressed);
return ret;
} }
bool ZipUtils::isGZipBuffer(const unsigned char *buffer, ssize_t len) bool ZipUtils::isGZipBuffer(const unsigned char *buffer, ssize_t len)
@ -455,24 +445,18 @@ int ZipUtils::inflateCCZBuffer(const unsigned char *buffer, ssize_t bufferLen, u
int ZipUtils::inflateCCZFile(const char *path, unsigned char **out) int ZipUtils::inflateCCZFile(const char *path, unsigned char **out)
{ {
CCAssert(out, ""); CCASSERT(out, "Invalid pointer for buffer!");
CCAssert(&*out, "");
// load file into memory // load file into memory
unsigned char* compressed = nullptr; Data compressedData = FileUtils::getInstance()->getDataFromFile(path);
ssize_t fileLen = 0; if (compressedData.isNull())
compressed = FileUtils::getInstance()->getFileData(path, "rb", &fileLen);
if(nullptr == compressed || 0 == fileLen)
{ {
CCLOG("cocos2d: Error loading CCZ compressed file"); CCLOG("cocos2d: Error loading CCZ compressed file");
return -1; return -1;
} }
int ret = inflateCCZBuffer(compressed, fileLen, out); return inflateCCZBuffer(compressedData.getBytes(), compressedData.getSize(), out);
free(compressed);
return ret;
} }
void ZipUtils::setPvrEncryptionKeyPart(int index, unsigned int value) void ZipUtils::setPvrEncryptionKeyPart(int index, unsigned int value)

View File

@ -23,6 +23,7 @@ THE SOFTWARE.
****************************************************************************/ ****************************************************************************/
#include "CCFileUtils.h" #include "CCFileUtils.h"
#include "CCData.h"
#include "ccMacros.h" #include "ccMacros.h"
#include "CCDirector.h" #include "CCDirector.h"
#include "CCSAXParser.h" #include "CCSAXParser.h"
@ -491,6 +492,69 @@ void FileUtils::purgeCachedEntries()
_fullPathCache.clear(); _fullPathCache.clear();
} }
static Data getData(const std::string& filename, bool forString)
{
CCASSERT(!filename.empty(), "Invalid filename!");
Data ret;
unsigned char* buffer = nullptr;
ssize_t size = 0;
const char* mode = nullptr;
if (forString)
mode = "rt";
else
mode = "rb";
do
{
// Read the file from hardware
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename);
FILE *fp = fopen(fullPath.c_str(), mode);
CC_BREAK_IF(!fp);
fseek(fp,0,SEEK_END);
size = ftell(fp);
fseek(fp,0,SEEK_SET);
if (forString)
{
buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + 1));
buffer[size] = '\0';
}
else
{
buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);
}
size = fread(buffer, sizeof(unsigned char), size, fp);
fclose(fp);
} while (0);
if (nullptr == buffer || 0 == size)
{
std::string msg = "Get data from file(";
msg.append(filename).append(") failed!");
CCLOG("%s", msg.c_str());
}
else
{
ret.fastSet(buffer, size);
}
return ret;
}
std::string FileUtils::getStringFromFile(const std::string& filename)
{
Data data = getData(filename, true);
std::string ret((const char*)data.getBytes());
return ret;
}
Data FileUtils::getDataFromFile(const std::string& filename)
{
return getData(filename, false);
}
unsigned char* FileUtils::getFileData(const char* filename, const char* mode, ssize_t *size) unsigned char* FileUtils::getFileData(const char* filename, const char* mode, ssize_t *size)
{ {
unsigned char * buffer = nullptr; unsigned char * buffer = nullptr;

View File

@ -30,6 +30,7 @@ THE SOFTWARE.
#include "CCPlatformMacros.h" #include "CCPlatformMacros.h"
#include "ccTypes.h" #include "ccTypes.h"
#include "CCValue.h" #include "CCValue.h"
#include "CCData.h"
NS_CC_BEGIN NS_CC_BEGIN
@ -75,16 +76,27 @@ public:
*/ */
virtual void purgeCachedEntries(); virtual void purgeCachedEntries();
/**
* Gets string from a file.
*/
virtual std::string getStringFromFile(const std::string& filename);
/**
* Creates binary data from a file.
* @return A data object.
*/
virtual Data getDataFromFile(const std::string& filename);
/** /**
* Gets resource file data * Gets resource file data
* *
* @param[in] filename The resource file name which contains the path. * @param[in] filename The resource file name which contains the path.
* @param[in] pszMode The read mode of the file. * @param[in] pszMode The read mode of the file.
* @param[out] pSize If the file read operation succeeds, it will be the data size, otherwise 0. * @param[out] pSize If the file read operation succeeds, it will be the data size, otherwise 0.
* @return Upon success, a pointer to the data is returned, otherwise nullptr. * @return Upon success, a pointer to the data is returned, otherwise NULL.
* @warning Recall: you are responsible for calling free() on any Non-nullptr pointer returned. * @warning Recall: you are responsible for calling free() on any Non-NULL pointer returned.
*/ */
virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t *size); CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t *size);
/** /**
* Gets resource file data from a zip file. * Gets resource file data from a zip file.

View File

@ -24,6 +24,7 @@ THE SOFTWARE.
#include "CCImage.h" #include "CCImage.h"
#include "CCData.h"
#include <string> #include <string>
#include <ctype.h> #include <ctype.h>
@ -420,15 +421,12 @@ bool Image::initWithImageFile(const char * strPath)
SDL_FreeSurface(iSurf); SDL_FreeSurface(iSurf);
#else #else
ssize_t bufferLen = 0; Data data = FileUtils::getInstance()->getDataFromFile(_filePath);
unsigned char* buffer = FileUtils::getInstance()->getFileData(_filePath.c_str(), "rb", &bufferLen);
if (buffer != nullptr && bufferLen > 0) if (!data.isNull())
{ {
bRet = initWithImageData(buffer, bufferLen); bRet = initWithImageData(data.getBytes(), data.getSize());
} }
free(buffer);
#endif // EMSCRIPTEN #endif // EMSCRIPTEN
return bRet; return bRet;
@ -437,19 +435,15 @@ bool Image::initWithImageFile(const char * strPath)
bool Image::initWithImageFileThreadSafe(const char *fullpath) bool Image::initWithImageFileThreadSafe(const char *fullpath)
{ {
bool ret = false; bool ret = false;
ssize_t dataLen = 0;
_filePath = fullpath; _filePath = fullpath;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
FileUtilsAndroid *fileUitls = (FileUtilsAndroid*)FileUtils::getInstance(); Data data = FileUtils::getInstance()->getDataFromFile(fullpath);
unsigned char *buffer = fileUitls->getFileDataForAsync(fullpath, "rb", &dataLen);
#else if (!data.isNull())
unsigned char *buffer = FileUtils::getInstance()->getFileData(fullpath, "rb", &dataLen);
#endif
if (buffer != NULL && dataLen > 0)
{ {
ret = initWithImageData(buffer, dataLen); ret = initWithImageData(data.getBytes(), data.getSize());
} }
free(buffer);
return ret; return ret;
} }

View File

@ -111,16 +111,15 @@ bool SAXParser::parse(const char* xmlData, size_t dataLength)
return tinyDoc.Accept( &printer ); return tinyDoc.Accept( &printer );
} }
bool SAXParser::parse(const char *file) bool SAXParser::parse(const std::string& filename)
{ {
bool ret = false; bool ret = false;
ssize_t size = 0; Data data = FileUtils::getInstance()->getDataFromFile(filename);
char* buffer = (char*)FileUtils::getInstance()->getFileData(file, "rt", &size); if (!data.isNull())
if (buffer != nullptr && size > 0)
{ {
ret = parse(buffer, size); ret = parse((const char*)data.getBytes(), data.getSize());
} }
free(buffer);
return ret; return ret;
} }

View File

@ -26,7 +26,7 @@
#include "CCPlatformConfig.h" #include "CCPlatformConfig.h"
#include "platform/CCCommon.h" #include "platform/CCCommon.h"
#include "string.h" // for size_t #include <string>
NS_CC_BEGIN NS_CC_BEGIN
@ -87,7 +87,7 @@ public:
* @js NA * @js NA
* @lua NA * @lua NA
*/ */
bool parse(const char *file); bool parse(const std::string& filename);
/** /**
* @js NA * @js NA
* @lua NA * @lua NA

View File

@ -34,13 +34,13 @@ THE SOFTWARE.
using namespace std; using namespace std;
AAssetManager* cocos2d::FileUtilsAndroid::assetmanager = NULL;
NS_CC_BEGIN NS_CC_BEGIN
AAssetManager* FileUtilsAndroid::assetmanager = nullptr;
void FileUtilsAndroid::setassetmanager(AAssetManager* a) { void FileUtilsAndroid::setassetmanager(AAssetManager* a) {
if (NULL == a) { if (nullptr == a) {
LOGD("setassetmanager : received unexpected NULL parameter"); LOGD("setassetmanager : received unexpected nullptr parameter");
return; return;
} }
@ -49,13 +49,13 @@ void FileUtilsAndroid::setassetmanager(AAssetManager* a) {
FileUtils* FileUtils::getInstance() FileUtils* FileUtils::getInstance()
{ {
if (s_sharedFileUtils == NULL) if (s_sharedFileUtils == nullptr)
{ {
s_sharedFileUtils = new FileUtilsAndroid(); s_sharedFileUtils = new FileUtilsAndroid();
if(!s_sharedFileUtils->init()) if(!s_sharedFileUtils->init())
{ {
delete s_sharedFileUtils; delete s_sharedFileUtils;
s_sharedFileUtils = NULL; s_sharedFileUtils = nullptr;
CCLOG("ERROR: Could not init CCFileUtilsAndroid"); CCLOG("ERROR: Could not init CCFileUtilsAndroid");
} }
} }
@ -129,19 +129,126 @@ bool FileUtilsAndroid::isAbsolutePath(const std::string& strPath) const
return false; return false;
} }
Data FileUtilsAndroid::getData(const std::string& filename, bool forString)
{
if (filename.empty())
{
return Data::Null;
}
unsigned char* data = nullptr;
ssize_t size = 0;
string fullPath = fullPathForFilename(filename);
if (fullPath[0] != '/')
{
string relativePath = string();
size_t position = fullPath.find("assets/");
if (0 == position) {
// "assets/" is at the beginning of the path and we don't want it
relativePath += fullPath.substr(strlen("assets/"));
} else {
relativePath += fullPath;
}
LOGD("relative path = %s", relativePath.c_str());
if (nullptr == FileUtilsAndroid::assetmanager) {
LOGD("... FileUtilsAndroid::assetmanager is nullptr");
return Data::Null;
}
// read asset data
AAsset* asset =
AAssetManager_open(FileUtilsAndroid::assetmanager,
relativePath.c_str(),
AASSET_MODE_UNKNOWN);
if (nullptr == asset) {
LOGD("asset is nullptr");
return Data::Null;
}
off_t fileSize = AAsset_getLength(asset);
if (forString)
{
data = (unsigned char*) malloc(fileSize + 1);
data[fileSize] = '\0';
}
else
{
data = (unsigned char*) malloc(fileSize);
}
int bytesread = AAsset_read(asset, (void*)data, fileSize);
size = bytesread;
AAsset_close(asset);
}
else
{
do
{
// read rrom other path than user set it
//CCLOG("GETTING FILE ABSOLUTE DATA: %s", filename);
const char* mode = nullptr;
if (forString)
mode = "rt";
else
mode = "rb";
FILE *fp = fopen(fullPath.c_str(), mode);
CC_BREAK_IF(!fp);
long fileSize;
fseek(fp,0,SEEK_END);
fileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
if (forString)
{
data = (unsigned char*) malloc(fileSize + 1);
data[fileSize] = '\0';
}
else
{
data = (unsigned char*) malloc(fileSize);
}
fileSize = fread(data,sizeof(unsigned char), fileSize,fp);
fclose(fp);
size = fileSize;
} while (0);
}
Data ret;
if (data == nullptr || size == 0)
{
std::string msg = "Get data from file(";
msg.append(filename).append(") failed!");
CCLOG("%s", msg.c_str());
}
else
{
ret.fastSet(data, size);
}
return ret;
}
std::string FileUtilsAndroid::getStringFromFile(const std::string& filename)
{
Data data = getData(filename, true);
std::string ret((const char*)data.getBytes());
return ret;
}
Data FileUtilsAndroid::getDataFromFile(const std::string& filename)
{
return getData(filename, false);
}
unsigned char* FileUtilsAndroid::getFileData(const char* filename, const char* mode, ssize_t * size) unsigned char* FileUtilsAndroid::getFileData(const char* filename, const char* mode, ssize_t * size)
{ {
return doGetFileData(filename, mode, size, false);
}
unsigned char* FileUtilsAndroid::getFileDataForAsync(const char* filename, const char* pszMode, ssize_t * pSize)
{
return doGetFileData(filename, pszMode, pSize, true);
}
unsigned char* FileUtilsAndroid::doGetFileData(const char* filename, const char* mode, ssize_t * size, bool forAsync)
{
unsigned char * data = 0; unsigned char * data = 0;
if ((! filename) || (! mode) || 0 == strlen(filename)) if ((! filename) || (! mode) || 0 == strlen(filename))
@ -164,9 +271,9 @@ unsigned char* FileUtilsAndroid::doGetFileData(const char* filename, const char*
} }
LOGD("relative path = %s", relativePath.c_str()); LOGD("relative path = %s", relativePath.c_str());
if (NULL == FileUtilsAndroid::assetmanager) { if (nullptr == FileUtilsAndroid::assetmanager) {
LOGD("... FileUtilsAndroid::assetmanager is NULL"); LOGD("... FileUtilsAndroid::assetmanager is nullptr");
return NULL; return nullptr;
} }
// read asset data // read asset data
@ -174,9 +281,9 @@ unsigned char* FileUtilsAndroid::doGetFileData(const char* filename, const char*
AAssetManager_open(FileUtilsAndroid::assetmanager, AAssetManager_open(FileUtilsAndroid::assetmanager,
relativePath.c_str(), relativePath.c_str(),
AASSET_MODE_UNKNOWN); AASSET_MODE_UNKNOWN);
if (NULL == asset) { if (nullptr == asset) {
LOGD("asset is NULL"); LOGD("asset is nullptr");
return NULL; return nullptr;
} }
off_t fileSize = AAsset_getLength(asset); off_t fileSize = AAsset_getLength(asset);
@ -196,7 +303,7 @@ unsigned char* FileUtilsAndroid::doGetFileData(const char* filename, const char*
do do
{ {
// read rrom other path than user set it // read rrom other path than user set it
//CCLOG("GETTING FILE ABSOLUTE DATA: %s", filename); //CCLOG("GETTING FILE ABSOLUTE DATA: %s", filename);
FILE *fp = fopen(fullPath.c_str(), mode); FILE *fp = fopen(fullPath.c_str(), mode);
CC_BREAK_IF(!fp); CC_BREAK_IF(!fp);

View File

@ -55,19 +55,28 @@ public:
/* override funtions */ /* override funtions */
bool init(); bool init();
virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t * size);
/** @deprecated Please use FileUtils::getDataFromFile or FileUtils::getStringFromFile instead. */
CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t * size) override;
/**
* Gets string from a file.
*/
virtual std::string getStringFromFile(const std::string& filename) override;
/**
* Creates binary data from a file.
* @return A data object.
*/
virtual Data getDataFromFile(const std::string& filename) override;
virtual std::string getWritablePath() const; virtual std::string getWritablePath() const;
virtual bool isFileExist(const std::string& strFilePath) const; virtual bool isFileExist(const std::string& strFilePath) const;
virtual bool isAbsolutePath(const std::string& strPath) const; virtual bool isAbsolutePath(const std::string& strPath) const;
/** This function is android specific. It is used for TextureCache::addImageAsync().
Don't use it in your codes.
*/
unsigned char* getFileDataForAsync(const char* filename, const char* mode, ssize_t * size);
private: private:
unsigned char* doGetFileData(const char* filename, const char* mode, ssize_t * size, bool forAsync); Data getData(const std::string& filename, bool forString);
static AAssetManager* assetmanager; static AAssetManager* assetmanager;
}; };

View File

@ -121,6 +121,77 @@ bool FileUtilsWin32::isAbsolutePath(const std::string& strPath) const
return false; return false;
} }
static Data getData(const std::string& filename, bool forString)
{
unsigned char *buffer = nullptr;
CCASSERT(!filename.empty(), "Invalid parameters.");
size_t size = 0;
do
{
// read the file from hardware
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename);
WCHAR wszBuf[CC_MAX_PATH] = {0};
MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf));
HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE);
size = ::GetFileSize(fileHandle, NULL);
if (forString)
{
buffer = (unsigned char*) malloc(size + 1);
buffer[size] = '\0';
}
else
{
buffer = (unsigned char*) malloc(size);
}
DWORD sizeRead = 0;
BOOL successed = FALSE;
successed = ::ReadFile(fileHandle, buffer, *size, &sizeRead, NULL);
::CloseHandle(fileHandle);
if (!successed)
{
free(buffer);
buffer = nullptr;
}
} while (0);
Data ret;
if (buffer == nullptr || size == 0)
{
std::string msg = "Get data from file(";
// Gets error code.
DWORD errorCode = ::GetLastError();
char errorCodeBuffer[20] = {0};
snprintf(errorCodeBuffer, sizeof(errorCodeBuffer), "%d", errorCode);
msg = msg + filename + ") failed, error code is " + errorCodeBuffer;
CCLOG("%s", msg.c_str());
}
else
{
ret.fastSet(buffer, size);
}
return ret;
}
std::string FileUtilsAndroid::getStringFromFile(const std::string& filename)
{
Data data = getData(filename, true);
std::string ret((const char*)data.getBytes());
return ret;
}
Data FileUtilsAndroid::getDataFromFile(const std::string& filename)
{
return getData(filename, false);
}
unsigned char* FileUtilsWin32::getFileData(const char* filename, const char* mode, ssize_t* size) unsigned char* FileUtilsWin32::getFileData(const char* filename, const char* mode, ssize_t* size)
{ {
unsigned char * pBuffer = NULL; unsigned char * pBuffer = NULL;
@ -148,6 +219,7 @@ unsigned char* FileUtilsWin32::getFileData(const char* filename, const char* mod
if (!successed) if (!successed)
{ {
free(pBuffer); free(pBuffer);
pBuffer = nullptr;
} }
} while (0); } while (0);

View File

@ -58,7 +58,18 @@ protected:
* @return Upon success, a pointer to the data is returned, otherwise NULL. * @return Upon success, a pointer to the data is returned, otherwise NULL.
* @warning Recall: you are responsible for calling delete[] on any Non-NULL pointer returned. * @warning Recall: you are responsible for calling delete[] on any Non-NULL pointer returned.
*/ */
virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t * size) override; CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const char* filename, const char* mode, ssize_t * size) override;
/**
* Gets string from a file.
*/
virtual std::string getStringFromFile(const std::string& filename) override;
/**
* Creates binary data from a file.
* @return A data object.
*/
virtual Data getDataFromFile(const std::string& filename) override;
/** /**
* Gets full path for filename, resolution directory and search path. * Gets full path for filename, resolution directory and search path.
@ -81,6 +92,7 @@ protected:
* @return The full path of the file, if the file can't be found, it will return an empty string. * @return The full path of the file, if the file can't be found, it will return an empty string.
*/ */
virtual std::string getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) override; virtual std::string getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) override;
}; };
// end of platform group // end of platform group

View File

@ -22,30 +22,67 @@
THE SOFTWARE. THE SOFTWARE.
****************************************************************************/ ****************************************************************************/
#include <string.h>
#include "CCData.h" #include "CCData.h"
#include "platform/CCCommon.h" #include "platform/CCCommon.h"
#include "ccMacros.h"
#include <string>
NS_CC_BEGIN NS_CC_BEGIN
Data::Data(unsigned char *pBytes, ssize_t nSize) const Data Data::Null;
Data::Data() :
_bytes(nullptr),
_size(0)
{ {
_size = nSize; CCLOGINFO("In the empty constructor of Data.");
_bytes = new unsigned char[_size];
memcpy(_bytes, pBytes, _size);
} }
Data::Data(Data *pData) Data::Data(Data&& other)
{ {
_size = pData->_size; CCLOGINFO("In the move constructor of Data.");
_bytes = new unsigned char[_size]; move(other);
memcpy(_bytes, pData->_bytes, _size); }
Data::Data(const Data& other)
{
CCLOGINFO("In the copy constructor of Data.");
copy(other._bytes, other._size);
} }
Data::~Data() Data::~Data()
{ {
CCLOGINFO("deallocing Data: %p", this); CCLOGINFO("deallocing Data: %p", this);
CC_SAFE_DELETE_ARRAY(_bytes); clear();
}
Data& Data::operator= (const Data& other)
{
CCLOGINFO("In the copy assignment of Data.");
copy(other._bytes, other._size);
return *this;
}
Data& Data::operator= (Data&& other)
{
CCLOGINFO("In the move assignment of Data.");
move(other);
return *this;
}
void Data::move(Data& other)
{
_bytes = other._bytes;
_size = other._size;
other._bytes = nullptr;
other._size = 0;
}
bool Data::isNull() const
{
return (_bytes == nullptr || _size == 0);
} }
unsigned char* Data::getBytes() const unsigned char* Data::getBytes() const
@ -58,4 +95,29 @@ ssize_t Data::getSize() const
return _size; return _size;
} }
void Data::copy(unsigned char* bytes, const ssize_t size)
{
clear();
if (size > 0)
{
_size = size;
_bytes = (unsigned char*)malloc(sizeof(unsigned char) * _size);
memcpy(_bytes, bytes, _size);
}
}
void Data::fastSet(unsigned char* bytes, const ssize_t size)
{
_bytes = bytes;
_size = size;
}
void Data::clear()
{
free(_bytes);
_bytes = nullptr;
_size = 0;
}
NS_CC_END NS_CC_END

View File

@ -26,41 +26,25 @@
#define __CCDATA_H__ #define __CCDATA_H__
#include "CCPlatformMacros.h" #include "CCPlatformMacros.h"
#include "CCObject.h" #include <stdint.h> // for ssize_t on android
#include <string> // for ssize_t on linux
NS_CC_BEGIN NS_CC_BEGIN
class CC_DLL Data : public Object class CC_DLL Data
{ {
public: public:
/** static const Data Null;
* @js NA
* @lua NA Data();
*/ Data(const Data& other);
Data(unsigned char *pBytes, const ssize_t nSize); Data(Data&& other);
/**
* @js NA
* @lua NA
*/
Data(Data *pData);
/**
* @js NA
* @lua NA
*/
~Data(); ~Data();
/**
* @js NA // Assignment operator
* @lua NA Data& operator= (const Data& other);
*/ Data& operator= (Data&& other);
static Data* create(unsigned char *pBytes, const ssize_t nSize)
{
Data* pRet = new Data(pBytes, nSize);
if (pRet)
{
pRet->autorelease();
}
return pRet;
}
/** /**
* @js NA * @js NA
* @lua NA * @lua NA
@ -72,12 +56,31 @@ public:
*/ */
ssize_t getSize() const; ssize_t getSize() const;
/** override functions /** Copies the buffer pointer and its size.
* @js NA * @note This method will copy the whole buffer.
* @lua NA * Developer should free the pointer after invoking this method.
* @see Data::fastSet
*/ */
virtual void acceptVisitor(DataVisitor &visitor) { visitor.visit(this); } void copy(unsigned char* bytes, const ssize_t size);
/** Fast set the buffer pointer and its size. Please use it carefully.
* @param bytes The buffer pointer, note that it have to be allocated by 'malloc' or 'calloc',
* since in the destructor of Data, the buffer will be deleted by 'free'.
* @note 1. This method will move the ownship of 'bytes'pointer to Data,
* 2. The pointer should not be used outside after it was passed to this method.
* @see Data::copy
*/
void fastSet(unsigned char* bytes, const ssize_t size);
/** Clears data, free buffer and reset data size */
void clear();
/** Check whether the data is null. */
bool isNull() const;
private:
void move(Data& other);
private: private:
unsigned char* _bytes; unsigned char* _bytes;
ssize_t _size; ssize_t _size;

View File

@ -31,7 +31,6 @@
#include "CCArray.h" #include "CCArray.h"
#include "CCDictionary.h" #include "CCDictionary.h"
#include "CCSet.h" #include "CCSet.h"
#include "CCData.h"
NS_CC_BEGIN NS_CC_BEGIN
@ -75,11 +74,6 @@ void DataVisitor::visit(const __Set *value)
visitObject(value); visitObject(value);
} }
void DataVisitor::visit(const Data *value)
{
visitObject(value);
}
// PrettyPrinter // PrettyPrinter
PrettyPrinter::PrettyPrinter(int indentLevel/* = 0 */) PrettyPrinter::PrettyPrinter(int indentLevel/* = 0 */)
{ {
@ -222,12 +216,6 @@ void PrettyPrinter::visit(const __Set *p)
_result += "</set>\n"; _result += "</set>\n";
} }
void PrettyPrinter::visit(const Data *p)
{
//TODO Implement
DataVisitor::visit(p);
}
void PrettyPrinter::setIndentLevel(int indentLevel) void PrettyPrinter::setIndentLevel(int indentLevel)
{ {
_indentLevel = indentLevel; _indentLevel = indentLevel;

View File

@ -39,7 +39,6 @@ class __String;
class __Array; class __Array;
class __Dictionary; class __Dictionary;
class __Set; class __Set;
class Data;
/** /**
* @addtogroup data_structures * @addtogroup data_structures
@ -80,7 +79,6 @@ public:
virtual void visit(const __Array *p); virtual void visit(const __Array *p);
virtual void visit(const __Dictionary *p); virtual void visit(const __Dictionary *p);
virtual void visit(const __Set *p); virtual void visit(const __Set *p);
virtual void visit(const Data *p);
}; };
@ -101,7 +99,6 @@ public:
virtual void visit(const __Array *p); virtual void visit(const __Array *p);
virtual void visit(const __Dictionary *p); virtual void visit(const __Dictionary *p);
virtual void visit(const __Set *p); virtual void visit(const __Set *p);
virtual void visit(const Data *p);
private: private:
void setIndentLevel(int indentLevel); void setIndentLevel(int indentLevel);
int _indentLevel; int _indentLevel;

View File

@ -205,7 +205,7 @@ public: virtual void set##funName(varType var) \
#define CC_BREAK_IF(cond) if(cond) break #define CC_BREAK_IF(cond) if(cond) break
#define __CCLOGWITHFUNCTION(s, ...) \ #define __CCLOGWITHFUNCTION(s, ...) \
log("%s : %s",__FUNCTION__, String::createWithFormat(s, ##__VA_ARGS__)->getCString()) log("%s : %s",__FUNCTION__, StringUtils::format(s, ##__VA_ARGS__).c_str())
// cocos2d debug // cocos2d debug
#if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0

View File

@ -255,13 +255,8 @@ __String* __String::createWithFormat(const char* format, ...)
__String* __String::createWithContentsOfFile(const char* filename) __String* __String::createWithContentsOfFile(const char* filename)
{ {
ssize_t size = 0; std::string str = FileUtils::getInstance()->getStringFromFile(filename);
unsigned char* data = 0; return __String::create(std::move(str));
__String* ret = NULL;
data = FileUtils::getInstance()->getFileData(filename, "rb", &size);
ret = __String::createWithData(data, static_cast<int>(size));
free(data);
return ret;
} }
void __String::acceptVisitor(DataVisitor &visitor) void __String::acceptVisitor(DataVisitor &visitor)

View File

@ -239,9 +239,6 @@ public:
}; };
CC_DEPRECATED_ATTRIBUTE typedef __String String;
// end of data_structure group // end of data_structure group
/// @} /// @}

View File

@ -110,7 +110,6 @@ CCBReader::CCBReader()
CCBReader::~CCBReader() CCBReader::~CCBReader()
{ {
CC_SAFE_RELEASE_NULL(_owner); CC_SAFE_RELEASE_NULL(_owner);
CC_SAFE_RELEASE_NULL(_data);
this->_nodeLoaderLibrary->release(); this->_nodeLoaderLibrary->release();
@ -218,23 +217,17 @@ Node* CCBReader::readNodeGraphFromFile(const char *pCCBFileName, Object *pOwner,
} }
std::string strPath = FileUtils::getInstance()->fullPathForFilename(strCCBFileName.c_str()); std::string strPath = FileUtils::getInstance()->fullPathForFilename(strCCBFileName.c_str());
ssize_t size = 0;
unsigned char * pBytes = FileUtils::getInstance()->getFileData(strPath.c_str(), "rb", &size); auto dataPtr = std::make_shared<Data>(FileUtils::getInstance()->getDataFromFile(strPath));
Data *data = new Data(pBytes, size);
free(pBytes);
Node *ret = this->readNodeGraphFromData(data, pOwner, parentSize);
data->release(); Node *ret = this->readNodeGraphFromData(dataPtr, pOwner, parentSize);
return ret; return ret;
} }
Node* CCBReader::readNodeGraphFromData(Data *pData, Object *pOwner, const Size &parentSize) Node* CCBReader::readNodeGraphFromData(std::shared_ptr<cocos2d::Data> data, Object *pOwner, const Size &parentSize)
{ {
_data = pData; _data = data;
CC_SAFE_RETAIN(_data);
_bytes =_data->getBytes(); _bytes =_data->getBytes();
_currentByte = 0; _currentByte = 0;
_currentBit = 0; _currentBit = 0;

View File

@ -173,7 +173,7 @@ public:
* @js NA * @js NA
* @lua NA * @lua NA
*/ */
cocos2d::Node* readNodeGraphFromData(cocos2d::Data *pData, cocos2d::Object *pOwner, const cocos2d::Size &parentSize); cocos2d::Node* readNodeGraphFromData(std::shared_ptr<cocos2d::Data> data, cocos2d::Object *pOwner, const cocos2d::Size &parentSize);
/** /**
@lua NA @lua NA
@ -360,7 +360,7 @@ private:
friend class NodeLoader; friend class NodeLoader;
private: private:
cocos2d::Data *_data; std::shared_ptr<cocos2d::Data> _data;
unsigned char *_bytes; unsigned char *_bytes;
int _currentByte; int _currentByte;
int _currentBit; int _currentBit;

View File

@ -923,19 +923,16 @@ Node * NodeLoader::parsePropTypeCCBFile(Node * pNode, Node * pParent, CCBReader
// Load sub file // Load sub file
std::string path = FileUtils::getInstance()->fullPathForFilename(ccbFileName.c_str()); std::string path = FileUtils::getInstance()->fullPathForFilename(ccbFileName.c_str());
ssize_t size = 0;
unsigned char * pBytes = FileUtils::getInstance()->getFileData(path.c_str(), "rb", &size);
auto dataPtr = std::make_shared<Data>(FileUtils::getInstance()->getDataFromFile(path));
CCBReader * reader = new CCBReader(pCCBReader); CCBReader * reader = new CCBReader(pCCBReader);
reader->autorelease(); reader->autorelease();
reader->getAnimationManager()->setRootContainerSize(pParent->getContentSize()); reader->getAnimationManager()->setRootContainerSize(pParent->getContentSize());
Data *data = new Data(pBytes, size);
free(pBytes); reader->_data = dataPtr;
reader->_bytes = dataPtr->getBytes();
data->retain();
reader->_data = data;
reader->_bytes = data->getBytes();
reader->_currentByte = 0; reader->_currentByte = 0;
reader->_currentBit = 0; reader->_currentBit = 0;
CC_SAFE_RETAIN(pCCBReader->_owner); CC_SAFE_RETAIN(pCCBReader->_owner);
@ -951,7 +948,6 @@ Node * NodeLoader::parsePropTypeCCBFile(Node * pNode, Node * pParent, CCBReader
// reader->_ownerCallbackNodes = pCCBReader->_ownerCallbackNodes; // reader->_ownerCallbackNodes = pCCBReader->_ownerCallbackNodes;
// reader->_ownerCallbackNodes->retain(); // reader->_ownerCallbackNodes->retain();
data->release();
Node * ccbFileNode = reader->readFileWithCleanUp(false, pCCBReader->getAnimationManagers()); Node * ccbFileNode = reader->readFileWithCleanUp(false, pCCBReader->getAnimationManagers());

View File

@ -288,11 +288,8 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath)
std::string str = &filePathStr[startPos]; std::string str = &filePathStr[startPos];
// Read content from file // Read content from file
ssize_t size;
std::string fullPath = CCFileUtils::getInstance()->fullPathForFilename(filePath); std::string fullPath = CCFileUtils::getInstance()->fullPathForFilename(filePath);
unsigned char *pTempContent = (unsigned char *)CCFileUtils::getInstance()->getFileData(fullPath.c_str() , "r", &size); std::string contentStr = FileUtils::getInstance()->getStringFromFile(fullPath);
std::string contentStr = std::string((const char*)pTempContent, size);
DataInfo dataInfo; DataInfo dataInfo;
dataInfo.filename = filePathStr; dataInfo.filename = filePathStr;
@ -307,8 +304,6 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath)
{ {
DataReaderHelper::addDataFromJsonCache(contentStr, &dataInfo); DataReaderHelper::addDataFromJsonCache(contentStr, &dataInfo);
} }
free(pTempContent);
} }
void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string& plistPath, const std::string& filePath, Object *target, SEL_SCHEDULE selector) void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string& plistPath, const std::string& filePath, Object *target, SEL_SCHEDULE selector)
@ -391,10 +386,9 @@ void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const
std::string str = &filePathStr[startPos]; std::string str = &filePathStr[startPos];
std::string fullPath = CCFileUtils::getInstance()->fullPathForFilename(filePath); std::string fullPath = CCFileUtils::getInstance()->fullPathForFilename(filePath);
ssize_t size;
// XXX fileContent is being leaked // XXX fileContent is being leaked
data->fileContent = (char *)CCFileUtils::getInstance()->getFileData(fullPath.c_str() , "r", &size); data->fileContent = FileUtils::getInstance()->getStringFromFile(fullPath);
if (str == ".xml") if (str == ".xml")
{ {

View File

@ -122,22 +122,22 @@ const cocos2d::Size GUIReader::getFileDesignSize(const char* fileName) const
UIWidget* GUIReader::widgetFromJsonFile(const char *fileName) UIWidget* GUIReader::widgetFromJsonFile(const char *fileName)
{ {
DictionaryHelper* dicHelper = DICTOOL; DictionaryHelper* dicHelper = DICTOOL;
char *des = nullptr;
std::string jsonpath; std::string jsonpath;
JsonDictionary *jsonDict = nullptr; JsonDictionary *jsonDict = nullptr;
jsonpath = CCFileUtils::getInstance()->fullPathForFilename(fileName); jsonpath = CCFileUtils::getInstance()->fullPathForFilename(fileName);
int pos = jsonpath.find_last_of('/'); int pos = jsonpath.find_last_of('/');
m_strFilePath = jsonpath.substr(0,pos+1); m_strFilePath = jsonpath.substr(0,pos+1);
ssize_t size = 0;
des = (char*)(CCFileUtils::getInstance()->getFileData(jsonpath.c_str(),"r" , &size)); std::string des = FileUtils::getInstance()->getStringFromFile(jsonpath);
if(nullptr == des || strcmp(des, "") == 0) if (des.empty())
{ {
printf("read json file[%s] error!\n", fileName); CCLOG("read json file[%s] error!\n", fileName);
return nullptr; return nullptr;
} }
std::string strDes(des);
jsonDict = new JsonDictionary(); jsonDict = new JsonDictionary();
jsonDict->initWithDescription(strDes.c_str()); jsonDict->initWithDescription(des.c_str());
UIWidget* widget = nullptr; UIWidget* widget = nullptr;
const char* fileVersion = dicHelper->getStringValue_json(jsonDict, "version"); const char* fileVersion = dicHelper->getStringValue_json(jsonDict, "version");
@ -164,7 +164,6 @@ UIWidget* GUIReader::widgetFromJsonFile(const char *fileName)
CC_SAFE_DELETE(pReader); CC_SAFE_DELETE(pReader);
CC_SAFE_DELETE(jsonDict); CC_SAFE_DELETE(jsonDict);
free(des);
return widget; return widget;
} }

View File

@ -47,19 +47,16 @@ namespace cocostudio {
cocos2d::Node* SceneReader::createNodeWithSceneFile(const char* pszFileName) cocos2d::Node* SceneReader::createNodeWithSceneFile(const char* pszFileName)
{ {
ssize_t size = 0;
char* pData = 0;
cocos2d::Node *pNode = nullptr; cocos2d::Node *pNode = nullptr;
do do
{ {
CC_BREAK_IF(pszFileName == nullptr); CC_BREAK_IF(pszFileName == nullptr);
pData = (char*)(cocos2d::FileUtils::getInstance()->getFileData(pszFileName, "r", &size)); std::string fileContent = cocos2d::FileUtils::getInstance()->getStringFromFile(pszFileName);
CC_BREAK_IF(pData == nullptr || strcmp(pData, "") == 0); CC_BREAK_IF(fileContent.empty());
JsonDictionary *jsonDict = new JsonDictionary(); JsonDictionary *jsonDict = new JsonDictionary();
jsonDict->initWithDescription(pData); jsonDict->initWithDescription(fileContent.c_str());
pNode = createObject(jsonDict,nullptr); pNode = createObject(jsonDict,nullptr);
CC_SAFE_DELETE(jsonDict); CC_SAFE_DELETE(jsonDict);
free(pData);
} while (0); } while (0);
return pNode; return pNode;
@ -215,11 +212,12 @@ namespace cocostudio {
{ {
file_path = reDir.substr(0, pos+1); file_path = reDir.substr(0, pos+1);
} }
ssize_t size = 0;
char *des = (char*)(cocos2d::FileUtils::getInstance()->getFileData(pPath.c_str(),"r" , &size)); std::string des = cocos2d::FileUtils::getInstance()->getStringFromFile(pPath);
JsonDictionary *jsonDict = new JsonDictionary(); JsonDictionary *jsonDict = new JsonDictionary();
jsonDict->initWithDescription(des); jsonDict->initWithDescription(des.c_str());
if(nullptr == des || strcmp(des, "") == 0) if (des.empty())
{ {
CCLOG("read json file[%s] error!\n", pPath.c_str()); CCLOG("read json file[%s] error!\n", pPath.c_str());
} }
@ -263,7 +261,6 @@ namespace cocostudio {
CC_SAFE_DELETE(jsonDict); CC_SAFE_DELETE(jsonDict);
CC_SAFE_DELETE(subData); CC_SAFE_DELETE(subData);
free(des);
} }
else if(comName != nullptr && strcmp(comName, "CCComAudio") == 0) else if(comName != nullptr && strcmp(comName, "CCComAudio") == 0)
{ {
@ -285,14 +282,11 @@ namespace cocostudio {
if (nResType == 0) if (nResType == 0)
{ {
pAttribute = ComAttribute::create(); pAttribute = ComAttribute::create();
ssize_t size = 0; std::string fileContent = cocos2d::FileUtils::getInstance()->getStringFromFile(pPath);
char* pData = 0; if (!fileContent.empty())
pData = (char*)(cocos2d::FileUtils::getInstance()->getFileData(pPath.c_str(), "r", &size));
if(pData != nullptr && strcmp(pData, "") != 0)
{ {
pAttribute->getDict()->initWithDescription(pData); pAttribute->getDict()->initWithDescription(fileContent.c_str());
} }
free(pData);
} }
else else
{ {

View File

@ -40,25 +40,25 @@ using std::max;
namespace spine { namespace spine {
CCSkeleton* CCSkeleton::createWithData (spSkeletonData* skeletonData, bool isOwnsSkeletonData) { Skeleton* Skeleton::createWithData (spSkeletonData* skeletonData, bool isOwnsSkeletonData) {
CCSkeleton* node = new CCSkeleton(skeletonData, isOwnsSkeletonData); Skeleton* node = new Skeleton(skeletonData, isOwnsSkeletonData);
node->autorelease(); node->autorelease();
return node; return node;
} }
CCSkeleton* CCSkeleton::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) { Skeleton* Skeleton::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
CCSkeleton* node = new CCSkeleton(skeletonDataFile, atlas, scale); Skeleton* node = new Skeleton(skeletonDataFile, atlas, scale);
node->autorelease(); node->autorelease();
return node; return node;
} }
CCSkeleton* CCSkeleton::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) { Skeleton* Skeleton::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
CCSkeleton* node = new CCSkeleton(skeletonDataFile, atlasFile, scale); Skeleton* node = new Skeleton(skeletonDataFile, atlasFile, scale);
node->autorelease(); node->autorelease();
return node; return node;
} }
void CCSkeleton::initialize () { void Skeleton::initialize () {
atlas = 0; atlas = 0;
debugSlots = false; debugSlots = false;
debugBones = false; debugBones = false;
@ -73,23 +73,23 @@ void CCSkeleton::initialize () {
scheduleUpdate(); scheduleUpdate();
} }
void CCSkeleton::setSkeletonData (spSkeletonData *skeletonData, bool isOwnsSkeletonData) { void Skeleton::setSkeletonData (spSkeletonData *skeletonData, bool isOwnsSkeletonData) {
skeleton = spSkeleton_create(skeletonData); skeleton = spSkeleton_create(skeletonData);
rootBone = skeleton->bones[0]; rootBone = skeleton->bones[0];
this->ownsSkeletonData = isOwnsSkeletonData; this->ownsSkeletonData = isOwnsSkeletonData;
} }
CCSkeleton::CCSkeleton () { Skeleton::Skeleton () {
initialize(); initialize();
} }
CCSkeleton::CCSkeleton (spSkeletonData *skeletonData, bool isOwnsSkeletonData) { Skeleton::Skeleton (spSkeletonData *skeletonData, bool isOwnsSkeletonData) {
initialize(); initialize();
setSkeletonData(skeletonData, isOwnsSkeletonData); setSkeletonData(skeletonData, isOwnsSkeletonData);
} }
CCSkeleton::CCSkeleton (const char* skeletonDataFile, spAtlas* aAtlas, float scale) { Skeleton::Skeleton (const char* skeletonDataFile, spAtlas* aAtlas, float scale) {
initialize(); initialize();
spSkeletonJson* json = spSkeletonJson_create(aAtlas); spSkeletonJson* json = spSkeletonJson_create(aAtlas);
@ -101,7 +101,7 @@ CCSkeleton::CCSkeleton (const char* skeletonDataFile, spAtlas* aAtlas, float sca
setSkeletonData(skeletonData, true); setSkeletonData(skeletonData, true);
} }
CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale) { Skeleton::Skeleton (const char* skeletonDataFile, const char* atlasFile, float scale) {
initialize(); initialize();
atlas = spAtlas_readAtlasFile(atlasFile); atlas = spAtlas_readAtlasFile(atlasFile);
@ -116,17 +116,17 @@ CCSkeleton::CCSkeleton (const char* skeletonDataFile, const char* atlasFile, flo
setSkeletonData(skeletonData, true); setSkeletonData(skeletonData, true);
} }
CCSkeleton::~CCSkeleton () { Skeleton::~Skeleton () {
if (ownsSkeletonData) spSkeletonData_dispose(skeleton->data); if (ownsSkeletonData) spSkeletonData_dispose(skeleton->data);
if (atlas) spAtlas_dispose(atlas); if (atlas) spAtlas_dispose(atlas);
spSkeleton_dispose(skeleton); spSkeleton_dispose(skeleton);
} }
void CCSkeleton::update (float deltaTime) { void Skeleton::update (float deltaTime) {
spSkeleton_update(skeleton, deltaTime * timeScale); spSkeleton_update(skeleton, deltaTime * timeScale);
} }
void CCSkeleton::draw () { void Skeleton::draw () {
CC_NODE_DRAW_SETUP(); CC_NODE_DRAW_SETUP();
GL::blendFunc(blendFunc.src, blendFunc.dst); GL::blendFunc(blendFunc.src, blendFunc.dst);
@ -222,11 +222,11 @@ void CCSkeleton::draw () {
} }
} }
TextureAtlas* CCSkeleton::getTextureAtlas (spRegionAttachment* regionAttachment) const { TextureAtlas* Skeleton::getTextureAtlas (spRegionAttachment* regionAttachment) const {
return (TextureAtlas*)((spAtlasRegion*)regionAttachment->rendererObject)->page->rendererObject; return (TextureAtlas*)((spAtlasRegion*)regionAttachment->rendererObject)->page->rendererObject;
} }
Rect CCSkeleton::getBoundingBox () const { Rect Skeleton::getBoundingBox () const {
float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN; float minX = FLT_MAX, minY = FLT_MAX, maxX = FLT_MIN, maxY = FLT_MIN;
float scaleX = getScaleX(); float scaleX = getScaleX();
float scaleY = getScaleY(); float scaleY = getScaleY();
@ -259,50 +259,50 @@ Rect CCSkeleton::getBoundingBox () const {
// --- Convenience methods for Skeleton_* functions. // --- Convenience methods for Skeleton_* functions.
void CCSkeleton::updateWorldTransform () { void Skeleton::updateWorldTransform () {
spSkeleton_updateWorldTransform(skeleton); spSkeleton_updateWorldTransform(skeleton);
} }
void CCSkeleton::setToSetupPose () { void Skeleton::setToSetupPose () {
spSkeleton_setToSetupPose(skeleton); spSkeleton_setToSetupPose(skeleton);
} }
void CCSkeleton::setBonesToSetupPose () { void Skeleton::setBonesToSetupPose () {
spSkeleton_setBonesToSetupPose(skeleton); spSkeleton_setBonesToSetupPose(skeleton);
} }
void CCSkeleton::setSlotsToSetupPose () { void Skeleton::setSlotsToSetupPose () {
spSkeleton_setSlotsToSetupPose(skeleton); spSkeleton_setSlotsToSetupPose(skeleton);
} }
spBone* CCSkeleton::findBone (const char* boneName) const { spBone* Skeleton::findBone (const char* boneName) const {
return spSkeleton_findBone(skeleton, boneName); return spSkeleton_findBone(skeleton, boneName);
} }
spSlot* CCSkeleton::findSlot (const char* slotName) const { spSlot* Skeleton::findSlot (const char* slotName) const {
return spSkeleton_findSlot(skeleton, slotName); return spSkeleton_findSlot(skeleton, slotName);
} }
bool CCSkeleton::setSkin (const char* skinName) { bool Skeleton::setSkin (const char* skinName) {
return spSkeleton_setSkinByName(skeleton, skinName) ? true : false; return spSkeleton_setSkinByName(skeleton, skinName) ? true : false;
} }
spAttachment* CCSkeleton::getAttachment (const char* slotName, const char* attachmentName) const { spAttachment* Skeleton::getAttachment (const char* slotName, const char* attachmentName) const {
return spSkeleton_getAttachmentForSlotName(skeleton, slotName, attachmentName); return spSkeleton_getAttachmentForSlotName(skeleton, slotName, attachmentName);
} }
bool CCSkeleton::setAttachment (const char* slotName, const char* attachmentName) { bool Skeleton::setAttachment (const char* slotName, const char* attachmentName) {
return spSkeleton_setAttachment(skeleton, slotName, attachmentName) ? true : false; return spSkeleton_setAttachment(skeleton, slotName, attachmentName) ? true : false;
} }
// --- CCBlendProtocol // --- CCBlendProtocol
const cocos2d::BlendFunc& CCSkeleton::getBlendFunc () const { const cocos2d::BlendFunc& Skeleton::getBlendFunc () const {
return blendFunc; return blendFunc;
} }
void CCSkeleton::setBlendFunc (const cocos2d::BlendFunc& aBlendFunc) { void Skeleton::setBlendFunc (const cocos2d::BlendFunc& aBlendFunc) {
this->blendFunc = aBlendFunc; this->blendFunc = aBlendFunc;
} }
void CCSkeleton::setFittedBlendingFunc(cocos2d::TextureAtlas * nextRenderedTexture) void Skeleton::setFittedBlendingFunc(cocos2d::TextureAtlas * nextRenderedTexture)
{ {
if(nextRenderedTexture->getTexture() && nextRenderedTexture->getTexture()->hasPremultipliedAlpha()) if(nextRenderedTexture->getTexture() && nextRenderedTexture->getTexture()->hasPremultipliedAlpha())
{ {

View File

@ -42,7 +42,7 @@ namespace spine {
/** /**
Draws a skeleton. Draws a skeleton.
*/ */
class CCSkeleton: public cocos2d::Node, public cocos2d::BlendProtocol { class Skeleton: public cocos2d::Node, public cocos2d::BlendProtocol {
public: public:
spSkeleton* skeleton; spSkeleton* skeleton;
spBone* rootBone; spBone* rootBone;
@ -52,15 +52,15 @@ public:
bool premultipliedAlpha; bool premultipliedAlpha;
cocos2d::BlendFunc blendFunc; cocos2d::BlendFunc blendFunc;
static CCSkeleton* createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData = false); static Skeleton* createWithData (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
static CCSkeleton* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0); static Skeleton* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
static CCSkeleton* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0); static Skeleton* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
CCSkeleton (spSkeletonData* skeletonData, bool ownsSkeletonData = false); Skeleton (spSkeletonData* skeletonData, bool ownsSkeletonData = false);
CCSkeleton (const char* skeletonDataFile, spAtlas* atlas, float scale = 0); Skeleton (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
CCSkeleton (const char* skeletonDataFile, const char* atlasFile, float scale = 0); Skeleton (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
virtual ~CCSkeleton (); virtual ~Skeleton ();
virtual void update (float deltaTime) override; virtual void update (float deltaTime) override;
virtual void draw() override; virtual void draw() override;
@ -93,7 +93,7 @@ public:
virtual void setBlendFunc(const cocos2d::BlendFunc& func) override; virtual void setBlendFunc(const cocos2d::BlendFunc& func) override;
protected: protected:
CCSkeleton (); Skeleton ();
void setSkeletonData (spSkeletonData* skeletonData, bool ownsSkeletonData); void setSkeletonData (spSkeletonData* skeletonData, bool ownsSkeletonData);
virtual cocos2d::TextureAtlas* getTextureAtlas (spRegionAttachment* regionAttachment) const; virtual cocos2d::TextureAtlas* getTextureAtlas (spRegionAttachment* regionAttachment) const;

View File

@ -43,28 +43,28 @@ using std::vector;
namespace spine { namespace spine {
static void callback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) { static void callback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
((CCSkeletonAnimation*)state->context)->onAnimationStateEvent(trackIndex, type, event, loopCount); ((SkeletonAnimation*)state->context)->onAnimationStateEvent(trackIndex, type, event, loopCount);
} }
CCSkeletonAnimation* CCSkeletonAnimation::createWithData (spSkeletonData* skeletonData) { SkeletonAnimation* SkeletonAnimation::createWithData (spSkeletonData* skeletonData) {
CCSkeletonAnimation* node = new CCSkeletonAnimation(skeletonData); SkeletonAnimation* node = new SkeletonAnimation(skeletonData);
node->autorelease(); node->autorelease();
return node; return node;
} }
CCSkeletonAnimation* CCSkeletonAnimation::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) { SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale) {
CCSkeletonAnimation* node = new CCSkeletonAnimation(skeletonDataFile, atlas, scale); SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlas, scale);
node->autorelease(); node->autorelease();
return node; return node;
} }
CCSkeletonAnimation* CCSkeletonAnimation::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) { SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
CCSkeletonAnimation* node = new CCSkeletonAnimation(skeletonDataFile, atlasFile, scale); SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlasFile, scale);
node->autorelease(); node->autorelease();
return node; return node;
} }
void CCSkeletonAnimation::initialize () { void SkeletonAnimation::initialize () {
listenerInstance = 0; listenerInstance = 0;
listenerMethod = 0; listenerMethod = 0;
@ -74,27 +74,27 @@ void CCSkeletonAnimation::initialize () {
state->listener = callback; state->listener = callback;
} }
CCSkeletonAnimation::CCSkeletonAnimation (spSkeletonData *skeletonData) SkeletonAnimation::SkeletonAnimation (spSkeletonData *skeletonData)
: CCSkeleton(skeletonData) { : Skeleton(skeletonData) {
initialize(); initialize();
} }
CCSkeletonAnimation::CCSkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale) SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale)
: CCSkeleton(skeletonDataFile, atlas, scale) { : Skeleton(skeletonDataFile, atlas, scale) {
initialize(); initialize();
} }
CCSkeletonAnimation::CCSkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale) SkeletonAnimation::SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale)
: CCSkeleton(skeletonDataFile, atlasFile, scale) { : Skeleton(skeletonDataFile, atlasFile, scale) {
initialize(); initialize();
} }
CCSkeletonAnimation::~CCSkeletonAnimation () { SkeletonAnimation::~SkeletonAnimation () {
if (ownsAnimationStateData) spAnimationStateData_dispose(state->data); if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
spAnimationState_dispose(state); spAnimationState_dispose(state);
} }
void CCSkeletonAnimation::update (float deltaTime) { void SkeletonAnimation::update (float deltaTime) {
super::update(deltaTime); super::update(deltaTime);
deltaTime *= timeScale; deltaTime *= timeScale;
@ -103,7 +103,7 @@ void CCSkeletonAnimation::update (float deltaTime) {
spSkeleton_updateWorldTransform(skeleton); spSkeleton_updateWorldTransform(skeleton);
} }
void CCSkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData) { void SkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData) {
CCAssert(stateData, "stateData cannot be null."); CCAssert(stateData, "stateData cannot be null.");
if (ownsAnimationStateData) spAnimationStateData_dispose(state->data); if (ownsAnimationStateData) spAnimationStateData_dispose(state->data);
@ -115,46 +115,46 @@ void CCSkeletonAnimation::setAnimationStateData (spAnimationStateData* stateData
state->listener = callback; state->listener = callback;
} }
void CCSkeletonAnimation::setMix (const char* fromAnimation, const char* toAnimation, float duration) { void SkeletonAnimation::setMix (const char* fromAnimation, const char* toAnimation, float duration) {
spAnimationStateData_setMixByName(state->data, fromAnimation, toAnimation, duration); spAnimationStateData_setMixByName(state->data, fromAnimation, toAnimation, duration);
} }
void CCSkeletonAnimation::setAnimationListener (Object* instance, SEL_AnimationStateEvent method) { void SkeletonAnimation::setAnimationListener (Object* instance, SEL_AnimationStateEvent method) {
listenerInstance = instance; listenerInstance = instance;
listenerMethod = method; listenerMethod = method;
} }
spTrackEntry* CCSkeletonAnimation::setAnimation (int trackIndex, const char* name, bool loop) { spTrackEntry* SkeletonAnimation::setAnimation (int trackIndex, const char* name, bool loop) {
spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name); spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
if (!animation) { if (!animation) {
CCLog("Spine: Animation not found: %s", name); log("Spine: Animation not found: %s", name);
return 0; return 0;
} }
return spAnimationState_setAnimation(state, trackIndex, animation, loop); return spAnimationState_setAnimation(state, trackIndex, animation, loop);
} }
spTrackEntry* CCSkeletonAnimation::addAnimation (int trackIndex, const char* name, bool loop, float delay) { spTrackEntry* SkeletonAnimation::addAnimation (int trackIndex, const char* name, bool loop, float delay) {
spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name); spAnimation* animation = spSkeletonData_findAnimation(skeleton->data, name);
if (!animation) { if (!animation) {
CCLog("Spine: Animation not found: %s", name); log("Spine: Animation not found: %s", name);
return 0; return 0;
} }
return spAnimationState_addAnimation(state, trackIndex, animation, loop, delay); return spAnimationState_addAnimation(state, trackIndex, animation, loop, delay);
} }
spTrackEntry* CCSkeletonAnimation::getCurrent (int trackIndex) { spTrackEntry* SkeletonAnimation::getCurrent (int trackIndex) {
return spAnimationState_getCurrent(state, trackIndex); return spAnimationState_getCurrent(state, trackIndex);
} }
void CCSkeletonAnimation::clearTracks () { void SkeletonAnimation::clearTracks () {
spAnimationState_clearTracks(state); spAnimationState_clearTracks(state);
} }
void CCSkeletonAnimation::clearTrack (int trackIndex) { void SkeletonAnimation::clearTrack (int trackIndex) {
spAnimationState_clearTrack(state, trackIndex); spAnimationState_clearTrack(state, trackIndex);
} }
void CCSkeletonAnimation::onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) { void SkeletonAnimation::onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount) {
if (listenerInstance) (listenerInstance->*listenerMethod)(this, trackIndex, type, event, loopCount); if (listenerInstance) (listenerInstance->*listenerMethod)(this, trackIndex, type, event, loopCount);
} }

View File

@ -40,25 +40,25 @@
namespace spine { namespace spine {
class CCSkeletonAnimation; class SkeletonAnimation;
typedef void (cocos2d::Object::*SEL_AnimationStateEvent)(spine::CCSkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount); typedef void (cocos2d::Object::*SEL_AnimationStateEvent)(spine::SkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount);
#define animationStateEvent_selector(_SELECTOR) (SEL_AnimationStateEvent)(&_SELECTOR) #define animationStateEvent_selector(_SELECTOR) (SEL_AnimationStateEvent)(&_SELECTOR)
/** Draws an animated skeleton, providing an AnimationState for applying one or more animations and queuing animations to be /** Draws an animated skeleton, providing an AnimationState for applying one or more animations and queuing animations to be
* played later. */ * played later. */
class CCSkeletonAnimation: public CCSkeleton { class SkeletonAnimation: public Skeleton {
public: public:
spAnimationState* state; spAnimationState* state;
static CCSkeletonAnimation* createWithData (spSkeletonData* skeletonData); static SkeletonAnimation* createWithData (spSkeletonData* skeletonData);
static CCSkeletonAnimation* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0); static SkeletonAnimation* createWithFile (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
static CCSkeletonAnimation* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0); static SkeletonAnimation* createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
CCSkeletonAnimation (spSkeletonData* skeletonData); SkeletonAnimation (spSkeletonData* skeletonData);
CCSkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale = 0); SkeletonAnimation (const char* skeletonDataFile, spAtlas* atlas, float scale = 0);
CCSkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale = 0); SkeletonAnimation (const char* skeletonDataFile, const char* atlasFile, float scale = 0);
virtual ~CCSkeletonAnimation (); virtual ~SkeletonAnimation ();
virtual void update (float deltaTime); virtual void update (float deltaTime);
@ -75,10 +75,10 @@ public:
virtual void onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount); virtual void onAnimationStateEvent (int trackIndex, spEventType type, spEvent* event, int loopCount);
protected: protected:
CCSkeletonAnimation (); SkeletonAnimation ();
private: private:
typedef CCSkeleton super; typedef Skeleton super;
cocos2d::Object* listenerInstance; cocos2d::Object* listenerInstance;
SEL_AnimationStateEvent listenerMethod; SEL_AnimationStateEvent listenerMethod;
bool ownsAnimationStateData; bool ownsAnimationStateData;

View File

@ -52,12 +52,24 @@ void _spAtlasPage_disposeTexture (spAtlasPage* self) {
((TextureAtlas*)self->rendererObject)->release(); ((TextureAtlas*)self->rendererObject)->release();
} }
char* _spUtil_readFile (const char* path, int* length) { char* _spUtil_readFile (const char* path, int* length)
ssize_t size; {
char* data = reinterpret_cast<char*>( char* ret = nullptr;
FileUtils::getInstance()->getFileData( FileUtils::getInstance()->fullPathForFilename(path).c_str(), "rb", &size)); int size = 0;
*length = static_cast<int>(size); Data data = FileUtils::getInstance()->getDataFromFile(path);
return data;}
if (!data.isNull())
{
size = static_cast<int>(data.getSize());
*length = size;
// Allocates one more byte for string terminal, it will be safe when parsing JSON file in Spine runtime.
ret = (char*)malloc(size + 1);
ret[size] = '\0';
memcpy(ret, data.getBytes(), size);
}
return ret;
}
/**/ /**/

@ -1 +1 @@
Subproject commit daff147b1ff3d3754cb014c4e9c575676dea68b9 Subproject commit 4b31f207c6743c246fc2116699ab2c995db18cf3

View File

@ -533,18 +533,17 @@ JSBool ScriptingCore::runScript(const char *path, JSObject* global, JSContext* c
// a) check jsc file first // a) check jsc file first
std::string byteCodePath = RemoveFileExt(std::string(path)) + BYTE_CODE_FILE_EXT; std::string byteCodePath = RemoveFileExt(std::string(path)) + BYTE_CODE_FILE_EXT;
ssize_t length = 0;
unsigned char* data = futil->getFileData(byteCodePath.c_str(), Data data = futil->getDataFromFile(byteCodePath);
"rb",
&length);
if (data) { if (!data.isNull())
script = JS_DecodeScript(cx, data, length, NULL, NULL); {
free(data); script = JS_DecodeScript(cx, data.getBytes(), static_cast<uint32_t>(data.getSize()), nullptr, nullptr);
} }
// b) no jsc file, check js file // b) no jsc file, check js file
if (!script) { if (!script)
{
/* Clear any pending exception from previous failed decoding. */ /* Clear any pending exception from previous failed decoding. */
ReportException(cx); ReportException(cx);
@ -553,12 +552,10 @@ JSBool ScriptingCore::runScript(const char *path, JSObject* global, JSContext* c
options.setUTF8(true).setFileAndLine(fullPath.c_str(), 1); options.setUTF8(true).setFileAndLine(fullPath.c_str(), 1);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
String* content = String::createWithContentsOfFile(path); std::string jsFileContent = futil->getStringFromFile(fullPath);
if (content) { if (!jsFileContent.empty())
// Not supported in SpiderMonkey 19.0 {
//JSScript* script = JS_CompileScript(cx, global, (char*)content, contentSize, path, 1); script = JS::Compile(cx, obj, options, jsFileContent.c_str(), jsFileContent.size());
const char* contentCStr = content->getCString();
script = JS::Compile(cx, obj, options, contentCStr, strlen(contentCStr));
} }
#else #else
script = JS::Compile(cx, obj, options, fullPath.c_str()); script = JS::Compile(cx, obj, options, fullPath.c_str());

View File

@ -1 +1 @@
4ff49d7d50964fb117a48243d728d75dd6d5ef77 9af2a4febb0a58cf084fc9adfb24c1ac8138cd27

View File

@ -46,17 +46,15 @@ extern "C"
} }
filename.append(".lua"); filename.append(".lua");
long codeBufferSize = 0; Data data = FileUtils::getInstance()->getDataFromFile(filename);
unsigned char* codeBuffer = FileUtils::getInstance()->getFileData(filename.c_str(), "rb", &codeBufferSize);
if (codeBuffer) if (!data.isNull())
{ {
if (luaL_loadbuffer(L, (char*)codeBuffer, codeBufferSize, filename.c_str()) != 0) if (luaL_loadbuffer(L, (char*)data.getBytes(), data.getSize(), filename.c_str()) != 0)
{ {
luaL_error(L, "error loading module %s from file %s :\n\t%s", luaL_error(L, "error loading module %s from file %s :\n\t%s",
lua_tostring(L, 1), filename.c_str(), lua_tostring(L, -1)); lua_tostring(L, 1), filename.c_str(), lua_tostring(L, -1));
} }
free(codeBuffer);
} }
else else
{ {

View File

@ -1 +1 @@
1f9ea8a4fdf66e19eb3d080042f2bc7463203562 7e0639125fd9b16ab635af21d26824fd79b1f41a

View File

@ -2,6 +2,10 @@
#include "../testResource.h" #include "../testResource.h"
#include "cocos2d.h" #include "cocos2d.h"
#include "renderer/CCRenderer.h"
#include "renderer/CCCustomCommand.h"
#include "renderer/CCGroupCommand.h"
static std::function<Layer*()> createFunctions[] = { static std::function<Layer*()> createFunctions[] = {
CL(ActionManual), CL(ActionManual),
@ -1284,14 +1288,23 @@ void ActionFollow::onEnter()
} }
void ActionFollow::draw() void ActionFollow::draw()
{
CustomCommand* cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(ActionFollow::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
}
void ActionFollow::onDraw()
{ {
auto winSize = Director::getInstance()->getWinSize(); auto winSize = Director::getInstance()->getWinSize();
float x = winSize.width*2 - 100; float x = winSize.width*2 - 100;
float y = winSize.height; float y = winSize.height;
Point vertices[] = { Point(5,5), Point(x-5,5), Point(x-5,y-5), Point(5,y-5) }; Point vertices[] = { Point(5,5), Point(x-5,5), Point(x-5,y-5), Point(5,y-5) };
DrawPrimitives::drawPoly(vertices, 4, true); DrawPrimitives::drawPoly(vertices, 4, true);
} }
std::string ActionFollow::subtitle() const std::string ActionFollow::subtitle() const
@ -1589,10 +1602,25 @@ void ActionCatmullRomStacked::draw()
// move to 50,50 since the "by" path will start at 50,50 // move to 50,50 since the "by" path will start at 50,50
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(50, 50, 0); kmGLTranslatef(50, 50, 0);
DrawPrimitives::drawCatmullRom(_array1,50); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV1);
kmGLPopMatrix(); kmGLPopMatrix();
kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV2);
CustomCommand* cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(ActionCatmullRomStacked::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
}
void ActionCatmullRomStacked::onDraw()
{
kmMat4 oldMat;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMat);
kmGLLoadMatrix(&_modelViewMV1);
DrawPrimitives::drawCatmullRom(_array1,50);
kmGLLoadMatrix(&_modelViewMV2);
DrawPrimitives::drawCatmullRom(_array2,50); DrawPrimitives::drawCatmullRom(_array2,50);
kmGLLoadMatrix(&oldMat);
} }
std::string ActionCatmullRomStacked::title() const std::string ActionCatmullRomStacked::title() const
@ -1684,15 +1712,31 @@ void ActionCardinalSplineStacked::draw()
// move to 50,50 since the "by" path will start at 50,50 // move to 50,50 since the "by" path will start at 50,50
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(50, 50, 0); kmGLTranslatef(50, 50, 0);
DrawPrimitives::drawCardinalSpline(_array, 0, 100); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV1);
kmGLPopMatrix(); kmGLPopMatrix();
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(s.width/2, 50, 0); kmGLTranslatef(s.width/2, 50, 0);
DrawPrimitives::drawCardinalSpline(_array, 1, 100); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV2);
kmGLPopMatrix(); kmGLPopMatrix();
CustomCommand* cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(ActionCardinalSplineStacked::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
}
void ActionCardinalSplineStacked::onDraw()
{
kmMat4 oldMat;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMat);
kmGLLoadMatrix(&_modelViewMV1);
DrawPrimitives::drawCardinalSpline(_array, 0, 100);
kmGLLoadMatrix(&_modelViewMV2);
DrawPrimitives::drawCardinalSpline(_array, 1, 100);
kmGLLoadMatrix(&oldMat);
} }
std::string ActionCardinalSplineStacked::title() const std::string ActionCardinalSplineStacked::title() const
@ -2036,12 +2080,30 @@ void ActionCatmullRom::draw()
// move to 50,50 since the "by" path will start at 50,50 // move to 50,50 since the "by" path will start at 50,50
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(50, 50, 0); kmGLTranslatef(50, 50, 0);
DrawPrimitives::drawCatmullRom(_array1, 50); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV1);
kmGLPopMatrix(); kmGLPopMatrix();
kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV2);
DrawPrimitives::drawCatmullRom(_array2,50);
CustomCommand* cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(ActionCatmullRom::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
} }
void ActionCatmullRom::onDraw()
{
kmMat4 oldMat;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMat);
kmGLLoadMatrix(&_modelViewMV1);
DrawPrimitives::drawCatmullRom(_array1, 50);
kmGLLoadMatrix(&_modelViewMV2);
DrawPrimitives::drawCatmullRom(_array2,50);
kmGLLoadMatrix(&oldMat);
}
std::string ActionCatmullRom::title() const std::string ActionCatmullRom::title() const
{ {
return "CatmullRomBy / CatmullRomTo"; return "CatmullRomBy / CatmullRomTo";
@ -2114,15 +2176,31 @@ void ActionCardinalSpline::draw()
// move to 50,50 since the "by" path will start at 50,50 // move to 50,50 since the "by" path will start at 50,50
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(50, 50, 0); kmGLTranslatef(50, 50, 0);
DrawPrimitives::drawCardinalSpline(_array, 0, 100); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV1);
kmGLPopMatrix(); kmGLPopMatrix();
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
kmGLPushMatrix(); kmGLPushMatrix();
kmGLTranslatef(s.width/2, 50, 0); kmGLTranslatef(s.width/2, 50, 0);
DrawPrimitives::drawCardinalSpline(_array, 1, 100); kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV2);
kmGLPopMatrix(); kmGLPopMatrix();
CustomCommand* cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(ActionCardinalSpline::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
}
void ActionCardinalSpline::onDraw()
{
kmMat4 oldMat;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMat);
kmGLLoadMatrix(&_modelViewMV1);
DrawPrimitives::drawCardinalSpline(_array, 0, 100);
kmGLLoadMatrix(&_modelViewMV2);
DrawPrimitives::drawCardinalSpline(_array, 1, 100);
kmGLLoadMatrix(&oldMat);
} }
std::string ActionCardinalSpline::title() const std::string ActionCardinalSpline::title() const

View File

@ -343,6 +343,9 @@ public:
virtual void onEnter(); virtual void onEnter();
virtual void draw(); virtual void draw();
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
protected:
void onDraw();
}; };
class ActionTargeted : public ActionsDemo class ActionTargeted : public ActionsDemo
@ -415,6 +418,11 @@ public:
virtual void onEnter(); virtual void onEnter();
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
protected:
//cached data and callback
kmMat4 _modelViewMV1;
kmMat4 _modelViewMV2;
void onDraw();
private: private:
PointArray* _array1; PointArray* _array1;
PointArray* _array2; PointArray* _array2;
@ -432,6 +440,10 @@ public:
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
private: private:
PointArray* _array; PointArray* _array;
protected:
void onDraw();
kmMat4 _modelViewMV1;
kmMat4 _modelViewMV2;
}; };
class Issue1305 : public ActionsDemo class Issue1305 : public ActionsDemo
@ -522,6 +534,10 @@ public:
private: private:
PointArray *_array1; PointArray *_array1;
PointArray *_array2; PointArray *_array2;
protected:
void onDraw();
kmMat4 _modelViewMV1;
kmMat4 _modelViewMV2;
}; };
class ActionCardinalSpline : public ActionsDemo class ActionCardinalSpline : public ActionsDemo
@ -537,6 +553,10 @@ public:
virtual std::string title() const override; virtual std::string title() const override;
private: private:
PointArray *_array; PointArray *_array;
protected:
void onDraw();
kmMat4 _modelViewMV1;
kmMat4 _modelViewMV2;
}; };
class PauseResumeActions : public ActionsDemo class PauseResumeActions : public ActionsDemo

View File

@ -1,6 +1,9 @@
#include "Box2dTest.h" #include "Box2dTest.h"
#include "../testResource.h" #include "../testResource.h"
#include "extensions/cocos-ext.h" #include "extensions/cocos-ext.h"
#include "renderer/CCRenderer.h"
#include "renderer/CCCustomCommand.h"
USING_NS_CC_EXT; USING_NS_CC_EXT;
#define PTM_RATIO 32 #define PTM_RATIO 32
@ -144,13 +147,28 @@ void Box2DTestLayer::draw()
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION ); GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
kmGLPushMatrix(); kmGLPushMatrix();
kmGLGetMatrix(KM_GL_MODELVIEW, &_modelViewMV);
world->DrawDebugData(); CustomCommand *cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(Box2DTestLayer::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
kmGLPopMatrix(); kmGLPopMatrix();
#endif #endif
} }
#if CC_ENABLE_BOX2D_INTEGRATION
void Box2DTestLayer::onDraw()
{
kmMat4 oldMV;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMV);
kmGLLoadMatrix(&_modelViewMV);
world->DrawDebugData();
kmGLLoadMatrix(&oldMV);
}
#endif
void Box2DTestLayer::addNewSpriteAtPosition(Point p) void Box2DTestLayer::addNewSpriteAtPosition(Point p)
{ {
CCLOG("Add sprite %0.2f x %02.f",p.x,p.y); CCLOG("Add sprite %0.2f x %02.f",p.x,p.y);

View File

@ -24,6 +24,11 @@ public:
void onTouchesEnded(const std::vector<Touch*>& touches, Event* event); void onTouchesEnded(const std::vector<Touch*>& touches, Event* event);
//CREATE_NODE(Box2DTestLayer); //CREATE_NODE(Box2DTestLayer);
#if CC_ENABLE_BOX2D_INTEGRATION
protected:
kmMat4 _modelViewMV;
void onDraw();
#endif
} ; } ;
class Box2DTestScene : public TestScene class Box2DTestScene : public TestScene

View File

@ -1,4 +1,6 @@
#include "DrawPrimitivesTest.h" #include "DrawPrimitivesTest.h"
#include "renderer/CCRenderer.h"
#include "renderer/CCCustomCommand.h"
using namespace std; using namespace std;
@ -114,113 +116,128 @@ DrawPrimitivesTest::DrawPrimitivesTest()
void DrawPrimitivesTest::draw() void DrawPrimitivesTest::draw()
{ {
CustomCommand * cmd = CustomCommand::getCommandPool().generateCommand();
cmd->init(0, _vertexZ);
cmd->func = CC_CALLBACK_0(DrawPrimitivesTest::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(cmd);
}
void DrawPrimitivesTest::onDraw()
{
kmMat4 oldMat;
kmGLGetMatrix(KM_GL_MODELVIEW, &oldMat);
kmGLLoadMatrix(&_modelViewTransform);
CHECK_GL_ERROR_DEBUG(); //draw
CHECK_GL_ERROR_DEBUG();
// draw a simple line // draw a simple line
// The default state is: // The default state is:
// Line Width: 1 // Line Width: 1
// color: 255,255,255,255 (white, non-transparent) // color: 255,255,255,255 (white, non-transparent)
// Anti-Aliased // Anti-Aliased
// glEnable(GL_LINE_SMOOTH); // glEnable(GL_LINE_SMOOTH);
DrawPrimitives::drawLine( VisibleRect::leftBottom(), VisibleRect::rightTop() ); DrawPrimitives::drawLine( VisibleRect::leftBottom(), VisibleRect::rightTop() );
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// line: color, width, aliased // line: color, width, aliased
// glLineWidth > 1 and GL_LINE_SMOOTH are not compatible // glLineWidth > 1 and GL_LINE_SMOOTH are not compatible
// GL_SMOOTH_LINE_WIDTH_RANGE = (1,1) on iPhone // GL_SMOOTH_LINE_WIDTH_RANGE = (1,1) on iPhone
// glDisable(GL_LINE_SMOOTH); // glDisable(GL_LINE_SMOOTH);
glLineWidth( 5.0f ); glLineWidth( 5.0f );
DrawPrimitives::setDrawColor4B(255,0,0,255); DrawPrimitives::setDrawColor4B(255,0,0,255);
DrawPrimitives::drawLine( VisibleRect::leftTop(), VisibleRect::rightBottom() ); DrawPrimitives::drawLine( VisibleRect::leftTop(), VisibleRect::rightBottom() );
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// TIP: // TIP:
// If you are going to use always the same color or width, you don't // If you are going to use always thde same color or width, you don't
// need to call it before every draw // need to call it before every draw
// //
// Remember: OpenGL is a state-machine. // Remember: OpenGL is a state-machine.
// draw big point in the center // draw big point in the center
DrawPrimitives::setPointSize(64); DrawPrimitives::setPointSize(64);
DrawPrimitives::setDrawColor4B(0,0,255,128); DrawPrimitives::setDrawColor4B(0,0,255,128);
DrawPrimitives::drawPoint( VisibleRect::center() ); DrawPrimitives::drawPoint( VisibleRect::center() );
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw 4 small points // draw 4 small points
Point points[] = { Point(60,60), Point(70,70), Point(60,70), Point(70,60) }; Point points[] = { Point(60,60), Point(70,70), Point(60,70), Point(70,60) };
DrawPrimitives::setPointSize(4); DrawPrimitives::setPointSize(4);
DrawPrimitives::setDrawColor4B(0,255,255,255); DrawPrimitives::setDrawColor4B(0,255,255,255);
DrawPrimitives::drawPoints( points, 4); DrawPrimitives::drawPoints( points, 4);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw a green circle with 10 segments // draw a green circle with 10 segments
glLineWidth(16); glLineWidth(16);
DrawPrimitives::setDrawColor4B(0, 255, 0, 255); DrawPrimitives::setDrawColor4B(0, 255, 0, 255);
DrawPrimitives::drawCircle( VisibleRect::center(), 100, 0, 10, false); DrawPrimitives::drawCircle( VisibleRect::center(), 100, 0, 10, false);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw a green circle with 50 segments with line to center // draw a green circle with 50 segments with line to center
glLineWidth(2); glLineWidth(2);
DrawPrimitives::setDrawColor4B(0, 255, 255, 255); DrawPrimitives::setDrawColor4B(0, 255, 255, 255);
DrawPrimitives::drawCircle( VisibleRect::center(), 50, CC_DEGREES_TO_RADIANS(90), 50, true); DrawPrimitives::drawCircle( VisibleRect::center(), 50, CC_DEGREES_TO_RADIANS(90), 50, true);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw a pink solid circle with 50 segments // draw a pink solid circle with 50 segments
glLineWidth(2); glLineWidth(2);
DrawPrimitives::setDrawColor4B(255, 0, 255, 255); DrawPrimitives::setDrawColor4B(255, 0, 255, 255);
DrawPrimitives::drawSolidCircle( VisibleRect::center() + Point(140,0), 40, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f); DrawPrimitives::drawSolidCircle( VisibleRect::center() + Point(140,0), 40, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// open yellow poly // open yellow poly
DrawPrimitives::setDrawColor4B(255, 255, 0, 255); DrawPrimitives::setDrawColor4B(255, 255, 0, 255);
glLineWidth(10); glLineWidth(10);
Point vertices[] = { Point(0,0), Point(50,50), Point(100,50), Point(100,100), Point(50,100) }; Point vertices[] = { Point(0,0), Point(50,50), Point(100,50), Point(100,100), Point(50,100) };
DrawPrimitives::drawPoly( vertices, 5, false); DrawPrimitives::drawPoly( vertices, 5, false);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// filled poly // filled poly
glLineWidth(1); glLineWidth(1);
Point filledVertices[] = { Point(0,120), Point(50,120), Point(50,170), Point(25,200), Point(0,170) }; Point filledVertices[] = { Point(0,120), Point(50,120), Point(50,170), Point(25,200), Point(0,170) };
DrawPrimitives::drawSolidPoly(filledVertices, 5, Color4F(0.5f, 0.5f, 1, 1 ) ); DrawPrimitives::drawSolidPoly(filledVertices, 5, Color4F(0.5f, 0.5f, 1, 1 ) );
// closed purble poly // closed purble poly
DrawPrimitives::setDrawColor4B(255, 0, 255, 255); DrawPrimitives::setDrawColor4B(255, 0, 255, 255);
glLineWidth(2); glLineWidth(2);
Point vertices2[] = { Point(30,130), Point(30,230), Point(50,200) }; Point vertices2[] = { Point(30,130), Point(30,230), Point(50,200) };
DrawPrimitives::drawPoly( vertices2, 3, true); DrawPrimitives::drawPoly( vertices2, 3, true);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw quad bezier path // draw quad bezier path
DrawPrimitives::drawQuadBezier(VisibleRect::leftTop(), VisibleRect::center(), VisibleRect::rightTop(), 50); DrawPrimitives::drawQuadBezier(VisibleRect::leftTop(), VisibleRect::center(), VisibleRect::rightTop(), 50);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
// draw cubic bezier path // draw cubic bezier path
DrawPrimitives::drawCubicBezier(VisibleRect::center(), Point(VisibleRect::center().x+30,VisibleRect::center().y+50), Point(VisibleRect::center().x+60,VisibleRect::center().y-50),VisibleRect::right(),100); DrawPrimitives::drawCubicBezier(VisibleRect::center(), Point(VisibleRect::center().x+30,VisibleRect::center().y+50), Point(VisibleRect::center().x+60,VisibleRect::center().y-50),VisibleRect::right(),100);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
//draw a solid polygon //draw a solid polygon
Point vertices3[] = {Point(60,160), Point(70,190), Point(100,190), Point(90,160)}; Point vertices3[] = {Point(60,160), Point(70,190), Point(100,190), Point(90,160)};
DrawPrimitives::drawSolidPoly( vertices3, 4, Color4F(1,1,0,1) ); DrawPrimitives::drawSolidPoly( vertices3, 4, Color4F(1,1,0,1) );
// restore original values // restore original values
glLineWidth(1); glLineWidth(1);
DrawPrimitives::setDrawColor4B(255,255,255,255); DrawPrimitives::setDrawColor4B(255,255,255,255);
DrawPrimitives::setPointSize(1); DrawPrimitives::setPointSize(1);
CHECK_GL_ERROR_DEBUG(); CHECK_GL_ERROR_DEBUG();
//end draw
kmGLLoadMatrix(&oldMat);
} }
string DrawPrimitivesTest::title() const string DrawPrimitivesTest::title() const
@ -257,10 +274,10 @@ DrawNodeTest::DrawNodeTest()
const float w=20; const float w=20;
const float h=50; const float h=50;
Point star[] = { Point star[] = {
Point(o+w,o-h), Point(o+w*2, o), // lower spike Point(o+w,o-h), Point(o+w*2, o), // lower spike
Point(o + w*2 + h, o+w ), Point(o + w*2, o+w*2), // right spike Point(o + w*2 + h, o+w ), Point(o + w*2, o+w*2), // right spike
// {o +w, o+w*2+h}, {o,o+w*2}, // top spike // {o +w, o+w*2+h}, {o,o+w*2}, // top spike
// {o -h, o+w}, {o,o}, // left spike // {o -h, o+w}, {o,o}, // left spike
}; };
draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1,0,0,0.5), 1, Color4F(0,0,1,1)); draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1,0,0,0.5), 1, Color4F(0,0,1,1));
@ -272,9 +289,9 @@ DrawNodeTest::DrawNodeTest()
const float w=20; const float w=20;
const float h=50; const float h=50;
Point star[] = { Point star[] = {
Point(o,o), Point(o+w,o-h), Point(o+w*2, o), // lower spike Point(o,o), Point(o+w,o-h), Point(o+w*2, o), // lower spike
Point(o + w*2 + h, o+w ), Point(o + w*2, o+w*2), // right spike Point(o + w*2 + h, o+w ), Point(o + w*2, o+w*2), // right spike
Point(o +w, o+w*2+h), Point(o,o+w*2), // top spike Point(o +w, o+w*2+h), Point(o,o+w*2), // top spike
Point(o -h, o+w), // left spike Point(o -h, o+w), // left spike
}; };

View File

@ -28,6 +28,8 @@ public:
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
virtual void draw(); virtual void draw();
protected:
void onDraw();
}; };
class DrawNodeTest : public BaseLayer class DrawNodeTest : public BaseLayer

View File

@ -49,7 +49,7 @@ void SpineTestScene::runThisTest()
bool SpineTestLayer::init () { bool SpineTestLayer::init () {
if (!Layer::init()) return false; if (!Layer::init()) return false;
skeletonNode = CCSkeletonAnimation::createWithFile("spine/spineboy.json", "spine/spineboy.atlas"); skeletonNode = SkeletonAnimation::createWithFile("spine/spineboy.json", "spine/spineboy.atlas");
skeletonNode->setMix("walk", "jump", 0.2f); skeletonNode->setMix("walk", "jump", 0.2f);
skeletonNode->setMix("jump", "walk", 0.4f); skeletonNode->setMix("jump", "walk", 0.4f);
@ -82,7 +82,7 @@ void SpineTestLayer::update (float deltaTime) {
} }
void SpineTestLayer::animationStateEvent (CCSkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount) { void SpineTestLayer::animationStateEvent (SkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount) {
spTrackEntry* entry = spAnimationState_getCurrent(node->state, trackIndex); spTrackEntry* entry = spAnimationState_getCurrent(node->state, trackIndex);
const char* animationName = (entry && entry->animation) ? entry->animation->name : 0; const char* animationName = (entry && entry->animation) ? entry->animation->name : 0;

View File

@ -38,13 +38,13 @@ public:
class SpineTestLayer: public cocos2d::Layer { class SpineTestLayer: public cocos2d::Layer {
private: private:
spine::CCSkeletonAnimation* skeletonNode; spine::SkeletonAnimation* skeletonNode;
public: public:
virtual bool init (); virtual bool init ();
virtual void update (float deltaTime); virtual void update (float deltaTime);
void animationStateEvent (spine::CCSkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount); void animationStateEvent (spine::SkeletonAnimation* node, int trackIndex, spEventType type, spEvent* event, int loopCount);
CREATE_FUNC (SpineTestLayer); CREATE_FUNC (SpineTestLayer);
}; };

View File

@ -76,7 +76,7 @@
<PrecompiledHeader> <PrecompiledHeader>
</PrecompiledHeader> </PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat> <DebugInformationFormat>OldStyle</DebugInformationFormat>
<DisableSpecificWarnings>4267;4251;4244;%(DisableSpecificWarnings)</DisableSpecificWarnings> <DisableSpecificWarnings>4267;4251;4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>

@ -1 +1 @@
Subproject commit fda861cde4387948e95811966d9c4ceea04dc758 Subproject commit ff3a95b059be8421677ed6817b73ae2ac577781d

View File

@ -26,7 +26,7 @@ headers = %(cocosdir)s/cocos/2d/cocos2d.h %(cocosdir)s/cocos/audio/include/Simpl
# what classes to produce code for. You can use regular expressions here. When testing the regular # what classes to produce code for. You can use regular expressions here. When testing the regular
# expression, it will be enclosed in "^$", like this: "^Menu*$". # expression, it will be enclosed in "^$", like this: "^Menu*$".
classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set Data SimpleAudioEngine Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak TextFieldTTF EGLViewProtocol EGLView Component __NodeRGBA __LayerRGBA classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set SimpleAudioEngine Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak TextFieldTTF EGLViewProtocol EGLView Component __NodeRGBA __LayerRGBA
classes_need_extend = Node Layer.* Sprite MenuItemFont Scene DrawNode classes_need_extend = Node Layer.* Sprite MenuItemFont Scene DrawNode
@ -104,7 +104,7 @@ skip = Node::[^setPosition$ setGrid setGLServerState description getUserObject .
TextureCache::[addPVRTCImage], TextureCache::[addPVRTCImage],
Timer::[getSelector createWithScriptHandler], Timer::[getSelector createWithScriptHandler],
*::[copyWith.* onEnter.* onExit.* ^description$ getObjectType onTouch.* onAcc.* onKey.* onRegisterTouchListener], *::[copyWith.* onEnter.* onExit.* ^description$ getObjectType onTouch.* onAcc.* onKey.* onRegisterTouchListener],
FileUtils::[(g|s)etSearchResolutionsOrder$ (g|s)etSearchPaths$ getFileData], FileUtils::[(g|s)etSearchResolutionsOrder$ (g|s)etSearchPaths$ getFileData getDataFromFile],
Application::[^application.* ^run$], Application::[^application.* ^run$],
Camera::[getEyeXYZ getCenterXYZ getUpXYZ], Camera::[getEyeXYZ getCenterXYZ getUpXYZ],
ccFontDefinition::[*], ccFontDefinition::[*],

View File

@ -1,7 +1,7 @@
[cocos2dx_spine] [cocos2dx_spine]
prefix = cocos2dx_spine prefix = cocos2dx_spine
target_namespace = cc target_namespace = sp
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include
android_flags = -D_SIZE_T_DEFINED_ android_flags = -D_SIZE_T_DEFINED_
@ -20,12 +20,12 @@ extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s
headers = %(cocosdir)s/cocos/editor-support/spine/spine-cocos2dx.h headers = %(cocosdir)s/cocos/editor-support/spine/spine-cocos2dx.h
skip = CCSkeleton::[createWithData], skip = Skeleton::[createWithData],
CCSkeletonAnimation::[createWithData] SkeletonAnimation::[createWithData]
classes = CCSkeleton CCSkeletonAnimation classes = Skeleton SkeletonAnimation
remove_prefix = CC remove_prefix =
classes_have_no_parents = classes_have_no_parents =

View File

@ -26,7 +26,7 @@ headers = %(cocosdir)s/cocos/2d/cocos2d.h %(cocosdir)s/cocos/audio/include/Simpl
# what classes to produce code for. You can use regular expressions here. When testing the regular # what classes to produce code for. You can use regular expressions here. When testing the regular
# expression, it will be enclosed in "^$", like this: "^Menu*$". # expression, it will be enclosed in "^$", like this: "^Menu*$".
classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set Data SimpleAudioEngine Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak ^Object$ UserDefault EGLViewProtocol EGLView Image Event.* DisplayLinkDirector classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* Move.* Rotate.* Blink.* Tint.* Sequence Repeat.* Fade.* Ease.* Scale.* Transition.* Spawn Animat.* Flip.* Delay.* Skew.* Jump.* Place.* Show.* Progress.* PointArray ToggleVisibility.* RemoveSelf Hide Particle.* Label.* Atlas.* TextureCache.* Texture2D Cardinal.* CatmullRom.* ParallaxNode TileMap.* TMX.* CallFunc RenderTexture GridAction Grid3DAction GridBase$ .+Grid Shaky3D Waves3D FlipX3D FlipY3D Speed ActionManager Set SimpleAudioEngine Scheduler Timer Orbit.* Follow.* Bezier.* CardinalSpline.* Camera.* DrawNode .*3D$ Liquid$ Waves$ ShuffleTiles$ TurnOffTiles$ Split.* Twirl$ FileUtils$ GLProgram ShaderCache Application ClippingNode MotionStreak ^Object$ UserDefault EGLViewProtocol EGLView Image Event.*
# what should we skip? in the format ClassName::[function function] # what should we skip? in the format ClassName::[function function]
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
@ -102,7 +102,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS
TextureCache::[addPVRTCImage], TextureCache::[addPVRTCImage],
Timer::[getSelector createWithScriptHandler], Timer::[getSelector createWithScriptHandler],
*::[copyWith.* onEnter.* onExit.* ^description$ getObjectType (g|s)etDelegate onTouch.* onAcc.* onKey.* onRegisterTouchListener], *::[copyWith.* onEnter.* onExit.* ^description$ getObjectType (g|s)etDelegate onTouch.* onAcc.* onKey.* onRegisterTouchListener],
FileUtils::[(g|s)etSearchResolutionsOrder$ (g|s)etSearchPaths$ getFileData], FileUtils::[(g|s)etSearchResolutionsOrder$ (g|s)etSearchPaths$ getFileData getDataFromFile],
Application::[^application.* ^run$], Application::[^application.* ^run$],
Camera::[getEyeXYZ getCenterXYZ getUpXYZ], Camera::[getEyeXYZ getCenterXYZ getUpXYZ],
ccFontDefinition::[*], ccFontDefinition::[*],