add ttf writer
This commit is contained in:
28
demo/filesystem.html
Normal file
28
demo/filesystem.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>文件系统</title>
|
||||||
|
<script src="./lib/esl.js"></script>
|
||||||
|
<script src="./lib/jquery.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<input id="upload-file" type="file">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
require.config({
|
||||||
|
baseUrl: '../src',
|
||||||
|
paths: {
|
||||||
|
demo: '../demo/js',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
define('jquery', $);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
require(['demo/filesystem']);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
88
demo/js/filesystem.js
Normal file
88
demo/js/filesystem.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* @file filesystem.js
|
||||||
|
* @author mengke01
|
||||||
|
* @date
|
||||||
|
* @description
|
||||||
|
* 文件系统入口
|
||||||
|
*/
|
||||||
|
|
||||||
|
define(
|
||||||
|
function(require) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function errorHandler(e) {
|
||||||
|
var msg = '';
|
||||||
|
|
||||||
|
switch (e.code) {
|
||||||
|
case FileError.QUOTA_EXCEEDED_ERR:
|
||||||
|
msg = 'QUOTA_EXCEEDED_ERR';
|
||||||
|
break;
|
||||||
|
case FileError.NOT_FOUND_ERR:
|
||||||
|
msg = 'NOT_FOUND_ERR';
|
||||||
|
break;
|
||||||
|
case FileError.SECURITY_ERR:
|
||||||
|
msg = 'SECURITY_ERR';
|
||||||
|
break;
|
||||||
|
case FileError.INVALID_MODIFICATION_ERR:
|
||||||
|
msg = 'INVALID_MODIFICATION_ERR';
|
||||||
|
break;
|
||||||
|
case FileError.INVALID_STATE_ERR:
|
||||||
|
msg = 'INVALID_STATE_ERR';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
msg = 'Unknown Error';
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('Error: ' + msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function onInitFs(fs) {
|
||||||
|
|
||||||
|
fs.root.getFile('log.txt', {create: true}, function(fileEntry) {
|
||||||
|
|
||||||
|
// Create a FileWriter object for our FileEntry (log.txt).
|
||||||
|
fileEntry.createWriter(function(fileWriter) {
|
||||||
|
|
||||||
|
fileWriter.onwriteend = function(e) {
|
||||||
|
console.log('Write completed.');
|
||||||
|
console.log(fileEntry.name);
|
||||||
|
console.log(fileEntry.fullPath);
|
||||||
|
};
|
||||||
|
|
||||||
|
fileWriter.onerror = function(e) {
|
||||||
|
console.log('Write failed: ' + e.toString());
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new Blob and write it to log.txt.
|
||||||
|
var bb = new Blob(['Lorem Ipsum'], {
|
||||||
|
type: 'text/plain'
|
||||||
|
}); // Note: window.WebKitBlobBuilder in Chrome 12.
|
||||||
|
fileWriter.write(bb);
|
||||||
|
|
||||||
|
}, errorHandler);
|
||||||
|
|
||||||
|
}, errorHandler);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var entry = {
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*/
|
||||||
|
init: function () {
|
||||||
|
|
||||||
|
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
|
||||||
|
window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
entry.init();
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
);
|
||||||
77
demo/js/ttfwriter.js
Normal file
77
demo/js/ttfwriter.js
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
* @file ttfwriter.js
|
||||||
|
* @author mengke01
|
||||||
|
* @date
|
||||||
|
* @description
|
||||||
|
* ttfwriter 入口
|
||||||
|
*/
|
||||||
|
|
||||||
|
define(
|
||||||
|
function(require) {
|
||||||
|
|
||||||
|
var Writer = require('ttf/writer');
|
||||||
|
var Reader = require('ttf/reader');
|
||||||
|
var ttf2base64 = require('ttf/ttf2base64');
|
||||||
|
|
||||||
|
var entry = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*/
|
||||||
|
init: function () {
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(100);
|
||||||
|
var writer = new Writer(buffer, 0, 100);
|
||||||
|
|
||||||
|
// 基本类型
|
||||||
|
writer.writeInt8(10);
|
||||||
|
writer.writeInt16(10);
|
||||||
|
writer.writeInt32(10);
|
||||||
|
writer.writeUint8(10);
|
||||||
|
writer.writeUint16(10);
|
||||||
|
writer.writeUint32(10);
|
||||||
|
|
||||||
|
// 扩展类型
|
||||||
|
writer.writeString('baidu');
|
||||||
|
writer.writeFixed(12.36);
|
||||||
|
writer.writeLongDateTime(new Date());
|
||||||
|
|
||||||
|
// 测试seek
|
||||||
|
writer.seek(50);
|
||||||
|
writer.writeFixed(12.36);
|
||||||
|
writer.head();
|
||||||
|
writer.writeFixed(12.36);
|
||||||
|
writer.writeBytes([3, 4, 5]);
|
||||||
|
|
||||||
|
var reader = new Reader(buffer, 0, 100);
|
||||||
|
|
||||||
|
|
||||||
|
console.log(reader.readInt8());
|
||||||
|
console.log(reader.readInt16());
|
||||||
|
console.log(reader.readInt32());
|
||||||
|
console.log(reader.readUint8());
|
||||||
|
console.log(reader.readUint16());
|
||||||
|
console.log(reader.readUint32());
|
||||||
|
|
||||||
|
console.log(reader.readString(reader.offset, 5));
|
||||||
|
console.log(reader.readFixed());
|
||||||
|
console.log(reader.readLongDateTime());
|
||||||
|
|
||||||
|
console.log(reader.readFixed());
|
||||||
|
console.log(reader.readBytes(3));
|
||||||
|
console.log(reader.readFixed(50));
|
||||||
|
|
||||||
|
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');
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
entry.init();
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
);
|
||||||
28
demo/ttfwriter.html
Normal file
28
demo/ttfwriter.html
Normal 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/ttfwriter']);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @file writter.js
|
* @file writer.js
|
||||||
* @author mengke01
|
* @author mengke01
|
||||||
* @date
|
* @date
|
||||||
* @description
|
* @description
|
||||||
@@ -46,12 +46,12 @@ define(
|
|||||||
function write(type, value, offset, littleEndian) {
|
function write(type, value, offset, littleEndian) {
|
||||||
|
|
||||||
// 使用当前位移
|
// 使用当前位移
|
||||||
if(undefined == offset) {
|
if(undefined === offset) {
|
||||||
offset = this.offset;
|
offset = this.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用小尾
|
// 使用小尾
|
||||||
if(undefined == littleEndian) {
|
if(undefined === littleEndian) {
|
||||||
littleEndian = this.littleEndian;
|
littleEndian = this.littleEndian;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ define(
|
|||||||
* @param {number} length 数组长度
|
* @param {number} length 数组长度
|
||||||
* @param {boolean} bigEndian 是否大尾
|
* @param {boolean} bigEndian 是否大尾
|
||||||
*/
|
*/
|
||||||
function Writter(buffer, offset, length, littleEndian) {
|
function Writer(buffer, offset, length, littleEndian) {
|
||||||
|
|
||||||
var bufferLength = buffer.byteLength || buffer.length;
|
var bufferLength = buffer.byteLength || buffer.length;
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ define(
|
|||||||
this.view = new DataView(buffer, this.offset, this.length);
|
this.view = new DataView(buffer, this.offset, this.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
Writter.prototype = {
|
Writer.prototype = {
|
||||||
write: write,
|
write: write,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,7 +106,7 @@ define(
|
|||||||
*/
|
*/
|
||||||
writeString: function(str, offset) {
|
writeString: function(str, offset) {
|
||||||
|
|
||||||
if(arguments.length == 1) {
|
if(undefined === offset) {
|
||||||
offset = this.offset;
|
offset = this.offset;
|
||||||
}
|
}
|
||||||
var length = str.replace(/[^\x00-\xff]/g, '11').length;
|
var length = str.replace(/[^\x00-\xff]/g, '11').length;
|
||||||
@@ -139,26 +139,36 @@ define(
|
|||||||
* @param {ArrayBuffer} value 写入值
|
* @param {ArrayBuffer} value 写入值
|
||||||
* @return {this}
|
* @return {this}
|
||||||
*/
|
*/
|
||||||
writeBytes: function(value, offset) {
|
writeBytes: function(value, length, offset) {
|
||||||
|
|
||||||
if(arguments.length == 1) {
|
if(undefined === offset) {
|
||||||
offset = this.offset;
|
offset = this.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
var length = value.byteLength || value.length;
|
length = length || value.byteLength || value.length;
|
||||||
|
|
||||||
if(length < 0 || offset + length > this.length) {
|
if(length < 0 || offset + length > this.length) {
|
||||||
throw 'length out of range:' + offset + ',' + length;
|
throw 'length out of range:' + offset + ',' + length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ArrayBuffer
|
||||||
|
this.seek(offset);
|
||||||
|
if (value instanceof ArrayBuffer) {
|
||||||
var view = new DataView(value, 0, length);
|
var view = new DataView(value, 0, length);
|
||||||
var littleEndian = this.littleEndian;
|
var littleEndian = this.littleEndian;
|
||||||
|
|
||||||
for (var i = 0; i < length; ++i) {
|
for (var i = 0; i < length; ++i) {
|
||||||
this.writeUint8(view.readUint8(i, littleEndian));
|
this.writeUint8(view.readUint8(i, littleEndian));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (var i = 0; i < length; ++i) {
|
||||||
|
this.writeUint8(value[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.offset = offset + length;
|
this.offset = offset + length;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -169,7 +179,7 @@ define(
|
|||||||
* @return {this}
|
* @return {this}
|
||||||
*/
|
*/
|
||||||
seek: function (offset) {
|
seek: function (offset) {
|
||||||
if (undefined == offset) {
|
if (undefined === offset) {
|
||||||
this.offset = 0;
|
this.offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,7 +187,7 @@ define(
|
|||||||
throw 'offset out of range:' + offset;
|
throw 'offset out of range:' + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._offset = Math.max(this._offset, this.offset);
|
this._offset = this.offset;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
@@ -218,7 +228,7 @@ define(
|
|||||||
if(undefined == offset) {
|
if(undefined == offset) {
|
||||||
offset = this.offset;
|
offset = this.offset;
|
||||||
}
|
}
|
||||||
this.writeInt32(Math.ceil(val * 65536), offset);
|
this.writeInt32(Math.ceil(value * 65536), offset);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
@@ -246,8 +256,8 @@ define(
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extend(Writter.prototype, proto, expandProto);
|
extend(Writer.prototype, proto, expandProto);
|
||||||
|
|
||||||
return Writter;
|
return Writer;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Reference in New Issue
Block a user