var Resource = require('resource-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();
});
};
};