2
0

font_loader.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2018 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.FontLoader = exports.FontFaceObject = void 0;
  27. var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
  28. var _util = require("../shared/util");
  29. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  30. function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
  31. function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
  32. function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
  33. function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
  34. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
  35. function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
  36. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
  37. function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
  38. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  39. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  40. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  41. var BaseFontLoader =
  42. /*#__PURE__*/
  43. function () {
  44. function BaseFontLoader(_ref) {
  45. var docId = _ref.docId,
  46. onUnsupportedFeature = _ref.onUnsupportedFeature;
  47. _classCallCheck(this, BaseFontLoader);
  48. if (this.constructor === BaseFontLoader) {
  49. (0, _util.unreachable)('Cannot initialize BaseFontLoader.');
  50. }
  51. this.docId = docId;
  52. this._onUnsupportedFeature = onUnsupportedFeature;
  53. this.nativeFontFaces = [];
  54. this.styleElement = null;
  55. }
  56. _createClass(BaseFontLoader, [{
  57. key: "addNativeFontFace",
  58. value: function addNativeFontFace(nativeFontFace) {
  59. this.nativeFontFaces.push(nativeFontFace);
  60. document.fonts.add(nativeFontFace);
  61. }
  62. }, {
  63. key: "insertRule",
  64. value: function insertRule(rule) {
  65. var styleElement = this.styleElement;
  66. if (!styleElement) {
  67. styleElement = this.styleElement = document.createElement('style');
  68. styleElement.id = "PDFJS_FONT_STYLE_TAG_".concat(this.docId);
  69. document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement);
  70. }
  71. var styleSheet = styleElement.sheet;
  72. styleSheet.insertRule(rule, styleSheet.cssRules.length);
  73. }
  74. }, {
  75. key: "clear",
  76. value: function clear() {
  77. this.nativeFontFaces.forEach(function (nativeFontFace) {
  78. document.fonts.delete(nativeFontFace);
  79. });
  80. this.nativeFontFaces.length = 0;
  81. if (this.styleElement) {
  82. this.styleElement.remove();
  83. this.styleElement = null;
  84. }
  85. }
  86. }, {
  87. key: "bind",
  88. value: function () {
  89. var _bind = _asyncToGenerator(
  90. /*#__PURE__*/
  91. _regenerator.default.mark(function _callee(font) {
  92. var _this = this;
  93. var nativeFontFace, rule;
  94. return _regenerator.default.wrap(function _callee$(_context) {
  95. while (1) {
  96. switch (_context.prev = _context.next) {
  97. case 0:
  98. if (!(font.attached || font.missingFile)) {
  99. _context.next = 2;
  100. break;
  101. }
  102. return _context.abrupt("return");
  103. case 2:
  104. font.attached = true;
  105. if (!this.isFontLoadingAPISupported) {
  106. _context.next = 19;
  107. break;
  108. }
  109. nativeFontFace = font.createNativeFontFace();
  110. if (!nativeFontFace) {
  111. _context.next = 18;
  112. break;
  113. }
  114. this.addNativeFontFace(nativeFontFace);
  115. _context.prev = 7;
  116. _context.next = 10;
  117. return nativeFontFace.loaded;
  118. case 10:
  119. _context.next = 18;
  120. break;
  121. case 12:
  122. _context.prev = 12;
  123. _context.t0 = _context["catch"](7);
  124. this._onUnsupportedFeature({
  125. featureId: _util.UNSUPPORTED_FEATURES.font
  126. });
  127. (0, _util.warn)("Failed to load font '".concat(nativeFontFace.family, "': '").concat(_context.t0, "'."));
  128. font.disableFontFace = true;
  129. throw _context.t0;
  130. case 18:
  131. return _context.abrupt("return");
  132. case 19:
  133. rule = font.createFontFaceRule();
  134. if (!rule) {
  135. _context.next = 25;
  136. break;
  137. }
  138. this.insertRule(rule);
  139. if (!this.isSyncFontLoadingSupported) {
  140. _context.next = 24;
  141. break;
  142. }
  143. return _context.abrupt("return");
  144. case 24:
  145. return _context.abrupt("return", new Promise(function (resolve) {
  146. var request = _this._queueLoadingCallback(resolve);
  147. _this._prepareFontLoadEvent([rule], [font], request);
  148. }));
  149. case 25:
  150. case "end":
  151. return _context.stop();
  152. }
  153. }
  154. }, _callee, this, [[7, 12]]);
  155. }));
  156. function bind(_x) {
  157. return _bind.apply(this, arguments);
  158. }
  159. return bind;
  160. }()
  161. }, {
  162. key: "_queueLoadingCallback",
  163. value: function _queueLoadingCallback(callback) {
  164. (0, _util.unreachable)('Abstract method `_queueLoadingCallback`.');
  165. }
  166. }, {
  167. key: "_prepareFontLoadEvent",
  168. value: function _prepareFontLoadEvent(rules, fontsToLoad, request) {
  169. (0, _util.unreachable)('Abstract method `_prepareFontLoadEvent`.');
  170. }
  171. }, {
  172. key: "isFontLoadingAPISupported",
  173. get: function get() {
  174. (0, _util.unreachable)('Abstract method `isFontLoadingAPISupported`.');
  175. }
  176. }, {
  177. key: "isSyncFontLoadingSupported",
  178. get: function get() {
  179. (0, _util.unreachable)('Abstract method `isSyncFontLoadingSupported`.');
  180. }
  181. }, {
  182. key: "_loadTestFont",
  183. get: function get() {
  184. (0, _util.unreachable)('Abstract method `_loadTestFont`.');
  185. }
  186. }]);
  187. return BaseFontLoader;
  188. }();
  189. var FontLoader;
  190. exports.FontLoader = FontLoader;
  191. {
  192. exports.FontLoader = FontLoader =
  193. /*#__PURE__*/
  194. function (_BaseFontLoader) {
  195. _inherits(GenericFontLoader, _BaseFontLoader);
  196. function GenericFontLoader(docId) {
  197. var _this2;
  198. _classCallCheck(this, GenericFontLoader);
  199. _this2 = _possibleConstructorReturn(this, _getPrototypeOf(GenericFontLoader).call(this, docId));
  200. _this2.loadingContext = {
  201. requests: [],
  202. nextRequestId: 0
  203. };
  204. _this2.loadTestFontId = 0;
  205. return _this2;
  206. }
  207. _createClass(GenericFontLoader, [{
  208. key: "_queueLoadingCallback",
  209. value: function _queueLoadingCallback(callback) {
  210. function completeRequest() {
  211. (0, _util.assert)(!request.done, 'completeRequest() cannot be called twice.');
  212. request.done = true;
  213. while (context.requests.length > 0 && context.requests[0].done) {
  214. var otherRequest = context.requests.shift();
  215. setTimeout(otherRequest.callback, 0);
  216. }
  217. }
  218. var context = this.loadingContext;
  219. var request = {
  220. id: "pdfjs-font-loading-".concat(context.nextRequestId++),
  221. done: false,
  222. complete: completeRequest,
  223. callback: callback
  224. };
  225. context.requests.push(request);
  226. return request;
  227. }
  228. }, {
  229. key: "_prepareFontLoadEvent",
  230. value: function _prepareFontLoadEvent(rules, fonts, request) {
  231. function int32(data, offset) {
  232. return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;
  233. }
  234. function spliceString(s, offset, remove, insert) {
  235. var chunk1 = s.substring(0, offset);
  236. var chunk2 = s.substring(offset + remove);
  237. return chunk1 + insert + chunk2;
  238. }
  239. var i, ii;
  240. var canvas = document.createElement('canvas');
  241. canvas.width = 1;
  242. canvas.height = 1;
  243. var ctx = canvas.getContext('2d');
  244. var called = 0;
  245. function isFontReady(name, callback) {
  246. called++;
  247. if (called > 30) {
  248. (0, _util.warn)('Load test font never loaded.');
  249. callback();
  250. return;
  251. }
  252. ctx.font = '30px ' + name;
  253. ctx.fillText('.', 0, 20);
  254. var imageData = ctx.getImageData(0, 0, 1, 1);
  255. if (imageData.data[3] > 0) {
  256. callback();
  257. return;
  258. }
  259. setTimeout(isFontReady.bind(null, name, callback));
  260. }
  261. var loadTestFontId = "lt".concat(Date.now()).concat(this.loadTestFontId++);
  262. var data = this._loadTestFont;
  263. var COMMENT_OFFSET = 976;
  264. data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);
  265. var CFF_CHECKSUM_OFFSET = 16;
  266. var XXXX_VALUE = 0x58585858;
  267. var checksum = int32(data, CFF_CHECKSUM_OFFSET);
  268. for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
  269. checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;
  270. }
  271. if (i < loadTestFontId.length) {
  272. checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0;
  273. }
  274. data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));
  275. var url = "url(data:font/opentype;base64,".concat(btoa(data), ");");
  276. var rule = "@font-face {font-family:\"".concat(loadTestFontId, "\";src:").concat(url, "}");
  277. this.insertRule(rule);
  278. var names = [];
  279. for (i = 0, ii = fonts.length; i < ii; i++) {
  280. names.push(fonts[i].loadedName);
  281. }
  282. names.push(loadTestFontId);
  283. var div = document.createElement('div');
  284. div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;');
  285. for (i = 0, ii = names.length; i < ii; ++i) {
  286. var span = document.createElement('span');
  287. span.textContent = 'Hi';
  288. span.style.fontFamily = names[i];
  289. div.appendChild(span);
  290. }
  291. document.body.appendChild(div);
  292. isFontReady(loadTestFontId, function () {
  293. document.body.removeChild(div);
  294. request.complete();
  295. });
  296. }
  297. }, {
  298. key: "isFontLoadingAPISupported",
  299. get: function get() {
  300. var supported = typeof document !== 'undefined' && !!document.fonts;
  301. if (supported && typeof navigator !== 'undefined') {
  302. var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);
  303. if (m && m[1] < 63) {
  304. supported = false;
  305. }
  306. }
  307. return (0, _util.shadow)(this, 'isFontLoadingAPISupported', supported);
  308. }
  309. }, {
  310. key: "isSyncFontLoadingSupported",
  311. get: function get() {
  312. var supported = false;
  313. if (typeof navigator === 'undefined') {
  314. supported = true;
  315. } else {
  316. var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);
  317. if (m && m[1] >= 14) {
  318. supported = true;
  319. }
  320. }
  321. return (0, _util.shadow)(this, 'isSyncFontLoadingSupported', supported);
  322. }
  323. }, {
  324. key: "_loadTestFont",
  325. get: function get() {
  326. var getLoadTestFont = function getLoadTestFont() {
  327. return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA' + 'FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA' + 'ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA' + 'AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1' + 'AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD' + '6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM' + 'AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D' + 'IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA' + 'AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA' + 'AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB' + 'AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY' + 'AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA' + 'AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA' + 'AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC' + 'AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3' + 'Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj' + 'FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==');
  328. };
  329. return (0, _util.shadow)(this, '_loadTestFont', getLoadTestFont());
  330. }
  331. }]);
  332. return GenericFontLoader;
  333. }(BaseFontLoader);
  334. }
  335. var IsEvalSupportedCached = {
  336. get value() {
  337. return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
  338. }
  339. };
  340. var FontFaceObject =
  341. /*#__PURE__*/
  342. function () {
  343. function FontFaceObject(translatedData, _ref2) {
  344. var _ref2$isEvalSupported = _ref2.isEvalSupported,
  345. isEvalSupported = _ref2$isEvalSupported === void 0 ? true : _ref2$isEvalSupported,
  346. _ref2$disableFontFace = _ref2.disableFontFace,
  347. disableFontFace = _ref2$disableFontFace === void 0 ? false : _ref2$disableFontFace,
  348. _ref2$ignoreErrors = _ref2.ignoreErrors,
  349. ignoreErrors = _ref2$ignoreErrors === void 0 ? false : _ref2$ignoreErrors,
  350. _ref2$onUnsupportedFe = _ref2.onUnsupportedFeature,
  351. onUnsupportedFeature = _ref2$onUnsupportedFe === void 0 ? null : _ref2$onUnsupportedFe,
  352. _ref2$fontRegistry = _ref2.fontRegistry,
  353. fontRegistry = _ref2$fontRegistry === void 0 ? null : _ref2$fontRegistry;
  354. _classCallCheck(this, FontFaceObject);
  355. this.compiledGlyphs = Object.create(null);
  356. for (var i in translatedData) {
  357. this[i] = translatedData[i];
  358. }
  359. this.isEvalSupported = isEvalSupported !== false;
  360. this.disableFontFace = disableFontFace === true;
  361. this.ignoreErrors = ignoreErrors === true;
  362. this._onUnsupportedFeature = onUnsupportedFeature;
  363. this.fontRegistry = fontRegistry;
  364. }
  365. _createClass(FontFaceObject, [{
  366. key: "createNativeFontFace",
  367. value: function createNativeFontFace() {
  368. if (!this.data || this.disableFontFace) {
  369. return null;
  370. }
  371. var nativeFontFace = new FontFace(this.loadedName, this.data, {});
  372. if (this.fontRegistry) {
  373. this.fontRegistry.registerFont(this);
  374. }
  375. return nativeFontFace;
  376. }
  377. }, {
  378. key: "createFontFaceRule",
  379. value: function createFontFaceRule() {
  380. if (!this.data || this.disableFontFace) {
  381. return null;
  382. }
  383. var data = (0, _util.bytesToString)(new Uint8Array(this.data));
  384. var url = "url(data:".concat(this.mimetype, ";base64,").concat(btoa(data), ");");
  385. var rule = "@font-face {font-family:\"".concat(this.loadedName, "\";src:").concat(url, "}");
  386. if (this.fontRegistry) {
  387. this.fontRegistry.registerFont(this, url);
  388. }
  389. return rule;
  390. }
  391. }, {
  392. key: "getPathGenerator",
  393. value: function getPathGenerator(objs, character) {
  394. if (this.compiledGlyphs[character] !== undefined) {
  395. return this.compiledGlyphs[character];
  396. }
  397. var cmds, current;
  398. try {
  399. cmds = objs.get(this.loadedName + '_path_' + character);
  400. } catch (ex) {
  401. if (!this.ignoreErrors) {
  402. throw ex;
  403. }
  404. if (this._onUnsupportedFeature) {
  405. this._onUnsupportedFeature({
  406. featureId: _util.UNSUPPORTED_FEATURES.font
  407. });
  408. }
  409. (0, _util.warn)("getPathGenerator - ignoring character: \"".concat(ex, "\"."));
  410. return this.compiledGlyphs[character] = function (c, size) {};
  411. }
  412. if (this.isEvalSupported && IsEvalSupportedCached.value) {
  413. var args,
  414. js = '';
  415. for (var i = 0, ii = cmds.length; i < ii; i++) {
  416. current = cmds[i];
  417. if (current.args !== undefined) {
  418. args = current.args.join(',');
  419. } else {
  420. args = '';
  421. }
  422. js += 'c.' + current.cmd + '(' + args + ');\n';
  423. }
  424. return this.compiledGlyphs[character] = new Function('c', 'size', js);
  425. }
  426. return this.compiledGlyphs[character] = function (c, size) {
  427. for (var _i = 0, _ii = cmds.length; _i < _ii; _i++) {
  428. current = cmds[_i];
  429. if (current.cmd === 'scale') {
  430. current.args = [size, -size];
  431. }
  432. c[current.cmd].apply(c, current.args);
  433. }
  434. };
  435. }
  436. }]);
  437. return FontFaceObject;
  438. }();
  439. exports.FontFaceObject = FontFaceObject;