From 1781567403360c6c1c9e58e808611983882edb99 Mon Sep 17 00:00:00 2001 From: kekee000 Date: Sun, 26 Apr 2015 21:36:05 +0800 Subject: [PATCH] add ttf test case --- README.md | 4 +- demo/js/ttfparse.js | 8 +- demo/test/baiduHealth.ttf | Bin 5096 -> 11308 bytes src/ttf/table/CFF.js | 24 ++-- src/ttf/ttfwriter.js | 15 ++- src/ttf/util/base642bytes.js | 26 +++++ src/ttf/util/bytes2base64.js | 8 +- src/ttf/util/optimizettf.js | 4 +- test/SpecRunner.html | 3 +- test/data/BalladeContour.otf.js | 7 ++ test/data/baiduHealth-hinting.ttf.js | 6 + test/data/baiduHealth.ttf.js | 6 + test/data/icomoon.svg.js | 5 + test/data/iconfont-xin.svg.js | 5 + test/spec/main.js | 16 ++- test/spec/ttf/eot2ttf.spec.js | 52 +++++++++ test/spec/ttf/otf2ttfobject.spec.js | 31 ++++++ test/spec/ttf/otfreader.spec.js | 81 ++++++++++++++ test/spec/ttf/reader.spec.js | 50 +++++++++ test/spec/ttf/svg2ttfobject.spec.js | 50 +++++++++ test/spec/ttf/ttf2eot.spec.js | 50 +++++++++ test/spec/ttf/ttf2svg.spec.js | 37 ++++++ test/spec/ttf/ttf2woff.spec.js | 50 +++++++++ test/spec/ttf/ttfreader.spec.js | 105 ++++++++++++++++++ test/spec/ttf/ttfwriter.spec.js | 93 ++++++++++++++++ test/spec/ttf/woff2ttf.spec.js | 53 +++++++++ .../{reader-writer.spec.js => writer.spec.js} | 41 ------- 27 files changed, 758 insertions(+), 72 deletions(-) create mode 100644 src/ttf/util/base642bytes.js create mode 100644 test/data/BalladeContour.otf.js create mode 100644 test/data/baiduHealth-hinting.ttf.js create mode 100644 test/data/baiduHealth.ttf.js create mode 100644 test/data/icomoon.svg.js create mode 100644 test/data/iconfont-xin.svg.js create mode 100644 test/spec/ttf/eot2ttf.spec.js create mode 100644 test/spec/ttf/otf2ttfobject.spec.js create mode 100644 test/spec/ttf/otfreader.spec.js create mode 100644 test/spec/ttf/reader.spec.js create mode 100644 test/spec/ttf/svg2ttfobject.spec.js create mode 100644 test/spec/ttf/ttf2eot.spec.js create mode 100644 test/spec/ttf/ttf2svg.spec.js create mode 100644 test/spec/ttf/ttf2woff.spec.js create mode 100644 test/spec/ttf/ttfreader.spec.js create mode 100644 test/spec/ttf/ttfwriter.spec.js create mode 100644 test/spec/ttf/woff2ttf.spec.js rename test/spec/ttf/{reader-writer.spec.js => writer.spec.js} (67%) diff --git a/README.md b/README.md index c9f6fc1..7bf2d78 100644 --- a/README.md +++ b/README.md @@ -39,4 +39,6 @@ fonteditor 在线ttf字体编辑器 16. 2015-4-9 增加图像导入参数设置,优化导入图形. -16. 2015-4-12 增加同步字体功能. +17. 2015-4-12 增加同步字体功能. + +18. 2015-4-12 增加otf字体读取和转换ttf功能. diff --git a/demo/js/ttfparse.js b/demo/js/ttfparse.js index 2de06f6..f258b39 100644 --- a/demo/js/ttfparse.js +++ b/demo/js/ttfparse.js @@ -18,7 +18,9 @@ define( var reader = new FileReader(); reader.onload = function(e) { - var ttfReader = new ttfreader(); + var ttfReader = new ttfreader({ + hinting: true + }); var ttfData = ttfReader.read(e.target.result); console.log(ttfData); @@ -44,7 +46,9 @@ define( type: 'binary', url: './test/baiduHealth.ttf', onSuccess: function(binaryData) { - var ttfReader = new ttfreader(); + var ttfReader = new ttfreader({ + hinting: true + }); var ttfData = ttfReader.read(binaryData); console.log(ttfData); diff --git a/demo/test/baiduHealth.ttf b/demo/test/baiduHealth.ttf index 0df71c6fc45d18c8dbdb5906073970a58e776fd0..1ddeaab1b45371518aaa679a23ce997bcdccc801 100644 GIT binary patch literal 11308 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 S8=D44w_pa7MXvF+1^qW}YEnJ` delta 1417 zcmYjRTWlLu5S_W+hvV4mXPk#$YdiKjHccGALZzw+;KVd3d5{1})QDK6ZG@6EB|%LU z6<6v<> zduPTw_k-!5wF)2r*x>@0V5K;Dq(q23?ssW6mx_Z!1`qC=gsr9Vu}NqLEAcyoU8TwA zo?Luu?F!-Bgw?Uhp3K;%M-S5y>xAczFO^q5zx5tznV;~-r^>4Ft80(X-nCHdKM}tJNU`z^)uG+r zUbG+j6Pg)00KVDz>PtS~8y+EXt;*)`Awe_LY2zKN)_&CAK&|Cj5V&^V#Q^o&IESFe z*%M(4I|#H2&)azXd`G$#331D>Z&@Z{5)2vMV1qS)G2q^=OfOqP`TE;+{xMjG&oF7a zF3buy#J43uT9Y2hUb#~)&^oJNV?Fpj1OfCrw&4nG*irk7lKC2B`qML12ah*X$i*W< zV|M4_8r{)|EXfMWS*gY2&1U)v*-UF68HIdK^W{hK`4ODS59jm4XBnE6Gy2t6WD!k> za=_zIrq6E7Fssty7x5~WHh%xDRuEB<=H^9-v{uCvu#8VJbHLMV;Tcku0jm^Pic*V6 zMnJOHV@D~{gEAlDxqj66P{@R^j}M&2m+x0h(ACCiU6^0+Et75dPuU=8pKv_tGDkkML>7P zC<-TJNvjJRR6{6xsD!N&EtjaoI=j0wy|a<9%ZV6|L{h1q?x~RKuu$o2?yM`Mb|q4& z(LlgXX@!GF2|$la`5v!(Ht@w~b9DLP5I& zF%k-C@nqMC-)~nCRezu}sv)zw(5F9e3{auB-|^lM^Z}m_VSCVDMmqy@?HBx=dMX6H z^r`d)FX$fzgIxN$`UUFGMB3<6#^@cl08c>%ui$I+^@N}wCP=-}d6)cyki$3eJUAf= zM_`Wpw)g`Fm9kj-6<@{g=+x*Sr&B9d=m@aD4E~Ep;S!i?Ihcr_1UR_GN8*~HjivD+ zOM>ZJrwX2n)LzRt+P+l<724@6pvwxIjW$8j%MF{6Wwa)ZCTQF93;Q%8ypX2Q>pdhH z1a+a%L>@1NUAGx1FxIe5klynP`!piV!{vrX;(mR%E2K9k)B3Swzy48jo`KP>W~UJo YLwzje)6b+2f0P>dA3R~{wEzGB diff --git a/src/ttf/table/CFF.js b/src/ttf/table/CFF.js index 6ffe332..4b0dd8d 100644 --- a/src/ttf/table/CFF.js +++ b/src/ttf/table/CFF.js @@ -42,15 +42,15 @@ define( * @param {Object} reader 读取器 * @return {Object} 头部字段 */ - function parseCFFHeader(reader) { - var header = {}; - header.startOffset = reader.offset; - header.endOffset = header.startOffset + 4; - header.formatMajor = reader.readUint8(); - header.formatMinor = reader.readUint8(); - header.size = reader.readUint8(); - header.offsetSize = reader.readUint8(); - return header; + function parseCFFHead(reader) { + var head = {}; + head.startOffset = reader.offset; + head.endOffset = head.startOffset + 4; + head.formatMajor = reader.readUint8(); + head.formatMinor = reader.readUint8(); + head.size = reader.readUint8(); + head.offsetSize = reader.readUint8(); + return head; } /** @@ -116,14 +116,14 @@ define( var offset = this.offset; reader.seek(offset); - var header = parseCFFHeader(reader); - var nameIndex = parseCFFIndex(reader, header.endOffset, string.getString); + var head = parseCFFHead(reader); + var nameIndex = parseCFFIndex(reader, head.endOffset, string.getString); var topDictIndex = parseCFFIndex(reader, nameIndex.endOffset); var stringIndex = parseCFFIndex(reader, topDictIndex.endOffset, string.getString); var globalSubrIndex = parseCFFIndex(reader, stringIndex.endOffset); var cff = { - header: header + head: head }; // 全局子glyf数据 diff --git a/src/ttf/ttfwriter.js b/src/ttf/ttfwriter.js index e920af6..1e24daf 100644 --- a/src/ttf/ttfwriter.js +++ b/src/ttf/ttfwriter.js @@ -37,9 +37,18 @@ define( * @param {Object} ttf ttf对象 */ function prepareDump(ttf) { + + if (!ttf.glyf || ttf.glyf.length === 0) { + error.raise(10201); + } + + if (!ttf['OS/2'] || !ttf.head || !ttf.name) { + error.raise(10204); + } + + var tables = SUPPORT_TABLES.slice(0); ttf.writeOptions = {}; - // hinting tables direct copy if (this.options.hinting) { ['cvt', 'fpgm', 'prep', 'gasp'].forEach(function (table) { @@ -77,10 +86,6 @@ define( ttf.head.modified = Date.now(); - if (!ttf.glyf || ttf.glyf.length === 0) { - error.raise(10201); - } - var checkUnicodeRepeat = {}; // 检查是否有重复代码点 // 将glyf的代码点按小到大排序 diff --git a/src/ttf/util/base642bytes.js b/src/ttf/util/base642bytes.js new file mode 100644 index 0000000..ecf05b1 --- /dev/null +++ b/src/ttf/util/base642bytes.js @@ -0,0 +1,26 @@ +/** + * @file base64字符串转数组 + * @author mengke01(kekee000@gmail.com) + */ + + +define( + function (require) { + + /** + * base64字符串转数组 + * @param {string} base64 base64字符串 + * @return {Array} 数组 + */ + function base642bytes(base64) { + var str = atob(base64); + var result = []; + for (var i = 0, l = str.length; i < l; i++) { + result.push(str[i].charCodeAt(0)); + } + return result; + } + + return base642bytes; + } +); diff --git a/src/ttf/util/bytes2base64.js b/src/ttf/util/bytes2base64.js index 063db4a..fb83095 100644 --- a/src/ttf/util/bytes2base64.js +++ b/src/ttf/util/bytes2base64.js @@ -1,12 +1,8 @@ /** - * @file bytes2base64.js - * @author mengke01 - * @date - * @description - * 二进制byte流转base64编码 + * @file 二进制byte流转base64编码 + * @author mengke01(kekee000@gmail.com) */ - define( function (require) { diff --git a/src/ttf/util/optimizettf.js b/src/ttf/util/optimizettf.js index 5d352bb..f3e3621 100644 --- a/src/ttf/util/optimizettf.js +++ b/src/ttf/util/optimizettf.js @@ -57,8 +57,8 @@ define( }); // 过滤无轮廓字体 - ttf.glyf = ttf.glyf.filter(function (glyf) { - return glyf.contours && glyf.contours.length; + ttf.glyf = ttf.glyf.filter(function (glyf, index) { + return index === 0 || glyf.contours && glyf.contours.length; }); if (!repeatList.length) { diff --git a/test/SpecRunner.html b/test/SpecRunner.html index 1aa60bb..5704db2 100644 --- a/test/SpecRunner.html +++ b/test/SpecRunner.html @@ -17,7 +17,8 @@ baseUrl: '../src', paths: { demo: '../demo/js', - test: '../unittest/spec' + test: '../test/spec', + data: '../test/data' } }); define('jquery', window.jQuery); diff --git a/test/data/BalladeContour.otf.js b/test/data/BalladeContour.otf.js new file mode 100644 index 0000000..21df333 --- /dev/null +++ b/test/data/BalladeContour.otf.js @@ -0,0 +1,7 @@ +define( + function (require) { + var data = 'T1RUTwAJAIAAAwAQQ0ZGIIA/tyUAAAnUAACTV09TLzKHfuIAAAABAAAAAGBjbWFwAwoFgwAACLAAAAECaGVhZO1YaRUAAACcAAAANmhoZWEHIQOXAAAA1AAAACRobXR4bH4AOgAAnSwAAAC8bWF4cAAvUAAAAAD4AAAABm5hbWXHedieAAABYAAAB01wb3N0/7gAMgAACbQAAAAgAAEAAAABAACAmCtpXw889QADA+gAAAAAuOxEvAAAAADRYuEL/8T/YAQuAw4AAAADAAIAAAAAAAAAAQAAAvb/bgA2BDn/xP/ABC4AAQAAAAAAAAAAAAAAAAAAAC8AAFAAAC8AAAADAk4BkAAFAAQCigJYAAAASwKKAlgAAAFeADIBUQAAAgAAAAAAAAAAAIAAAK8QACBKAAAAAAAAAABEU1QAAEAAAgBaAvb/bgA2A7kA5gAAAAEAAAAAAjMDDgAgACAAAAAAAB0BYgABAAAAAAAAAK0AAAABAAAAAAABAA8ArQABAAAAAAACAAcAvAABAAAAAAADABgAwwABAAAAAAAEAA8ArQABAAAAAAAFACAA2wABAAAAAAAGAA4A+wABAAAAAAAHAFEBCQABAAAAAAAJABABWgABAAAAAAAKAGYBagABAAAAAAALABcB0AABAAAAAAAMABcB0AABAAAAAAANABIB5wABAAAAAAAOABcB0AADAAEECQAAAVoB+QADAAEECQABAB4DUwADAAEECQACAA4DcQADAAEECQADADADfwADAAEECQAEABwDrwADAAEECQAFAEADywADAAEECQAGABwDrwADAAEECQAHAKIECwADAAEECQAJACAErQADAAEECQAKAMwEzQADAAEECQALAC4FmQADAAEECQAMAC4FmQADAAEECQANACQFxwADAAEECQAOAC4FmQADAAEECQASAB4DU0NvcHlyaWdodCAoYykgVHlwb2dyYXBoZXIgTWVkaWVuZ2VzdGFsdHVuZywgMjAwMi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gSGFsYmZldHRlIEJhbGxhZGUgZ2VzY2hhZmZlbiB2b24gUGF1bCBSZW5uZXIsIDE5MzcuIERpZ2l0aXplZCBhbmQgaGludGVkIGJ5IERpZXRlciBTdGVmZm1hbm4sIEtyZXV6dGFsQmFsbGFkZSBDb250b3VyUmVndWxhcjEuMDAwO0RTVDtCYWxsYWRlQ29udG91ck9URiAxLjAwMDtQUyAwMDEuMDAwO0NvcmUgMS4wLjI5QmFsbGFkZUNvbnRvdXJQbGVhc2UgcmVmZXIgdG8gdGhlIENvcHlyaWdodCBzZWN0aW9uIGZvciB0aGUgZm9udCB0cmFkZW1hcmsgYXR0cmlidXRpb24gbm90aWNlcy5EaWV0ZXIgU3RlZmZtYW5uSGFsYmZldHRlIEJhbGxhZGUgZ2VzY2hhZmZlbiB2b24gUGF1bCBSZW5uZXIsIDE5MzcuIERpZ2l0aXplZCBhbmQgaGludGVkIGJ5IERpZXRlciBTdGVmZm1hbm4sIEtyZXV6dGFsaHR0cDovL3d3dy5zdGVmZm1hbm4uZGVIYXZlIGZ1biBhbmQgZW5qb3kAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgAFQAeQBwAG8AZwByAGEAcABoAGUAcgAgAE0AZQBkAGkAZQBuAGcAZQBzAHQAYQBsAHQAdQBuAGcALAAgADIAMAAwADIALgAgAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQALgAgAEgAYQBsAGIAZgBlAHQAdABlACAAQgBhAGwAbABhAGQAZQAgAGcAZQBzAGMAaABhAGYAZgBlAG4AIAB2AG8AbgAgAFAAYQB1AGwAIABSAGUAbgBuAGUAcgAsACAAMQA5ADMANwAuACAARABpAGcAaQB0AGkAegBlAGQAIABhAG4AZAAgAGgAaQBuAHQAZQBkACAAYgB5ACAARABpAGUAdABlAHIAIABTAHQAZQBmAGYAbQBhAG4AbgAsACAASwByAGUAdQB6AHQAYQBsAEIAYQBsAGwAYQBkAGUAIABDAG8AbgB0AG8AdQByAFIAZQBnAHUAbABhAHIAMQAuADAAMAAwADsARABTAFQAOwBCAGEAbABsAGEAZABlAEMAbwBuAHQAbwB1AHIAQgBhAGwAbABhAGQAZQBDAG8AbgB0AG8AdQByAE8AVABGACAAMQAuADAAMAAwADsAUABTACAAMAAwADEALgAwADAAMAA7AEMAbwByAGUAIAAxAC4AMAAuADIAOQBQAGwAZQBhAHMAZQAgAHIAZQBmAGUAcgAgAHQAbwAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQA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'; + + return new Uint8Array(require('ttf/util/base642bytes')(data)).buffer; + } +); diff --git a/test/data/baiduHealth-hinting.ttf.js b/test/data/baiduHealth-hinting.ttf.js new file mode 100644 index 0000000..017a58d --- /dev/null +++ b/test/data/baiduHealth-hinting.ttf.js @@ -0,0 +1,6 @@ +define( + function (require) { + var data = 'AAEAAAAUAQAABABAR0RFRgABAAAAACvsAAAADEdQT1MAGQAMAAAr+AAAABJHU1VCbJF0jwAALAwAAAAgTFRTSDuFT0sAAAJsAAAAFU9TLzJP3Uw+AAAByAAAAGBWRE1YecaBVQAAAoQAAAXgY21hcEG2gmwAAAo4AAABAmN2dCAAagCGAAANfAAAABhmcGdtBlicNgAACzwAAAFzZ2FzcP//AAMAACvkAAAACGdseWZ0lOSfAAANlAAAG4hoZG1438ilLgAACGQAAAHUaGVhZAGjI34AAAFMAAAANmhoZWEEbgKbAAABhAAAACRobXR4Hn0CDwAAAigAAABEbG9jYTWCOyQAACkcAAAAJG1heHACNweIAAABqAAAACBuYW1ljx5MUgAAKUAAAAHmcG9zdCXTa1EAACsoAAAAuXByZXA7n99HAAAMsAAAAMwAAQAAAAEAAGvl3LRfDzz1ABsCAAAAAADOtMTDAAAAANFiHfwAAP/gAl0B4gAAAAgAAgAAAAAAAAABAAAB4P/gAC4CqgAA//8CXQABAAAAAAAAAAAAAAAAAAAAEQABAAAAEQIGABsAAAAAAAEAAAAAAAoAAAIABYEAAAAAAAMB5wGQAAUACAFMAWYAAABHAUwBZgAAAPUAGQCEAAACAAUDAAAAAAAAAAAAABAAAAAAAAAAAAAAAFBmRWQAQAAA4DgB4P/gAC4B4AAhAAAAAQAAAAAAAAAAAAAAIAAAAgAAAAAAAAAAqgAAAqoAcwJ5ABoCAAAAAgAAEAItAAMCLQAHAi0ACAGrAEQBrQA/AY8AQwGOAEUBdABEAgcACAI5AAkAAAARAQEBAQEBTDc3TAEBATcBAQEAAAAAAAABAAEBAQEBAAwA+Aj/AAgACP//AAkACf//AAoACv//AAsAC///AAwADP//AA0ADf//AA4ADv//AA8AD///ABAAD//+ABEAEP/+ABIAEf/+ABMAEv/+ABQAE//+ABUAFP/+ABYAFf/+ABcAFv/+ABgAF//+ABkAGP/+ABoAGf/+ABsAGv/+ABwAG//+AB0AHP/+AB4AHf/+AB8AHv/+ACAAHv/9ACEAH//9ACIAIP/9ACMAIf/9ACQAIv/9ACUAI//9ACYAJP/9ACcAJf/9ACgAJv/9ACkAJ//9ACoAKP/9ACsAKf/9ACwAKv/9AC0AK//9AC4ALP/9AC8ALf/8ADAALf/8ADEALv/8ADIAL//8ADMAMP/8ADQAMf/8ADUAMv/8ADYAM//8ADcANP/8ADgANf/8ADkANv/8ADoAN//8ADsAOP/8ADwAOf/8AD0AOv/8AD4AO//8AD8APP/7AEAAPP/7AEEAPf/7AEIAPv/7AEMAP//7AEQAQP/7AEUAQf/7AEYAQv/7AEcAQ//7AEgARP/7AEkARf/7AEoARv/7AEsAR//7AEwASP/7AE0ASf/7AE4ASv/6AE8AS//6AFAAS//6AFEATP/6AFIATf/6AFMATv/6AFQAT//6AFUAUP/6AFYAUf/6AFcAUv/6AFgAU//6AFkAVP/6AFoAVf/6AFsAVv/6AFwAV//6AF0AWP/6AF4AWf/5AF8AWv/5AGAAWv/5AGEAW//5AGIAXP/5AGMAXf/5AGQAXv/5AGUAX//5AGYAYP/5AGcAYf/5AGgAYv/5AGkAY//5AGoAZP/5AGsAZf/5AGwAZv/5AG0AZ//4AG4AaP/4AG8Aaf/4AHAAaf/4AHEAav/4AHIAa//4AHMAbP/4AHQAbf/4AHUAbv/4AHYAb//4AHcAcP/4AHgAcf/4AHkAcv/4AHoAc//4AHsAdP/4AHwAdf/4AH0Adv/3AH4Ad//3AH8AeP/3AIAAeP/3AIEAef/3AIIAev/3AIMAe//3AIQAfP/3AIUAff/3AIYAfv/3AIcAf//3AIgAgP/3AIkAgf/3AIoAgv/3AIsAg//3AIwAhP/2AI0Ahf/2AI4Ahv/2AI8Ah//2AJAAh//2AJEAiP/2AJIAif/2AJMAiv/2AJQAi//2AJUAjP/2AJYAjf/2AJcAjv/2AJgAj//2AJkAkP/2AJoAkf/2AJsAkv/2AJwAk//1AJ0AlP/1AJ4Alf/1AJ8Alv/1AKAAlv/1AKEAl//1AKIAmP/1AKMAmf/1AKQAmv/1AKUAm//1AKYAnP/1AKcAnf/1AKgAnv/1AKkAn//1AKoAoP/1AKsAof/0AKwAov/0AK0Ao//0AK4ApP/0AK8Apf/0ALAApf/0ALEApv/0ALIAp//0ALMAqP/0ALQAqf/0ALUAqv/0ALYAq//0ALcArP/0ALgArf/0ALkArv/0ALoAr//0ALsAsP/zALwAsf/zAL0Asv/zAL4As//zAL8AtP/zAMAAtP/zAMEAtf/zAMIAtv/zAMMAt//zAMQAuP/zAMUAuf/z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'; + return new Uint8Array(require('ttf/util/base642bytes')(data)).buffer; + } +); diff --git a/test/data/baiduHealth.ttf.js b/test/data/baiduHealth.ttf.js new file mode 100644 index 0000000..080c6f2 --- /dev/null +++ b/test/data/baiduHealth.ttf.js @@ -0,0 +1,6 @@ +define( + function (require) { + var data = 'AAEAAAAPAIAAAwBwRFNJRwAAAAEAABOgAAAACEdERUYAAQAAAAATqAAAAAxHUE9TABkADAAAE7QAAAASR1NVQmyRdI8AABPIAAAAIE9TLzJPvUw+AAABeAAAAGBjbWFwwKqhtAAAAhwAAACyZ2FzcP//AAMAABOYAAAACGdseWYEIHnhAAAC9AAADmxoZWFkAHtQjQAAAPwAAAA2aGhlYQRuApoAAAE0AAAAJGhtdHgefQISAAAB2AAAAERsb2NhHTwgTgAAAtAAAAAkbWF4cAAzAlkAAAFYAAAAIG5hbWWHdJyzAAARYAAAAYNwb3N0OFrNCgAAEuQAAAC0AAEAAAABAAAgRuHuXw889QALAgAAAAAAzrTEwwAAAADQSksKAAD/4AJdAeMAAAAIAAIAAAAAAAAAAQAAAeD/3wAuAqoAAP//Al0AAQAAAAAAAAAAAAAAAAAAABEAAQAAABECBgAbAFIABAAAAAAAAAAAAAAAAAAAAAIAAQADAecBkAAFAAgBTAFmAAAARwFMAWYAAAD1ABkAhAAAAgAFAwAAAAAAAAAAAAAQAAAAAAAAAAAAAABQZkVkAEAAAOA4AeD/4AAuAeAAIQAAAAEAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAKoAAAKqAHMCeQAaAgAAAAIAABACLQADAi0ABwItAAgBqwBEAa0APwGPAEMBjgBFAXQARAIHAAoCOQAKAAAAAwAAAAMAAAAcAAEAAAAAAGwAAwABAAAAHAAEAFAAAAAQABAAAwAAAAAAHeAD4BDgFeAh4Dj//wAAAAAAHeAD4A3gFeAh4DL//wAB/+QgAB/3H/Mf6B/YAAEAAAAAAAAAAAAAAAAAAAAAAAYARgAAAAAAHgABAAAAAAAAAAAAAAAAAAAAAQACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAALAB4AL4BKgOcBFoEogWSBgQGdAbsBxYHJAc2AAEAcwANAi8BowAeAAATMzIdARQrARYVMzciJzczMh0BFCsBAyMmAyMiPQE0ddoCAiNJAkkCIgKPAgIktwECtyMCAaMCIgKQApMkAQIiAv6QAQFvAiICAAADABr/9gJdAcoABwAPADIAABIUFjI2NCYiBBQWMjY0JiITNCYnJicmIyIHBgcOAQczBhUUFjMyNzYzMhc3FjMyNjU0Jxs1SzU1SwFZNUo1NUp3AgEIDnGTlXIHBQEDAQEHHRQQDlh3e1kCDA4VHAUBlUs1NUs1NUs1NUs1/nMBAQEOBl1gBQYBAwEMDhQdClBUAggdFAsKAAIAAP/gAgAB4AAHACsAAAAiBhQWMjY0BxYUDwEGIi8BBwYiLwEmND8BJyY0PwE2Mh8BNzYyHwEWFA8BAWrUlpbUlpgFBQkGDwVHRwUPBgkFBUdHBQUJBQ8GR0cFEAUJBQVHAeCW1JaW1LYFEAUJBQVHRgYGCAYPBUdHBRAFCQUFR0cFBQkFEAVHAAAAAgAQ//cCAQHZACIARAAAJS4BJyYnJgcOAQcGBwYXHgEXFhcWNz4BNzY3NjcyMzI2NTQHBgcGBwYnLgEnJicmNz4BNzY3NhceARcWFxYHFBUUFhcGAgEBKCUkLi4yMVoiIRIRAQEmIiIrKy8uVB8gEAoDAQENEzMSHyApKCsrTh0dDw8BASEeHSYlKChIGxoODgEQDQXgM1wjIxISAQEnIyMtLTAwViEgEREBASUhISkZGxMNAlQoHx4PEAEBIh8fJyYqKUscHA8OAQEgHB0kIycBAgwSARsAGwADAJoCKAFJAAsAGQAnADIATgBjAG8AgAECARwBIAEoATYBbgGGAZIBmgGeAawBsgG9AccB0wHhAekB9gIFAAATMhcWFQYjIic0JzYXMhcWFRQHBiMiJzU0NwcyFxYVFA8BIic1NDc2FzIXFRQPASI9ATQHMhcWFxYVFAcGIyInJiMiByMiJyY9ATQ3Njc2BTMyFxYdARQHFRYVFAcGKwEwJzU0NzMwFxUUByMiJzU0NxcGHQEwByMiJzUjIj0BPwE7ATIdATMyHQEzMBcVFAcVFCsBFRYxMzIdARQHIxUWMTMyHQEUByMVMzIdATAHIyInBisBIj0BNzU0JyYxNTc2NSY9ATA3MzAXFRQHFh0BFBczNSMwJzU0NzMyPQEjMCc1NDczMj0BIyInNTQ3MzI9ASMiJzUwNzM1IyInNTQ7ATU0NzMyHQEzMhcVFCsBBjEVFAcjIj0BMDczNTQHFTM1BRUzMjc1JiMzFRQHIyIHFRQXFjsBNTsBMhcVMzIXFTMyFxUwByMVFCsBFRQrASInNTc1IyI9ATQ3MzI9ASMiPQE0NzM1IyI9ATQ3MzU0BTMyFxYdARQHIyY9ATY7ATUmKwEiJzU0NzMwFxUwByMiJzU0BRUWMTMyPQEzFTM1BRUUFzM1IxUUByMiPQEXFTMyNzUFMzAXFRQHIyInNgcVMzY9ASYrASIFMzIXMh0BFAcjIic3MzIVBisBIic1NDsBNgUVFBczNSMiBTIVBisBIj0BNxcyNzsBMhczMhcVFAcjIic0J/4MBgEEDw4FAQRECQgCDgYDEAIRWA0HARAFEAQLAoERBA0HFSsRDRMPBxEIBgUbAwMCIAoSBwEWEwYK/v8uFwgCDA8PCAY1AaYRAQERAQHbAQQBCQEBBgEEBTANAQ8BAwEEBwkBDgEBDwEOAQEPDwEBJgQHBwQBAQQBAwMBBQINAQQEDAULAQEKAQsBAQoBCwEBAgoBCwEBAgsLAQEDClENASMBAQJGAQEJAQEfQQb+Xh8HAgMFyAEKDgYIBwQY8g0BARYBAQIBAQICCBALCAEBBRcBARYBFwEBFxcBARf+ZSYQBwEBMBMDEB0DByABAUoRAQERAQEBDAEDAlMN/voMHAwCBwftCgIB/t0IAQEICAMD1yAJAggeAQHOCAICBgEIBgQ4CQECBwwBAQIHAv5RBxkaBgGMAQUHBwEBAQIEJAoCAwcBAQIKCgIBAUkRBgUaFwICGwQQBQQNDAIVBA4MJBIEBhMFARkBDgoCDBYGEQUBFwEbERUWCwkLEwkCBQEEFgUCAhEQDw0JBxAFAwEMCAEHDg8HAwJYAQECEAEBAhABAQEPA0gBATwBCQMSAgIBDwEJAQEECAMBAggBAQMBAggBAQQCCQEDAwEJBAUFDAMKAhMGAQEJAQEiBQQHAg8HAQQCCAEBAQMCCAEBAQMCBAEBAQMCCQEEAQgDAgEBAgIBCQEBSgEBAlUBAgEPBAQEEAcEBQ4BARIFEAIDPAICAgoCBAEFCBgMAgcDGAEFAQEBAwIEAQEEAgQBAQIBAxICAysBAQQOAxMECAIMAQECQQEBQQEHAwEDAQQECB8HAigeAQEGGgQEAQMDAhUBAQsOCRQCBgUHBAQCBAEBCwEBCwIFAQQJAQUBDAwBDwIIAgEFBAIIAQEKAQQAAAgAB//lAgkB2wAQACEAMAA+AGAAcgCBAI4AABMyFxYXFAcGKwEiJyY1NDc2FzIXFhUUBwYrASInJjU0NzYFMhcWFxQHBiMiJzU0NzYFMzIXFh0BFCMiJyY1NAczMhcWFxYdARQHBisBIicmIyIHBisBIicmNTQ3Njc2NzYHFRQrASIHBh0BFjMWOwE1NCMXFRQXMzUjFRQrASInNSMHMzIdARQrASInNDcyxyIUBAImDAoBLQ8BKgqsFxkOIhIVAicPBDYG/ucpGQIBKgsQMA4UEgGWAi4RBUEtDwWJBjEnNTUaIhkkBSA3Ew8NSw4RAjoUFkU4Dg8sDjACIyMVAwMIGxRMAhslWSYDHw4CIGUfAgIgFwcbAgHbLQoXMBkGQAoFNBcDDB4VEyEhDyYODTMfAmY0DQ80EAVBBx0eFiYtCQ0KRyETFEwyOjcmGR8GKRwQDQMKAR4aIDMqLRYcDwJQLQEqCAsJKBCqAjpSGQdyWQINTxUBRAIgGg0AAgAI/+kB7wHYAB8AMQAAEzMyFxYdARQHFRYVFhUUBwYjIi8BIwYrASInJjU0NzYHFRQXFjsBMjc2NTQnJiMiBwbOEGFEIyRqAx8JBRcpPwIwMhJSRi1qMURKGBQESSYJSRkWTSQJAdhbNjwEPDgCZggJBh0NATA+HEw9RXNCGsoJRiYJSxsURycKSxQAAAAACgBEABkBqwGAABMAIwBdAI4AlgCeAKYArgC2AL8AABMzMhcWHQEUBwYrASInJj0BNDc2BxQXFjMyNzY1NCcmIyIHBjcyFzM2OwEVBxUUFxUGFRQXFRQHBh0BFAciJyIHIyInIwcjNTc1NCc1NjU0JzU0NzY9ATQ3FjsBMjcHIxUzFSMVMzIVByMVMxUUIxUzNj0BMxUUFzM1IyI9ATMyNSM1MzI3NSM1MzUjIicGBzMyFQcjIjU3MzIVByMiNQczFhUHIyI1NzMWFQcjIjUHFRYXMzUiJzMVFBczNSI9AfcBajkQaSQmAWo5EGkkiHAgH3E0CWcmJGQ5D68DEQkeBgIMJRkZHAQFBRgIEgMCFAsbBwskGRkdAwYZAgIJDhcUJyYlAwMmBwcOBgUFKh0EKg4mGgkCJSYSEgsKEhIDAxIEKxAEBBADJBIDAxIEKxAEBBADCwMEEAgEEwgMBQGAaSQmAWo5EGkkJgFqORC2azYLdhwfZDkPZyVAHRQEJwYGBQMXCAQVBgIKBgUWAgMMHhkQAisDBQYEFwgCGQMDCgYFFQMDCRs4CwQkAwILBQsJAQ0LFAIDBwQOCwQFIAQLAgIYAwIEAQMCBAsBAwIEAgEDAgQgAggBBwQJCgMHBAsABwA/ABMBrQGBABEAIgAuADIAPgBKAFYAABMzMhcWFRQHBisBIicmNTQ3NgcUFxY7ATI3NjU0JyYjIgcGNzMyFxUGKwEiJzU0FxUzNQczFh0BFCsBIj0BNBczMh0BFCsBIj0BNBczMh0BFCsBIj0BNPUCaDsTTjA4Alo7IU4we1wsKwJcOh1SLjVgOhl+bA4EBBBpEAQUaE82AgI2AgI2AgI2AgI2AgI2AgGBZCkrWjshTjA6WjshuGI6F1ItNlw6HVkrMBWYFRGeEBOVlRcBAQ8DAw8CKgIPAgIPAioCEAICEAIABABDADIBjwF+AA8AHwA/AFEAABMyFxYVFAcGIyInJjU0NzYHFBcWMzI3NjU0JyYjIgcGNzIXBhUUFxUUBwYdARYXFh0BFCsBJzQ/ATY1JjUmNTYXFRQHFTMVFDsBNTQ7ATU0JzXqWjUWUygsVTYaUyd3RSszWDUWWSQnTzUephgOAwMRBAwrAgKUAgsuAhQCDhkLCwIEAgkLAX5TJi5YNxZNKTFYNxamUTQeUCgsXDURRSscCiUTAgQBChIJAgEJFQkGAQIBEQUYBAMZCiIeBgkJAQEFCQIJAgQCAQkAAAAEAEUANAGOAX0AEQAjAEkAXQAAEzIXFh0BFAcGKwEiJyY1NDc2BxQXFjsBMjc2PQE0JyYjIgcGNzIXFhcWFRQrARUUKwEiPQE0KwEiHQEUKwEiPQE0KwEiJzQ3NjEHFRQHIxUzMhcVMzU0OwE1IyI9AexSNxkuNDwNRTghRituQiwtDUQ1IkEsNVY1FqIFEzwFAQcREhYBCCMHARYSAg8HATofAgMVFQECDAIWFgIBfUsrKA06MzFALzZRNR6lTzQePS4wDEc2H08oNBM2BwICB0MPAjgIBzkCDkMBCQQzGx0XAQINAhUWAQ0CGAAAAAACAET/6gF1AdcADAAaAAATMhcWHQEUByY1NDc2BxQXFjsBMjc0MyYjIgfhWzAJmZhqGj02DgoFOxQCDEo9EQHXZRwZBIHOzIlkLganKBwERQxWSf//AAoAWQH9AUwAhwAD/zQAUSZmAAA5miZmAAD//wALABgCMAHjAioAA9ERIAAUgwAEAG4BThma4AAgABmaAAAAAAAMAJYAAQAAAAAAAQALAAcAAQAAAAAAAgAHAAAAAQAAAAAAAwAYAAcAAQAAAAAABAALAAcAAQAAAAAABQAwAB8AAQAAAAAABgALAAcAAwABBAkAAQAWAF0AAwABBAkAAgAOAE8AAwABBAkAAwAwAF0AAwABBAkABAAWAF0AAwABBAkABQBgAI0AAwABBAkABgAWAF1SZWd1bGFyYmFpZHVIZWFsdGg6VmVyc2lvbiAxLjAwVmVyc2lvbiAxLjAwIFNlcHRlbWJlciAyNSwgMjAxNCwgaW5pdGlhbCByZWxlYXNlAFIAZQBnAHUAbABhAHIAYgBhAGkAZAB1AEgAZQBhAGwAdABoADoAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAIABTAGUAcAB0AGUAbQBiAGUAcgAgADIANQAsACAAMgAwADEANAAsACAAaQBuAGkAdABpAGEAbAAgAHIAZQBsAGUAYQBzAGUAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAEAAgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8HdW5pRTAwMwd1bmlFMDBEB3VuaUUwMEUHdW5pRTAwRgd1bmlFMDEwB3VuaUUwMTUHdW5pRTAyMQd1bmlFMDMyB3VuaUUwMzMHdW5pRTAzNAd1bmlFMDM1B3VuaUUwMzYHdW5pRTAzNwd1bmlFMDM4AAAAAf//AAIAAAABAAAAAAABAAAAAAAAAAAAAAABAAAACgAMAA4AAAAAAAAAAAAAAAEAAAAKABwAHgABbGF0bgAIAAQAAAAA//8AAAAAAAA='; + return new Uint8Array(require('ttf/util/base642bytes')(data)).buffer; + } +); diff --git a/test/data/icomoon.svg.js b/test/data/icomoon.svg.js new file mode 100644 index 0000000..782ed8f --- /dev/null +++ b/test/data/icomoon.svg.js @@ -0,0 +1,5 @@ +define( + function (require) { + return 'Generated by IcoMoon'; + } +); diff --git a/test/data/iconfont-xin.svg.js b/test/data/iconfont-xin.svg.js new file mode 100644 index 0000000..813e075 --- /dev/null +++ b/test/data/iconfont-xin.svg.js @@ -0,0 +1,5 @@ +define( + function (require) { + return ''; + } +); diff --git a/test/spec/main.js b/test/spec/main.js index 67eaef6..97f19e4 100644 --- a/test/spec/main.js +++ b/test/spec/main.js @@ -10,11 +10,23 @@ define( // math require('./math/getBezierQ2T.spec'); - // ttf - require('./ttf/reader-writer.spec'); // graphics require('./graphics/vector.spec'); require('./graphics/isSegmentCross.spec'); + + // ttf + require('./ttf/reader.spec'); + require('./ttf/writer.spec'); + require('./ttf/ttfreader.spec'); + require('./ttf/ttfwriter.spec'); + require('./ttf/otfreader.spec'); + require('./ttf/otf2ttfobject.spec'); + require('./ttf/ttf2woff.spec'); + require('./ttf/woff2ttf.spec'); + require('./ttf/ttf2eot.spec'); + require('./ttf/eot2ttf.spec'); + require('./ttf/svg2ttfobject.spec'); + require('./ttf/ttf2svg.spec'); } ); diff --git a/test/spec/ttf/eot2ttf.spec.js b/test/spec/ttf/eot2ttf.spec.js new file mode 100644 index 0000000..f72d969 --- /dev/null +++ b/test/spec/ttf/eot2ttf.spec.js @@ -0,0 +1,52 @@ +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + var ttf2eot = require('ttf/ttf2eot'); + var eot2ttf = require('ttf/eot2ttf'); + + describe('eot 转 ttf', function () { + + var eotBuffer = ttf2eot(require('data/baiduHealth-hinting.ttf')) + var ttf = new TTFReader({ + hinting: true + }).read(eot2ttf(eotBuffer)); + + it('test read ttf2eot', function () { + + expect(ttf.version).toBe(1); + + expect(ttf.head.magickNumber).toBe(1594834165); + expect(ttf.head.unitsPerEm).toBe(512); + + expect(ttf.post.format).toBe(2); + expect(ttf.post.underlinePosition).toBe(0); + expect(ttf.post.underlineThickness).toBe(0); + + expect(ttf.hhea.advanceWidthMax).toBe(682); + expect(ttf.hhea.ascent).toBe(480); + expect(ttf.hhea.descent).toBe(-32); + + expect(ttf.maxp.version).toBe(1); + expect(ttf.maxp.numGlyphs).toBe(17); + + expect(ttf.glyf[0].advanceWidth).toBe(512); + expect(ttf.glyf[0].leftSideBearing).toBe(0); + expect(ttf.glyf[0].name).toBe('.notdef'); + expect(ttf.glyf[3].contours[0].length).toBe(31); + + expect(ttf.cmap[0]).toBe(1); + expect(ttf.cmap[57400]).toBe(16); + }); + + it('test read hinting', function () { + expect(ttf.cvt.length).toBe(24); + expect(ttf.fpgm.length).toBe(371); + expect(ttf.prep.length).toBe(204); + expect(ttf.gasp.length).toBe(8); + }); + + }); + + } +); diff --git a/test/spec/ttf/otf2ttfobject.spec.js b/test/spec/ttf/otf2ttfobject.spec.js new file mode 100644 index 0000000..8d7cc57 --- /dev/null +++ b/test/spec/ttf/otf2ttfobject.spec.js @@ -0,0 +1,31 @@ + +define( + function (require) { + + var OTFReader = require('ttf/otfreader'); + var otf2ttfobject = require('ttf/otf2ttfobject'); + + describe('otf 转ttf object', function () { + + var fontObject = new OTFReader().read(require('data/BalladeContour.otf')); + var numGlyphs = fontObject.maxp.numGlyphs; + var glyfContours = fontObject.glyf[3].contours.length; + var glyfAdvanceWidth = fontObject.glyf[3].advanceWidth; + var glyfLeftSideBearing = fontObject.glyf[3].leftSideBearing; + + + var ttfObject = otf2ttfobject(fontObject); + + it('test otf2ttfobject', function () { + expect(ttfObject.version).toBe(1); + expect(!!ttfObject.CFF).toBe(false); + expect(!!ttfObject.VORG).toBe(false); + expect(ttfObject.glyf.length).toBe(numGlyphs); + expect(ttfObject.glyf[3].contours.length).toBe(glyfContours); + expect(ttfObject.glyf[3].advanceWidth).toBe(glyfAdvanceWidth); + expect(ttfObject.glyf[3].leftSideBearing).toBe(glyfLeftSideBearing); + }); + }); + + } +); diff --git a/test/spec/ttf/otfreader.spec.js b/test/spec/ttf/otfreader.spec.js new file mode 100644 index 0000000..fd9304c --- /dev/null +++ b/test/spec/ttf/otfreader.spec.js @@ -0,0 +1,81 @@ + +define( + function (require) { + + var OTFReader = require('ttf/otfreader'); + + describe('读otf数据', function () { + + var fontObject = new OTFReader().read(require('data/BalladeContour.otf')); + + it('test read otf', function () { + expect(fontObject.version).toBe('OTTO'); + expect(fontObject.numTables).toBe(9); + expect(fontObject.rengeShift).toBe(16); + expect(fontObject.searchRenge).toBe(128); + }); + + it('test read otf head', function () { + expect(fontObject.head.magickNumber).toBe(1594834165); + expect(fontObject.head.unitsPerEm).toBe(1000); + expect(fontObject.head.checkSumAdjustment).toBe(2157456233); + }); + + it('test read otf name', function () { + expect(fontObject.name.fontFamily).toBe('Ballade Contour'); + expect(fontObject.name.fontSubFamily).toBe('Regular'); + expect(fontObject.name.fullName).toBe('BalladeContour'); + }); + + + it('test read otf post', function () { + expect(fontObject.post.format).toBe(3); + expect(fontObject.post.underlinePosition).toBe(-75); + expect(fontObject.post.underlineThickness).toBe(50); + }); + + it('test read otf hhea', function () { + expect(fontObject.hhea.advanceWidthMax).toBe(1081); + expect(fontObject.hhea.ascent).toBe(758); + expect(fontObject.hhea.descent).toBe(-146); + }); + + it('test read otf maxp', function () { + expect(fontObject.maxp.version).toBe(0.3125); + expect(fontObject.maxp.numGlyphs).toBe(47); + }); + + it('test read otf glyf', function () { + expect(fontObject.glyf[0].advanceWidth).toBe(500); + expect(fontObject.glyf[3].contours[0].length).toBe(96); + }); + + it('test read otf CFF', function () { + expect(!!fontObject.CFF).toBe(true); + expect(fontObject.CFF.defaultWidthX).toBe(500); + expect(fontObject.CFF.nominalWidthX).toBe(708); + expect(fontObject.CFF.topDict.uniqueId).toBe(308228); + expect(fontObject.CFF.topDict.familyName).toBe('Ballade Contour'); + expect(fontObject.CFF.topDict.weight).toBe('Normal'); + expect(fontObject.CFF.topDict.underlineThickness).toBe(50); + expect(fontObject.CFF.topDict.underlinePosition).toBe(-100); + }); + }); + + + describe('读错误otf数据', function () { + + it('test read version error', function () { + expect(function () { + new OTFReader().read(new Uint8Array([0, 1, 0, 0, 25, 4, 11]).buffer); + }).toThrow(); + }); + + it('test read range error', function () { + expect(function () { + new OTFReader().read(new Uint8Array([0, 1, 0, 0, 0, 10, 11, 45, 8]).buffer); + }).toThrow(); + }); + }); + } +); diff --git a/test/spec/ttf/reader.spec.js b/test/spec/ttf/reader.spec.js new file mode 100644 index 0000000..e3eaeea --- /dev/null +++ b/test/spec/ttf/reader.spec.js @@ -0,0 +1,50 @@ + +define( + function (require) { + + var Writer = require('ttf/writer'); + var Reader = require('ttf/reader'); + + describe('读数据', function () { + var buffer = new ArrayBuffer(100); + var writer = new Writer(buffer, 0, 100); + var now = Math.round(new Date().getTime() / 1000) * 1000; + + // 基本类型 + writer.writeInt8(10); + writer.writeInt16(2442); + writer.writeInt32(-10); + writer.writeUint8(10); + writer.writeUint16(2442); + writer.writeUint32(5375673); + // 扩展类型 + writer.writeString('baidu'); + writer.writeFixed(12.36); + writer.writeLongDateTime(now); + writer.writeBytes([3, 4, 5]); + + + + it('test read basic datatype', function () { + var reader = new Reader(buffer, 0, 100); + expect(reader.readInt8()).toBe(10); + expect(reader.readInt16()).toBe(2442); + expect(reader.readInt32()).toBe(-10); + expect(reader.readUint8()).toBe(10); + expect(reader.readUint16()).toBe(2442); + expect(reader.readUint32()).toBe(5375673); + }); + + it('test read extend datatype', function () { + var reader = new Reader(buffer, 0, 100); + reader.seek(14); + expect(reader.readString(5)).toEqual('baidu'); + expect(reader.readFixed()).toBeCloseTo(12.36, 2); + expect(reader.readLongDateTime().getTime()).toEqual(now); + expect(reader.readBytes(3)).toEqual([3, 4, 5]); + }); + + }); + + } +); diff --git a/test/spec/ttf/svg2ttfobject.spec.js b/test/spec/ttf/svg2ttfobject.spec.js new file mode 100644 index 0000000..28a024a --- /dev/null +++ b/test/spec/ttf/svg2ttfobject.spec.js @@ -0,0 +1,50 @@ + +define( + function (require) { + + var svg2ttfobject = require('ttf/svg2ttfobject'); + + describe('svg转ttf对象', function () { + + var ttfObject = svg2ttfobject(require('data/iconfont-xin.svg')); + + it('test svg glyf', function () { + expect(ttfObject.from).toBe('svg'); + expect(ttfObject.glyf.length).toBe(1); + expect(ttfObject.glyf[0].contours.length).toBe(7); + }); + + var fontObject = svg2ttfobject(require('data/icomoon.svg')); + + it('test svg font', function () { + expect(fontObject.from).toBe('svgfont'); + expect(fontObject.id).toBe('icomoon'); + expect(fontObject.name.fontFamily).toBe('icomoon'); + expect(fontObject.metadata).toBe('Generated by IcoMoon'); + }); + + it('test svg font glyf', function () { + expect(fontObject.glyf.length).toBe(3); + expect(fontObject.glyf[2].leftSideBearing).toBe(0); + expect(fontObject.glyf[2].advanceWidth).toBe(1024); + expect(fontObject.glyf[2].contours.length).toBe(7); + expect(fontObject.glyf[2].unicode[0]).toBe(57345); + }); + + }); + + describe('读错误svg数据', function () { + + it('test read svg error', function () { + expect(function () { + svg2ttfobject(''); + }).toThrow(); + + expect(function () { + svg2ttfobject(''); + }).toThrow(); + + }); + }); + } +); diff --git a/test/spec/ttf/ttf2eot.spec.js b/test/spec/ttf/ttf2eot.spec.js new file mode 100644 index 0000000..9564677 --- /dev/null +++ b/test/spec/ttf/ttf2eot.spec.js @@ -0,0 +1,50 @@ + +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + var ttf2eot = require('ttf/ttf2eot'); + var eot2ttf = require('ttf/eot2ttf'); + + describe('ttf 转 eot', function () { + + var eotBuffer = ttf2eot(require('data/baiduHealth.ttf')) + + it('test woff format', function () { + expect(eotBuffer.byteLength).toBeGreaterThan(1000); + expect(eotBuffer.byteLength).toBeLessThan(10000); + }); + + it('test read ttf2eot', function () { + var ttf = new TTFReader().read(eot2ttf(eotBuffer)); + + expect(ttf.version).toBe(1); + + expect(ttf.head.magickNumber).toBe(1594834165); + expect(ttf.head.unitsPerEm).toBe(512); + + expect(ttf.post.format).toBe(2); + expect(ttf.post.underlinePosition).toBe(0); + expect(ttf.post.underlineThickness).toBe(0); + + expect(ttf.hhea.advanceWidthMax).toBe(682); + expect(ttf.hhea.ascent).toBe(480); + expect(ttf.hhea.descent).toBe(-33); + + expect(ttf.maxp.version).toBe(1); + expect(ttf.maxp.numGlyphs).toBe(17); + + expect(ttf.glyf[0].advanceWidth).toBe(512); + expect(ttf.glyf[0].leftSideBearing).toBe(0); + expect(ttf.glyf[0].name).toBe('.notdef'); + expect(ttf.glyf[3].contours[0].length).toBe(31); + expect(ttf.glyf[16].compound).toBe(true); + expect(ttf.glyf[16].glyfs.length).toBe(2); + + expect(ttf.cmap[0]).toBe(1); + expect(ttf.cmap[57400]).toBe(16); + }); + }); + + } +); diff --git a/test/spec/ttf/ttf2svg.spec.js b/test/spec/ttf/ttf2svg.spec.js new file mode 100644 index 0000000..23f9b4c --- /dev/null +++ b/test/spec/ttf/ttf2svg.spec.js @@ -0,0 +1,37 @@ + +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + var ttf2svg = require('ttf/ttf2svg'); + var svg2ttfobject = require('ttf/svg2ttfobject'); + + describe('ttf 转 eot', function () { + + var fontObject = new TTFReader().read(require('data/baiduHealth.ttf')); + var svg = ttf2svg(fontObject); + var ttf = svg2ttfobject(svg); + + it('test genrate svg font', function () { + expect(svg.length).toBeGreaterThan(1000); + }); + + it('test read svg font', function () { + expect(ttf.from).toBe('svgfont'); + expect(ttf.name.fontFamily).toBe('baiduHealth'); + + expect(ttf.head.unitsPerEM).toBe(fontObject.head.unitsPerEM); + expect(ttf.head.xMax).toBe(fontObject.head.xMax); + expect(ttf.head.yMax).toBe(fontObject.head.yMax); + + expect(ttf.hhea.ascent).toBe(fontObject.hhea.ascent); + expect(ttf.hhea.descent).toBe(fontObject.hhea.descent); + + expect(ttf.glyf.length).toBe(14); + expect(ttf.glyf[3].contours.length).toBe(3); + expect(ttf.glyf[3].unicode[0]).toBe(57357); + }); + }); + + } +); diff --git a/test/spec/ttf/ttf2woff.spec.js b/test/spec/ttf/ttf2woff.spec.js new file mode 100644 index 0000000..83fea08 --- /dev/null +++ b/test/spec/ttf/ttf2woff.spec.js @@ -0,0 +1,50 @@ + +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + var ttf2woff = require('ttf/ttf2woff'); + var woff2ttf = require('ttf/woff2ttf'); + + describe('ttf 转 woff', function () { + + var woffBuffer = ttf2woff(require('data/baiduHealth.ttf')) + + it('test woff format', function () { + expect(woffBuffer.byteLength).toBeGreaterThan(1000); + expect(woffBuffer.byteLength).toBeLessThan(10000); + }); + + it('test read ttf2woff', function () { + var ttf = new TTFReader().read(woff2ttf(woffBuffer)); + + expect(ttf.version).toBe(1); + + expect(ttf.head.magickNumber).toBe(1594834165); + expect(ttf.head.unitsPerEm).toBe(512); + + expect(ttf.post.format).toBe(2); + expect(ttf.post.underlinePosition).toBe(0); + expect(ttf.post.underlineThickness).toBe(0); + + expect(ttf.hhea.advanceWidthMax).toBe(682); + expect(ttf.hhea.ascent).toBe(480); + expect(ttf.hhea.descent).toBe(-33); + + expect(ttf.maxp.version).toBe(1); + expect(ttf.maxp.numGlyphs).toBe(17); + + expect(ttf.glyf[0].advanceWidth).toBe(512); + expect(ttf.glyf[0].leftSideBearing).toBe(0); + expect(ttf.glyf[0].name).toBe('.notdef'); + expect(ttf.glyf[3].contours[0].length).toBe(31); + expect(ttf.glyf[16].compound).toBe(true); + expect(ttf.glyf[16].glyfs.length).toBe(2); + + expect(ttf.cmap[0]).toBe(1); + expect(ttf.cmap[57400]).toBe(16); + }); + }); + + } +); diff --git a/test/spec/ttf/ttfreader.spec.js b/test/spec/ttf/ttfreader.spec.js new file mode 100644 index 0000000..c6966d5 --- /dev/null +++ b/test/spec/ttf/ttfreader.spec.js @@ -0,0 +1,105 @@ + +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + + describe('读ttf数据', function () { + + var fontObject = new TTFReader().read(require('data/baiduHealth.ttf')); + + it('test read ttf', function () { + expect(fontObject.version).toBe(1); + expect(fontObject.numTables).toBe(15); + expect(fontObject.rengeShift).toBe(112); + expect(fontObject.searchRenge).toBe(128); + }); + + it('test read ttf head', function () { + expect(fontObject.head.magickNumber).toBe(1594834165); + expect(fontObject.head.unitsPerEm).toBe(512); + expect(fontObject.head.checkSumAdjustment).toBe(541516270); + }); + + it('test read ttf name', function () { + expect(fontObject.name.fontFamily).toBe('baiduHealth'); + expect(fontObject.name.fontSubFamily).toBe('Regular'); + expect(fontObject.name.fullName).toBe('baiduHealth'); + }); + + + it('test read ttf post', function () { + expect(fontObject.post.format).toBe(2); + expect(fontObject.post.underlinePosition).toBe(0); + expect(fontObject.post.underlineThickness).toBe(0); + }); + + it('test read ttf hhea', function () { + expect(fontObject.hhea.advanceWidthMax).toBe(682); + expect(fontObject.hhea.ascent).toBe(480); + expect(fontObject.hhea.descent).toBe(-33); + }); + + it('test read ttf maxp', function () { + expect(fontObject.maxp.version).toBe(1); + expect(fontObject.maxp.numGlyphs).toBe(17); + }); + + it('test read ttf glyf', function () { + expect(fontObject.glyf[0].advanceWidth).toBe(512); + expect(fontObject.glyf[0].leftSideBearing).toBe(0); + expect(fontObject.glyf[0].name).toBe('.notdef'); + expect(fontObject.glyf[3].contours[0].length).toBe(31); + expect(fontObject.glyf[16].compound).toBe(true); + expect(fontObject.glyf[16].glyfs.length).toBe(2); + }); + + it('test read ttf cmap', function () { + expect(fontObject.cmap[0]).toBe(1); + expect(fontObject.cmap[57400]).toBe(16); + }); + }); + + describe('转换compound到simple', function () { + + var fontObject = new TTFReader({ + compound2simple: true + }).read(require('data/baiduHealth.ttf')); + + it('test read ttf glyf', function () { + expect(!!fontObject.glyf[16].compound).toBe(false); + expect(!!fontObject.glyf[16].glyfs).toBe(false); + expect(fontObject.glyf[16].contours.length).toBe(4); + }); + }); + + describe('读ttf hinting数据', function () { + var fontObject = new TTFReader({ + hinting: true + }).read(require('data/baiduHealth-hinting.ttf')); + + it('test read hinting', function () { + expect(fontObject.cvt.length).toBe(24); + expect(fontObject.fpgm.length).toBe(371); + expect(fontObject.prep.length).toBe(204); + expect(fontObject.gasp.length).toBe(8); + }); + + }); + + describe('读错误ttf数据', function () { + + it('test read version error', function () { + expect(function () { + new TTFReader().read(new Uint8Array([0, 1, 0, 0, 25, 4, 11]).buffer); + }).toThrow(); + }); + + it('test read range error', function () { + expect(function () { + new TTFReader().read(new Uint8Array([0, 1, 0, 0, 0, 10, 11, 45, 8]).buffer); + }).toThrow(); + }); + }); + } +); diff --git a/test/spec/ttf/ttfwriter.spec.js b/test/spec/ttf/ttfwriter.spec.js new file mode 100644 index 0000000..261aff6 --- /dev/null +++ b/test/spec/ttf/ttfwriter.spec.js @@ -0,0 +1,93 @@ + +define( + function (require) { + + var lang = require('common/lang'); + var TTFReader = require('ttf/ttfreader'); + var TTFWriter = require('ttf/ttfwriter'); + + + describe('写ttf数据', function () { + + var fontObject = new TTFReader().read(require('data/baiduHealth.ttf')); + + it('test write ttf', function () { + var buffer = new TTFWriter().write(fontObject); + expect(buffer.byteLength).toBeGreaterThan(1000); + expect(buffer.byteLength).toBeLessThan(10000); + + var ttf = new TTFReader().read(buffer); + + expect(ttf.version).toBe(1); + + expect(ttf.head.magickNumber).toBe(1594834165); + expect(ttf.head.unitsPerEm).toBe(512); + + expect(ttf.post.format).toBe(2); + expect(ttf.post.underlinePosition).toBe(0); + expect(ttf.post.underlineThickness).toBe(0); + + expect(ttf.hhea.advanceWidthMax).toBe(682); + expect(ttf.hhea.ascent).toBe(480); + expect(ttf.hhea.descent).toBe(-33); + + expect(ttf.maxp.version).toBe(1); + expect(ttf.maxp.numGlyphs).toBe(17); + + expect(ttf.glyf[0].advanceWidth).toBe(512); + expect(ttf.glyf[0].leftSideBearing).toBe(0); + expect(ttf.glyf[0].name).toBe('.notdef'); + expect(ttf.glyf[3].contours[0].length).toBe(31); + expect(ttf.glyf[16].compound).toBe(true); + expect(ttf.glyf[16].glyfs.length).toBe(2); + + expect(ttf.cmap[0]).toBe(1); + expect(ttf.cmap[57400]).toBe(16); + + }); + + it('test write ttf error', function () { + expect(function () { + var ttf = lang.extend({}, fontObject); + ttf.head = null; + new TTFWriter().write(ttf); + }).toThrow(); + + expect(function () { + var ttf = lang.extend({}, fontObject); + ttf.glyf.length = 0; + new TTFWriter().write(ttf); + }).toThrow(); + + expect(function () { + var ttf = lang.extend({}, fontObject); + ttf.name = null; + new TTFWriter().write(ttf); + }).toThrow(); + + }); + }); + + + describe('写ttf hinting数据', function () { + + var fontObject = new TTFReader({ + hinting: true + }).read(require('data/baiduHealth-hinting.ttf')); + + it('test write ttf hinting', function () { + var buffer = new TTFWriter({ + hinting: true + }).write(fontObject); + expect(buffer.byteLength).toBeGreaterThan(1000); + expect(buffer.byteLength).toBeLessThan(10000); + + var ttf = new TTFReader().read(buffer); + expect(fontObject.cvt.length).toBe(24); + expect(fontObject.fpgm.length).toBe(371); + expect(fontObject.prep.length).toBe(204); + expect(fontObject.gasp.length).toBe(8); + }); + }); + } +); diff --git a/test/spec/ttf/woff2ttf.spec.js b/test/spec/ttf/woff2ttf.spec.js new file mode 100644 index 0000000..943b943 --- /dev/null +++ b/test/spec/ttf/woff2ttf.spec.js @@ -0,0 +1,53 @@ + +define( + function (require) { + + var TTFReader = require('ttf/ttfreader'); + var ttf2woff = require('ttf/ttf2woff'); + var woff2ttf = require('ttf/woff2ttf'); + + describe('woff 转 ttf', function () { + + var woffBuffer = ttf2woff(require('data/baiduHealth-hinting.ttf')) + var ttf = new TTFReader({ + hinting: true + }).read(woff2ttf(woffBuffer)); + + it('test read ttf2woff', function () { + + expect(ttf.version).toBe(1); + + expect(ttf.head.magickNumber).toBe(1594834165); + expect(ttf.head.unitsPerEm).toBe(512); + + expect(ttf.post.format).toBe(2); + expect(ttf.post.underlinePosition).toBe(0); + expect(ttf.post.underlineThickness).toBe(0); + + expect(ttf.hhea.advanceWidthMax).toBe(682); + expect(ttf.hhea.ascent).toBe(480); + expect(ttf.hhea.descent).toBe(-32); + + expect(ttf.maxp.version).toBe(1); + expect(ttf.maxp.numGlyphs).toBe(17); + + expect(ttf.glyf[0].advanceWidth).toBe(512); + expect(ttf.glyf[0].leftSideBearing).toBe(0); + expect(ttf.glyf[0].name).toBe('.notdef'); + expect(ttf.glyf[3].contours[0].length).toBe(31); + + expect(ttf.cmap[0]).toBe(1); + expect(ttf.cmap[57400]).toBe(16); + }); + + it('test read hinting', function () { + expect(ttf.cvt.length).toBe(24); + expect(ttf.fpgm.length).toBe(371); + expect(ttf.prep.length).toBe(204); + expect(ttf.gasp.length).toBe(8); + }); + + }); + + } +); diff --git a/test/spec/ttf/reader-writer.spec.js b/test/spec/ttf/writer.spec.js similarity index 67% rename from test/spec/ttf/reader-writer.spec.js rename to test/spec/ttf/writer.spec.js index 07dddcd..59c4d82 100644 --- a/test/spec/ttf/reader-writer.spec.js +++ b/test/spec/ttf/writer.spec.js @@ -93,46 +93,5 @@ define( }); }); - describe('读数据', function () { - var buffer = new ArrayBuffer(100); - var writer = new Writer(buffer, 0, 100); - var now = Math.round(new Date().getTime() / 1000) * 1000; - - // 基本类型 - writer.writeInt8(10); - writer.writeInt16(2442); - writer.writeInt32(-10); - writer.writeUint8(10); - writer.writeUint16(2442); - writer.writeUint32(5375673); - // 扩展类型 - writer.writeString('baidu'); - writer.writeFixed(12.36); - writer.writeLongDateTime(now); - writer.writeBytes([3, 4, 5]); - - - - it('test read basic datatype', function () { - var reader = new Reader(buffer, 0, 100); - expect(reader.readInt8()).toBe(10); - expect(reader.readInt16()).toBe(2442); - expect(reader.readInt32()).toBe(-10); - expect(reader.readUint8()).toBe(10); - expect(reader.readUint16()).toBe(2442); - expect(reader.readUint32()).toBe(5375673); - }); - - it('test read extend datatype', function () { - var reader = new Reader(buffer, 0, 100); - reader.seek(14); - expect(reader.readString(5)).toEqual('baidu'); - expect(reader.readFixed()).toBeCloseTo(12.36, 2); - expect(reader.readLongDateTime().getTime()).toEqual(now); - expect(reader.readBytes(3)).toEqual([3, 4, 5]); - }); - - }); - } );