diff --git a/demo/bezierSegmentCross.html b/demo/bezierSegmentCross.html
index d58ea1c..bc33570 100644
--- a/demo/bezierSegmentCross.html
+++ b/demo/bezierSegmentCross.html
@@ -3,8 +3,8 @@
二次贝塞尔曲线绘制
-
-
+
+
diff --git a/demo/filesystem.html b/demo/filesystem.html
index 9cea734..d2fb755 100644
--- a/demo/filesystem.html
+++ b/demo/filesystem.html
@@ -3,8 +3,8 @@
文件系统
-
-
+
+
diff --git a/demo/glyfcanvas.html b/demo/glyfcanvas.html
index fd22a34..b9cc1ab 100644
--- a/demo/glyfcanvas.html
+++ b/demo/glyfcanvas.html
@@ -3,8 +3,8 @@
glyf2canvas
-
-
+
+
diff --git a/demo/glyfsvg.html b/demo/glyfsvg.html
index b916c4b..114e93a 100644
--- a/demo/glyfsvg.html
+++ b/demo/glyfsvg.html
@@ -3,8 +3,8 @@
glyf2svg
-
-
+
+
diff --git a/demo/js/setFontface.js b/demo/js/setFontface.js
index 74942ab..b9538db 100644
--- a/demo/js/setFontface.js
+++ b/demo/js/setFontface.js
@@ -20,7 +20,7 @@ define(
var str = ''
+ '@font-face {'
+ 'font-family:\'' + name + '\';'
- + 'src:url(data:font/ttf;charset=utf-8;base64,'
+ + 'src:url('
+ ttfBase64
+ ') format(\'truetype\');'
+ '}';
diff --git a/demo/js/testDeflate.js b/demo/js/testDeflate.js
new file mode 100644
index 0000000..9a7f2d2
--- /dev/null
+++ b/demo/js/testDeflate.js
@@ -0,0 +1,29 @@
+/**
+ * @file testDeflate.js
+ * @author mengke01
+ * @date
+ * @description
+ * 测试deflate
+ */
+
+define(
+ function(require) {
+
+ var deflate = require('deflate');
+
+
+ var entry = {
+
+ /**
+ * 初始化
+ */
+ init: function () {
+ console.log(deflate);
+ }
+ };
+
+ entry.init();
+
+ return entry;
+ }
+);
diff --git a/demo/js/ttf2woff.js b/demo/js/ttf2woff.js
new file mode 100644
index 0000000..400a736
--- /dev/null
+++ b/demo/js/ttf2woff.js
@@ -0,0 +1,144 @@
+/**
+ * @file ttf2woff.js
+ * @author mengke01
+ * @date
+ * @description
+ * ttf2woff 转换
+ */
+
+define(
+ function(require) {
+ var ajaxBinaryFile = require('common/ajaxBinaryFile');
+ var ttf2woff = require('ttf/ttf2woff');
+ var woff2base64 = require('ttf/woff2base64');
+ var TTFReader = require('ttf/ttfreader');
+ var TTFWriter = require('ttf/ttfwriter');
+ var TTF = require('ttf/ttf');
+ var setFontface = require('./setFontface');
+ var deflate = require('deflate').deflate;
+
+ // 设置字体
+ function setFont(base64str) {
+ var str = ''
+ + '@font-face {'
+ + 'font-family:\'truetype\';'
+ + 'src:url('
+ + base64str
+ + ') format(\'woff\');'
+ + '}';
+ document.getElementById('font-face').innerHTML = str;
+ }
+ // 查看ttf glyf
+ function showTTFGlyf(ttfData) {
+
+ ttf = new TTF(ttfData);
+ var codes = ttf.codes();
+
+ var str = '';
+ // 获取unicode字符
+ codes.forEach(function(item) {
+ str += ''
+ + ''+ String.fromCharCode(item) +''
+ + (item > 255 ? '\\u' + Number(item).toString(16) : item)
+ +'';
+ });
+ $('#font-list').html(str);
+ }
+
+ var ttf2woffoptions = {
+ metadata: {
+ vendor: {
+ name: 'mk',
+ url: 'http://www.baidu.com'
+ },
+ credit: {
+ name: 'mk',
+ url: 'http://www.baidu.com'
+ },
+ description: 'font editor ver 1.0',
+ license: {
+ url: 'http://www.baidu.com',
+ id: 'id',
+ text: 'font editor ver 1.0'
+ },
+ copyright: '"m;k"',
+ trademark: 'trademark',
+ licensee: 'http://www.baidu.com'
+ }
+ };
+
+
+ function write() {
+ ajaxBinaryFile({
+ url: '../font/iconfont.ttf',
+ onSuccess: function(buffer) {
+
+ var woffBuffer = ttf2woff(buffer, ttf2woffoptions);
+
+ var base64str = woff2base64(woffBuffer);
+ setFont(base64str);
+
+
+ var saveBtn = $('.saveas');
+ saveBtn.attr('href', base64str);
+ saveBtn.attr('download', 'save.woff');
+
+
+
+ var TTFReader = new TTFreader();
+ TTFReader.read(buffer);
+ var ttfData = TTFReader.resolve();
+ showTTFGlyf(ttfData);
+
+ },
+ onError: function() {
+ console.error('error read file');
+ }
+ });
+ }
+
+ function readAndWrite() {
+ $.getJSON('./js/iconfont.json', function(ttf) {
+
+ var reader = new TTFReader();
+ var writer = new TTFWriter();
+ var buffer = writer.write(ttf);
+
+ var woffBuffer = ttf2woff(buffer, ttf2woffoptions);
+
+ var base64str = woff2base64(woffBuffer);
+ setFont(base64str);
+
+
+ var saveBtn = $('.saveas');
+ saveBtn.attr('href', base64str);
+ saveBtn.attr('download', 'save.woff');
+
+
+ var ttfReader = new TTFReader();
+ ttfReader.read(buffer);
+ var ttfData = ttfReader.resolve();
+ showTTFGlyf(ttfData);
+
+ });
+ }
+
+
+ var entry = {
+
+ /**
+ * 初始化
+ */
+ init: function () {
+
+ ttf2woffoptions.deflate = deflate;
+
+ readAndWrite();
+ }
+ };
+
+ entry.init();
+
+ return entry;
+ }
+);
\ No newline at end of file
diff --git a/demo/js/ttfTableWriter.js b/demo/js/ttfTableWriter.js
index ba0081b..ef46ab9 100644
--- a/demo/js/ttfTableWriter.js
+++ b/demo/js/ttfTableWriter.js
@@ -53,6 +53,9 @@ define(
ttf.support = {};
+ var OS2Tbl = new supportTables['OS/2']();
+ var size = OS2Tbl.size(ttf);
+
// 写入maxp
var maxpTbl = new supportTables['maxp']();
var size = maxpTbl.size(ttf);
diff --git a/demo/js/ttfwriter.js b/demo/js/ttfwriter.js
index 184c68c..dae4848 100644
--- a/demo/js/ttfwriter.js
+++ b/demo/js/ttfwriter.js
@@ -28,7 +28,7 @@ define(
var ttfData = reader.resolve();
console.log(ttfData);
- var base64str = 'data:font/ttf;charset=utf-8;base64,' + ttf2base64(buffer);
+ var base64str = ttf2base64(buffer);
var saveBtn = $('.saveas');
saveBtn.attr('href', base64str);
saveBtn.attr('download', 'save.ttf');
diff --git a/demo/js/writer.js b/demo/js/writer.js
index 86c0ce0..ccafd3a 100644
--- a/demo/js/writer.js
+++ b/demo/js/writer.js
@@ -11,7 +11,6 @@ define(
var Writer = require('ttf/writer');
var Reader = require('ttf/reader');
- var ttf2base64 = require('ttf/ttf2base64');
var entry = {
@@ -61,12 +60,6 @@ define(
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');
-
}
};
diff --git a/demo/math.html b/demo/math.html
index c181cf4..0ec86a6 100644
--- a/demo/math.html
+++ b/demo/math.html
@@ -3,8 +3,8 @@
测试math函数
-
-
+
+
-
+
+
diff --git a/demo/segmentCross.html b/demo/segmentCross.html
index cb97e43..42999cf 100644
--- a/demo/segmentCross.html
+++ b/demo/segmentCross.html
@@ -3,8 +3,8 @@
线段相交
-
-
+
+
+
+
+
+保存
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/ttfTableWriter.html b/demo/ttfTableWriter.html
index c1e9725..49c111b 100644
--- a/demo/ttfTableWriter.html
+++ b/demo/ttfTableWriter.html
@@ -3,8 +3,8 @@
font编辑器
-
-
+
+
diff --git a/demo/ttfparse.html b/demo/ttfparse.html
index bf0b030..b97bfd9 100644
--- a/demo/ttfparse.html
+++ b/demo/ttfparse.html
@@ -3,8 +3,8 @@
font编辑器
-
-
+
+
diff --git a/demo/ttfwriter.html b/demo/ttfwriter.html
index f79c740..0c78b89 100644
--- a/demo/ttfwriter.html
+++ b/demo/ttfwriter.html
@@ -3,8 +3,8 @@
font编辑器
-
-
+
+
diff --git a/demo/writer.html b/demo/writer.html
index 55175ac..35326a6 100644
--- a/demo/writer.html
+++ b/demo/writer.html
@@ -3,8 +3,8 @@
font编辑器
-
-
+
+
diff --git a/demo/lib/esl.js b/dep/esl.js
similarity index 100%
rename from demo/lib/esl.js
rename to dep/esl.js
diff --git a/demo/lib/jquery.min.js b/dep/jquery.min.js
similarity index 100%
rename from demo/lib/jquery.min.js
rename to dep/jquery.min.js
diff --git a/dep/pako_deflate.min.js b/dep/pako_deflate.min.js
new file mode 100644
index 0000000..7abad6b
--- /dev/null
+++ b/dep/pako_deflate.min.js
@@ -0,0 +1,2 @@
+/* pako 0.2.5 nodeca/pako */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.pako=t()}}(function(){return function t(e,a,n){function r(s,h){if(!a[s]){if(!e[s]){var l="function"==typeof require&&require;if(!h&&l)return l(s,!0);if(i)return i(s,!0);throw new Error("Cannot find module '"+s+"'")}var o=a[s]={exports:{}};e[s][0].call(o.exports,function(t){var a=e[s][1][t];return r(a?a:t)},o,o.exports,t,e,a,n)}return a[s].exports}for(var i="function"==typeof require&&require,s=0;s0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new _,this.strm.avail_out=0;var a=s.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==f)throw new Error(o[a]);e.header&&s.deflateSetHeader(this.strm,e.header)};b.prototype.push=function(t,e){var a,n,r=this.strm,i=this.options.chunkSize;if(this.ended)return!1;n=e===~~e?e:e===!0?u:d,r.input="string"==typeof t?l.string2buf(t):t,r.next_in=0,r.avail_in=r.input.length;do{if(0===r.avail_out&&(r.output=new h.Buf8(i),r.next_out=0,r.avail_out=i),a=s.deflate(r,n),a!==c&&a!==f)return this.onEnd(a),this.ended=!0,!1;(0===r.avail_out||0===r.avail_in&&n===u)&&this.onData("string"===this.options.to?l.buf2binstring(h.shrinkBuf(r.output,r.next_out)):h.shrinkBuf(r.output,r.next_out))}while((r.avail_in>0||0===r.avail_out)&&a!==c);return n===u?(a=s.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===f):!0},b.prototype.onData=function(t){this.chunks.push(t)},b.prototype.onEnd=function(t){t===f&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},a.Deflate=b,a.deflate=n,a.deflateRaw=r,a.gzip=i},{"./utils/common":2,"./utils/strings":3,"./zlib/deflate.js":6,"./zlib/messages":7,"./zlib/zstream":9}],2:[function(t,e,a){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;a.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(var n in a)a.hasOwnProperty(n)&&(t[n]=a[n])}}return t},a.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var r={arraySet:function(t,e,a,n,r){if(e.subarray&&t.subarray)return void t.set(e.subarray(a,a+n),r);for(var i=0;n>i;i++)t[r+i]=e[a+i]},flattenChunks:function(t){var e,a,n,r,i,s;for(n=0,e=0,a=t.length;a>e;e++)n+=t[e].length;for(s=new Uint8Array(n),r=0,e=0,a=t.length;a>e;e++)i=t[e],s.set(i,r),r+=i.length;return s}},i={arraySet:function(t,e,a,n,r){for(var i=0;n>i;i++)t[r+i]=e[a+i]},flattenChunks:function(t){return[].concat.apply([],t)}};a.setTyped=function(t){t?(a.Buf8=Uint8Array,a.Buf16=Uint16Array,a.Buf32=Int32Array,a.assign(a,r)):(a.Buf8=Array,a.Buf16=Array,a.Buf32=Array,a.assign(a,i))},a.setTyped(n)},{}],3:[function(t,e,a){"use strict";function n(t,e){if(65537>e&&(t.subarray&&s||!t.subarray&&i))return String.fromCharCode.apply(null,r.shrinkBuf(t,e));for(var a="",n=0;e>n;n++)a+=String.fromCharCode(t[n]);return a}var r=t("./common"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(h){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){s=!1}for(var l=new r.Buf8(256),o=0;256>o;o++)l[o]=o>=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;l[254]=l[254]=1,a.string2buf=function(t){var e,a,n,i,s,h=t.length,l=0;for(i=0;h>i;i++)a=t.charCodeAt(i),55296===(64512&a)&&h>i+1&&(n=t.charCodeAt(i+1),56320===(64512&n)&&(a=65536+(a-55296<<10)+(n-56320),i++)),l+=128>a?1:2048>a?2:65536>a?3:4;for(e=new r.Buf8(l),s=0,i=0;l>s;i++)a=t.charCodeAt(i),55296===(64512&a)&&h>i+1&&(n=t.charCodeAt(i+1),56320===(64512&n)&&(a=65536+(a-55296<<10)+(n-56320),i++)),128>a?e[s++]=a:2048>a?(e[s++]=192|a>>>6,e[s++]=128|63&a):65536>a?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},a.buf2binstring=function(t){return n(t,t.length)},a.binstring2buf=function(t){for(var e=new r.Buf8(t.length),a=0,n=e.length;n>a;a++)e[a]=t.charCodeAt(a);return e},a.buf2string=function(t,e){var a,r,i,s,h=e||t.length,o=new Array(2*h);for(r=0,a=0;h>a;)if(i=t[a++],128>i)o[r++]=i;else if(s=l[i],s>4)o[r++]=65533,a+=s-1;else{for(i&=2===s?31:3===s?15:7;s>1&&h>a;)i=i<<6|63&t[a++],s--;s>1?o[r++]=65533:65536>i?o[r++]=i:(i-=65536,o[r++]=55296|i>>10&1023,o[r++]=56320|1023&i)}return n(o,r)},a.utf8border=function(t,e){var a;for(e=e||t.length,e>t.length&&(e=t.length),a=e-1;a>=0&&128===(192&t[a]);)a--;return 0>a?e:0===a?e:a+l[t[a]]>e?a:e}},{"./common":2}],4:[function(t,e){"use strict";function a(t,e,a,n){for(var r=65535&t|0,i=t>>>16&65535|0,s=0;0!==a;){s=a>2e3?2e3:a,a-=s;do r=r+e[n++]|0,i=i+r|0;while(--s);r%=65521,i%=65521}return r|i<<16|0}e.exports=a},{}],5:[function(t,e){"use strict";function a(){for(var t,e=[],a=0;256>a;a++){t=a;for(var n=0;8>n;n++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e}function n(t,e,a,n){var i=r,s=n+a;t=-1^t;for(var h=n;s>h;h++)t=t>>>8^i[255&(t^e[h])];return-1^t}var r=a();e.exports=n},{}],6:[function(t,e,a){"use strict";function n(t,e){return t.msg=U[e],e}function r(t){return(t<<1)-(t>4?9:0)}function i(t){for(var e=t.length;--e>=0;)t[e]=0}function s(t){var e=t.state,a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(S.arraySet(t.output,e.pending_buf,e.pending_out,a,t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))}function h(t,e){E._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,s(t.strm)}function l(t,e){t.pending_buf[t.pending++]=e}function o(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function _(t,e,a,n){var r=t.avail_in;return r>n&&(r=n),0===r?0:(t.avail_in-=r,S.arraySet(e,t.input,t.next_in,r,a),1===t.state.wrap?t.adler=j(t.adler,e,r,a):2===t.state.wrap&&(t.adler=I(t.adler,e,r,a)),t.next_in+=r,t.total_in+=r,r)}function d(t,e){var a,n,r=t.max_chain_length,i=t.strstart,s=t.prev_length,h=t.nice_match,l=t.strstart>t.w_size-oe?t.strstart-(t.w_size-oe):0,o=t.window,_=t.w_mask,d=t.prev,u=t.strstart+le,f=o[i+s-1],c=o[i+s];t.prev_length>=t.good_match&&(r>>=2),h>t.lookahead&&(h=t.lookahead);do if(a=e,o[a+s]===c&&o[a+s-1]===f&&o[a]===o[i]&&o[++a]===o[i+1]){i+=2,a++;do;while(o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&o[++i]===o[++a]&&u>i);if(n=le-(u-i),i=u-le,n>s){if(t.match_start=e,s=n,n>=h)break;f=o[i+s-1],c=o[i+s]}}while((e=d[e&_])>l&&0!==--r);return s<=t.lookahead?s:t.lookahead}function u(t){var e,a,n,r,i,s=t.w_size;do{if(r=t.window_size-t.lookahead-t.strstart,t.strstart>=s+(s-oe)){S.arraySet(t.window,t.window,s,s,0),t.match_start-=s,t.strstart-=s,t.block_start-=s,a=t.hash_size,e=a;do n=t.head[--e],t.head[e]=n>=s?n-s:0;while(--a);a=s,e=a;do n=t.prev[--e],t.prev[e]=n>=s?n-s:0;while(--a);r+=s}if(0===t.strm.avail_in)break;if(a=_(t.strm,t.window,t.strstart+t.lookahead,r),t.lookahead+=a,t.lookahead+t.insert>=he)for(i=t.strstart-t.insert,t.ins_h=t.window[i],t.ins_h=(t.ins_h<t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(u(t),0===t.lookahead&&e===q)return be;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+a;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,h(t,!1),0===t.strm.avail_out))return be;if(t.strstart-t.block_start>=t.w_size-oe&&(h(t,!1),0===t.strm.avail_out))return be}return t.insert=0,e===T?(h(t,!0),0===t.strm.avail_out?we:ye):t.strstart>t.block_start&&(h(t,!1),0===t.strm.avail_out)?be:be}function c(t,e){for(var a,n;;){if(t.lookahead=he&&(t.ins_h=(t.ins_h<=he)if(n=E._tr_tally(t,t.strstart-t.match_start,t.match_length-he),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=he){t.match_length--;do t.strstart++,t.ins_h=(t.ins_h<=he&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=he-1)),t.prev_length>=he&&t.match_length<=t.prev_length){r=t.strstart+t.lookahead-he,n=E._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-he),t.lookahead-=t.prev_length-1,t.prev_length-=2;do++t.strstart<=r&&(t.ins_h=(t.ins_h<=he&&t.strstart>0&&(r=t.strstart-1,n=s[r],n===s[++r]&&n===s[++r]&&n===s[++r])){i=t.strstart+le;do;while(n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&n===s[++r]&&i>r);t.match_length=le-(i-r),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=he?(a=E._tr_tally(t,1,t.match_length-he),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=E._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(h(t,!1),0===t.strm.avail_out))return be}return t.insert=0,e===T?(h(t,!0),0===t.strm.avail_out?we:ye):t.last_lit&&(h(t,!1),0===t.strm.avail_out)?be:ve}function m(t,e){for(var a;;){if(0===t.lookahead&&(u(t),0===t.lookahead)){if(e===q)return be;break}if(t.match_length=0,a=E._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(h(t,!1),0===t.strm.avail_out))return be}return t.insert=0,e===T?(h(t,!0),0===t.strm.avail_out?we:ye):t.last_lit&&(h(t,!1),0===t.strm.avail_out)?be:ve}function b(t){t.window_size=2*t.w_size,i(t.head),t.max_lazy_match=C[t.level].max_lazy,t.good_match=C[t.level].good_length,t.nice_match=C[t.level].nice_length,t.max_chain_length=C[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=he-1,t.match_available=0,t.ins_h=0}function v(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=X,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new S.Buf16(2*ie),this.dyn_dtree=new S.Buf16(2*(2*ne+1)),this.bl_tree=new S.Buf16(2*(2*re+1)),i(this.dyn_ltree),i(this.dyn_dtree),i(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new S.Buf16(se+1),this.heap=new S.Buf16(2*ae+1),i(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new S.Buf16(2*ae+1),i(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function w(t){var e;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=W,e=t.state,e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?de:pe,t.adler=2===e.wrap?0:1,e.last_flush=q,E._tr_init(e),L):n(t,N)}function y(t){var e=w(t);return e===L&&b(t.state),e}function z(t,e){return t&&t.state?2!==t.state.wrap?N:(t.state.gzhead=e,L):N}function k(t,e,a,r,i,s){if(!t)return N;var h=1;if(e===F&&(e=6),0>r?(h=0,r=-r):r>15&&(h=2,r-=16),1>i||i>Y||a!==X||8>r||r>15||0>e||e>9||0>s||s>Q)return n(t,N);8===r&&(r=9);var l=new v;return t.state=l,l.strm=t,l.wrap=h,l.gzhead=null,l.w_bits=r,l.w_size=1<>1,l.l_buf=3*l.lit_bufsize,l.level=e,l.strategy=s,l.method=a,y(t)}function x(t,e){return k(t,e,X,Z,$,V)}function B(t,e){var a,h,_,d;if(!t||!t.state||e>H||0>e)return t?n(t,N):N;if(h=t.state,!t.output||!t.input&&0!==t.avail_in||h.status===me&&e!==T)return n(t,0===t.avail_out?P:N);if(h.strm=t,a=h.last_flush,h.last_flush=e,h.status===de)if(2===h.wrap)t.adler=0,l(h,31),l(h,139),l(h,8),h.gzhead?(l(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),l(h,255&h.gzhead.time),l(h,h.gzhead.time>>8&255),l(h,h.gzhead.time>>16&255),l(h,h.gzhead.time>>24&255),l(h,9===h.level?2:h.strategy>=J||h.level<2?4:0),l(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(l(h,255&h.gzhead.extra.length),l(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(t.adler=I(t.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=ue):(l(h,0),l(h,0),l(h,0),l(h,0),l(h,0),l(h,9===h.level?2:h.strategy>=J||h.level<2?4:0),l(h,ze),h.status=pe);else{var u=X+(h.w_bits-8<<4)<<8,f=-1;f=h.strategy>=J||h.level<2?0:h.level<6?1:6===h.level?2:3,u|=f<<6,0!==h.strstart&&(u|=_e),u+=31-u%31,h.status=pe,o(h,u),0!==h.strstart&&(o(h,t.adler>>>16),o(h,65535&t.adler)),t.adler=1}if(h.status===ue)if(h.gzhead.extra){for(_=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),s(t),_=h.pending,h.pending!==h.pending_buf_size));)l(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=fe)}else h.status=fe;if(h.status===fe)if(h.gzhead.name){_=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),s(t),_=h.pending,h.pending===h.pending_buf_size)){d=1;break}d=h.gzindex_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),0===d&&(h.gzindex=0,h.status=ce)}else h.status=ce;if(h.status===ce)if(h.gzhead.comment){_=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),s(t),_=h.pending,h.pending===h.pending_buf_size)){d=1;break}d=h.gzindex_&&(t.adler=I(t.adler,h.pending_buf,h.pending-_,_)),0===d&&(h.status=ge)}else h.status=ge;if(h.status===ge&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&s(t),h.pending+2<=h.pending_buf_size&&(l(h,255&t.adler),l(h,t.adler>>8&255),t.adler=0,h.status=pe)):h.status=pe),0!==h.pending){if(s(t),0===t.avail_out)return h.last_flush=-1,L}else if(0===t.avail_in&&r(e)<=r(a)&&e!==T)return n(t,P);if(h.status===me&&0!==t.avail_in)return n(t,P);if(0!==t.avail_in||0!==h.lookahead||e!==q&&h.status!==me){var c=h.strategy===J?m(h,e):h.strategy===M?p(h,e):C[h.level].func(h,e);if((c===we||c===ye)&&(h.status=me),c===be||c===we)return 0===t.avail_out&&(h.last_flush=-1),L;if(c===ve&&(e===D?E._tr_align(h):e!==H&&(E._tr_stored_block(h,0,0,!1),e===R&&(i(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),s(t),0===t.avail_out))return h.last_flush=-1,L}return e!==T?L:h.wrap<=0?K:(2===h.wrap?(l(h,255&t.adler),l(h,t.adler>>8&255),l(h,t.adler>>16&255),l(h,t.adler>>24&255),l(h,255&t.total_in),l(h,t.total_in>>8&255),l(h,t.total_in>>16&255),l(h,t.total_in>>24&255)):(o(h,t.adler>>>16),o(h,65535&t.adler)),s(t),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?L:K)}function A(t){var e;return t&&t.state?(e=t.state.status,e!==de&&e!==ue&&e!==fe&&e!==ce&&e!==ge&&e!==pe&&e!==me?n(t,N):(t.state=null,e===pe?n(t,O):L)):N}var C,S=t("../utils/common"),E=t("./trees"),j=t("./adler32"),I=t("./crc32"),U=t("./messages"),q=0,D=1,R=3,T=4,H=5,L=0,K=1,N=-2,O=-3,P=-5,F=-1,G=1,J=2,M=3,Q=4,V=0,W=2,X=8,Y=9,Z=15,$=8,te=29,ee=256,ae=ee+1+te,ne=30,re=19,ie=2*ae+1,se=15,he=3,le=258,oe=le+he+1,_e=32,de=42,ue=69,fe=73,ce=91,ge=103,pe=113,me=666,be=1,ve=2,we=3,ye=4,ze=3,ke=function(t,e,a,n,r){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=n,this.func=r};C=[new ke(0,0,0,0,f),new ke(4,4,8,4,c),new ke(4,5,16,8,c),new ke(4,6,32,32,c),new ke(4,4,16,16,g),new ke(8,16,32,32,g),new ke(8,16,128,128,g),new ke(8,32,128,256,g),new ke(32,128,258,1024,g),new ke(32,258,258,4096,g)],a.deflateInit=x,a.deflateInit2=k,a.deflateReset=y,a.deflateResetKeep=w,a.deflateSetHeader=z,a.deflate=B,a.deflateEnd=A,a.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":2,"./adler32":4,"./crc32":5,"./messages":7,"./trees":8}],7:[function(t,e){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],8:[function(t,e,a){"use strict";function n(t){for(var e=t.length;--e>=0;)t[e]=0}function r(t){return 256>t?se[t]:se[256+(t>>>7)]}function i(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function s(t,e,a){t.bi_valid>Q-a?(t.bi_buf|=e<>Q-t.bi_valid,t.bi_valid+=a-Q):(t.bi_buf|=e<>>=1,a<<=1;while(--e>0);return a>>>1}function o(t){16===t.bi_valid?(i(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}function _(t,e){var a,n,r,i,s,h,l=e.dyn_tree,o=e.max_code,_=e.stat_desc.static_tree,d=e.stat_desc.has_stree,u=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,c=e.stat_desc.max_length,g=0;for(i=0;M>=i;i++)t.bl_count[i]=0;for(l[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;J>a;a++)n=t.heap[a],i=l[2*l[2*n+1]+1]+1,i>c&&(i=c,g++),l[2*n+1]=i,n>o||(t.bl_count[i]++,s=0,n>=f&&(s=u[n-f]),h=l[2*n],t.opt_len+=h*(i+s),d&&(t.static_len+=h*(_[2*n+1]+s)));if(0!==g){do{for(i=c-1;0===t.bl_count[i];)i--;t.bl_count[i]--,t.bl_count[i+1]+=2,t.bl_count[c]--,g-=2}while(g>0);for(i=c;0!==i;i--)for(n=t.bl_count[i];0!==n;)r=t.heap[--a],r>o||(l[2*r+1]!==i&&(t.opt_len+=(i-l[2*r+1])*l[2*r],l[2*r+1]=i),n--)}}function d(t,e,a){var n,r,i=new Array(M+1),s=0;for(n=1;M>=n;n++)i[n]=s=s+a[n-1]<<1;for(r=0;e>=r;r++){var h=t[2*r+1];0!==h&&(t[2*r]=l(i[h]++,h))}}function u(){var t,e,a,n,r,i=new Array(M+1);for(a=0,n=0;N-1>n;n++)for(le[n]=a,t=0;t<1<<$[n];t++)he[a++]=n;for(he[a-1]=n,r=0,n=0;16>n;n++)for(oe[n]=r,t=0;t<1<>=7;F>n;n++)for(oe[n]=r<<7,t=0;t<1<=e;e++)i[e]=0;for(t=0;143>=t;)re[2*t+1]=8,t++,i[8]++;for(;255>=t;)re[2*t+1]=9,t++,i[9]++;for(;279>=t;)re[2*t+1]=7,t++,i[7]++;for(;287>=t;)re[2*t+1]=8,t++,i[8]++;for(d(re,P+1,i),t=0;F>t;t++)ie[2*t+1]=5,ie[2*t]=l(t,5);_e=new fe(re,$,O+1,P,M),de=new fe(ie,te,0,F,M),ue=new fe(new Array(0),ee,0,G,V)}function f(t){var e;for(e=0;P>e;e++)t.dyn_ltree[2*e]=0;for(e=0;F>e;e++)t.dyn_dtree[2*e]=0;for(e=0;G>e;e++)t.bl_tree[2*e]=0;t.dyn_ltree[2*W]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function c(t){t.bi_valid>8?i(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function g(t,e,a,n){c(t),n&&(i(t,a),i(t,~a)),j.arraySet(t.pending_buf,t.window,e,a,t.pending),t.pending+=a}function p(t,e,a,n){var r=2*e,i=2*a;return t[r]a;a++)0!==i[2*a]?(t.heap[++t.heap_len]=o=a,t.depth[a]=0):i[2*a+1]=0;for(;t.heap_len<2;)r=t.heap[++t.heap_len]=2>o?++o:0,i[2*r]=1,t.depth[r]=0,t.opt_len--,h&&(t.static_len-=s[2*r+1]);for(e.max_code=o,a=t.heap_len>>1;a>=1;a--)m(t,i,a);r=l;do a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],m(t,i,1),n=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=n,i[2*r]=i[2*a]+i[2*n],t.depth[r]=(t.depth[a]>=t.depth[n]?t.depth[a]:t.depth[n])+1,i[2*a+1]=i[2*n+1]=r,t.heap[1]=r++,m(t,i,1);while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],_(t,e),d(i,o,t.bl_count)}function w(t,e,a){var n,r,i=-1,s=e[1],h=0,l=7,o=4;for(0===s&&(l=138,o=3),e[2*(a+1)+1]=65535,n=0;a>=n;n++)r=s,s=e[2*(n+1)+1],++hh?t.bl_tree[2*r]+=h:0!==r?(r!==i&&t.bl_tree[2*r]++,t.bl_tree[2*X]++):10>=h?t.bl_tree[2*Y]++:t.bl_tree[2*Z]++,h=0,i=r,0===s?(l=138,o=3):r===s?(l=6,o=3):(l=7,o=4))}function y(t,e,a){var n,r,i=-1,l=e[1],o=0,_=7,d=4;for(0===l&&(_=138,d=3),n=0;a>=n;n++)if(r=l,l=e[2*(n+1)+1],!(++o<_&&r===l)){if(d>o){do h(t,r,t.bl_tree);while(0!==--o)}else 0!==r?(r!==i&&(h(t,r,t.bl_tree),o--),h(t,X,t.bl_tree),s(t,o-3,2)):10>=o?(h(t,Y,t.bl_tree),s(t,o-3,3)):(h(t,Z,t.bl_tree),s(t,o-11,7));o=0,i=r,0===l?(_=138,d=3):r===l?(_=6,d=3):(_=7,d=4)}}function z(t){var e;for(w(t,t.dyn_ltree,t.l_desc.max_code),w(t,t.dyn_dtree,t.d_desc.max_code),v(t,t.bl_desc),e=G-1;e>=3&&0===t.bl_tree[2*ae[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}function k(t,e,a,n){var r;for(s(t,e-257,5),s(t,a-1,5),s(t,n-4,4),r=0;n>r;r++)s(t,t.bl_tree[2*ae[r]+1],3);y(t,t.dyn_ltree,e-1),y(t,t.dyn_dtree,a-1)}function x(t){var e,a=4093624447;for(e=0;31>=e;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return U;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return q;for(e=32;O>e;e++)if(0!==t.dyn_ltree[2*e])return q;return U}function B(t){ge||(u(),ge=!0),t.l_desc=new ce(t.dyn_ltree,_e),t.d_desc=new ce(t.dyn_dtree,de),t.bl_desc=new ce(t.bl_tree,ue),t.bi_buf=0,t.bi_valid=0,f(t)}function A(t,e,a,n){s(t,(R<<1)+(n?1:0),3),g(t,e,a,!0)}function C(t){s(t,T<<1,3),h(t,W,re),o(t)}function S(t,e,a,n){var r,i,h=0;t.level>0?(t.strm.data_type===D&&(t.strm.data_type=x(t)),v(t,t.l_desc),v(t,t.d_desc),h=z(t),r=t.opt_len+3+7>>>3,i=t.static_len+3+7>>>3,r>=i&&(r=i)):r=i=a+5,r>=a+4&&-1!==e?A(t,e,a,n):t.strategy===I||i===r?(s(t,(T<<1)+(n?1:0),3),b(t,re,ie)):(s(t,(H<<1)+(n?1:0),3),k(t,t.l_desc.max_code+1,t.d_desc.max_code+1,h+1),b(t,t.dyn_ltree,t.dyn_dtree)),f(t),n&&c(t)}function E(t,e,a){return t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(he[a]+O+1)]++,t.dyn_dtree[2*r(e)]++),t.last_lit===t.lit_bufsize-1}var j=t("../utils/common"),I=4,U=0,q=1,D=2,R=0,T=1,H=2,L=3,K=258,N=29,O=256,P=O+1+N,F=30,G=19,J=2*P+1,M=15,Q=16,V=7,W=256,X=16,Y=17,Z=18,$=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],te=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],ee=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ae=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ne=512,re=new Array(2*(P+2));n(re);var ie=new Array(2*F);n(ie);var se=new Array(ne);n(se);var he=new Array(K-L+1);n(he);var le=new Array(N);n(le);var oe=new Array(F);n(oe);var _e,de,ue,fe=function(t,e,a,n,r){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=n,this.max_length=r,this.has_stree=t&&t.length},ce=function(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e},ge=!1;a._tr_init=B,a._tr_stored_block=A,a._tr_flush_block=S,a._tr_tally=E,a._tr_align=C},{"../utils/common":2}],9:[function(t,e){"use strict";function a(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}e.exports=a},{}]},{},[1])(1)});
\ No newline at end of file
diff --git a/font/iconfont.svg b/font/iconfont.svg
new file mode 100644
index 0000000..659acc5
--- /dev/null
+++ b/font/iconfont.svg
@@ -0,0 +1,331 @@
+
+
+
diff --git a/index.html b/index.html
index 70446d6..79aacfa 100644
--- a/index.html
+++ b/index.html
@@ -3,13 +3,13 @@
font编辑器
-
-
+
+
diff --git a/src/common/promise.js b/src/common/promise.js
deleted file mode 100644
index 1cbc17a..0000000
--- a/src/common/promise.js
+++ /dev/null
@@ -1,553 +0,0 @@
-/**
- * @file Promise
- * @author treelite(c.xinle@gmail.com)
- * from:
- * https://github.com/ecomfe/saber-promise/blob/master/src/promise.js
- */
-
-define(function () {
-
- /**
- * resolver的状态
- *
- * @type {Object}
- */
- var STATUS = {
- PENDING: 0,
- FULFILLED: 1,
- REJECTED: 2
- };
-
-
- /**
- * 是否捕获异常
- * 规范要求捕获所有异常 see #2.2.7.2
- *
- * but 捕获了所有异常 开发可能比较难找错误...
- * 可以在debug下调用`Resolver.disableExceptionCapture()`
- * 关闭异常捕获简单粗暴管事儿
- *
- * 更优雅点的方式是`Resolver.on('reject', fn)`注册全局事件来统一处理异常
- *
- *
- * @type {boolean}
- */
- var captureException = true;
-
- /**
- * 是否启用全局事件
- * 默认不启用
- *
- * @type {boolean}
- */
- var globalEvent = false;
-
- /**
- * 延迟执行
- *
- * @inner
- */
- var nextTick = (function () {
- var res;
-
- var Observer;
- var callbacks = [];
- var NAME = 'promise';
-
- function callback() {
- var len = callbacks.length;
- for (var i = 0; i < len; i++) {
- callbacks[i]();
- }
- callbacks.splice(0, i);
- }
-
- // nodejs support this
- // only IE on browser, currently
- // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html#processingmodel
- if (typeof setImmediate == 'function') {
- res = setImmediate;
- }
- // for modern browser
- else if ((Observer = window.MutationObserver)
- || window.webKitMutationObserver
- ) {
- var observer = new Observer(function (mutations) {
- var item = mutations[0];
- if (item.attributeName == NAME) {
- callback();
- }
- });
- var ele = document.createElement('div');
- observer.observe(ele, {attributes: true});
-
- res = function (fn) {
- callbacks.push(fn);
- ele.setAttribute(
- NAME,
- Date.now ? Date.now() : (new Date()).getTime()
- );
- };
- }
- // it's faster than `setTimeout`
- else if (typeof window.postMessage == 'function') {
- window.addEventListener(
- 'message',
- function (e) {
- if (e.source == window && e.data == NAME) {
- callback();
- }
- },
- false
- );
-
- res = function (fn) {
- callbacks.push(fn);
- window.postMessage(NAME, '*');
- };
- }
- // for older browser
- else {
- res = function (fn) {
- setTimeout(fn, 0);
- };
- }
-
- return res;
- })();
-
- /**
- * 函数判断
- *
- * @inner
- * @param {*} value
- * @return {boolean}
- */
- function isFunction(value) {
- return '[object Function]'
- == Object.prototype.toString.call(value);
- }
-
- /**
- * object判断
- *
- * @inner
- * @param {*} value
- * @return {boolean}
- */
- function isObject(value) {
- return '[object Object]'
- == Object.prototype.toString.call(value);
- }
-
- /**
- * 使用value确定resolver的状态
- *
- * @param {Resolver}
- * @param {Object} value
- */
- function resolve(resolver, value) {
- // 不再额外判断value是否是Promise对象
- if (isObject(value) || isFunction(value)) {
- // 保证resolvePromise与rejectPromise
- // 只能被调用一次
- // (不确定value是否是Promise对象)
- // see #2.3.3.3.3
- var called;
- try {
- // 可能抛异常
- var then = value.then;
- if (isFunction(then)) {
- // 可能抛异常
- then.call(
- value,
- function (data) {
- if (!called) {
- resolve(resolver, data);
- called = true;
- }
- },
- function (reason) {
- if (!called) {
- resolver.reject(reason);
- called = true;
- }
- }
- );
- }
- else {
- resolver.fulfill(value);
- }
- }
- catch (e) {
- if (!captureException) {
- throw e;
- }
- else if (!called) {
- emitExceptionEvent(e);
- resolver.reject(e);
- }
- }
- }
- else {
- resolver.fulfill(value);
- }
- }
-
- /**
- * 包装then的回调参数
- * 使其能根据回调的返回结果设置then返回的Resolver对象状态
- *
- * @inner
- * @param {Resolver} resolver
- * @param {Promise} promise
- * @param {Function} callback
- */
- function wrapCallback(resolver, promise, callback) {
- return function (data) {
- try {
- // 可能抛异常
- var res = callback(data);
- // 返回结果与当前的promise对象相同
- // 抛异常
- // see # 2.3.1
- if (res === promise) {
- throw new TypeError();
- }
-
- resolve(resolver, res);
- }
- catch (e) {
- if (captureException) {
- emitExceptionEvent(e);
- resolver.reject(e);
- }
- else {
- throw e;
- }
- }
- };
- }
-
- /**
- * 注册resolver的回调函数
- * 如果resolver已处于非PENDING状态
- * 则“立即”调用回调函数
- *
- * @inner
- * @param {Object} resolver
- * @param {number} status 回调函数类型 FULFILLED 或者 REJECTED
- * @param {Function} callback
- */
- function addListener(resolver, status, callback) {
- if (resolver.status == status) {
- // 设置延迟
- // 为了让then函数先返回再执行回调
- // see #2.2.4
- nextTick(
- function () {
- callback(resolver.data);
- }
- );
- }
- else if (status == STATUS.FULFILLED) {
- resolver.fulfillList.push(callback);
- }
- else if (status == STATUS.REJECTED) {
- resolver.rejectList.push(callback);
- }
- }
-
- /**
- * 触发resolver回调函数
- * 根据状态,执行resolver的回调函数
- *
- * @inner
- * @param {Object} resolver
- */
- function emit(resolver) {
- var items = resolver.status == STATUS.FULFILLED
- ? resolver.fulfillList
- : resolver.rejectList;
-
- emitGlobalEvent(resolver);
-
- if (items.length <= 0 ) {
- return;
- }
-
- // 触发注册的回调函数必须
- // 在状态改变完成后
- // see #2.2.2 #2.2.3 #2.2.4
- nextTick(
- function () {
- var item;
- while ((item = items.shift())) {
- item(resolver.data);
- }
- }
- );
- }
-
- /**
- * then
- * 将fulfill回调与reject回调注册到resolver上
- * 并返回新的Promise对象
- *
- * @inner
- * @param {Resolver} resolver
- * @param {Function} onFulfilled
- * @param {Function} onRejected
- * @return {Promise}
- */
- function then(resolver, onFulfilled, onRejected) {
- var res = new Resolver();
- var promise = createPromise(res);
-
- if (isFunction(onFulfilled)) {
- onFulfilled = wrapCallback(res, promise, onFulfilled);
- }
- else {
- // not function
- // 'return promise' must fulfill with the same value
- // when 'main promise' is resolved
- // see #2.2.7.3
- onFulfilled = function (data) {
- res.fulfill(data);
- };
- }
- addListener(resolver, STATUS.FULFILLED, onFulfilled);
-
- if (isFunction(onRejected)) {
- onRejected = wrapCallback(res, promise, onRejected);
- }
- else {
- // not function
- // 'return promise' must reject with the same reason
- // when 'main promise' is rejected
- // see #2.2.7.4
- onRejected = function (reason) {
- res.reject(reason);
- };
- }
- addListener(resolver, STATUS.REJECTED, onRejected);
-
- return promise;
- }
-
- /**
- * 创建Promise对象
- *
- * @inner
- * @param {Resolver} resolver
- */
- function createPromise(resolver) {
- return {
- then: function (onFulfilled, onRejected) {
- return then(resolver, onFulfilled, onRejected);
- }
- };
- }
-
- /**
- * 触发全局事件
- *
- * @inner
- * @param {Resolver} resolver
- * @param {string} type 事件类型
- */
- function emitGlobalEvent(resolver) {
- var type = resolver.status == STATUS.FULFILLED
- ? 'resolve'
- : 'reject';
-
- if (globalEvent) {
- Resolver.emit(type, resolver.data);
- }
- }
-
- function emitExceptionEvent(e) {
- if (globalEvent) {
- Resolver.emit('exception', e);
- }
- }
-
- /**
- * Resolver
- *
- * @constructor
- */
- function Resolver() {
- this.status = STATUS.PENDING;
- this.fulfillList = [];
- this.rejectList = [];
- }
-
- /**
- * 启用全局事件
- *
- * @public
- * @param {Emitter} Emitter
- */
- Resolver.enableGlobalEvent = function (Emitter) {
- Emitter.mixin(this);
- globalEvent = true;
- };
-
- /**
- * 禁用异常捕获
- *
- * @public
- */
- Resolver.disableExceptionCapture = function () {
- captureException = false;
- };
-
- /**
- * 启用异常捕获
- *
- * @public
- */
- Resolver.enableExceptionCapture = function () {
- captureException = true;
- };
-
- /**
- * all
- *
- * @public
- * @param {Array.|...Promise} promises
- * @return {Promise}
- */
- Resolver.all = function (promises) {
-
- if (!Array.isArray(promises)) {
- promises = Array.prototype.slice.call(arguments);
- }
-
- var resolve = new Resolver();
- var resolvedCount = 0;
- var res = [];
-
- function createResolvedHandler(index) {
- return function (data) {
- res[index] = data;
- resolvedCount++;
- if (resolvedCount >= promises.length) {
- resolve.fulfill(res);
- }
- };
- }
-
- function rejectedHandler(reason) {
- resolve.reject(reason);
- }
-
- promises.forEach(function (item, index) {
- item.then(createResolvedHandler(index), rejectedHandler);
- });
-
- return resolve.promise();
- };
-
- /**
- * 创建promise
- *
- * @public
- * @param {function(Resolver)} fn
- * @return {Promise}
- */
- Resolver.promise = function (fn) {
- var resolver = new Resolver();
-
- fn(resolver);
- return resolver.promise();
- };
-
- /**
- * 创建处于`rejected`状态的Promise对象
- *
- * @public
- * @param {string} reason
- * @return {Promise}
- */
- Resolver.rejected = function (reason) {
- return this.promise(function (resolver) {
- resolver.reject(reason);
- });
- };
-
- /**
- * 创建处于`fulfill`状态的Promise对象
- *
- * @public
- * @param {*} data
- * @return {Promise}
- */
- Resolver.fulfilled = function (data) {
- return this.promise(function (resolver) {
- resolver.fulfill(data);
- });
- };
-
- /**
- * 创建处于`fulfill`状态的Promise对象
- *
- * @public
- * @param {*} data
- * @return {Promise}
- */
- Resolver.resolved = Resolver.fulfilled;
-
- /**
- * fulfill
- *
- * @public
- * @param {*} data
- */
- Resolver.prototype.fulfill = function (data) {
- if (this.status != STATUS.PENDING) {
- return;
- }
-
- this.data = data;
- this.status = STATUS.FULFILLED;
- emit(this);
- };
-
- /**
- * resolve
- *
- * @public
- * @param {*} data
- */
- Resolver.prototype.resolve = Resolver.prototype.fulfill;
-
- /**
- * reject
- *
- * @public
- * @param {*} reason
- */
- Resolver.prototype.reject = function (reason) {
- if (this.status != STATUS.PENDING) {
- return;
- }
-
- this.data = reason;
- this.status = STATUS.REJECTED;
- emit(this);
- };
-
- /**
- * 生成Promise
- *
- * @public
- * @return {Promise}
- */
- Resolver.prototype.promise = function () {
- return createPromise(this);
- };
-
- return Resolver;
-});
\ No newline at end of file
diff --git a/src/common/string.js b/src/common/string.js
new file mode 100644
index 0000000..be2d6a1
--- /dev/null
+++ b/src/common/string.js
@@ -0,0 +1,99 @@
+/**
+ * @file string.js
+ * @author mengke01
+ * @date
+ * @description
+ * string 相关的函数
+ */
+
+define(
+ function(require) {
+ var string = {
+
+ /**
+ * HTML解码字符串
+ *
+ * @param {string} source 源字符串
+ * @return {string}
+ */
+ decodeHTML: function(source) {
+ var str = String(source)
+ .replace(/"/g, '"')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, "&");
+
+ //处理转义的中文和实体字符
+ return str.replace(/([\d]+);/g, function(_0, _1){
+ return String.fromCharCode(parseInt(_1, 10));
+ });
+ },
+
+ /**
+ * HTML编码字符串
+ *
+ * @param {string} source 源字符串
+ * @return {string}
+ */
+ encodeHTML: function(source) {
+ return String(source)
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ },
+
+ /**
+ * 获取string字节长度
+ *
+ * @param {string} source 源字符串
+ * @return {number} 长度
+ */
+ getLength: function(source) {
+ return String(source).replace(/[^\x00-\xff]/g, '11').length;
+ },
+
+ /**
+ * 按字节截取字符串
+ * @param {string} str 字符串
+ * @param {number} length 截取长度
+ * @param {string} tail 加的后缀
+ * @return {string} 截取后的字符串
+ */
+ cut: function(str, length, tail) {
+ tail = tail || '';
+ str = String(str);
+ var size = 0;
+ var l = str.length;
+
+ for(var i = 0; i < l; i++) {
+ size += str.charCodeAt(i) > 255 ? 2 : 1;
+ if(size > length) {
+ return str.slice(0, i) + tail;
+ }
+ }
+ return str + tail;;
+ },
+
+ /**
+ * 字符串格式化,支持如 ${xxx.xxx} 的语法
+ * @param {string} tmpl 模板字符串
+ * @param {Object} data 数据
+ * @return {string} 格式化后字符串
+ */
+ format: function(source, data) {
+ return source.replace(/\$\{([\w.]+)\}/g, function($0, $1) {
+ var ref = $1.split('.');
+ var refObject = data, level;
+ while( refObject != null && (level = ref.shift()) ) {
+ refObject = refObject[level];
+ }
+ return refObject != null ? refObject : '';
+ });
+ }
+ };
+
+ return string;
+ }
+);
diff --git a/src/ttf/ttf2base64.js b/src/ttf/ttf2base64.js
index fcfaae4..edbc18e 100644
--- a/src/ttf/ttf2base64.js
+++ b/src/ttf/ttf2base64.js
@@ -10,6 +10,8 @@
define(
function(require) {
+ var bytes2base64 = require('./util/bytes2base64');
+
/**
* ttf 二进制转base64编码
*
@@ -17,13 +19,7 @@ define(
* @return {string} base64编码
*/
function ttf2base64(arrayBuffer) {
- var length = arrayBuffer.byteLength || arrayBuffer.length;
- var view = new DataView(arrayBuffer, 0, length);
- var str = '';
- for(var i = 0; i < length; i++) {
- str += String.fromCharCode(view.getUint8(i, false));
- }
- return btoa(str);
+ return 'data:font/ttf;charset=utf-8;base64,' + bytes2base64(arrayBuffer);
}
return ttf2base64;
diff --git a/src/ttf/ttf2svg.js b/src/ttf/ttf2svg.js
new file mode 100644
index 0000000..4070c70
--- /dev/null
+++ b/src/ttf/ttf2svg.js
@@ -0,0 +1,21 @@
+/**
+ * @file ttf2svg.js
+ * @author mengke01
+ * @date
+ * @description
+ * ttf转svg
+ */
+
+define(
+ function(require) {
+ /**
+ * desc
+ *
+ * @type {Object}
+ */
+ var ttf2svg = {
+ };
+
+ return ttf2svg;
+ }
+);
diff --git a/src/ttf/ttf2woff.js b/src/ttf/ttf2woff.js
new file mode 100644
index 0000000..2dc2a9c
--- /dev/null
+++ b/src/ttf/ttf2woff.js
@@ -0,0 +1,280 @@
+/**
+ * @file ttf2woff.js
+ * @author mengke01
+ * @date
+ * @description
+ * ttf转换为woff
+ *
+ * woff format:
+ * http://www.w3.org/TR/2012/REC-WOFF-20121213/
+ *
+ * references:
+ * https://github.com/fontello/ttf2woff
+ * https://github.com/nodeca/pako
+ *
+ */
+
+
+define(
+ function(require) {
+ var Reader = require('./reader');
+ var Writer = require('./writer');
+ var checkSum = require('./util/checkSum');
+ var string = require('common/string');
+
+ /**
+ * metadata 转换成XML
+ *
+ * @param {Object} metadata metadata
+ * @return {string} xml字符串
+ */
+ function metadata2xml(metadata) {
+ var xml = ''
+ + ''
+ + '';
+
+ metadata.uniqueid = metadata.uniqueid || 'fonteditor.' + Date.now();
+ xml += '';
+
+ if (metadata.vendor) {
+ xml += '';
+ }
+
+ if (metadata.credit) {
+ xml += '';
+ var credits = metadata.credit instanceof Array ? metadata.credit : [metadata.credit];
+ credits.forEach(function(credit) {
+ xml += '';
+ });
+ xml += '';
+ }
+
+ if (metadata.description) {
+ xml += ''
+ + string.encodeHTML(metadata.description)
+ + '';
+ }
+
+ if (metadata.license) {
+ xml += '';
+ xml += string.encodeHTML(metadata.license.text)
+ xml += '';
+ }
+
+ if (metadata.copyright) {
+ xml += ''
+ xml += string.encodeHTML(metadata.copyright)
+ xml += '';
+ }
+
+ if (metadata.trademark) {
+ xml += ''
+ + string.encodeHTML(metadata.trademark)
+ + '';
+ }
+
+ if (metadata.licensee) {
+ xml += '';
+ }
+
+ xml += '';
+
+ return xml;
+ }
+
+ /**
+ * 写空数据
+ *
+ * @param {Writer} writer writer对象
+ * @param {number} length 大小
+ * @return {Writer}
+ */
+ function writeEmpty(writer, length) {
+ while (length-- > 0) {
+ writer.writeUint8(0);
+ }
+ return writer;
+ }
+
+ /**
+ * ttf格式转换成woff字体格式
+ *
+ * @param {ArrayBuffer} ttfBuffer ttf缓冲数组
+ * @param {Object} options 选项
+ * @param {Object} options.metadata 字体相关的信息
+ *
+ * @return {ArrayBuffer} woff格式byte流
+ */
+ function ttf2woff(ttfBuffer, options) {
+
+ options = options || {};
+
+ // woff 头部结构
+ var woffHeader = {
+ signature: 0x774F4646, // for woff
+ flavor: 0x10000, // for ttf
+ length: 0,
+ numTables: 0,
+ reserved: 0,
+ totalSfntSize: 0,
+ majorVersion: 0,
+ minorVersion: 0,
+ metaOffset: 0,
+ metaLength: 0,
+ metaOrigLength: 0,
+ privOffset: 0,
+ privLength: 0
+ };
+
+ var ttfReader = new Reader(ttfBuffer);
+ var tableEntries = [];
+ var numTables = ttfReader.readUint16(4); // 读取ttf表个数
+
+ // 读取ttf表索引信息
+ ttfReader.seek(12);
+ for (var i = 0; i < numTables; ++i) {
+
+ var tableEntry = {
+ tag: ttfReader.readString(ttfReader.offset, 4),
+ checkSum: ttfReader.readUint32(),
+ offset: ttfReader.readUint32(),
+ length: ttfReader.readUint32()
+ };
+
+ var entryOffset = ttfReader.offset;
+
+ if (tableEntry.tag == 'head') {
+ // 读取font revision
+ woffHeader.majorVersion = ttfReader.readUint16(tableEntry.offset + 4),
+ woffHeader.minorVersion = ttfReader.readUint16(tableEntry.offset + 6)
+ }
+
+ // ttf 表数据
+ var sfntData = ttfReader.readBytes(tableEntry.offset, tableEntry.length);
+
+ // 对数据进行压缩
+ if (options.deflate) {
+ var deflatedData = options.deflate(sfntData);
+
+ // 这里需要判断是否压缩后数据小于原始数据
+ if (deflatedData.length < sfntData.length) {
+ tableEntry.data = deflatedData;
+ tableEntry.deflated = true;
+ }
+ else {
+ tableEntry.data = sfntData;
+ }
+ }
+ else {
+ tableEntry.data = sfntData;
+ }
+
+ tableEntry.compLength = tableEntry.data.length;
+ tableEntries.push(tableEntry);
+ ttfReader.seek(entryOffset);
+ }
+
+ // 对table进行排序
+ tableEntries = tableEntries.sort(function(a, b) {
+ return a.tag === b.tag ? 0 : a.tag < b.tag ? -1 : 1;
+ });
+
+ // 计算offset和 woff size
+ var woffSize = 44 + 20 * numTables; // header size + table entries
+ var ttfSize = 12 + 16 * numTables;
+
+ for (var i = 0, l = tableEntries.length; i < l; ++i) {
+ var tableEntry = tableEntries[i];
+ tableEntry.offset = woffSize;
+ // 4字节对齐
+ woffSize += tableEntry.compLength + (tableEntry.compLength % 4 ? 4 - tableEntry.compLength % 4 : 0);
+ ttfSize += tableEntry.length + (tableEntry.length % 4 ? 4 - tableEntry.length % 4 : 0);
+ }
+
+ // 计算metaData
+ var metadata = null;
+ if (options.metadata) {
+ var xml = require('./util/string').toUTF8Bytes(metadata2xml(options.metadata));
+
+ if (options.deflate) {
+ var deflatedData = options.deflate(xml);
+ if (deflatedData.length < xml.length) {
+ metadata = deflatedData;
+ }
+ else {
+ metadata = xml;
+ }
+ }
+ else {
+ metadata = xml;
+ }
+
+ woffHeader.metaLength = metadata.length;
+ woffHeader.metaOrigLength = xml.length;
+ woffHeader.metaOffset = woffSize;
+ //metadata header + length
+ woffSize += woffHeader.metaLength + (woffHeader.metaLength % 4 ? 4 - woffHeader.metaLength % 4 : 0);
+ }
+
+ woffHeader.numTables = tableEntries.length;
+ woffHeader.length = woffSize;
+ woffHeader.totalSfntSize = ttfSize;
+
+ // 写woff数据
+ var woffWriter = new Writer(new ArrayBuffer(woffSize));
+
+ // 写woff头部
+ woffWriter.writeUint32(woffHeader.signature);
+ woffWriter.writeUint32(woffHeader.flavor);
+ woffWriter.writeUint32(woffHeader.length);
+ woffWriter.writeUint16(woffHeader.numTables);
+ woffWriter.writeUint16(woffHeader.reserved);
+ woffWriter.writeUint32(woffHeader.totalSfntSize);
+ woffWriter.writeUint16(woffHeader.majorVersion);
+ woffWriter.writeUint16(woffHeader.minorVersion);
+ woffWriter.writeUint32(woffHeader.metaOffset);
+ woffWriter.writeUint32(woffHeader.metaLength);
+ woffWriter.writeUint32(woffHeader.metaOrigLength);
+ woffWriter.writeUint32(woffHeader.privOffset);
+ woffWriter.writeUint32(woffHeader.privLength);
+
+
+ // 写woff表索引
+ for (var i = 0, l = tableEntries.length; i < l; ++i) {
+ var tableEntry = tableEntries[i];
+ woffWriter.writeString(tableEntry.tag);
+ woffWriter.writeUint32(tableEntry.offset);
+ woffWriter.writeUint32(tableEntry.compLength);
+ woffWriter.writeUint32(tableEntry.length);
+ woffWriter.writeUint32(tableEntry.checkSum);
+ }
+
+ // 写表数据
+ for (var i = 0, l = tableEntries.length; i < l; ++i) {
+ var tableEntry = tableEntries[i];
+ woffWriter.writeBytes(tableEntry.data);
+
+ if (tableEntry.compLength % 4) {
+ writeEmpty(woffWriter, 4 - tableEntry.compLength % 4);
+ }
+ }
+
+ // 写metadata
+ if (metadata) {
+ woffWriter.writeBytes(metadata);
+ if (woffHeader.metaLength % 4) {
+ writeEmpty(woffWriter, 4 - woffHeader.metaLength % 4);
+ }
+ }
+
+ return woffWriter.getBuffer();
+ }
+
+
+ return ttf2woff;
+ }
+);
diff --git a/src/ttf/util/bytes2base64.js b/src/ttf/util/bytes2base64.js
new file mode 100644
index 0000000..1500d42
--- /dev/null
+++ b/src/ttf/util/bytes2base64.js
@@ -0,0 +1,42 @@
+/**
+ * @file bytes2base64.js
+ * @author mengke01
+ * @date
+ * @description
+ * 二进制byte流转base64编码
+ */
+
+
+define(
+ function(require) {
+
+ /**
+ * 二进制byte流转base64编码
+ *
+ * @param {ArrayBuffer|Array} arrayBuffer ArrayBuffer对象
+ * @return {string} base64编码
+ */
+ function bytes2base64(arrayBuffer) {
+ var str = '';
+
+ // ArrayBuffer
+ if (arrayBuffer instanceof ArrayBuffer) {
+ var length = arrayBuffer.byteLength;
+ var view = new DataView(arrayBuffer, 0, length);
+ for(var i = 0; i < length; i++) {
+ str += String.fromCharCode(view.getUint8(i, false));
+ }
+ }
+ //Array
+ else if (arrayBuffer instanceof Array) {
+ var length = arrayBuffer.length;
+ for(var i = 0; i < length; i++) {
+ str += String.fromCharCode(arrayBuffer[i]);
+ }
+ }
+ return btoa(str);
+ }
+
+ return bytes2base64;
+ }
+);
diff --git a/src/ttf/util/checkSum.js b/src/ttf/util/checkSum.js
index 7aa28f3..73635c2 100644
--- a/src/ttf/util/checkSum.js
+++ b/src/ttf/util/checkSum.js
@@ -11,13 +11,8 @@ define(
function(require) {
- /**
- * table校验
- *
- * @param {ArrayBuffer|Array} buffer 表数据
- * @return {number} 校验和
- */
- function checkSum(buffer, offset, length) {
+
+ function checkSumArrayBuffer(buffer, offset, length) {
var offset = offset || 0;
var length = length || buffer.byteLength;
@@ -45,6 +40,52 @@ define(
return sum % 0x100000000;
}
+ function checkSumArray(buffer, offset, length) {
+ var offset = offset || 0;
+ var length = length || buffer.length;
+
+ if (offset + length > buffer.length) {
+ throw 'check sum out of bound';
+ }
+
+ var nLongs = Math.floor(length/ 4);
+ var sum = 0, i = 0;
+
+ while (i < nLongs) {
+ sum += (buffer[i++] << 24) + (buffer[i++] << 16) + (buffer[i++] << 8) + buffer[i++];
+ }
+
+ var leftBytes = length - nLongs * 4;
+ if (leftBytes) {
+ var offset = nLongs * 4;
+ while(leftBytes > 0) {
+ sum += buffer[offset] << (leftBytes * 8);
+ offset++;
+ leftBytes--;
+ }
+ }
+ return sum % 0x100000000;
+ }
+
+
+ /**
+ * table校验
+ *
+ * @param {ArrayBuffer|Array} buffer 表数据
+ * @return {number} 校验和
+ */
+ function checkSum(buffer, offset, length) {
+ if (buffer instanceof ArrayBuffer) {
+ return checkSumArrayBuffer(buffer, offset, length);
+ }
+ else if (buffer instanceof Array) {
+ return checkSumArray(buffer, offset, length);
+ }
+ else {
+ throw 'not support checksum buffer type';
+ }
+ }
+
return checkSum;
}
);
diff --git a/src/ttf/woff2base64.js b/src/ttf/woff2base64.js
new file mode 100644
index 0000000..663c995
--- /dev/null
+++ b/src/ttf/woff2base64.js
@@ -0,0 +1,27 @@
+/**
+ * @file woff2base64.js
+ * @author mengke01
+ * @date
+ * @description
+ * ttf 二进制转base64编码
+ */
+
+
+define(
+ function(require) {
+
+ var bytes2base64 = require('./util/bytes2base64');
+
+ /**
+ * ttf 二进制转base64编码
+ *
+ * @param {Array} arrayBuffer ArrayBuffer对象
+ * @return {string} base64编码
+ */
+ function woff2base64(arrayBuffer) {
+ return 'data:font/woff;charset=utf-8;base64,' + bytes2base64(arrayBuffer);
+ }
+
+ return woff2base64;
+ }
+);