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 @@ + + + + +Created by FontForge 20120731 at Fri Sep 26 21:41:29 2014 + By Ads + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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; + } +);