add ttf writer

This commit is contained in:
mkwiser
2014-10-02 17:12:16 +08:00
parent 5f7fee0adb
commit ab817f5fc8
13 changed files with 682 additions and 109 deletions

File diff suppressed because one or more lines are too long

193
demo/js/ttfTableWriter.js Normal file
View File

@@ -0,0 +1,193 @@
/**
* @file ttfTableWriter.js
* @author mengke01
* @date
* @description
* 测试ttf表写
*/
define(
function(require) {
var Reader = require('ttf/reader');
var Writer = require('ttf/writer');
var Directory = require('ttf/table/directory');
var supportTables = require('ttf/table/support');
// 支持写的表, 注意表顺序
var tableList = [
'OS/2',
'cmap',
'glyf',
'head',
'hhea',
'hmtx',
'loca',
'maxp',
'name',
'post'
];
function resolve(ttf) {
ttf.numTables = tableList.length;
ttf.entrySelector = Math.floor(Math.log(tableList.length)/Math.LN2);
ttf.searchRange = Math.pow(2, ttf.entrySelector) * 16;
ttf.rangeShift = tableList.length * 16 - ttf.searchRange;
// 将glyf的代码点按小到大排序
ttf.glyf.forEach(function(glyf) {
if (glyf.unicode) {
glyf.unicode = glyf.unicode.sort();
}
});
return ttf;
}
function write(ttf) {
// 用来做写入缓存的对象,用完后删掉
ttf.support = {};
// 写入maxp
var maxpTbl = new supportTables['maxp']();
var size = maxpTbl.size(ttf);
var maxpWriter = new Writer(new ArrayBuffer(size));
maxpTbl.write(maxpWriter, ttf);
// 写入glyf
var glyfTbl = new supportTables['glyf']();
var size = glyfTbl.size(ttf);
var glyfWriter = new Writer(new ArrayBuffer(size));
glyfTbl.write(glyfWriter, ttf);
// 写入loca
var locaTbl = new supportTables['loca']();
var locaWriter = new Writer(new ArrayBuffer(locaTbl.size(ttf)));
locaTbl.write(locaWriter, ttf);
// 写入cmap
var cmapTbl = new supportTables['cmap']();
var cmapWriter = new Writer(new ArrayBuffer(cmapTbl.size(ttf)));
cmapTbl.write(cmapWriter, ttf);
// 写入hmtx
var hmtxTbl = new supportTables['hmtx']();
var hmtxWriter = new Writer(new ArrayBuffer(hmtxTbl.size(ttf)));
hmtxTbl.write(hmtxWriter, ttf);
// 写入name
var nameTbl = new supportTables['name']();
var nameWriter = new Writer(new ArrayBuffer(nameTbl.size(ttf)));
nameTbl.write(nameWriter, ttf);
// 写入post
var postTbl = new supportTables['post']();
var postWriter = new Writer(new ArrayBuffer(postTbl.size(ttf)));
postTbl.write(postWriter, ttf);
// 写入OS2
var OS2Tbl = new supportTables['OS/2']();
var OS2Writer = new Writer(new ArrayBuffer(OS2Tbl.size(ttf)));
OS2Tbl.write(OS2Writer, ttf);
// 写入hhea
var hheaTbl = new supportTables['hhea']();
var hheaWriter = new Writer(new ArrayBuffer(hheaTbl.size(ttf)));
hheaTbl.write(hheaWriter, ttf);
// 读取测试
var maxpReader = new Reader(maxpWriter.getBuffer());
maxpTbl.offset = 0;
ttf.maxp = maxpTbl.read(maxpReader, ttf);
var locaReader = new Reader(locaWriter.getBuffer());
locaTbl.offset = 0;
ttf.loca = locaTbl.read(locaReader, ttf);
console.log('loca readed');
console.log(ttf.loca);
var glyfReader = new Reader(glyfWriter.getBuffer());
glyfTbl.offset = 0;
var glyf = glyfTbl.read(glyfReader, ttf);
console.log('glyf readed');
console.log(glyf);
var cmapReader = new Reader(cmapWriter.getBuffer());
cmapTbl.offset = 0;
var cmap = cmapTbl.read(cmapReader, ttf);
console.log('cmap readed');
console.log(cmap);
var hmtxReader = new Reader(hmtxWriter.getBuffer());
hmtxTbl.offset = 0;
var hmtx = hmtxTbl.read(hmtxReader, ttf);
console.log('hmtx readed');
console.log(hmtx);
var nameReader = new Reader(nameWriter.getBuffer());
nameTbl.offset = 0;
var name = nameTbl.read(nameReader, ttf);
console.log('name readed');
console.log(name);
var postReader = new Reader(postWriter.getBuffer());
postTbl.offset = 0;
ttf.tables = ttf.tables || {};
ttf.tables.post = {
length: postWriter.offset
};
var post = postTbl.read(postReader, ttf);
console.log('post readed');
console.log(post);
var OS2Reader = new Reader(OS2Writer.getBuffer());
OS2Tbl.offset = 0;
var OS2 = OS2Tbl.read(OS2Reader, ttf);
console.log('OS2 readed');
console.log(OS2);
var hheaReader = new Reader(hheaWriter.getBuffer());
hheaTbl.offset = 0;
var hhea = hheaTbl.read(hheaReader, ttf);
console.log('hhea readed');
console.log(hhea);
delete ttf.support;
}
var entry = {
init: function () {
$.getJSON('./js/baiduHealth.json', function(ttf) {
resolve(ttf);
write(ttf);
});
}
};
entry.init();
return entry;
}
);

View File

@@ -27,10 +27,10 @@ define(
var ttfData = reader.read(buffer);
console.log(ttfData);
// var base64str = 'data:font/ttf;charset=utf-8;base64,' + ttf2base64(buffer.slice(0, 54));
// var saveBtn = $('.saveas');
// saveBtn.attr('href', base64str);
// saveBtn.attr('download', 'save.ttf');
var base64str = 'data:font/ttf;charset=utf-8;base64,' + ttf2base64(buffer);
var saveBtn = $('.saveas');
saveBtn.attr('href', base64str);
saveBtn.attr('download', 'save.ttf');
});
}
};

28
demo/ttfTableWriter.html Normal file
View File

@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>font编辑器</title>
<script src="./lib/esl.js"></script>
<script src="./lib/jquery.min.js"></script>
</head>
<body>
<a class="saveas" href="" download="">保存</a>
<script>
require.config({
baseUrl: '../src',
paths: {
demo: '../demo/js',
}
});
define('jquery', $);
</script>
<script>
require(['demo/ttfTableWriter']);
</script>
</body>
</html>