我们来看一下cocos2d-x中的libcocos2d库,其下有许多目录,找到textures展开,可以看到有CCTexture2D,CCTextureAtlas,CCTextureCache,CCTexturePVR四个类。
这四个类的功能分别是:
CCTexture2D: 纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。
CCTexturePVR:处理PVR文件生成纹理的类,提示:大家可以用它解析愤怒的小鸟中的图片。
CCTextureCache:纹理管理器,负责加载图片并对生成的纹理进行管理。通过“字典”来进行快速的查询。
CCTextureAtlas:纹理块管理器,如果图片是由多个小图块组成的,则纹理块管理器用来存储这些小图块的相关信息,以方便绘制相应图块。
为了让大家更好的学习纹理,在讲解纹理的代码之前我已经先给大家分析了本章用到的两个功能类:
CCImage和CCDictionary。这两个类分别在纹理模块中担任加载图片和管理纹理指针的作用。希望大家先顶一下这两篇贴子之后再开始下面的代码学习,你一定会感到非常容易。
一.CCTexture2D:
好,咱们现在开始看CCTexture2D:
- #ifndef__CCTEXTURE2D_H__
- #define__CCTEXTURE2D_H__
- #include<string>
- #include"cocoa/CCObject.h"
- #include"cocoa/CCGeometry.h"
- #include"ccTypes.h"
- NS_CC_BEGIN
- classCCImage;
- typedefenum{
- kCCTexture2DPixelFormat_RGBA8888,
- kCCTexture2DPixelFormat_RGB888,
- kCCTexture2DPixelFormat_RGB565,
- kCCTexture2DPixelFormat_A8,
- kCCTexture2DPixelFormat_I8,
- kCCTexture2DPixelFormat_AI88,
- kCCTexture2DPixelFormat_RGBA4444,
- kCCTexture2DPixelFormat_RGB5A1,
- kCCTexture2DPixelFormat_PVRTC4,
- kCCTexture2DPixelFormat_PVRTC2,
- kCCTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_RGBA8888,
- kTexture2DPixelFormat_RGBA8888=kCCTexture2DPixelFormat_RGBA8888,
- kTexture2DPixelFormat_RGB888=kCCTexture2DPixelFormat_RGB888,
- kTexture2DPixelFormat_RGB565=kCCTexture2DPixelFormat_RGB565,
- kTexture2DPixelFormat_A8=kCCTexture2DPixelFormat_A8,
- kTexture2DPixelFormat_RGBA4444=kCCTexture2DPixelFormat_RGBA4444,
- kTexture2DPixelFormat_RGB5A1=kCCTexture2DPixelFormat_RGB5A1,
- kTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_Default
- }CCTexture2DPixelFormat;
- classCCGLProgram;
- typedefstruct_ccTexParams{
- GLuintminFilter;
- GLuintmagFilter;
- GLuintwrapS;
- GLuintwrapT;
- }ccTexParams;
- classCC_DLLCCTexture2D:publicCCObject
- {
- public:
- CCTexture2D();
- virtual~CCTexture2D();
- constchar*description(void);
- voidreleaseData(void*data);
- void*keepData(void*data,unsignedintlength);
- boolinitWithData(constvoid*data,CCTexture2DPixelFormatpixelFormat,unsignedintpixelsWide,unsignedintpixelsHigh,constCCSize&contentSize);
- voiddrawAtPoint(constCCPoint&point);
- voiddrawInRect(constCCRect&rect);
- boolinitWithImage(CCImage*uiImage);
- boolinitWithString(constchar*text,constCCSize&dimensions,CCTextAlignmenthAlignment,CCVerticalTextAlignmentvAlignment,constchar*fontName,floatfontSize);
- boolinitWithString(constchar*text,floatfontSize);
- #ifdefCC_SUPPORT_PVRTC
- boolinitWithPVRTCData(constvoid*data,intlevel,intbpp,boolhasAlpha,intlength,CCTexture2DPixelFormatpixelFormat);
- #endif//CC_SUPPORT_PVRTC
- boolinitWithPVRFile(constchar*file);
- voidsetTexParameters(ccTexParams*texParams);
- voidsetAntiAliasTexParameters();
- voidsetAliasTexParameters();
- voidgenerateMipmap();
- constchar*stringForFormat();
- unsignedintbitsPerPixelForFormat();
- unsignedintbitsPerPixelForFormat(CCTexture2DPixelFormatformat);
- staticvoidsetDefaultAlphaPixelFormat(CCTexture2DPixelFormatformat);
- staticCCTexture2DPixelFormatdefaultAlphaPixelFormat();
- staticvoidPVRImagesHavePremultipliedAlpha(boolhaveAlphaPremultiplied);
- constCCSize&getContentSizeInPixels();
- boolhasPremultipliedAlpha();
- boolhasMipmaps();
- private:
- boolinitPremultipliedATextureWithImage(CCImage*image,unsignedintpixelsHigh);
- boolm_bPVRHaveAlphaPremultiplied;
- CC_PROPERTY_READONLY(CCTexture2DPixelFormat,m_ePixelFormat,PixelFormat)
- CC_PROPERTY_READONLY(unsignedint,m_uPixelsWide,PixelsWide)
- CC_PROPERTY_READONLY(unsignedint,m_uPixelsHigh,PixelsHigh)
- CC_PROPERTY_READONLY(GLuint,m_uName,Name)
- CC_PROPERTY(GLfloat,m_fMaxS,MaxS)
- CC_PROPERTY(GLfloat,m_fMaxT,MaxT)
- CC_PROPERTY_READONLY(CCSize,m_tContentSize,ContentSize)
- boolm_bHasPremultipliedAlpha;
- boolm_bHasMipmaps;
- CC_PROPERTY(CCGLProgram*,m_pShaderProgram,ShaderProgram);
- };
- NS_CC_END
- #endif//__CCTEXTURE2D_H__
再来看CCTexture2D.cpp:
- #include"CCTexture2D.h"
- #include"ccConfig.h"
- #include"ccMacros.h"
- #include"CCConfiguration.h"
- #include"platform/platform.h"
- #include"platform/CCImage.h"
- #include"CCGL.h"
- #include"support/ccUtils.h"
- #include"platform/CCPlatformMacros.h"
- #include"textures/CCTexturePVR.h"
- #include"CCDirector.h"
- #include"shaders/CCGLProgram.h"
- #include"shaders/ccGLStateCache.h"
- #include"shaders/CCShaderCache.h"
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- #include"CCTextureCache.h"
- #endif
- NS_CC_BEGIN
- staticCCTexture2DPixelFormatg_defaultAlphaPixelFormat=kCCTexture2DPixelFormat_Default;
- staticboolPVRHaveAlphaPremultiplied_=false;
- CCTexture2D::CCTexture2D()
- :m_uPixelsWide(0)
- ,m_uPixelsHigh(0)
- ,m_uName(0)
- ,m_fMaxS(0.0)
- ,m_fMaxT(0.0)
- ,m_bHasPremultipliedAlpha(false)
- ,m_bHasMipmaps(false)
- ,m_bPVRHaveAlphaPremultiplied(true)
- ,m_pShaderProgram(NULL)
- {
- }
- CCTexture2D::~CCTexture2D()
- {
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::removeTexture(this);
- #endif
- CCLOGINFO("cocos2d:deallocingCCTexture2D%u.",m_uName);
- CC_SAFE_RELEASE(m_pShaderProgram);
- if(m_uName)
- {
- ccGLDeleteTexture(m_uName);
- }
- }
- CCTexture2DPixelFormatCCTexture2D::getPixelFormat()
- {
- returnm_ePixelFormat;
- }
- unsignedintCCTexture2D::getPixelsWide()
- {
- returnm_uPixelsWide;
- }
- unsignedintCCTexture2D::getPixelsHigh()
- {
- returnm_uPixelsHigh;
- }
- GLuintCCTexture2D::getName()
- {
- returnm_uName;
- }
- CCSizeCCTexture2D::getContentSize()
- {
- CCSizeret;
- ret.width=m_tContentSize.width/CC_CONTENT_SCALE_FACTOR();
- ret.height=m_tContentSize.height/CC_CONTENT_SCALE_FACTOR();
- returnret;
- }
- constCCSize&CCTexture2D::getContentSizeInPixels()
- {
- returnm_tContentSize;
- }
- GLfloatCCTexture2D::getMaxS()
- {
- returnm_fMaxS;
- }
- voidCCTexture2D::setMaxS(GLfloatmaxS)
- {
- m_fMaxS=maxS;
- }
- GLfloatCCTexture2D::getMaxT()
- {
- returnm_fMaxT;
- }
- voidCCTexture2D::setMaxT(GLfloatmaxT)
- {
- m_fMaxT=maxT;
- }
- CCGLProgram*CCTexture2D::getShaderProgram(void)
- {
- returnm_pShaderProgram;
- }
- voidCCTexture2D::setShaderProgram(CCGLProgram*pShaderProgram)
- {
- CC_SAFE_RETAIN(pShaderProgram);
- CC_SAFE_RELEASE(m_pShaderProgram);
- m_pShaderProgram=pShaderProgram;
- }
- voidCCTexture2D::releaseData(void*data)
- {
- free(data);
- }
- void*CCTexture2D::keepData(void*data,unsignedintlength)
- {
- CC_UNUSED_PARAM(length);
- returndata;
- }
- boolCCTexture2D::hasPremultipliedAlpha()
- {
- returnm_bHasPremultipliedAlpha;
- }
- boolCCTexture2D::initWithData(constvoid*data,constCCSize&contentSize)
- {
- if(pixelFormat==kCCTexture2DPixelFormat_RGBA8888||(ccNextPOT(pixelsWide)==pixelsWide&&ccNextPOT(pixelsHigh)==pixelsHigh))
- {
- glPixelStorei(GL_UNPACK_ALIGNMENT,4);
- }
- else
- {
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- }
- glGenTextures(1,&m_uName);
- ccGLBindTexture2D(m_uName);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
- switch(pixelFormat)
- {
- casekCCTexture2DPixelFormat_RGBA8888:
- glTexImage2D(GL_TEXTURE_2D,GL_RGBA,(GLsizei)pixelsWide,(GLsizei)pixelsHigh,GL_UNSIGNED_BYTE,data);
- break;
- casekCCTexture2DPixelFormat_RGB888:
- glTexImage2D(GL_TEXTURE_2D,GL_RGB,data);
- break;
- casekCCTexture2DPixelFormat_RGBA4444:
- glTexImage2D(GL_TEXTURE_2D,GL_UNSIGNED_SHORT_4_4_4_4,data);
- break;
- casekCCTexture2DPixelFormat_RGB5A1:
- glTexImage2D(GL_TEXTURE_2D,GL_UNSIGNED_SHORT_5_5_5_1,data);
- break;
- casekCCTexture2DPixelFormat_RGB565:
- glTexImage2D(GL_TEXTURE_2D,GL_UNSIGNED_SHORT_5_6_5,data);
- break;
- casekCCTexture2DPixelFormat_AI88:
- glTexImage2D(GL_TEXTURE_2D,GL_LUMINANCE_ALPHA,data);
- break;
- casekCCTexture2DPixelFormat_A8:
- glTexImage2D(GL_TEXTURE_2D,GL_ALPHA,data);
- break;
- casekCCTexture2DPixelFormat_I8:
- glTexImage2D(GL_TEXTURE_2D,GL_LUMINANCE,data);
- break;
- default:
- CCAssert(0,"NSInternalInconsistencyException");
- }
- m_tContentSize=contentSize;
- m_uPixelsWide=pixelsWide;
- m_uPixelsHigh=pixelsHigh;
- m_ePixelFormat=pixelFormat;
- m_fMaxS=contentSize.width/(float)(pixelsWide);
- m_fMaxT=contentSize.height/(float)(pixelsHigh);
- m_bHasPremultipliedAlpha=false;
- m_bHasMipmaps=false;
- setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTexture));
- returntrue;
- }
- constchar*CCTexture2D::description(void)
- {
- returnCCString::createWithFormat("<CCTexture2D|Name=%u|Dimensions=%ux%u|Coordinates=(%.2f,%.2f)>",m_fMaxT)->getCString();
- }
- boolCCTexture2D::initWithImage(CCImage*uiImage)
- {
- if(uiImage==NULL)
- {
- CCLOG("cocos2d:CCTexture2D.Can'tcreateTexture.UIImageisnil");
- this->release();
- returnfalse;
- }
- unsignedintimageWidth=uiImage->getWidth();
- unsignedintimageHeight=uiImage->getHeight();
- CCConfiguration*conf=CCConfiguration::sharedConfiguration();
- unsignedmaxTextureSize=conf->getMaxTextureSize();
- if(imageWidth>maxTextureSize||imageHeight>maxTextureSize)
- {
- CCLOG("cocos2d:WARNING:Image(%ux%u)isbiggerthanthesupported%ux%u",imageWidth,imageHeight,maxTextureSize,maxTextureSize);
- this->release();
- returnNULL;
- }
- returninitPremultipliedATextureWithImage(uiImage,imageHeight);
- }
- boolCCTexture2D::initPremultipliedATextureWithImage(CCImage*image,unsignedintwidth,unsignedintheight)
- {
- unsignedchar*tempData=image->getData();
- unsignedint*inPixel32=NULL;
- unsignedchar*inPixel8=NULL;
- unsignedshort*outPixel16=NULL;
- boolhasAlpha=image->hasAlpha();
- CCSizeimageSize=CCSizeMake((float)(image->getWidth()),(float)(image->getHeight()));
- CCTexture2DPixelFormatpixelFormat;
- size_tbpp=image->getBitsPerComponent();
- if(hasAlpha)
- {
- pixelFormat=g_defaultAlphaPixelFormat;
- }
- else
- {
- if(bpp>=8)
- {
- pixelFormat=kCCTexture2DPixelFormat_RGB888;
- }
- else
- {
- pixelFormat=kCCTexture2DPixelFormat_RGB565;
- }
- }
- unsignedintlength=width*height;
- if(pixelFormat==kCCTexture2DPixelFormat_RGB565)
- {
- if(hasAlpha)
- {
- tempData=newunsignedchar[width*height*2];
- outPixel16=(unsignedshort*)tempData;
- inPixel32=(unsignedint*)image->getData();
- for(unsignedinti=0;i<length;++i,++inPixel32)
- {
- *outPixel16++=
- ((((*inPixel32>>0)&0xFF)>>3)<<11)|
- ((((*inPixel32>>8)&0xFF)>>2)<<5)|
- ((((*inPixel32>>16)&0xFF)>>3)<<0);
- }
- }
- else
- {
- tempData=newunsignedchar[width*height*2];
- outPixel16=(unsignedshort*)tempData;
- inPixel8=(unsignedchar*)image->getData();
- for(unsignedinti=0;i<length;++i)
- {
- *outPixel16++=
- (((*inPixel8++&0xFF)>>3)<<11)|
- (((*inPixel8++&0xFF)>>2)<<5)|
- (((*inPixel8++&0xFF)>>3)<<0);
- }
- }
- }
- elseif(pixelFormat==kCCTexture2DPixelFormat_RGBA4444)
- {
- inPixel32=(unsignedint*)image->getData();
- tempData=newunsignedchar[width*height*2];
- outPixel16=(unsignedshort*)tempData;
- for(unsignedinti=0;i<length;++i,B,A各8位数据值,然后组成RGBA4444值。放入outPixel16指向的unsignedshort数据中。
- *outPixel16++=
- ((((*inPixel32>>0)&0xFF)>>4)<<12)|
- ((((*inPixel32>>8)&0xFF)>>4)<<8)|
- ((((*inPixel32>>16)&0xFF)>>4)<<4)|
- ((((*inPixel32>>24)&0xFF)>>4)<<0);
- }
- }
- elseif(pixelFormat==kCCTexture2DPixelFormat_RGB5A1)
- {
- inPixel32=(unsignedint*)image->getData();
- tempData=newunsignedchar[width*height*2];
- outPixel16=(unsignedshort*)tempData;
- for(unsignedinti=0;i<length;++i,A各8位数据值,然后组成RGB5A1值。放入outPixel16指向的unsignedshort数据中。
- *outPixel16++=
- ((((*inPixel32>>0)&0xFF)>>3)<<11)|
- ((((*inPixel32>>8)&0xFF)>>3)<<6)|
- ((((*inPixel32>>16)&0xFF)>>3)<<1)|
- ((((*inPixel32>>24)&0xFF)>>7)<<0);
- }
- }
- elseif(pixelFormat==kCCTexture2DPixelFormat_A8)
- {
- inPixel32=(unsignedint*)image->getData();
- tempData=newunsignedchar[width*height];
- unsignedchar*outPixel8=tempData;
- for(unsignedinti=0;i<length;++i,++inPixel32)
- {
- *outPixel8++=(*inPixel32>>24)&0xFF;
- }
- }
- if(hasAlpha&&pixelFormat==kCCTexture2DPixelFormat_RGB888)
- {
- inPixel32=(unsignedint*)image->getData();
- tempData=newunsignedchar[width*height*3];
- unsignedchar*outPixel8=tempData;
- for(unsignedinti=0;i<length;++i,++inPixel32)
- {
- *outPixel8++=(*inPixel32>>0)&0xFF;
- *outPixel8++=(*inPixel32>>8)&0xFF;
- *outPixel8++=(*inPixel32>>16)&0xFF;
- }
- }
- initWithData(tempData,pixelFormat,width,height,imageSize);
- if(tempData!=image->getData())
- {
- delete[]tempData;
- }
- m_bHasPremultipliedAlpha=image->isPremultipliedAlpha();
- returntrue;
- }
- boolCCTexture2D::initWithString(constchar*text,floatfontSize)
- {
- returninitWithString(text,CCSizeMake(0,0),kCCTextAlignmentCenter,kCCVerticalTextAlignmentTop,fontName,fontSize);
- }
- boolCCTexture2D::initWithString(constchar*text,floatfontSize)
- {
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::addStringTexture(this,text,dimensions,hAlignment,vAlignment,fontSize);
- #endif
- CCImageimage;
- CCImage::ETextAligneAlign;
- if(kCCVerticalTextAlignmentTop==vAlignment)
- {
- eAlign=(kCCTextAlignmentCenter==hAlignment)?CCImage::kAlignTop
- :(kCCTextAlignmentLeft==hAlignment)?CCImage::kAlignTopLeft:CCImage::kAlignTopRight;
- }
- elseif(kCCVerticalTextAlignmentCenter==vAlignment)
- {
- eAlign=(kCCTextAlignmentCenter==hAlignment)?CCImage::kAlignCenter
- :(kCCTextAlignmentLeft==hAlignment)?CCImage::kAlignLeft:CCImage::kAlignRight;
- }
- elseif(kCCVerticalTextAlignmentBottom==vAlignment)
- {
- eAlign=(kCCTextAlignmentCenter==hAlignment)?CCImage::kAlignBottom
- :(kCCTextAlignmentLeft==hAlignment)?CCImage::kAlignBottomLeft:CCImage::kAlignBottomRight;
- }
- else
- {
- CCAssert(false,"Notsupportedalignmentformat!");
- }
- if(!image.initWithString(text,(int)dimensions.width,(int)dimensions.height,eAlign,(int)fontSize))
- {
- returnfalse;
- }
- returninitWithImage(&image);
- }
- voidCCTexture2D::drawAtPoint(constCCPoint&point)
- {
- GLfloatcoordinates[]={
- 0.0f,
- m_fMaxS,
- 0.0f,0.0f,0.0f};
- GLfloatwidth=(GLfloat)m_uPixelsWide*m_fMaxS,
- height=(GLfloat)m_uPixelsHigh*m_fMaxT;
- GLfloatvertices[]={
- point.x,point.y,
- width+point.x,
- point.x,height+point.y,height+point.y};
- ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position|kCCVertexAttribFlag_TexCoords);
- m_pShaderProgram->use();
- m_pShaderProgram->setUniformForModelViewProjectionMatrix();
- ccGLBindTexture2D(m_uName);
- glVertexAttribPointer(kCCVertexAttrib_Position,2,GL_FLOAT,GL_FALSE,vertices);
- glVertexAttribPointer(kCCVertexAttrib_TexCoords,coordinates);
- glDrawArrays(GL_TRIANGLE_STRIP,4);
- }
- voidCCTexture2D::drawInRect(constCCRect&rect)
- {
- GLfloatcoordinates[]={
- 0.0f,
- m_fMaxS,
- 0.0f,0.0f};
- GLfloatvertices[]={rect.origin.x,rect.origin.y,
- rect.origin.x+rect.size.width,*/
- rect.origin.x,rect.origin.y+rect.size.height,};
- ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position|kCCVertexAttribFlag_TexCoords);
- m_pShaderProgram->use();
- m_pShaderProgram->setUniformForModelViewProjectionMatrix();
- ccGLBindTexture2D(m_uName);
- glVertexAttribPointer(kCCVertexAttrib_Position,4);
- }
- #ifdefCC_SUPPORT_PVRTC
- boolCCTexture2D::initWithPVRTCData(constvoid*data,CCTexture2DPixelFormatpixelFormat)
- {
- if(!(CCConfiguration::sharedConfiguration()->supportsPVRTC()))
- {
- CCLOG("cocos2d:WARNING:PVRTCimagesisnotsupported.");
- this->release();
- returnfalse;
- }
- glGenTextures(1,&m_uName);
- glBindTexture(GL_TEXTURE_2D,m_uName);
- this->setAntiAliasTexParameters();
- GLenumformat;
- GLsizeisize=length*length*bpp/8;
- if(hasAlpha){
- format=(bpp==4)?GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
- }else{
- format=(bpp==4)?GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
- }
- if(size<32){
- size=32;
- }
- glCompressedTexImage2D(GL_TEXTURE_2D,level,format,length,size,data);
- m_tContentSize=CCSizeMake((float)(length),(float)(length));
- m_uPixelsWide=length;
- m_uPixelsHigh=length;
- m_fMaxS=1.0f;
- m_fMaxT=1.0f;
- m_bHasPremultipliedAlpha=PVRHaveAlphaPremultiplied_;
- m_ePixelFormat=pixelFormat;
- returntrue;
- }
- #endif//CC_SUPPORT_PVRTC
- boolCCTexture2D::initWithPVRFile(constchar*file)
- {
- boolbRet=false;
- CCTexturePVR*pvr=newCCTexturePVR;
- bRet=pvr->initWithContentsOfFile(file);
- if(bRet)
- {
- pvr->setRetainName(true);
- m_uName=pvr->getName();
- m_fMaxS=1.0f;
- m_fMaxT=1.0f;
- m_uPixelsWide=pvr->getWidth();
- m_uPixelsHigh=pvr->getHeight();
- m_tContentSize=CCSizeMake((float)m_uPixelsWide,(float)m_uPixelsHigh);
- m_bHasPremultipliedAlpha=PVRHaveAlphaPremultiplied_;
- m_ePixelFormat=pvr->getFormat();
- m_bHasMipmaps=pvr->getNumberOfMipmaps()>1;
- pvr->release();
- }
- else
- {
- CCLOG("cocos2d:Couldn'tloadPVRimage%s",file);
- }
- returnbRet;
- }
- voidCCTexture2D::PVRImagesHavePremultipliedAlpha(boolhaveAlphaPremultiplied)
- {
- PVRHaveAlphaPremultiplied_=haveAlphaPremultiplied;
- }
- voidCCTexture2D::generateMipmap()
- {
- CCAssert(m_uPixelsWide==ccNextPOT(m_uPixelsWide)&&m_uPixelsHigh==ccNextPOT(m_uPixelsHigh),"MimpaptextureonlyworksinPOTtextures");
- ccGLBindTexture2D(m_uName);
- glGenerateMipmap(GL_TEXTURE_2D);
- m_bHasMipmaps=true;
- }
- boolCCTexture2D::hasMipmaps()
- {
- returnm_bHasMipmaps;
- }
- voidCCTexture2D::setTexParameters(ccTexParams*texParams)
- {
- CCAssert((m_uPixelsWide==ccNextPOT(m_uPixelsWide)||texParams->wrapS==GL_CLAMP_TO_EDGE)&&
- (m_uPixelsHigh==ccNextPOT(m_uPixelsHigh)||texParams->wrapT==GL_CLAMP_TO_EDGE),
- "GL_CLAMP_TO_EDGEshouldbeusedinNPOTdimensions");
- ccGLBindTexture2D(m_uName);
- glTexParameteri(GL_TEXTURE_2D,texParams->minFilter);
- glTexParameteri(GL_TEXTURE_2D,texParams->magFilter);
- glTexParameteri(GL_TEXTURE_2D,texParams->wrapS);
- glTexParameteri(GL_TEXTURE_2D,texParams->wrapT);
- }
- voidCCTexture2D::setAliasTexParameters()
- {
- ccGLBindTexture2D(m_uName);
- if(!m_bHasMipmaps)
- {
- glTexParameteri(GL_TEXTURE_2D,GL_NEAREST);
- }
- else
- {
- glTexParameteri(GL_TEXTURE_2D,GL_NEAREST_MIPMAP_NEAREST);
- }
- glTexParameteri(GL_TEXTURE_2D,GL_NEAREST);
- }
- voidCCTexture2D::setAntiAliasTexParameters()
- {
- ccGLBindTexture2D(m_uName);
- if(!m_bHasMipmaps)
- {
- glTexParameteri(GL_TEXTURE_2D,GL_LINEAR);
- }
- else
- {
- glTexParameteri(GL_TEXTURE_2D,GL_LINEAR_MIPMAP_NEAREST);
- }
- glTexParameteri(GL_TEXTURE_2D,GL_LINEAR);
- }
- constchar*CCTexture2D::stringForFormat()
- {
- switch(m_ePixelFormat)
- {
- casekCCTexture2DPixelFormat_RGBA8888:
- return"RGBA8888";
- casekCCTexture2DPixelFormat_RGB888:
- return"RGB888";
- casekCCTexture2DPixelFormat_RGB565:
- return"RGB565";
- casekCCTexture2DPixelFormat_RGBA4444:
- return"RGBA4444";
- casekCCTexture2DPixelFormat_RGB5A1:
- return"RGB5A1";
- casekCCTexture2DPixelFormat_AI88:
- return"AI88";
- casekCCTexture2DPixelFormat_A8:
- return"A8";
- casekCCTexture2DPixelFormat_I8:
- return"I8";
- casekCCTexture2DPixelFormat_PVRTC4:
- return"PVRTC4";
- casekCCTexture2DPixelFormat_PVRTC2:
- return"PVRTC2";
- default:
- CCAssert(false,"unrecognisedpixelformat");
- CCLOG("stringForFormat:%ld,cannotgiveusefulresult",(long)m_ePixelFormat);
- break;
- }
- returnNULL;
- }
- voidCCTexture2D::setDefaultAlphaPixelFormat(CCTexture2DPixelFormatformat)
- {
- g_defaultAlphaPixelFormat=format;
- }
- CCTexture2DPixelFormatCCTexture2D::defaultAlphaPixelFormat()
- {
- returng_defaultAlphaPixelFormat;
- }
- unsignedintCCTexture2D::bitsPerPixelForFormat(CCTexture2DPixelFormatformat)
- {
- unsignedintret=0;
- switch(format){
- casekCCTexture2DPixelFormat_RGBA8888:
- ret=32;
- break;
- casekCCTexture2DPixelFormat_RGB888:
- ret=32;
- break;
- casekCCTexture2DPixelFormat_RGB565:
- ret=16;
- break;
- casekCCTexture2DPixelFormat_RGBA4444:
- ret=16;
- break;
- casekCCTexture2DPixelFormat_RGB5A1:
- ret=16;
- break;
- casekCCTexture2DPixelFormat_AI88:
- ret=16;
- break;
- casekCCTexture2DPixelFormat_A8:
- ret=8;
- break;
- casekCCTexture2DPixelFormat_I8:
- ret=8;
- break;
- casekCCTexture2DPixelFormat_PVRTC4:
- ret=4;
- break;
- casekCCTexture2DPixelFormat_PVRTC2:
- ret=2;
- break;
- default:
- ret=-1;
- CCAssert(false,"unrecognisedpixelformat");
- CCLOG("bitsPerPixelForFormat:%ld,(long)format);
- break;
- }
- returnret;
- }
- unsignedintCCTexture2D::bitsPerPixelForFormat()
- {
- returnthis->bitsPerPixelForFormat(m_ePixelFormat);
- }
- NS_CC_END
二.CCTexturePVR: CCTexturePVR.h:
- #ifndef__CCPVRTEXTURE_H__
- #define__CCPVRTEXTURE_H__
- #include"CCStdC.h"
- #include"CCGL.h"
- #include"cocoa/CCObject.h"
- #include"cocoa/CCArray.h"
- NS_CC_BEGIN
- structCCPVRMipmap{
- unsignedchar*address;
- unsignedintlen;
- };
- enum{
- CC_PVRMIPMAP_MAX=16,
- };
- -RGBA8888
- -BGRA8888
- -RGBA4444
- -RGBA5551
- -RGB565
- -A8
- -I8
- -AI88
- -PVRTC4BPP
- -PVRTC2BPP
- classCCTexturePVR:publicCCObject
- {
- public:
- CCTexturePVR();
- virtual~CCTexturePVR();
- boolinitWithContentsOfFile(constchar*path);
- CC_DEPRECATED_ATTRIB一个UTEstaticCCTexturePVR*pvrTextureWithContentsOfFile(constchar*path);
- staticCCTexturePVR*create(constchar*path);
- inlineunsignedintgetName(){returnm_uName;}
- inlineunsignedintgetWidth(){returnm_uWidth;}
- inlineunsignedintgetHeight(){returnm_uHeight;}
- inlineboolhasAlpha(){returnm_bHasAlpha;}
- inlineunsignedintgetNumberOfMipmaps(){returnm_uNumberOfMipmaps;}
- inlineCCTexture2DPixelFormatgetFormat(){returnm_eFormat;}
- inlineboolisRetainName(){returnm_bRetainName;}
- inlinevoidsetRetainName(boolretainName){m_bRetainName=retainName;}
- private:
- boolunpackPVRData(unsignedchar*data,unsignedintlen);
- boolcreateGLTexture();
- protected:
- structCCPVRMipmapm_asMipmaps[CC_PVRMIPMAP_MAX];
- unsignedintm_uNumberOfMipmaps;
- unsignedintm_uTableFormatIndex;
- unsignedintm_uWidth,m_uHeight;
- GLuintm_uName;
- boolm_bHasAlpha;
- boolm_bRetainName;
- CCTexture2DPixelFormatm_eFormat;
- };
- NS_CC_END
- #endif//__CCPVRTEXTURE_H__
CCTexturePVR.cpp:
- #include"CCTexture2D.h"
- #include"CCTexturePVR.h"
- #include"ccMacros.h"
- #include"CCConfiguration.h"
- #include"support/ccUtils.h"
- #include"CCStdC.h"
- #include"platform/CCFileUtils.h"
- #include"support/zip_support/ZipUtils.h"
- #include"shaders/ccGLStateCache.h"
- #include<ctype.h>
- #include<cctype>
- NS_CC_BEGIN
- #definePVR_TEXTURE_FLAG_TYPE_MASK0xff
- enum{
- kPVRTextureFlagMipmap=(1<<8),
- kPVRTextureFlagTwiddle=(1<<9),
- kPVRTextureFlagBumpmap=(1<<10),
- kPVRTextureFlagTiling=(1<<11),
- kPVRTextureFlagCubemap=(1<<12),
- kPVRTextureFlagFalseMipCol=(1<<13),
- kPVRTextureFlagVolume=(1<<14),
- kPVRTextureFlagAlpha=(1<<15),
- kPVRTextureFlagVerticalFlip=(1<<16),
- };
- staticchargPVRTexIdentifier[5]="PVR!";
- enum
- {
- kPVRTexturePixelTypeRGBA_4444=0x10,
- kPVRTexturePixelTypeRGBA_5551,
- kPVRTexturePixelTypeRGBA_8888,
- kPVRTexturePixelTypeRGB_565,
- kPVRTexturePixelTypeRGB_555,
- kPVRTexturePixelTypeRGB_888,
- kPVRTexturePixelTypeI_8,
- kPVRTexturePixelTypeAI_88,
- kPVRTexturePixelTypePVRTC_2,
- kPVRTexturePixelTypePVRTC_4,
- kPVRTexturePixelTypeBGRA_8888,
- kPVRTexturePixelTypeA_8,
- };
- staticconstunsignedinttableFormats[][7]={
- {kPVRTexturePixelTypeRGBA_4444,16,false,kCCTexture2DPixelFormat_RGBA4444},
- {kPVRTexturePixelTypeRGBA_5551,kCCTexture2DPixelFormat_RGB5A1},
- {kPVRTexturePixelTypeRGBA_8888,32,kCCTexture2DPixelFormat_RGBA8888},
- {kPVRTexturePixelTypeRGB_565,kCCTexture2DPixelFormat_RGB565},
- {kPVRTexturePixelTypeRGB_888,24,kCCTexture2DPixelFormat_RGB888},
- {kPVRTexturePixelTypeA_8,8,kCCTexture2DPixelFormat_A8},
- {kPVRTexturePixelTypeI_8,kCCTexture2DPixelFormat_I8},
- {kPVRTexturePixelTypeAI_88,kCCTexture2DPixelFormat_AI88},
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
- {kPVRTexturePixelTypePVRTC_2,GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,(unsignedint)-1,(unsignedint)-1,true,kCCTexture2DPixelFormat_PVRTC2},
- {kPVRTexturePixelTypePVRTC_4,GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,4,kCCTexture2DPixelFormat_PVRTC4},
- {kPVRTexturePixelTypeBGRA_8888,GL_BGRA,
- #endif
- };
- #defineMAX_TABLE_ELEMENTS(sizeof(tableFormats)/sizeof(tableFormats[0]))
- enum{
- kCCInternalPVRTextureFormat,
- kCCInternalOpenGLInternalFormat,
- kCCInternalOpenGLFormat,
- kCCInternalOpenGLType,
- kCCInternalBPP,
- kCCInternalCompressedImage,
- kCCInternalCCTexture2DPixelFormat,
- };
- typedefstruct_PVRTexHeader
- {
- unsignedintheaderLength;
- unsignedintheight;
- unsignedintwidth;
- unsignedintnumMipmaps;
- unsignedintflags;
- unsignedintdataLength;
- unsignedintbpp;
- unsignedintbitmaskRed;
- unsignedintbitmaskGreen;
- unsignedintbitmaskBlue;
- unsignedintbitmaskAlpha;
- unsignedintpvrTag;
- unsignedintnumSurfs;
- }PVRTexHeader;
- CCTexturePVR::CCTexturePVR()
- :m_uTableFormatIndex(0)
- ,m_uNumberOfMipmaps(0)
- ,m_uWidth(0)
- ,m_uHeight(0)
- ,m_bRetainName(false)
- ,m_bHasAlpha(false)
- ,m_eFormat(kCCTexture2DPixelFormat_Default)
- {
- }
- CCTexturePVR::~CCTexturePVR()
- {
- CCLOGINFO("cocos2d:deallocingCCTexturePVR");
- if(m_uName!=0&&!m_bRetainName)
- {
- ccGLDeleteTexture(m_uName);
- }
- }
- boolCCTexturePVR::unpackPVRData(unsignedchar*data,unsignedintlen)
- {
- boolsuccess=false;
- PVRTexHeader*header=NULL;
- unsignedintflags,pvrTag;
- unsignedintdataLength=0,dataOffset=0,dataSize=0;
- unsignedintblockSize=0,widthBlocks=0,heightBlocks=0;
- unsignedintwidth=0,height=0,bpp=4;
- unsignedchar*bytes=NULL;
- unsignedintformatFlags;
- header=(PVRTexHeader*)data;
- pvrTag=CC_SWAP_INT32_LITTLE_TO_HOST(header->pvrTag);
- if(gPVRTexIdentifier[0]!=((pvrTag>>0)&0xff)||
- gPVRTexIdentifier[1]!=((pvrTag>>8)&0xff)||
- gPVRTexIdentifier[2]!=((pvrTag>>16)&0xff)||
- gPVRTexIdentifier[3]!=((pvrTag>>24)&0xff))
- {
- CCLOG("UnsupportedPVRformat.UsetheLegacyformatuntilthenewformatissupported");
- returnfalse;
- }
- CCConfiguration*configuration=CCConfiguration::sharedConfiguration();
- flags=CC_SWAP_INT32_LITTLE_TO_HOST(header->flags);
- formatFlags=flags&PVR_TEXTURE_FLAG_TYPE_MASK;
- boolflipped=(flags&kPVRTextureFlagVerticalFlip)?true:false;
- if(flipped)
- {
- CCLOG("cocos2d:WARNING:Imageisflipped.RegenerateitusingPVRTexTool");
- }
- if(!configuration->supportsNPOT()&&
- (header->width!=ccNextPOT(header->width)||header->height!=ccNextPOT(header->height)))
- {
- CCLOG("cocos2d:ERROR:LodinganNPOTtexture(%dx%d)butisnotsupportedonthisdevice",header->width,header->height);
- returnfalse;
- }
- for(m_uTableFormatIndex=0;m_uTableFormatIndex<(unsignedint)MAX_TABLE_ELEMENTS;m_uTableFormatIndex++)
- {
- if(tableFormats[m_uTableFormatIndex][kCCInternalPVRTextureFormat]==formatFlags)
- {
- m_uNumberOfMipmaps=0;
- m_uWidth=width=CC_SWAP_INT32_LITTLE_TO_HOST(header->width);
- m_uHeight=height=CC_SWAP_INT32_LITTLE_TO_HOST(header->height);
- if(CC_SWAP_INT32_LITTLE_TO_HOST(header->bitmaskAlpha))
- {
- m_bHasAlpha=true;
- }
- else
- {
- m_bHasAlpha=false;
- }
- dataLength=CC_SWAP_INT32_LITTLE_TO_HOST(header->dataLength);
- bytes=((unsignedchar*)data)+sizeof(PVRTexHeader);
- m_eFormat=(CCTexture2DPixelFormat)(tableFormats[m_uTableFormatIndex][kCCInternalCCTexture2DPixelFormat]);
- bpp=tableFormats[m_uTableFormatIndex][kCCInternalBPP];
- while(dataOffset<dataLength)
- {
- switch(formatFlags){
- casekPVRTexturePixelTypePVRTC_2:
- blockSize=8*4;
- widthBlocks=width/8;
- heightBlocks=height/4;
- break;
- casekPVRTexturePixelTypePVRTC_4:
- blockSize=4*4;
- widthBlocks=width/4;
- heightBlocks=height/4;
- break;
- casekPVRTexturePixelTypeBGRA_8888:
- if(CCConfiguration::sharedConfiguration()->supportsBGRA8888()==false)
- {
- CCLOG("cocos2d:TexturePVR.BGRA8888notsupportedonthisdevice");
- returnfalse;
- }
- default:
- blockSize=1;
- widthBlocks=width;
- heightBlocks=height;
- break;
- }
- if(widthBlocks<2)
- {
- widthBlocks=2;
- }
- if(heightBlocks<2)
- {
- heightBlocks=2;
- }
- dataSize=widthBlocks*heightBlocks*((blockSize*bpp)/8);
- unsignedintpacketLength=(dataLength-dataOffset);
- packetLength=packetLength>dataSize?dataSize:packetLength;
- m_asMipmaps[m_uNumberOfMipmaps].address=bytes+dataOffset;
- m_asMipmaps[m_uNumberOfMipmaps].len=packetLength;
- m_uNumberOfMipmaps++;
- CCAssert(m_uNumberOfMipmaps<CC_PVRMIPMAP_MAX,
- "TexturePVR:Maximumnumberofmimpapsreached.IncreatetheCC_PVRMIPMAP_MAXvalue");
- dataOffset+=packetLength;
- width=MAX(width>>1,1);
- height=MAX(height>>1,1);
- }
- success=true;
- break;
- }
- }
- if(!success)
- {
- CCLOG("cocos2d:WARNING:UnsupportedPVRPixelFormat:0x%2x.Re-encodeitwithaOpenGLpixelformatvariant",formatFlags);
- }
- returnsuccess;
- }
- boolCCTexturePVR::createGLTexture()
- {
- unsignedintwidth=m_uWidth;
- unsignedintheight=m_uHeight;
- GLenumerr;
- if(m_uNumberOfMipmaps>0)
- {
- if(m_uName!=0)
- {
- ccGLDeleteTexture(m_uName);
- }
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- glGenTextures(1,&m_uName);
- glBindTexture(GL_TEXTURE_2D,m_uName);
- if(m_uNumberOfMipmaps==1)
- {
- glTexParameteri(GL_TEXTURE_2D,GL_LINEAR);
- }
- else
- {
- glTexParameteri(GL_TEXTURE_2D,GL_LINEAR_MIPMAP_NEAREST);
- }
- glTexParameteri(GL_TEXTURE_2D,GL_CLAMP_TO_EDGE);
- }
- CHECK_GL_ERROR_DEBUG();
- GLenuminternalFormat=tableFormats[m_uTableFormatIndex][kCCInternalOpenGLInternalFormat];
- GLenumformat=tableFormats[m_uTableFormatIndex][kCCInternalOpenGLFormat];
- GLenumtype=tableFormats[m_uTableFormatIndex][kCCInternalOpenGLType];
- boolcompressed=(0==tableFormats[m_uTableFormatIndex][kCCInternalCompressedImage])?false:true;
- for(unsignedinti=0;i<m_uNumberOfMipmaps;++i)
- {
- if(compressed&&!CCConfiguration::sharedConfiguration()->supportsPVRTC())
- {
- CCLOG("cocos2d:WARNING:PVRTCimagesarenotsupported");
- returnfalse;
- }
- unsignedchar*data=m_asMipmaps[i].address;
- unsignedintdatalen=m_asMipmaps[i].len;
- if(compressed)
- {
- glCompressedTexImage2D(GL_TEXTURE_2D,i,internalFormat,datalen,data);
- }
- else
- {
- glTexImage2D(GL_TEXTURE_2D,type,data);
- }
- if(i>0&&(width!=height||ccNextPOT(width)!=width))
- {
- CCLOG("cocos2d:TexturePVR.WARNING.Mipmaplevel%uisnotsquared.Texturewon'trendercorrectly.width=%u!=height=%u",height);
- }
- err=glGetError();
- if(err!=GL_NO_ERROR)
- {
- CCLOG("cocos2d:TexturePVR:Erroruploadingcompressedtexturelevel:%u.glError:0x%04X",err);
- returnfalse;
- }
- width=MAX(width>>1,1);
- }
- returntrue;
- }
- boolCCTexturePVR::initWithContentsOfFile(constchar*path)
- {
- unsignedchar*pvrdata=NULL;
- intpvrlen=0;
- std::stringlowerCase(path);
- for(unsignedinti=0;i<lowerCase.length();++i)
- {
- lowerCase[i]=tolower(lowerCase[i]);
- }
- if(lowerCase.find(".ccz")!=std::string::npos)
- {
- pvrlen=ZipUtils::ccInflateCCZFile(path,&pvrdata);
- }
- elseif(lowerCase.find(".gz")!=std::string::npos)
- {
- pvrlen=ZipUtils::ccInflateGZipFile(path,&pvrdata);
- }
- else
- {
- pvrdata=CCFileUtils::sharedFileUtils()->getFileData(path,"rb",(unsignedlong*)(&pvrlen));
- }
- if(pvrlen<0)
- {
- this->release();
- returnfalse;
- }
- m_uNumberOfMipmaps=0;
- m_uName=0;
- m_uWidth=m_uHeight=0;
- m_bHasAlpha=false;
- m_bRetainName=false;
- if(!unpackPVRData(pvrdata,pvrlen)||!createGLTexture())
- {
- CC_SAFE_DELETE_ARRAY(pvrdata);
- this->release();
- returnfalse;
- }
- CC_SAFE_DELETE_ARRAY(pvrdata);
- returntrue;
- }
- CCTexturePVR*CCTexturePVR::pvrTextureWithContentsOfFile(constchar*path)
- {
- returnCCTexturePVR::create(path);
- }
- CCTexturePVR*CCTexturePVR::create(constchar*path)
- {
- CCTexturePVR*pTexture=newCCTexturePVR();
- if(pTexture)
- {
- if(pTexture->initWithContentsOfFile(path))
- {
- pTexture->autorelease();
- }
- else
- {
- deletepTexture;
- pTexture=NULL;
- }
- }
- returnpTexture;
- }
- NS_CC_END
三.CCTextureCache:
打开CCTextureCache.h:
- #ifndef__CCTEXTURE_CACHE_H__
- #define__CCTEXTURE_CACHE_H__
- #include"cocoa/CCObject.h"
- #include"cocoa/CCDictionary.h"
- #include"textures/CCTexture2D.h"
- #include<string>
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- #include"platform/CCImage.h"
- #include<list>
- #endif
- NS_CC_BEGIN
- classCCLock;
- classCCImage;
- classCC_DLLCCTextureCache:publicCCObject
- {
- protected:
- CCDictionary*m_pTextures;
- private:
- voidaddImageAsyncCallBack(floatdt);
- public:
- CCTextureCache();
- virtual~CCTextureCache();
- constchar*description(void);
- CCDictionary*snapshotTextures();
- staticCCTextureCache*sharedTextureCache();
- staticvoidpurgeSharedTextureCache();
- CCTexture2D*addImage(constchar*fileimage);
- voidaddImageAsync(constchar*path,CCObject*target,SEL_CallFuncOselector);
- CCTexture2D*addUIImage(CCImage*image,constchar*key);
- CCTexture2D*textureForKey(constchar*key);
- voidremoveAllTextures();
- voidremoveUnusedTextures();
- voidremoveTexture(CCTexture2D*texture);
- voidremoveTextureForKey(constchar*textureKeyName);
- voiddumpCachedTextureInfo();
- #ifdefCC_SUPPORT_PVRTC
- CCTexture2D*addPVRTCImage(constchar*fileimage,intwidth);
- #endif//CC_SUPPORT_PVRTC
- CCTexture2D*addPVRImage(constchar*filename);
- staticvoidreloadAllTextures();
- };
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- classVolatileTexture
- {
- typedefenum{
- kInvalid=0,
- kImageFile,
- kImageData,
- kString,
- kImage,
- }ccCachedImageType;
- public:
- VolatileTexture(CCTexture2D*t);
- ~VolatileTexture();
- staticvoidaddImageTexture(CCTexture2D*tt,constchar*imageFileName,CCImage::EImageFormatformat);
- staticvoidaddStringTexture(CCTexture2D*tt,constchar*text,CCTextAlignmentalignment,
- CCVerticalTextAlignmentvAlignment,constchar*fontName,floatfontSize);
- staticvoidaddDataTexture(CCTexture2D*tt,void*data,constCCSize&contentSize);
- staticvoidaddCCImage(CCTexture2D*tt,CCImage*image);
- staticvoidremoveTexture(CCTexture2D*t);
- staticvoidreloadAllTextures();
- public:
- staticstd::list<VolatileTexture*>textures;
- staticboolisReloading;
- private:
- staticVolatileTexture*findVolotileTexture(CCTexture2D*tt);
- protected:
- CCTexture2D*texture;
- CCImage*uiImage;
- ccCachedImageTypem_eCashedImageType;
- void*m_pTextureData;
- CCSizem_TextureSize;
- CCTexture2DPixelFormatm_PixelFormat;
- std::stringm_strFileName;
- CCImage::EImageFormatm_FmtImage;
- CCSizem_size;
- CCTextAlignmentm_alignment;
- CCVerticalTextAlignmentm_vAlignment;
- std::stringm_strFontName;
- std::stringm_strText;
- floatm_fFontSize;
- };
- #endif
- NS_CC_END
- #endif//__CCTEXTURE_CACHE_H__
然后是CPP文件:
- #include"CCTextureCache.h"
- #include"CCTexture2D.h"
- #include"ccMacros.h"
- #include"CCDirector.h"
- #include"platform/platform.h"
- #include"platform/CCFileUtils.h"
- #include"platform/CCThread.h"
- #include"platform/CCImage.h"
- #include"support/ccUtils.h"
- #include"CCScheduler.h"
- #include"cocoa/CCString.h"
- #include<errno.h>
- #include<stack>
- #include<string>
- #include<cctype>
- #include<queue>
- #include<list>
- #include<pthread.h>
- #include<semaphore.h>
- usingnamespacestd;
- NS_CC_BEGIN
- typedefstruct_AsyncStruct
- {
- std::stringfilename;
- CCObject*target;
- SEL_CallFuncOselector;
- }AsyncStruct;
- typedefstruct_ImageInfo
- {
- AsyncStruct*asyncStruct;
- CCImage*image;
- CCImage::EImageFormatimageType
- }ImageInfo;
- staticpthread_ts_loadingThread;
- staticpthread_mutex_ts_asyncStructQueueMutex;
- staticpthread_mutex_ts_ImageInfoMutex;
- staticsem_t*s_pSem=NULL;
- staticunsignedlongs_nAsyncRefCount=0;
- #ifCC_TARGET_PLATFORM==CC_PLATFORM_IOS
- #defineCC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE1
- #else
- #defineCC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE0
- #endif
- #ifCC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE
- #defineCC_ASYNC_TEXTURE_CACHE_SEMAPHORE"ccAsync"
- #else
- staticsem_ts_sem;
- #endif
- staticboolneed_quit=false;
- staticstd::queue<AsyncStruct*>*s_pAsyncStructQueue=NULL;
- staticstd::queue<ImageInfo*>*s_pImageQueue=NULL;
- staticCCImage::EImageFormatcomputeImageFormatType(string&filename)
- {
- CCImage::EImageFormatret=CCImage::kFmtUnKnown;
- if((std::string::npos!=filename.find(".jpg"))||(std::string::npos!=filename.find(".jpeg")))
- {
- ret=CCImage::kFmtJpg;
- }
- elseif((std::string::npos!=filename.find(".png"))||(std::string::npos!=filename.find(".PNG")))
- {
- ret=CCImage::kFmtPng;
- }
- elseif((std::string::npos!=filename.find(".tiff"))||(std::string::npos!=filename.find(".TIFF")))
- {
- ret=CCImage::kFmtTiff;
- }
- returnret;
- }
- staticvoid*loadImage(void*data)
- {
- CCThreadthread;
- thread.createAutoreleasePool();
- AsyncStruct*pAsyncStruct=NULL;
- while(true)
- {
- intsemWaitRet=sem_wait(s_pSem);
- if(semWaitRet<0)
- {
- CCLOG("CCTextureCacheasyncthreadsemaphoreerror:%sn",strerror(errno));
- break;
- }
- std::queue<AsyncStruct*>*pQueue=s_pAsyncStructQueue;
- pthread_mutex_lock(&s_asyncStructQueueMutex);
- if(pQueue->empty())
- {
- pthread_mutex_unlock(&s_asyncStructQueueMutex);
- if(need_quit)
- break;
- else
- continue;
- }
- else
- {
- pAsyncStruct=pQueue->front();
- pQueue->pop();
- pthread_mutex_unlock(&s_asyncStructQueueMutex);
- }
- constchar*filename=pAsyncStruct->filename.c_str();
- CCImage::EImageFormatimageType=computeImageFormatType(pAsyncStruct->filename);
- if(imageType==CCImage::kFmtUnKnown)
- {
- CCLOG("unsupporttedformat%s",filename);
- deletepAsyncStruct;
- continue;
- }
- CCImage*pImage=newCCImage();
- if(!pImage->initWithImageFileThreadSafe(filename,imageType))
- {
- deletepImage;
- CCLOG("cannotload%s",filename);
- continue;
- }
- ImageInfo*pImageInfo=newImageInfo();
- pImageInfo->asyncStruct=pAsyncStruct;
- pImageInfo->image=pImage;
- pImageInfo->imageType=imageType;
- pthread_mutex_lock(&s_ImageInfoMutex);
- s_pImageQueue->push(pImageInfo);
- pthread_mutex_unlock(&s_ImageInfoMutex);
- }
- if(s_pSem!=NULL)
- {
- #ifCC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE
- sem_unlink(CC_ASYNC_TEXTURE_CACHE_SEMAPHORE);
- sem_close(s_pSem);
- #else
- sem_destroy(s_pSem);
- #endif
- s_pSem=NULL;
- deletes_pAsyncStructQueue;
- deletes_pImageQueue;
- }
- return0;
- }
- staticCCTextureCache*g_sharedTextureCache=NULL;
- CCTextureCache*CCTextureCache::sharedTextureCache()
- {
- if(!g_sharedTextureCache)
- {
- g_sharedTextureCache=newCCTextureCache();
- }
- returng_sharedTextureCache;
- }
- CCTextureCache::CCTextureCache()
- {
- CCAssert(g_sharedTextureCache==NULL,"Attemptedtoallocateasecondinstanceofasingleton.");
- m_pTextures=newCCDictionary();
- }
- CCTextureCache::~CCTextureCache()
- {
- CCLOGINFO("cocos2d:deallocingCCTextureCache.");
- need_quit=true;
- if(s_pSem!=NULL)
- {
- sem_post(s_pSem);
- }
- CC_SAFE_RELEASE(m_pTextures);
- }
- voidCCTextureCache::purgeSharedTextureCache()
- {
- CC_SAFE_RELEASE_NULL(g_sharedTextureCache);
- }
- constchar*CCTextureCache::description()
- {
- returnCCString::createWithFormat("<CCTextureCache|Numberoftextures=%u>",m_pTextures->count())->getCString();
- }
- CCDictionary*CCTextureCache::snapshotTextures()
- {
- CCDictionary*pRet=newCCDictionary();
- CCDictElement*pElement=NULL;
- CCDICT_FOREACH(m_pTextures,pElement)
- {
- pRet->setObject(pElement->getObject(),pElement->getStrKey());
- }
- returnpRet;
- }
- voidCCTextureCache::addImageAsync(constchar*path,SEL_CallFuncOselector)
- {
- CCAssert(path!=NULL,"TextureCache:fileimageMUSTnotbeNULL");
- CCTexture2D*texture=NULL;
- std::stringpathKey=path;
- pathKey=CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pathKey.c_str());
- texture=(CCTexture2D*)m_pTextures->objectForKey(pathKey.c_str());
- std::stringfullpath=pathKey;
- if(texture!=NULL)
- {
- if(target&&selector)
- {
- (target->*selector)(texture);
- }
- return;
- }
- if(s_pSem==NULL)
- {
- #ifCC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE
- s_pSem=sem_open(CC_ASYNC_TEXTURE_CACHE_SEMAPHORE,O_CREAT,0644,0);
- if(s_pSem==SEM_FAILED)
- {
- CCLOG("CCTextureCacheasyncthreadsemaphoreiniterror:%sn",strerror(errno));
- s_pSem=NULL;
- return;
- }
- #else
- intsemInitRet=sem_init(&s_sem,0);
- if(semInitRet<0)
- {
- CCLOG("CCTextureCacheasyncthreadsemaphoreiniterror:%sn",strerror(errno));
- return;
- }
- s_pSem=&s_sem;
- #endif
- s_pAsyncStructQueue=newqueue<AsyncStruct*>();
- s_pImageQueue=newqueue<ImageInfo*>();
- pthread_mutex_init(&s_asyncStructQueueMutex,NULL);
- pthread_mutex_init(&s_ImageInfoMutex,NULL);
- pthread_create(&s_loadingThread,NULL,loadImage,NULL);
- need_quit=false;
- }
- if(0==s_nAsyncRefCount)
- {
- CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CCTextureCache::addImageAsyncCallBack),this,false);
- }
- ++s_nAsyncRefCount;
- if(target)
- {
- target->retain();
- }
- AsyncStruct*data=newAsyncStruct();
- data->filename=fullpath.c_str();
- data->target=target;
- data->selector=selector;
- pthread_mutex_lock(&s_asyncStructQueueMutex);
- s_pAsyncStructQueue->push(data);
- pthread_mutex_unlock(&s_asyncStructQueueMutex);
- sem_post(s_pSem);
- }
- voidCCTextureCache::addImageAsyncCallBack(floatdt)
- {
- std::queue<ImageInfo*>*imagesQueue=s_pImageQueue;
- pthread_mutex_lock(&s_ImageInfoMutex);
- if(imagesQueue->empty())
- {
- pthread_mutex_unlock(&s_ImageInfoMutex);
- }
- else
- {
- ImageInfo*pImageInfo=imagesQueue->front();
- imagesQueue->pop();
- pthread_mutex_unlock(&s_ImageInfoMutex);
- AsyncStruct*pAsyncStruct=pImageInfo->asyncStruct;
- CCImage*pImage=pImageInfo->image;
- CCObject*target=pAsyncStruct->target;
- SEL_CallFuncOselector=pAsyncStruct->selector;
- constchar*filename=pAsyncStruct->filename.c_str();
- CCTexture2D*texture=newCCTexture2D();
- #if0//TODO:(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
- texture->initWithImage(pImage,kCCResolutioniPhone);
- #else
- texture->initWithImage(pImage);
- #endif
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::addImageTexture(texture,filename,pImageInfo->imageType);
- #endif
- m_pTextures->setObject(texture,filename);
- texture->autorelease();
- if(target&&selector)
- {
- (target->*selector)(texture);
- target->release();
- }
- pImage->release();
- deletepAsyncStruct;
- deletepImageInfo;
- --s_nAsyncRefCount;
- if(0==s_nAsyncRefCount)
- {
- CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(schedule_selector(CCTextureCache::addImageAsyncCallBack),this);
- }
- }
- }
- CCTexture2D*CCTextureCache::addImage(constchar*path)
- {
- CCAssert(path!=NULL,"TextureCache:fileimageMUSTnotbeNULL");
- CCTexture2D*texture=NULL;
- std::stringpathKey=path;
- pathKey=CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pathKey.c_str());
- texture=(CCTexture2D*)m_pTextures->objectForKey(pathKey.c_str());
- std::stringfullpath=pathKey;
- if(!texture)
- {
- std::stringlowerCase(path);
- for(unsignedinti=0;i<lowerCase.length();++i)
- {
- lowerCase[i]=tolower(lowerCase[i]);
- }
- do
- {
- if(std::string::npos!=lowerCase.find(".pvr"))
- {
- texture=this->addPVRImage(fullpath.c_str());
- }
- else
- {
- CCImage::EImageFormateImageFormat=CCImage::kFmtUnKnown;
- if(std::string::npos!=lowerCase.find(".png"))
- {
- eImageFormat=CCImage::kFmtPng;
- }
- elseif(std::string::npos!=lowerCase.find(".jpg")||std::string::npos!=lowerCase.find(".jpeg"))
- {
- eImageFormat=CCImage::kFmtJpg;
- }
- elseif(std::string::npos!=lowerCase.find(".tif")||std::string::npos!=lowerCase.find(".tiff"))
- {
- eImageFormat=CCImage::kFmtTiff;
- }
- CCImageimage;
- unsignedlongnSize=0;
- unsignedchar*pBuffer=CCFileUtils::sharedFileUtils()->getFileData(fullpath.c_str(),"rb",&nSize);
- CC_BREAK_IF(!image.initWithImageData((void*)pBuffer,nSize,eImageFormat));
- CC_SAFE_DELETE_ARRAY(pBuffer);
- texture=newCCTexture2D();
- if(texture&&
- texture->initWithImage(&image))
- {
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::addImageTexture(texture,fullpath.c_str(),eImageFormat);
- #endif
- m_pTextures->setObject(texture,pathKey.c_str());
- texture->release();
- }
- else
- {
- CCLOG("cocos2d:Couldn'taddimage:%sinCCTextureCache",path);
- }
- }
- }while(0);
- }
- returntexture;
- }
- #ifdefCC_SUPPORT_PVRTC
- CCTexture2D*CCTextureCache::addPVRTCImage(constchar*path,intwidth)
- {
- CCAssert(path!=NULL,"TextureCache:fileimageMUSTnotbenill");
- CCAssert(bpp==2||bpp==4,"TextureCache:bppmustbeeither2or4");
- CCTexture2D*texture;
- std::stringtemp(path);
- if((texture=(CCTexture2D*)m_pTextures->objectForKey(temp.c_str())))
- {
- returntexture;
- }
- std::stringfullpath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(path));
- unsignedlongnLen=0;
- unsignedchar*pData=CCFileUtils::sharedFileUtils()->getFileData(fullpath.c_str(),&nLen);
- texture=newCCTexture2D();
- if(texture->initWithPVRTCData(pData,bpp,hasAlpha,
- (bpp==2?kCCTexture2DPixelFormat_PVRTC2:kCCTexture2DPixelFormat_PVRTC4)))
- {
- m_pTextures->setObject(texture,temp.c_str());
- texture->autorelease();
- }
- else
- {
- CCLOG("cocos2d:Couldn'taddPVRTCImage:%sinCCTextureCache",path);
- }
- CC_SAFE_DELETE_ARRAY(pData);
- returntexture;
- }
- #endif//CC_SUPPORT_PVRTC
- CCTexture2D*CCTextureCache::addPVRImage(constchar*path)
- {
- CCAssert(path!=NULL,"TextureCache:fileimageMUSTnotbenill");
- CCTexture2D*texture=NULL;
- std::stringkey(path);
- if((texture=(CCTexture2D*)m_pTextures->objectForKey(key.c_str())))
- {
- returntexture;
- }
- std::stringfullpath=CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(key.c_str());
- texture=newCCTexture2D();
- if(texture!=NULL&&texture->initWithPVRFile(fullpath.c_str()))
- {
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::addImageTexture(texture,CCImage::kFmtRawData);
- #endif
- m_pTextures->setObject(texture,key.c_str());
- texture->autorelease();
- }
- else
- {
- CCLOG("cocos2d:Couldn'taddPVRImage:%sinCCTextureCache",key.c_str());
- CC_SAFE_DELETE(texture);
- }
- returntexture;
- }
- CCTexture2D*CCTextureCache::addUIImage(CCImage*image,constchar*key)
- {
- CCAssert(image!=NULL,"TextureCache:imageMUSTnotbenill");
- CCTexture2D*texture=NULL;
- std::stringforKey;
- if(key)
- {
- forKey=CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(key);
- }
- do
- {
- if(key&&(texture=(CCTexture2D*)m_pTextures->objectForKey(forKey.c_str())))
- {
- break;
- }
- texture=newCCTexture2D();
- texture->initWithImage(image);
- if(key&&texture)
- {
- m_pTextures->setObject(texture,forKey.c_str());
- texture->autorelease();
- }
- else
- {
- CCLOG("cocos2d:Couldn'taddUIImageinCCTextureCache");
- }
- }while(0);
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::addCCImage(texture,image);
- #endif
- returntexture;
- }
- voidCCTextureCache::removeAllTextures()
- {
- m_pTextures->removeAllObjects();
- }
- voidCCTextureCache::removeUnusedTextures()
- {
- if(m_pTextures->count())
- {
- CCDictElement*pElement=NULL;
- list<CCDictElement*>elementToRemove;
- CCDICT_FOREACH(m_pTextures,pElement)
- {
- CCLOG("cocos2d:CCTextureCache:texture:%s",pElement->getStrKey());
- CCTexture2D*value=(CCTexture2D*)pElement->getObject();
- if(value->retainCount()==1)
- {
- elementToRemove.push_back(pElement);
- }
- }
- for(list<CCDictElement*>::iteratoriter=elementToRemove.begin();iter!=elementToRemove.end();++iter)
- {
- CCLOG("cocos2d:CCTextureCache:removingunusedtexture:%s",(*iter)->getStrKey());
- m_pTextures->removeObjectForElememt(*iter);
- }
- }
- }
- voidCCTextureCache::removeTexture(CCTexture2D*texture)
- {
- if(!texture)
- {
- return;
- }
- CCArray*keys=m_pTextures->allKeysForObject(texture);
- m_pTextures->removeObjectsForKeys(keys);
- }
- voidCCTextureCache::removeTextureForKey(constchar*textureKeyName)
- {
- if(textureKeyName==NULL)
- {
- return;
- }
- stringfullPath=CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(textureKeyName);
- m_pTextures->removeObjectForKey(fullPath.c_str());
- }
- CCTexture2D*CCTextureCache::textureForKey(constchar*key)
- {
- return(CCTexture2D*)m_pTextures->objectForKey(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(key));
- }
- voidCCTextureCache::reloadAllTextures()
- {
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- VolatileTexture::reloadAllTextures();
- #endif
- }
- voidCCTextureCache::dumpCachedTextureInfo()
- {
- unsignedintcount=0;
- unsignedinttotalBytes=0;
- CCDictElement*pElement=NULL;
- CCDICT_FOREACH(m_pTextures,pElement)
- {
- CCTexture2D*tex=(CCTexture2D*)pElement->getObject();
- unsignedintbpp=tex->bitsPerPixelForFormat();
- unsignedintbytes=tex->getPixelsWide()*tex->getPixelsHigh()*bpp/8;
- totalBytes+=bytes;
- count++;
- CCLOG("cocos2d:"%s"rc=%luid=%lu%lux%lu@%ldbpp=>%luKB",
- pElement->getStrKey(),
- (long)tex->retainCount(),
- (long)tex->getName(),
- (long)tex->getPixelsWide(),
- (long)tex->getPixelsHigh(),
- (long)bpp,
- (long)bytes/1024);
- }
- CCLOG("cocos2d:CCTextureCachedumpDebugInfo:%ldtextures,for%luKB(%.2fMB)",(long)count,(long)totalBytes/1024,totalBytes/(1024.0f*1024.0f));
- }
- #ifCC_ENABLE_CACHE_TEXTURE_DATA
- std::list<VolatileTexture*>VolatileTexture::textures;
- boolVolatileTexture::isReloading=false;
- VolatileTexture::VolatileTexture(CCTexture2D*t)
- :texture(t)
- ,m_eCashedImageType(kInvalid)
- ,m_pTextureData(NULL)
- ,m_PixelFormat(kTexture2DPixelFormat_RGBA8888)
- ,m_strFileName("")
- ,m_FmtImage(CCImage::kFmtPng)
- ,m_alignment(kCCTextAlignmentCenter)
- ,m_vAlignment(kCCVerticalTextAlignmentCenter)
- ,m_strFontName("")
- ,m_strText("")
- ,uiImage(NULL)
- ,m_fFontSize(0.0f)
- {
- m_size=CCSizeMake(0,0);
- textures.push_back(this);
- }
- VolatileTexture::~VolatileTexture()
- {
- textures.remove(this);
- CC_SAFE_RELEASE(uiImage);
- }
- voidVolatileTexture::addImageTexture(CCTexture2D*tt,CCImage::EImageFormatformat)
- {
- if(isReloading)
- {
- return;
- }
- VolatileTexture*vt=findVolotileTexture(tt);
- vt->m_eCashedImageType=kImageFile;
- vt->m_strFileName=imageFileName;
- vt->m_FmtImage=format;
- vt->m_PixelFormat=tt->getPixelFormat();
- }
- voidVolatileTexture::addCCImage(CCTexture2D*tt,CCImage*image)
- {
- VolatileTexture*vt=findVolotileTexture(tt);
- image->retain();
- vt->uiImage=image;
- vt->m_eCashedImageType=kImage;
- }
- VolatileTexture*VolatileTexture::findVolotileTexture(CCTexture2D*tt)
- {
- VolatileTexture*vt=0;
- std::list<VolatileTexture*>::iteratori=textures.begin();
- while(i!=textures.end())
- {
- VolatileTexture*v=*i++;
- if(v->texture==tt)
- {
- vt=v;
- break;
- }
- }
- if(!vt)
- {
- vt=newVolatileTexture(tt);
- }
- returnvt;
- }
- voidVolatileTexture::addDataTexture(CCTexture2D*tt,constCCSize&contentSize)
- {
- if(isReloading)
- {
- return;
- }
- VolatileTexture*vt=findVolotileTexture(tt);
- vt->m_eCashedImageType=kImageData;
- vt->m_pTextureData=data;
- vt->m_PixelFormat=pixelFormat;
- vt->m_TextureSize=contentSize;
- }
- voidVolatileTexture::addStringTexture(CCTexture2D*tt,floatfontSize)
- {
- if(isReloading)
- {
- return;
- }
- VolatileTexture*vt=findVolotileTexture(tt);
- vt->m_eCashedImageType=kString;
- vt->m_size=dimensions;
- vt->m_strFontName=fontName;
- vt->m_alignment=alignment;
- vt->m_vAlignment=vAlignment;
- vt->m_fFontSize=fontSize;
- vt->m_strText=text;
- }
- voidVolatileTexture::removeTexture(CCTexture2D*t)
- {
- std::list<VolatileTexture*>::iteratori=textures.begin();
- while(i!=textures.end())
- {
- VolatileTexture*vt=*i++;
- if(vt->texture==t)
- {
- deletevt;
- break;
- }
- }
- }
- voidVolatileTexture::reloadAllTextures()
- {
- isReloading=true;
- CCLOG("reloadalltexture");
- std::list<VolatileTexture*>::iteratoriter=textures.begin();
- while(iter!=textures.end())
- {
- VolatileTexture*vt=*iter++;
- switch(vt->m_eCashedImageType)
- {
- casekImageFile:
- {
- CCImageimage;
- std::stringlowerCase(vt->m_strFileName.c_str());
- for(unsignedinti=0;i<lowerCase.length();++i)
- {
- lowerCase[i]=tolower(lowerCase[i]);
- }
- if(std::string::npos!=lowerCase.find(".pvr"))
- {
- CCTexture2DPixelFormatoldPixelFormat=CCTexture2D::defaultAlphaPixelFormat();
- CCTexture2D::setDefaultAlphaPixelFormat(vt->m_PixelFormat);
- vt->texture->initWithPVRFile(vt->m_strFileName.c_str());
- CCTexture2D::setDefaultAlphaPixelFormat(oldPixelFormat);
- }
- else
- {
- unsignedlongnSize=0;
- unsignedchar*pBuffer=CCFileUtils::sharedFileUtils()->getFileData(vt->m_strFileName.c_str(),&nSize);
- if(image.initWithImageData((void*)pBuffer,vt->m_FmtImage))
- {
- CCTexture2DPixelFormatoldPixelFormat=CCTexture2D::defaultAlphaPixelFormat();
- vt->texture->initWithImage(&image);
- CCTexture2D::setDefaultAlphaPixelFormat(oldPixelFormat);
- }
- CC_SAFE_DELETE_ARRAY(pBuffer);
- }
- }
- break;
- casekImageData:
- {
- vt->texture->initWithData(vt->m_pTextureData,
- vt->m_PixelFormat,
- vt->m_TextureSize.width,
- vt->m_TextureSize.height,
- vt->m_TextureSize);
- }
- break;
- casekString:
- {
- vt->texture->initWithString(vt->m_strText.c_str(),
- vt->m_size,
- vt->m_alignment,
- vt->m_vAlignment,
- vt->m_strFontName.c_str(),
- vt->m_fFontSize);
- }
- break;
- casekImage:
- {
- vt->texture->initWithImage(vt->uiImage);
- }
- break;
- default:
- break;
- }
- }
- isReloading=false;
- }
- #endif//CC_ENABLE_CACHE_TEXTURE_DATA
- NS_CC_END
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|