diff --git a/fonts.js b/fonts.js index fd467eeca..6fb99a4d2 100755 --- a/fonts.js +++ b/fonts.js @@ -161,68 +161,57 @@ if (!isWorker) { var FontLoader = { fonts: {}, fontsLoading: false, - waitingNames: [], - waitingStr: [], - - bind: function(fonts, callback) { - var rules = [], names = []; - - for (var i = 0; i < fonts.length; i++) { - var font = fonts[i]; - - var obj = new Font(font.name, font.file, font.properties); - - var str = ''; - var data = obj.data; - var name = obj.loadedName; - if (data) { - var length = data.length; - for (var j = 0; j < length; j++) - str += String.fromCharCode(data[j]); - - - this.fonts[obj.loadedName] = obj; - - this.waitingNames.push(name); - this.waitingStr.push(str); - } else { - // If there is no data, then there is nothing to load and we can - // resolve the object right away. - Objects.resolve(name, obj); - } - } + waitingFontObjs: [], + waitingFontIds: [], + bind: function(objId, fontObj) { + this.waitingFontObjs.push(fontObj); + this.waitingFontIds.push(objId); + if (!this.fontsLoading) { this.executeWaiting(); - } else { - console.log('There are currently some fonts getting loaded - waiting'); } }, + + bindDOM: function font_bindDom(fontObj) { + var fontName = fontObj.loadedName; + // Add the font-face rule to the document + var url = ('url(data:' + fontObj.mimetype + ';base64,' + + window.btoa(fontObj.str) + ');'); + var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}'; + var styleSheet = document.styleSheets[0]; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + return rule; + }, executeWaiting: function() { - var names = this.waitingNames; - console.log('executing fonts', names.join(', ')); - var rules = []; - for (var i = 0; i < names.length; i++) { - var obj = this.fonts[names[i]]; - var rule = obj.bindDOM(this.waitingStr[i]); + var names = []; + var objIds = this.waitingFontIds; + + for (var i = 0; i < this.waitingFontObjs.length; i++) { + var fontObj = this.waitingFontObjs[i]; + var rule = this.bindDOM(fontObj); + this.fonts[objIds[i]] = fontObj; + names.push(fontObj.loadedName); rules.push(rule); } - this.prepareFontLoadEvent(rules, names); - this.waitingNames = []; - this.waitingStr = []; + + this.prepareFontLoadEvent(rules, names, objIds); + this.waitingFontIds = []; + this.waitingFontObjs = []; }, - fontLoadEvent: function(names) { - this.fontsLoading = false; - - for (var i = 0; i < names.length; i++) { - var name = names[i]; - Objects.resolve(name, this.fonts[name]); + fontLoadEvent: function(objIds) { + for (var i = 0; i < objIds.length; i++) { + var objId = objIds[i]; + Objects.resolve(objId, this.fonts[objId]); + delete this.fonts[objId]; } + + this.fontsLoading = false; - if (this.waitingNames.length != 0) { + if (this.waitingFontIds.length != 0) { this.executeWaiting(); } }, @@ -232,7 +221,7 @@ var FontLoader = { // loaded in a subdocument. It's expected that the load of |rules| // has already started in this (outer) document, so that they should // be ordered before the load in the subdocument. - prepareFontLoadEvent: function(rules, names) { + prepareFontLoadEvent: function(rules, names, objIds) { this.fontsLoading = true; /** Hack begin */ // There's no event when a font has finished downloading so the @@ -278,18 +267,16 @@ var FontLoader = { } src += ''; src += '
'; - for (var i = 0; i < names.length; ++i) { - src += 'Hi
'; - } + src += 'Hi
'; src += '