diff --git a/src/loaders/AssetLoader.js b/src/loaders/AssetLoader.js deleted file mode 100644 index c4dba1c..0000000 --- a/src/loaders/AssetLoader.js +++ /dev/null @@ -1,177 +0,0 @@ -var core = require('../core'), - ImageLoader = require('./ImageLoader'), - JsonLoader = require('./JsonLoader'), - AtlasLoader = require('./AtlasLoader'), - SpineLoader = require('./SpineLoader'), - BitmapFontLoader = require('./BitmapFontLoader'); - -/** - * A Class that loads a bunch of images / sprite sheet / bitmap font files. Once the - * assets have been loaded they are added to the PIXI Texture cache and can be accessed - * easily through Texture.fromImage() and Sprite.fromImage() - * When all items have been loaded this class will dispatch a 'onLoaded' event - * As each individual item is loaded this class will dispatch a 'onProgress' event - * - * @class - * @namespace PIXI - * @mixes eventTarget - * @param assetURLs {string[]} An array of image/sprite sheet urls that you would like loaded - * supported. Supported image formats include 'jpeg', 'jpg', 'png', 'gif'. Supported - * sprite sheet data formats only include 'JSON' at this time. Supported bitmap font - * data formats include 'xml' and 'fnt'. - * @param crossorigin {boolean} Whether requests should be treated as crossorigin - */ -function AssetLoader(assetURLs, crossorigin) -{ - /** - * The array of asset URLs that are going to be loaded - * - * @member {string[]} - */ - this.assetURLs = assetURLs; - - /** - * Whether the requests should be treated as cross origin - * - * @member {boolean} - */ - this.crossorigin = crossorigin; - - /** - * Maps file extension to loader types - * - * @member {object} - */ - this.loadersByType = { - 'jpg': ImageLoader, - 'jpeg': ImageLoader, - 'png': ImageLoader, - 'gif': ImageLoader, - 'webp': ImageLoader, - 'json': JsonLoader, - 'atlas': AtlasLoader, - 'anim': SpineLoader, - 'xml': BitmapFontLoader, - 'fnt': BitmapFontLoader - }; -} - -// constructor -AssetLoader.prototype.constructor = AssetLoader; -module.exports = AssetLoader; - -core.utils.eventTarget.mixin(AssetLoader.prototype); - -/** - * Fired when an item has loaded - * @event onProgress - */ - -/** - * Fired when all the assets have loaded - * @event onComplete - */ - -/** - * Given a filename, returns its extension. - * - * @param str {string} the name of the asset - */ -AssetLoader.prototype._getDataType = function (str) -{ - var test = 'data:'; - var start = str.slice(0, test.length).toLowerCase(); - - if (start === test) - { - var data = str.slice(test.length); - var sepIdx = data.indexOf(','); - - // check for malformed data URI scheme - if (sepIdx === -1) - { - return null; - } - - //e.g. 'image/gif;base64' => 'image/gif' - var info = data.slice(0, sepIdx).split(';')[0]; - - //We might need to handle some special cases here... - //standardize text/plain to 'txt' file extension - if (!info || info.toLowerCase() === 'text/plain') - { - return 'txt'; - } - - //User specified mime type, try splitting it by '/' - return info.split('/').pop().toLowerCase(); - } - - return null; -}; - -/** - * Starts loading the assets sequentially - * - */ -AssetLoader.prototype.load = function () -{ - var scope = this; - - function onLoad(evt) - { - scope.onAssetLoaded(evt.data.content); - } - - this.loadCount = this.assetURLs.length; - - for (var i=0; i < this.assetURLs.length; i++) - { - var fileName = this.assetURLs[i]; - //first see if we have a data URI scheme.. - var fileType = this._getDataType(fileName); - - //if not, assume it's a file URI - if (!fileType) - { - fileType = fileName.split('?').shift().split('.').pop().toLowerCase(); - } - - var Constructor = this.loadersByType[fileType]; - if (!Constructor) - { - throw new Error(fileType + ' is an unsupported file type'); - } - - var loader = new Constructor(fileName, this.crossorigin); - - loader.on('loaded', onLoad); - loader.load(); - } -}; - -/** - * Invoked after each file is loaded - * - * @private - */ -AssetLoader.prototype.onAssetLoaded = function (loader) -{ - this.loadCount--; - this.emit('onProgress', { content: this, loader: loader }); - - if (this.onProgress) - { - this.onProgress(loader); - } - - if (!this.loadCount) - { - this.emit('onComplete', { content: this }); - - if (this.onComplete) - { - this.onComplete(); - } - } -}; diff --git a/src/loaders/AssetLoader.js b/src/loaders/AssetLoader.js deleted file mode 100644 index c4dba1c..0000000 --- a/src/loaders/AssetLoader.js +++ /dev/null @@ -1,177 +0,0 @@ -var core = require('../core'), - ImageLoader = require('./ImageLoader'), - JsonLoader = require('./JsonLoader'), - AtlasLoader = require('./AtlasLoader'), - SpineLoader = require('./SpineLoader'), - BitmapFontLoader = require('./BitmapFontLoader'); - -/** - * A Class that loads a bunch of images / sprite sheet / bitmap font files. Once the - * assets have been loaded they are added to the PIXI Texture cache and can be accessed - * easily through Texture.fromImage() and Sprite.fromImage() - * When all items have been loaded this class will dispatch a 'onLoaded' event - * As each individual item is loaded this class will dispatch a 'onProgress' event - * - * @class - * @namespace PIXI - * @mixes eventTarget - * @param assetURLs {string[]} An array of image/sprite sheet urls that you would like loaded - * supported. Supported image formats include 'jpeg', 'jpg', 'png', 'gif'. Supported - * sprite sheet data formats only include 'JSON' at this time. Supported bitmap font - * data formats include 'xml' and 'fnt'. - * @param crossorigin {boolean} Whether requests should be treated as crossorigin - */ -function AssetLoader(assetURLs, crossorigin) -{ - /** - * The array of asset URLs that are going to be loaded - * - * @member {string[]} - */ - this.assetURLs = assetURLs; - - /** - * Whether the requests should be treated as cross origin - * - * @member {boolean} - */ - this.crossorigin = crossorigin; - - /** - * Maps file extension to loader types - * - * @member {object} - */ - this.loadersByType = { - 'jpg': ImageLoader, - 'jpeg': ImageLoader, - 'png': ImageLoader, - 'gif': ImageLoader, - 'webp': ImageLoader, - 'json': JsonLoader, - 'atlas': AtlasLoader, - 'anim': SpineLoader, - 'xml': BitmapFontLoader, - 'fnt': BitmapFontLoader - }; -} - -// constructor -AssetLoader.prototype.constructor = AssetLoader; -module.exports = AssetLoader; - -core.utils.eventTarget.mixin(AssetLoader.prototype); - -/** - * Fired when an item has loaded - * @event onProgress - */ - -/** - * Fired when all the assets have loaded - * @event onComplete - */ - -/** - * Given a filename, returns its extension. - * - * @param str {string} the name of the asset - */ -AssetLoader.prototype._getDataType = function (str) -{ - var test = 'data:'; - var start = str.slice(0, test.length).toLowerCase(); - - if (start === test) - { - var data = str.slice(test.length); - var sepIdx = data.indexOf(','); - - // check for malformed data URI scheme - if (sepIdx === -1) - { - return null; - } - - //e.g. 'image/gif;base64' => 'image/gif' - var info = data.slice(0, sepIdx).split(';')[0]; - - //We might need to handle some special cases here... - //standardize text/plain to 'txt' file extension - if (!info || info.toLowerCase() === 'text/plain') - { - return 'txt'; - } - - //User specified mime type, try splitting it by '/' - return info.split('/').pop().toLowerCase(); - } - - return null; -}; - -/** - * Starts loading the assets sequentially - * - */ -AssetLoader.prototype.load = function () -{ - var scope = this; - - function onLoad(evt) - { - scope.onAssetLoaded(evt.data.content); - } - - this.loadCount = this.assetURLs.length; - - for (var i=0; i < this.assetURLs.length; i++) - { - var fileName = this.assetURLs[i]; - //first see if we have a data URI scheme.. - var fileType = this._getDataType(fileName); - - //if not, assume it's a file URI - if (!fileType) - { - fileType = fileName.split('?').shift().split('.').pop().toLowerCase(); - } - - var Constructor = this.loadersByType[fileType]; - if (!Constructor) - { - throw new Error(fileType + ' is an unsupported file type'); - } - - var loader = new Constructor(fileName, this.crossorigin); - - loader.on('loaded', onLoad); - loader.load(); - } -}; - -/** - * Invoked after each file is loaded - * - * @private - */ -AssetLoader.prototype.onAssetLoaded = function (loader) -{ - this.loadCount--; - this.emit('onProgress', { content: this, loader: loader }); - - if (this.onProgress) - { - this.onProgress(loader); - } - - if (!this.loadCount) - { - this.emit('onComplete', { content: this }); - - if (this.onComplete) - { - this.onComplete(); - } - } -}; diff --git a/src/loaders/BitmapFontLoader.js b/src/loaders/BitmapFontLoader.js deleted file mode 100644 index 13e5c1b..0000000 --- a/src/loaders/BitmapFontLoader.js +++ /dev/null @@ -1,162 +0,0 @@ -var core = require('../core'), - ImageLoader = require('./ImageLoader'); - -/** - * The xml loader is used to load in XML bitmap font data ('xml' or 'fnt') - * To generate the data you can use http://www.angelcode.com/products/bmfont/ - * This loader will also load the image file as the data. - * When loaded this class will dispatch a 'loaded' event - * - * @class - * @mixes eventTarget - * @namespace PIXI - * @param url {String} The url of the sprite sheet JSON file - * @param crossorigin {boolean} Whether requests should be treated as crossorigin - */ -function BitmapFontLoader(url, crossorigin) -{ - /** - * The url of the bitmap font data - * - * @member {String} - */ - this.url = url; - - /** - * Whether the requests should be treated as cross origin - * - * @member {boolean} - */ - this.crossorigin = crossorigin; - - /** - * The base url of the bitmap font data - * - * @member {String} - * @readOnly - */ - this.baseUrl = url.replace(/[^\/]*$/, ''); - - /** - * The texture of the bitmap font - * - * @member {Texture} - */ - this.texture = null; -} - -// constructor -BitmapFontLoader.prototype.constructor = BitmapFontLoader; -module.exports = BitmapFontLoader; - -core.utils.eventTarget.mixin(BitmapFontLoader.prototype); - -/** - * Loads the XML font data - * - */ -BitmapFontLoader.prototype.load = function () -{ - this.ajaxRequest = new core.utils.AjaxRequest(); - this.ajaxRequest.onreadystatechange = this.onXMLLoaded.bind(this); - - this.ajaxRequest.open('GET', this.url, true); - - if (this.ajaxRequest.overrideMimeType) - { - this.ajaxRequest.overrideMimeType('application/xml'); - } - - this.ajaxRequest.send(null); -}; - -/** - * Invoked when the XML file is loaded, parses the data. - * - * @private - */ -BitmapFontLoader.prototype.onXMLLoaded = function () -{ - if (this.ajaxRequest.readyState === 4) - { - if (this.ajaxRequest.status === 200 || window.location.protocol.indexOf('http') === -1) - { - var responseXML = this.ajaxRequest.responseXML; - if (!responseXML || /MSIE 9/i.test(navigator.userAgent) || navigator.isCocoonJS) - { - if (typeof(window.DOMParser) === 'function') - { - var domparser = new DOMParser(); - responseXML = domparser.parseFromString(this.ajaxRequest.responseText, 'text/xml'); - } else { - var div = document.createElement('div'); - div.innerHTML = this.ajaxRequest.responseText; - responseXML = div; - } - } - - var textureUrl = this.baseUrl + responseXML.getElementsByTagName('page')[0].getAttribute('file'); - var image = new ImageLoader(textureUrl, this.crossorigin); - this.texture = image.texture.baseTexture; - - var data = {}; - var info = responseXML.getElementsByTagName('info')[0]; - var common = responseXML.getElementsByTagName('common')[0]; - data.font = info.getAttribute('face'); - data.size = parseInt(info.getAttribute('size'), 10); - data.lineHeight = parseInt(common.getAttribute('lineHeight'), 10); - data.chars = {}; - - //parse letters - var letters = responseXML.getElementsByTagName('char'); - - for (var i = 0; i < letters.length; i++) - { - var charCode = parseInt(letters[i].getAttribute('id'), 10); - - var textureRect = new core.math.Rectangle( - parseInt(letters[i].getAttribute('x'), 10), - parseInt(letters[i].getAttribute('y'), 10), - parseInt(letters[i].getAttribute('width'), 10), - parseInt(letters[i].getAttribute('height'), 10) - ); - - data.chars[charCode] = { - xOffset: parseInt(letters[i].getAttribute('xoffset'), 10), - yOffset: parseInt(letters[i].getAttribute('yoffset'), 10), - xAdvance: parseInt(letters[i].getAttribute('xadvance'), 10), - kerning: {}, - texture: core.utils.TextureCache[charCode] = new core.Texture(this.texture, textureRect) - - }; - } - - //parse kernings - var kernings = responseXML.getElementsByTagName('kerning'); - for (i = 0; i < kernings.length; i++) - { - var first = parseInt(kernings[i].getAttribute('first'), 10); - var second = parseInt(kernings[i].getAttribute('second'), 10); - var amount = parseInt(kernings[i].getAttribute('amount'), 10); - - data.chars[second].kerning[first] = amount; - - } - - core.BitmapText.fonts[data.font] = data; - - image.addEventListener('loaded', this.onLoaded.bind(this)); - image.load(); - } - } -}; - -/** - * Invoked when all files are loaded (xml/fnt and texture) - * - * @private - */ -BitmapFontLoader.prototype.onLoaded = function () -{ - this.emit('loaded', { content: this }); -}; diff --git a/src/loaders/AssetLoader.js b/src/loaders/AssetLoader.js deleted file mode 100644 index c4dba1c..0000000 --- a/src/loaders/AssetLoader.js +++ /dev/null @@ -1,177 +0,0 @@ -var core = require('../core'), - ImageLoader = require('./ImageLoader'), - JsonLoader = require('./JsonLoader'), - AtlasLoader = require('./AtlasLoader'), - SpineLoader = require('./SpineLoader'), - BitmapFontLoader = require('./BitmapFontLoader'); - -/** - * A Class that loads a bunch of images / sprite sheet / bitmap font files. Once the - * assets have been loaded they are added to the PIXI Texture cache and can be accessed - * easily through Texture.fromImage() and Sprite.fromImage() - * When all items have been loaded this class will dispatch a 'onLoaded' event - * As each individual item is loaded this class will dispatch a 'onProgress' event - * - * @class - * @namespace PIXI - * @mixes eventTarget - * @param assetURLs {string[]} An array of image/sprite sheet urls that you would like loaded - * supported. Supported image formats include 'jpeg', 'jpg', 'png', 'gif'. Supported - * sprite sheet data formats only include 'JSON' at this time. Supported bitmap font - * data formats include 'xml' and 'fnt'. - * @param crossorigin {boolean} Whether requests should be treated as crossorigin - */ -function AssetLoader(assetURLs, crossorigin) -{ - /** - * The array of asset URLs that are going to be loaded - * - * @member {string[]} - */ - this.assetURLs = assetURLs; - - /** - * Whether the requests should be treated as cross origin - * - * @member {boolean} - */ - this.crossorigin = crossorigin; - - /** - * Maps file extension to loader types - * - * @member {object} - */ - this.loadersByType = { - 'jpg': ImageLoader, - 'jpeg': ImageLoader, - 'png': ImageLoader, - 'gif': ImageLoader, - 'webp': ImageLoader, - 'json': JsonLoader, - 'atlas': AtlasLoader, - 'anim': SpineLoader, - 'xml': BitmapFontLoader, - 'fnt': BitmapFontLoader - }; -} - -// constructor -AssetLoader.prototype.constructor = AssetLoader; -module.exports = AssetLoader; - -core.utils.eventTarget.mixin(AssetLoader.prototype); - -/** - * Fired when an item has loaded - * @event onProgress - */ - -/** - * Fired when all the assets have loaded - * @event onComplete - */ - -/** - * Given a filename, returns its extension. - * - * @param str {string} the name of the asset - */ -AssetLoader.prototype._getDataType = function (str) -{ - var test = 'data:'; - var start = str.slice(0, test.length).toLowerCase(); - - if (start === test) - { - var data = str.slice(test.length); - var sepIdx = data.indexOf(','); - - // check for malformed data URI scheme - if (sepIdx === -1) - { - return null; - } - - //e.g. 'image/gif;base64' => 'image/gif' - var info = data.slice(0, sepIdx).split(';')[0]; - - //We might need to handle some special cases here... - //standardize text/plain to 'txt' file extension - if (!info || info.toLowerCase() === 'text/plain') - { - return 'txt'; - } - - //User specified mime type, try splitting it by '/' - return info.split('/').pop().toLowerCase(); - } - - return null; -}; - -/** - * Starts loading the assets sequentially - * - */ -AssetLoader.prototype.load = function () -{ - var scope = this; - - function onLoad(evt) - { - scope.onAssetLoaded(evt.data.content); - } - - this.loadCount = this.assetURLs.length; - - for (var i=0; i < this.assetURLs.length; i++) - { - var fileName = this.assetURLs[i]; - //first see if we have a data URI scheme.. - var fileType = this._getDataType(fileName); - - //if not, assume it's a file URI - if (!fileType) - { - fileType = fileName.split('?').shift().split('.').pop().toLowerCase(); - } - - var Constructor = this.loadersByType[fileType]; - if (!Constructor) - { - throw new Error(fileType + ' is an unsupported file type'); - } - - var loader = new Constructor(fileName, this.crossorigin); - - loader.on('loaded', onLoad); - loader.load(); - } -}; - -/** - * Invoked after each file is loaded - * - * @private - */ -AssetLoader.prototype.onAssetLoaded = function (loader) -{ - this.loadCount--; - this.emit('onProgress', { content: this, loader: loader }); - - if (this.onProgress) - { - this.onProgress(loader); - } - - if (!this.loadCount) - { - this.emit('onComplete', { content: this }); - - if (this.onComplete) - { - this.onComplete(); - } - } -}; diff --git a/src/loaders/BitmapFontLoader.js b/src/loaders/BitmapFontLoader.js deleted file mode 100644 index 13e5c1b..0000000 --- a/src/loaders/BitmapFontLoader.js +++ /dev/null @@ -1,162 +0,0 @@ -var core = require('../core'), - ImageLoader = require('./ImageLoader'); - -/** - * The xml loader is used to load in XML bitmap font data ('xml' or 'fnt') - * To generate the data you can use http://www.angelcode.com/products/bmfont/ - * This loader will also load the image file as the data. - * When loaded this class will dispatch a 'loaded' event - * - * @class - * @mixes eventTarget - * @namespace PIXI - * @param url {String} The url of the sprite sheet JSON file - * @param crossorigin {boolean} Whether requests should be treated as crossorigin - */ -function BitmapFontLoader(url, crossorigin) -{ - /** - * The url of the bitmap font data - * - * @member {String} - */ - this.url = url; - - /** - * Whether the requests should be treated as cross origin - * - * @member {boolean} - */ - this.crossorigin = crossorigin; - - /** - * The base url of the bitmap font data - * - * @member {String} - * @readOnly - */ - this.baseUrl = url.replace(/[^\/]*$/, ''); - - /** - * The texture of the bitmap font - * - * @member {Texture} - */ - this.texture = null; -} - -// constructor -BitmapFontLoader.prototype.constructor = BitmapFontLoader; -module.exports = BitmapFontLoader; - -core.utils.eventTarget.mixin(BitmapFontLoader.prototype); - -/** - * Loads the XML font data - * - */ -BitmapFontLoader.prototype.load = function () -{ - this.ajaxRequest = new core.utils.AjaxRequest(); - this.ajaxRequest.onreadystatechange = this.onXMLLoaded.bind(this); - - this.ajaxRequest.open('GET', this.url, true); - - if (this.ajaxRequest.overrideMimeType) - { - this.ajaxRequest.overrideMimeType('application/xml'); - } - - this.ajaxRequest.send(null); -}; - -/** - * Invoked when the XML file is loaded, parses the data. - * - * @private - */ -BitmapFontLoader.prototype.onXMLLoaded = function () -{ - if (this.ajaxRequest.readyState === 4) - { - if (this.ajaxRequest.status === 200 || window.location.protocol.indexOf('http') === -1) - { - var responseXML = this.ajaxRequest.responseXML; - if (!responseXML || /MSIE 9/i.test(navigator.userAgent) || navigator.isCocoonJS) - { - if (typeof(window.DOMParser) === 'function') - { - var domparser = new DOMParser(); - responseXML = domparser.parseFromString(this.ajaxRequest.responseText, 'text/xml'); - } else { - var div = document.createElement('div'); - div.innerHTML = this.ajaxRequest.responseText; - responseXML = div; - } - } - - var textureUrl = this.baseUrl + responseXML.getElementsByTagName('page')[0].getAttribute('file'); - var image = new ImageLoader(textureUrl, this.crossorigin); - this.texture = image.texture.baseTexture; - - var data = {}; - var info = responseXML.getElementsByTagName('info')[0]; - var common = responseXML.getElementsByTagName('common')[0]; - data.font = info.getAttribute('face'); - data.size = parseInt(info.getAttribute('size'), 10); - data.lineHeight = parseInt(common.getAttribute('lineHeight'), 10); - data.chars = {}; - - //parse letters - var letters = responseXML.getElementsByTagName('char'); - - for (var i = 0; i < letters.length; i++) - { - var charCode = parseInt(letters[i].getAttribute('id'), 10); - - var textureRect = new core.math.Rectangle( - parseInt(letters[i].getAttribute('x'), 10), - parseInt(letters[i].getAttribute('y'), 10), - parseInt(letters[i].getAttribute('width'), 10), - parseInt(letters[i].getAttribute('height'), 10) - ); - - data.chars[charCode] = { - xOffset: parseInt(letters[i].getAttribute('xoffset'), 10), - yOffset: parseInt(letters[i].getAttribute('yoffset'), 10), - xAdvance: parseInt(letters[i].getAttribute('xadvance'), 10), - kerning: {}, - texture: core.utils.TextureCache[charCode] = new core.Texture(this.texture, textureRect) - - }; - } - - //parse kernings - var kernings = responseXML.getElementsByTagName('kerning'); - for (i = 0; i < kernings.length; i++) - { - var first = parseInt(kernings[i].getAttribute('first'), 10); - var second = parseInt(kernings[i].getAttribute('second'), 10); - var amount = parseInt(kernings[i].getAttribute('amount'), 10); - - data.chars[second].kerning[first] = amount; - - } - - core.BitmapText.fonts[data.font] = data; - - image.addEventListener('loaded', this.onLoaded.bind(this)); - image.load(); - } - } -}; - -/** - * Invoked when all files are loaded (xml/fnt and texture) - * - * @private - */ -BitmapFontLoader.prototype.onLoaded = function () -{ - this.emit('loaded', { content: this }); -}; diff --git a/src/loaders/bitmapFontParser.js b/src/loaders/bitmapFontParser.js new file mode 100644 index 0000000..cbc1ff0 --- /dev/null +++ b/src/loaders/bitmapFontParser.js @@ -0,0 +1,86 @@ +var Resource = require('asset-loader').Resource, + core = require('../core'); + +module.exports = function () +{ + return function (resource, next) + { + if (!resource.data || navigator.isCocoonJS) + { + if (window.DOMParser) + { + var domparser = new DOMParser(); + resource.data = domparser.parseFromString(this.xhr.responseText, 'text/xml'); + } + else + { + var div = document.createElement('div'); + div.innerHTML = this.xhr.responseText; + resource.data = div; + } + } + + // skip if no data + if (!resource.data) { + return next(); + } + + var textureUrl = this.baseUrl + resource.data.getElementsByTagName('page')[0].getAttribute('file'); + var loadOptions = { + crossOrigin: resource.crossOrigin, + loadType: Resource.LOAD_TYPE.IMAGE + }; + + // load the texture for the font + this.loadResource(new Resource(textureUrl, loadOptions), function (res) + { + var data = {}; + var info = resource.data.getElementsByTagName('info')[0]; + var common = resource.data.getElementsByTagName('common')[0]; + + data.font = info.getAttribute('face'); + data.size = parseInt(info.getAttribute('size'), 10); + data.lineHeight = parseInt(common.getAttribute('lineHeight'), 10); + data.chars = {}; + + //parse letters + var letters = resource.data.getElementsByTagName('char'); + + for (var i = 0; i < letters.length; i++) + { + var charCode = parseInt(letters[i].getAttribute('id'), 10); + + var textureRect = new core.math.Rectangle( + parseInt(letters[i].getAttribute('x'), 10), + parseInt(letters[i].getAttribute('y'), 10), + parseInt(letters[i].getAttribute('width'), 10), + parseInt(letters[i].getAttribute('height'), 10) + ); + + data.chars[charCode] = { + xOffset: parseInt(letters[i].getAttribute('xoffset'), 10), + yOffset: parseInt(letters[i].getAttribute('yoffset'), 10), + xAdvance: parseInt(letters[i].getAttribute('xadvance'), 10), + kerning: {}, + texture: core.utils.TextureCache[charCode] = new core.Texture(res.texture.baseTexture, textureRect) + + }; + } + + //parse kernings + var kernings = resource.data.getElementsByTagName('kerning'); + for (i = 0; i < kernings.length; i++) + { + var first = parseInt(kernings[i].getAttribute('first'), 10); + var second = parseInt(kernings[i].getAttribute('second'), 10); + var amount = parseInt(kernings[i].getAttribute('amount'), 10); + + data.chars[second].kerning[first] = amount; + + } + + resource.bitmapFont = data; + next(); + }); + }; +};