123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- /****************************************************************************
- Copyright (c) 2008-2010 Ricardo Quesada
- Copyright (c) 2011-2012 cocos2d-x.org
- Copyright (c) 2013-2014 Chukong Technologies Inc.
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- /**
- * cc.textureCache is a singleton object, it's the global cache for cc.Texture2D
- * @class
- * @name cc.textureCache
- */
- cc.textureCache = /** @lends cc.textureCache# */{
- _textures: {},
- _textureColorsCache: {},
- _textureKeySeq: (0 | Math.random() * 1000),
- _loadedTexturesBefore: {},
- //handleLoadedTexture move to Canvas/WebGL
- _initializingRenderer: function () {
- var selPath;
- //init texture from _loadedTexturesBefore
- var locLoadedTexturesBefore = this._loadedTexturesBefore, locTextures = this._textures;
- for (selPath in locLoadedTexturesBefore) {
- var tex2d = locLoadedTexturesBefore[selPath];
- tex2d.handleLoadedTexture();
- locTextures[selPath] = tex2d;
- }
- this._loadedTexturesBefore = {};
- },
- /**
- * <p>
- * Returns a Texture2D object given an PVR filename <br/>
- * If the file image was not previously loaded, it will create a new CCTexture2D <br/>
- * object and it will return it. Otherwise it will return a reference of a previously loaded image <br/>
- * note: AddPVRTCImage does not support on HTML5
- * </p>
- * @param {String} filename
- * @return {cc.Texture2D}
- */
- addPVRTCImage: function (filename) {
- cc.log(cc._LogInfos.textureCache_addPVRTCImage);
- },
- /**
- * <p>
- * Returns a Texture2D object given an ETC filename <br/>
- * If the file image was not previously loaded, it will create a new CCTexture2D <br/>
- * object and it will return it. Otherwise it will return a reference of a previously loaded image <br/>
- * note:addETCImage does not support on HTML5
- * </p>
- * @param {String} filename
- * @return {cc.Texture2D}
- */
- addETCImage: function (filename) {
- cc.log(cc._LogInfos.textureCache_addETCImage);
- },
- /**
- * Description
- * @return {String}
- */
- description: function () {
- return "<TextureCache | Number of textures = " + this._textures.length + ">";
- },
- /**
- * Returns an already created texture. Returns null if the texture doesn't exist.
- * @param {String} textureKeyName
- * @return {cc.Texture2D|Null}
- * @deprecated
- * @example
- * //example
- * var key = cc.textureCache.textureForKey("hello.png");
- */
- textureForKey: function (textureKeyName) {
- cc.log(cc._LogInfos.textureCache_textureForKey);
- return this.getTextureForKey(textureKeyName);
- },
- /**
- * Returns an already created texture. Returns null if the texture doesn't exist.
- * @param {String} textureKeyName
- * @return {cc.Texture2D|Null}
- * @example
- * //example
- * var key = cc.textureCache.getTextureForKey("hello.png");
- */
- getTextureForKey: function(textureKeyName){
- return this._textures[textureKeyName] || this._textures[cc.loader._aliases[textureKeyName]];
- },
- /**
- * @param {Image} texture
- * @return {String|Null}
- * @example
- * //example
- * var key = cc.textureCache.getKeyByTexture(texture);
- */
- getKeyByTexture: function (texture) {
- for (var key in this._textures) {
- if (this._textures[key] == texture) {
- return key;
- }
- }
- return null;
- },
- _generalTextureKey: function () {
- this._textureKeySeq++;
- return "_textureKey_" + this._textureKeySeq;
- },
- /**
- * @param {Image} texture
- * @return {Array}
- * @example
- * //example
- * var cacheTextureForColor = cc.textureCache.getTextureColors(texture);
- */
- getTextureColors: function (texture) {
- var key = this.getKeyByTexture(texture);
- if (!key) {
- if (texture instanceof HTMLImageElement)
- key = texture.src;
- else
- key = this._generalTextureKey();
- }
- if (!this._textureColorsCache[key])
- this._textureColorsCache[key] = cc.generateTextureCacheForColor(texture);
- return this._textureColorsCache[key];
- },
- /**
- * <p>Returns a Texture2D object given an PVR filename<br />
- * If the file image was not previously loaded, it will create a new Texture2D<br />
- * object and it will return it. Otherwise it will return a reference of a previously loaded image </p>
- * @param {String} path
- * @return {cc.Texture2D}
- */
- addPVRImage: function (path) {
- cc.log(cc._LogInfos.textureCache_addPVRImage);
- },
- /**
- * <p>Purges the dictionary of loaded textures. <br />
- * Call this method if you receive the "Memory Warning" <br />
- * In the short term: it will free some resources preventing your app from being killed <br />
- * In the medium term: it will allocate more resources <br />
- * In the long term: it will be the same</p>
- * @example
- * //example
- * cc.textureCache.removeAllTextures();
- */
- removeAllTextures: function () {
- var locTextures = this._textures;
- for (var selKey in locTextures) {
- if (locTextures[selKey])
- locTextures[selKey].releaseTexture();
- }
- this._textures = {};
- },
- /**
- * Deletes a texture from the cache given a texture
- * @param {Image} texture
- * @example
- * //example
- * cc.textureCache.removeTexture(texture);
- */
- removeTexture: function (texture) {
- if (!texture)
- return;
- var locTextures = this._textures;
- for (var selKey in locTextures) {
- if (locTextures[selKey] == texture) {
- locTextures[selKey].releaseTexture();
- delete(locTextures[selKey]);
- }
- }
- },
- /**
- * Deletes a texture from the cache given a its key name
- * @param {String} textureKeyName
- * @example
- * //example
- * cc.textureCache.removeTexture("hello.png");
- */
- removeTextureForKey: function (textureKeyName) {
- if (textureKeyName == null)
- return;
- if (this._textures[textureKeyName])
- delete(this._textures[textureKeyName]);
- },
- //addImage move to Canvas/WebGL
- /**
- * Cache the image data
- * @param {String} path
- * @param {Image|HTMLImageElement|HTMLCanvasElement} texture
- */
- cacheImage: function (path, texture) {
- if (texture instanceof cc.Texture2D) {
- this._textures[path] = texture;
- return;
- }
- var texture2d = new cc.Texture2D();
- texture2d.initWithElement(texture);
- texture2d.handleLoadedTexture();
- this._textures[path] = texture2d;
- },
- /**
- * <p>Returns a Texture2D object given an UIImage image<br />
- * If the image was not previously loaded, it will create a new Texture2D object and it will return it.<br />
- * Otherwise it will return a reference of a previously loaded image<br />
- * The "key" parameter will be used as the "key" for the cache.<br />
- * If "key" is null, then a new texture will be created each time.</p>
- * @param {HTMLImageElement|HTMLCanvasElement} image
- * @param {String} key
- * @return {cc.Texture2D}
- */
- addUIImage: function (image, key) {
- cc.assert(image, cc._LogInfos.textureCache_addUIImage_2);
- if (key) {
- if (this._textures[key])
- return this._textures[key];
- }
- // prevents overloading the autorelease pool
- var texture = new cc.Texture2D();
- texture.initWithImage(image);
- if ((key != null) && (texture != null))
- this._textures[key] = texture;
- else
- cc.log(cc._LogInfos.textureCache_addUIImage);
- return texture;
- },
- /**
- * <p>Output to cc.log the current contents of this TextureCache <br />
- * This will attempt to calculate the size of each texture, and the total texture memory in use. </p>
- */
- dumpCachedTextureInfo: function () {
- var count = 0;
- var totalBytes = 0, locTextures = this._textures;
- for (var key in locTextures) {
- var selTexture = locTextures[key];
- count++;
- if (selTexture.getHtmlElementObj() instanceof HTMLImageElement)
- cc.log(cc._LogInfos.textureCache_dumpCachedTextureInfo, key, selTexture.getHtmlElementObj().src, selTexture.pixelsWidth, selTexture.pixelsHeight);
- else {
- cc.log(cc._LogInfos.textureCache_dumpCachedTextureInfo_2, key, selTexture.pixelsWidth, selTexture.pixelsHeight);
- }
- totalBytes += selTexture.pixelsWidth * selTexture.pixelsHeight * 4;
- }
- var locTextureColorsCache = this._textureColorsCache;
- for (key in locTextureColorsCache) {
- var selCanvasColorsArr = locTextureColorsCache[key];
- for (var selCanvasKey in selCanvasColorsArr) {
- var selCanvas = selCanvasColorsArr[selCanvasKey];
- count++;
- cc.log(cc._LogInfos.textureCache_dumpCachedTextureInfo_2, key, selCanvas.width, selCanvas.height);
- totalBytes += selCanvas.width * selCanvas.height * 4;
- }
- }
- cc.log(cc._LogInfos.textureCache_dumpCachedTextureInfo_3, count, totalBytes / 1024, (totalBytes / (1024.0 * 1024.0)).toFixed(2));
- },
- _clear: function () {
- this._textures = {};
- this._textureColorsCache = {};
- this._textureKeySeq = (0 | Math.random() * 1000);
- this._loadedTexturesBefore = {};
- }
- };
- if (cc._renderType === cc._RENDER_TYPE_CANVAS) {
- var _p = cc.textureCache;
- _p.handleLoadedTexture = function (url) {
- var locTexs = this._textures;
- //remove judge
- var tex = locTexs[url];
- if (!tex) {
- tex = locTexs[url] = new cc.Texture2D();
- tex.url = url;
- }
- tex.handleLoadedTexture();
- };
- /**
- * <p>Returns a Texture2D object given an file image <br />
- * If the file image was not previously loaded, it will create a new Texture2D <br />
- * object and it will return it. It will use the filename as a key.<br />
- * Otherwise it will return a reference of a previously loaded image. <br />
- * Supported image extensions: .png, .jpg, .gif</p>
- * @param {String} url
- * @param {Function} cb
- * @param {Object} target
- * @return {cc.Texture2D}
- * @example
- * //example
- * cc.textureCache.addImage("hello.png");
- */
- _p.addImage = function (url, cb, target) {
- cc.assert(url, cc._LogInfos.Texture2D_addImage);
- var locTexs = this._textures;
- //remove judge
- var tex = locTexs[url] || locTexs[cc.loader._aliases[url]];
- if (tex) {
- cb && cb.call(target);
- return tex;
- }
- tex = locTexs[url] = new cc.Texture2D();
- tex.url = url;
- if (!cc.loader.getRes(url)) {
- if (cc.loader._checkIsImageURL(url)) {
- cc.loader.load(url, function (err) {
- cb && cb.call(target);
- });
- } else {
- cc.loader.cache[url] = cc.loader.loadImg(url, function (err, img) {
- if (err)
- return cb ? cb(err) : err;
- cc.textureCache.handleLoadedTexture(url);
- cb && cb(target, img);
- });
- }
- }
- else {
- tex.handleLoadedTexture();
- }
- return tex;
- };
- _p = null;
- } else {
- cc.assert(typeof cc._tmp.WebGLTextureCache === "function", cc._LogInfos.MissingFile, "TexturesWebGL.js");
- cc._tmp.WebGLTextureCache();
- delete cc._tmp.WebGLTextureCache;
- }
|