axmol/cocos/scripting/js-bindings/script/jsb_loaders.js

187 lines
6.5 KiB
JavaScript

/*
* Copyright (c) 2014 Chukong Technologies Inc.
*
* 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.
*/
//
// cocos2d loader plugins.
//
// This helper file should be required after jsb_cocos2d.js
//
cc._emptyLoader = {
load : function(realUrl, url, res, cb){
cb && cb(null, null);
return null;
}
};
cc.loader.register([
"mp3", "ogg", "wav", "mp4", "m4a",
"font", "eot", "ttf", "woff", "svg", "gaf"
],
cc._emptyLoader);
cc._txtLoader = {
load : function(realUrl, url, res, cb){
var result = jsb.fileUtils.getStringFromFile(realUrl);
cb && cb(null, result);
return result;
}
};
cc.loader.register(["txt", "xml", "vsh", "fsh", "tmx", "tsx"], cc._txtLoader);
cc._jsonLoader = {
load : function(realUrl, url, res, cb){
var data = jsb.fileUtils.getStringFromFile(realUrl), result;
try{
result = JSON.parse(data);
}catch(e){
cc.error(e);
result = null;
}
cb && cb(null, result);
return result;
}
};
cc.loader.register(["json", "ExportJson"], cc._jsonLoader);
cc._imgLoader = {
load : function(realUrl, url, res, cb){
cc.loader.loadImg(realUrl, function(err, img){
if(err) {
cb && cb(err);
return;
}
cc.loader.cache[url] = img;
cb && cb(null, img);
});
}
};
cc.loader.register(["png", "jpg", "bmp","jpeg","gif", "webp"], cc._imgLoader);
cc._plistLoader = {
load : function(realUrl, url, res, cb){
var content = jsb.fileUtils.getStringFromFile(realUrl);
var result = cc.plistParser.parse(content);
cb && cb(null, result);
return result;
}
};
cc.loader.register(["plist"], cc._plistLoader);
cc._binaryLoader = {
load : function(realUrl, url, res, cb){
var result = cc.loader.loadBinarySync(realUrl);
cb && cb(null, result);
return result;
}
};
cc.loader.register(["ccbi"], cc._binaryLoader);
cc._fntLoader = {
INFO_EXP : /info [^\n]*(\n|$)/gi,
COMMON_EXP : /common [^\n]*(\n|$)/gi,
PAGE_EXP : /page [^\n]*(\n|$)/gi,
CHAR_EXP : /char [^\n]*(\n|$)/gi,
KERNING_EXP : /kerning [^\n]*(\n|$)/gi,
ITEM_EXP : /\w+=[^ \r\n]+/gi,
INT_EXP : /^[\-]?\d+$/,
_parseStrToObj : function(str){
var arr = str.match(this.ITEM_EXP);
var obj = {};
if(arr){
for(var i = 0, li = arr.length; i < li; i++){
var tempStr = arr[i];
var index = tempStr.indexOf("=");
var key = tempStr.substring(0, index);
var value = tempStr.substring(index + 1);
if(value.match(this.INT_EXP)) value = parseInt(value);
else if(value[0] == '"') value = value.substring(1, value.length - 1);
obj[key] = value;
}
}
return obj;
},
parseFnt : function(fntStr, url){
var self = this, fnt = {};
//padding
var infoObj = self._parseStrToObj(fntStr.match(self.INFO_EXP)[0]);
var paddingArr = infoObj["padding"].split(",");
var padding = {
left : parseInt(paddingArr[0]),
top : parseInt(paddingArr[1]),
right : parseInt(paddingArr[2]),
bottom : parseInt(paddingArr[3])
};
//common
var commonObj = self._parseStrToObj(fntStr.match(self.COMMON_EXP)[0]);
fnt.commonHeight = commonObj["lineHeight"];
if (cc._renderType === cc._RENDER_TYPE_WEBGL) {
var texSize = cc.configuration.getMaxTextureSize();
if(commonObj["scaleW"] > texSize.width || commonObj["scaleH"] > texSize.height)
cc.log("cc.LabelBMFont._parseCommonArguments(): page can't be larger than supported");
}
if(commonObj["pages"] !== 1) cc.log("cc.LabelBMFont._parseCommonArguments(): only supports 1 page");
//page
var pageObj = self._parseStrToObj(fntStr.match(self.PAGE_EXP)[0]);
if(pageObj["id"] !== 0) cc.log("cc.LabelBMFont._parseImageFileName() : file could not be found");
fnt.atlasName = cc.path.changeBasename(url, pageObj["file"]);
//char
var charLines = fntStr.match(self.CHAR_EXP);
var fontDefDictionary = fnt.fontDefDictionary = {};
for(var i = 0, li = charLines.length; i < li; i++){
var charObj = self._parseStrToObj(charLines[i]);
var charId = charObj["id"];
fontDefDictionary[charId] = {
rect : {x : charObj["x"], y : charObj["y"], width : charObj["width"], height : charObj["height"]},
xOffset : charObj["xoffset"],
yOffset : charObj["yoffset"],
xAdvance : charObj["xadvance"]
};
}
//kerning
var kerningDict = fnt.kerningDict = {};
var kerningLines = fntStr.match(self.KERNING_EXP);
if(kerningLines){
for(var i = 0, li = kerningLines.length; i < li; i++){
var kerningObj = self._parseStrToObj(kerningLines[i]);
kerningDict[(kerningObj["first"] << 16) | (kerningObj["second"] & 0xffff)] = kerningObj["amount"];
}
}
return fnt;
},
load : function(realUrl, url, res, cb){
var data = jsb.fileUtils.getStringFromFile(realUrl), result = null;
if (data)
result = this.parseFnt(data, url);
cb && cb(null, result);
return result;
}
};
cc.loader.register(["fnt"], cc._fntLoader);