/* * (c) Copyright Ascensio System SIA 2010-2024 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; (function(window, document){ // Import var FontStyle = AscFonts.FontStyle; // глобальные мапы для быстрого поиска var g_map_font_index = {}; var g_fonts_streams = []; var isLoadFontsSync = (window["NATIVE_EDITOR_ENJINE"] === true); function CFontFileLoader(id) { this.LoadingCounter = 0; this.Id = id; this.Status = -1; // -1 - notloaded, 0 - loaded, 1 - error, 2 - loading this.stream_index = -1; this.callback = null; } CFontFileLoader.prototype.GetMaxLoadingCount = function() { return 3; }; CFontFileLoader.prototype.CheckLoaded = function() { return (0 === this.Status || 1 === this.Status); }; CFontFileLoader.prototype.SetStreamIndex = function(index) { this.stream_index = index; }; CFontFileLoader.prototype.LoadFontFromData = function(data) { let stream_index = g_fonts_streams.length; g_fonts_streams[stream_index] = new AscFonts.FontStream(data, data.length); this.SetStreamIndex(stream_index); this.Status = 0; }; CFontFileLoader.prototype.LoadFontNative = function() { let data = window["native"]["GetFontBinary"](this.Id); this.LoadFontFromData(data); }; CFontFileLoader.prototype.LoadFontArrayBuffer = function(basePath) { var xhr = new XMLHttpRequest(); xhr.fontFile = this; xhr.open('GET', basePath + this.Id, true); if (typeof ArrayBuffer !== 'undefined' && !window.opera) xhr.responseType = 'arraybuffer'; if (xhr.overrideMimeType) xhr.overrideMimeType('text/plain; charset=x-user-defined'); else xhr.setRequestHeader('Accept-Charset', 'x-user-defined'); xhr.onload = function() { if (this.status !== 200) return this.onerror(); this.fontFile.Status = 0; if (typeof ArrayBuffer !== 'undefined' && !window.opera && this.response) { this.fontFile.LoadFontFromData(new Uint8Array(this.response)); } else if (AscCommon.AscBrowser.isIE) { let _response = new VBArray(this["responseBody"]).toArray(); let srcLen = _response.length; let stream = new AscFonts.FontStream(AscFonts.allocate(srcLen), srcLen); let dstPx = stream.data; let index = 0; while (index < srcLen) { dstPx[index] = _response[index]; index++; } let stream_index = g_fonts_streams.length; g_fonts_streams[stream_index] = stream; this.fontFile.SetStreamIndex(stream_index); } else { let stream_index = g_fonts_streams.length; g_fonts_streams[stream_index] = AscFonts.CreateFontData3(this.responseText); this.fontFile.SetStreamIndex(stream_index); } // decode let guidOdttf = [0xA0, 0x66, 0xD6, 0x20, 0x14, 0x96, 0x47, 0xfa, 0x95, 0x69, 0xB8, 0x50, 0xB0, 0x41, 0x49, 0x48]; let stream = g_fonts_streams[g_fonts_streams.length - 1]; let data = stream.data; let count_decode = Math.min(32, stream.size); for (let i = 0; i < count_decode; ++i) data[i] ^= guidOdttf[i % 16]; if (null != this.fontFile.callback) this.fontFile.callback(); if (this.fontFile["externalCallback"]) this.fontFile["externalCallback"](); }; xhr.onerror = function() { this.fontFile.LoadingCounter++; if (this.fontFile.LoadingCounter < this.fontFile.GetMaxLoadingCount()) { //console.log("font loaded: one more attemption"); this.fontFile.Status = -1; return; } this.fontFile.Status = 2; // aka loading... window["Asc"]["editor"].sendEvent("asc_onError", Asc.c_oAscError.ID.LoadingFontError, Asc.c_oAscError.Level.Critical); }; xhr.send(null); }; CFontFileLoader.prototype.LoadFontAsync = function(basePath, callback) { if (isLoadFontsSync) return true; if (window["AscDesktopEditor"] !== undefined) { if (-1 !== this.Status) return true; window["AscDesktopEditor"]["LoadFontBase64"](this.Id); let streams_count = g_fonts_streams.length; g_fonts_streams[streams_count] = AscFonts.CreateFontData4(window[this.Id]); this.SetStreamIndex(streams_count); this.Status = 0; delete window[this.Id]; if (callback) callback(); if (this["externalCallback"]) this["externalCallback"](); return; } this.callback = callback; if (-1 !== this.Status) return true; this.Status = 2; this.LoadFontArrayBuffer(basePath); return false; }; CFontFileLoader.prototype["LoadFontAsync"] = CFontFileLoader.prototype.LoadFontAsync; CFontFileLoader.prototype["GetID"] = function() { return this.Id; }; CFontFileLoader.prototype["GetStatus"] = function() { return this.Status; }; CFontFileLoader.prototype["GetStreamIndex"] = function() { return this.stream_index; }; function CFontFileLoaderEmbed(id) { this.Id = id; this.Status = -1; // -1 - notloaded, 0 - loaded, 1 - error, 2 - loading this.stream_index = -1; this.callback = null; } CFontFileLoaderEmbed.prototype.startIndex = -1; CFontFileLoaderEmbed.prototype.CheckLoaded = function() { return (0 === this.Status || 1 === this.Status); }; CFontFileLoaderEmbed.prototype.SetStreamIndex = function(index) { this.stream_index = index; }; CFontFileLoaderEmbed.prototype.LoadFontAsync = function() { if (this.Status === 0 || this.Status === 1) return true; let fontData = AscFonts.loadEmbeddedFont(this.Id); if (fontData) { let stream_index = g_fonts_streams.length; g_fonts_streams[stream_index] = new AscFonts.FontStream(fontData, fontData.length); this.SetStreamIndex(stream_index); this.Status = 0; AscFonts.CreateNativeStreamByIndex(stream_index); } else { this.Status = 1; } return true; }; const fontstyle_mask_regular = 1; const fontstyle_mask_italic = 2; const fontstyle_mask_bold = 4; const fontstyle_mask_bolditalic = 8; function GenerateMapId(api, name, style, size) { var fontInfo = api.FontLoader.fontInfos[api.FontLoader.map_font_index[name]]; let info = fontInfo.GetNeedInfo(style); var _ext = ""; if (info.needB) _ext += "nbold"; if (info.needI) _ext += "nitalic"; // index != -1 (!!!) let fontfile = api.FontLoader.fontFiles[info.index]; return fontfile.Id + info.faceIndex + size + _ext; } function CFontInfo(sName, thumbnail, indexR, faceIndexR, indexI, faceIndexI, indexB, faceIndexB, indexBI, faceIndexBI) { this.Name = sName; this.Thumbnail = thumbnail; this.NeedStyles = 0; this.indexR = indexR; this.faceIndexR = faceIndexR; this.needR = false; this.indexI = indexI; this.faceIndexI = faceIndexI; this.needI = false; this.indexB = indexB; this.faceIndexB = faceIndexB; this.needB = false; this.indexBI = indexBI; this.faceIndexBI= faceIndexBI; this.needBI = false; } CFontInfo.prototype = { // начинаем грузить нужные стили CheckFontLoadStyles : function(global_loader) { if (isLoadFontsSync) return false; if ((this.NeedStyles & 0x0F) === 0x0F) { this.needR = true; this.needI = true; this.needB = true; this.needBI = true; } else { let needs = [false, false, false, false]; if ((this.NeedStyles & fontstyle_mask_regular) !== 0) needs[this.GetBaseStyle(FontStyle.FontStyleRegular)] = true; if ((this.NeedStyles & fontstyle_mask_italic) !== 0) needs[this.GetBaseStyle(FontStyle.FontStyleItalic)] = true; if ((this.NeedStyles & fontstyle_mask_bold) !== 0) needs[this.GetBaseStyle(FontStyle.FontStyleBold)] = true; if ((this.NeedStyles & fontstyle_mask_bolditalic) !== 0) needs[this.GetBaseStyle(FontStyle.FontStyleBoldItalic)] = true; if (needs[0]) this.needR = true; if (needs[1]) this.needI = true; if (needs[2]) this.needB = true; if (needs[3]) this.needBI = true; } var fonts = global_loader.fontFiles; var basePath = global_loader.fontFilesPath; var isNeed = false; if ((this.needR === true) && (-1 !== this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) { fonts[this.indexR].LoadFontAsync(basePath, null); isNeed = true; } if ((this.needI === true) && (-1 !== this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) { fonts[this.indexI].LoadFontAsync(basePath, null); isNeed = true; } if ((this.needB === true) && (-1 !== this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) { fonts[this.indexB].LoadFontAsync(basePath, null); isNeed = true; } if ((this.needBI === true) && (-1 !== this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) { fonts[this.indexBI].LoadFontAsync(basePath, null); isNeed = true; } return isNeed; }, // надо ли грузить хоть один шрифт из семейства CheckFontLoadStylesNoLoad : function(global_loader) { if (isLoadFontsSync) return false; var fonts = global_loader.fontFiles; if ((-1 !== this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) return true; if ((-1 !== this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) return true; if ((-1 !== this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) return true; if ((-1 !== this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) return true; return false; }, // используется только в тестовом примере LoadFontsFromServer : function(global_loader) { var fonts = global_loader.fontFiles; var basePath = global_loader.fontFilesPath; if ((-1 !== this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) fonts[this.indexR].LoadFontAsync(basePath, null); if ((-1 !== this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) fonts[this.indexI].LoadFontAsync(basePath, null); if ((-1 !== this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) fonts[this.indexB].LoadFontAsync(basePath, null); if ((-1 !== this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) fonts[this.indexBI].LoadFontAsync(basePath, null); }, LoadFont : function(font_loader, fontManager, fEmSize, style, dHorDpi, dVerDpi, transform, isNoSetupToManager) { let info = this.GetNeedInfo(style); let fontfile = font_loader.fontFiles[info.index]; if (window["NATIVE_EDITOR_ENJINE"] && fontfile.Status !== 0) fontfile.LoadFontNative(); var pFontFile = fontManager.LoadFont(fontfile, info.faceIndex, fEmSize, (0 !== (style & FontStyle.FontStyleBold)) ? true : false, (0 !== (style & FontStyle.FontStyleItalic)) ? true : false, info.needB, info.needI, isNoSetupToManager); if (!pFontFile && -1 === fontfile.stream_index && true === AscFonts.IsLoadFontOnCheckSymbols && true != AscFonts.IsLoadFontOnCheckSymbolsWait) { // в форматах pdf/xps - не прогоняем символы через чеккер при открытии, // так как там должны быть символы в встроенном шрифте. Но вдруг? // тогда при отрисовке СРАЗУ грузим шрифт - и при загрузке перерисовываемся // сюда попали только если символ попал в чеккер AscFonts.IsLoadFontOnCheckSymbols = false; AscFonts.IsLoadFontOnCheckSymbolsWait = true; AscFonts.FontPickerByCharacter.loadFonts(window.editor, function () { AscFonts.IsLoadFontOnCheckSymbolsWait = false; this.WordControl && this.WordControl.private_RefreshAll(); }); } if (pFontFile && (true !== isNoSetupToManager)) { var newEmSize = fontManager.UpdateSize(fEmSize, dVerDpi, dVerDpi); pFontFile.SetSizeAndDpi(newEmSize, dHorDpi, dVerDpi); if (undefined !== transform) { fontManager.SetTextMatrix2(transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty); } else { fontManager.SetTextMatrix(1, 0, 0, 1, 0, 0); } } return pFontFile; }, GetFontID : function(font_loader, style) { let info = this.GetNeedInfo(style); let fontfile = font_loader.fontFiles[info.index]; return { id: fontfile.Id, faceIndex : info.faceIndex, file : fontfile }; }, // по запрашиваемому стилю - отдаем какой будем использовать GetBaseStyle : function(style) { switch (style) { case FontStyle.FontStyleBoldItalic: { if (-1 !== this.indexBI) return FontStyle.FontStyleBoldItalic; else if (-1 !== this.indexB) return FontStyle.FontStyleBold; else if (-1 !== this.indexI) return FontStyle.FontStyleItalic; else return FontStyle.FontStyleRegular; break; } case FontStyle.FontStyleBold: { if (-1 !== this.indexB) return FontStyle.FontStyleBold; else if (-1 !== this.indexR) return FontStyle.FontStyleRegular; else if (-1 !== this.indexBI) return FontStyle.FontStyleBoldItalic; else return FontStyle.FontStyleItalic; break; } case FontStyle.FontStyleItalic: { if (-1 !== this.indexI) return FontStyle.FontStyleItalic; else if (-1 !== this.indexR) return FontStyle.FontStyleRegular; else if (-1 !== this.indexBI) return FontStyle.FontStyleBoldItalic; else return FontStyle.FontStyleBold; break; } case FontStyle.FontStyleRegular: { if (-1 !== this.indexR) return FontStyle.FontStyleRegular; else if (-1 !== this.indexI) return FontStyle.FontStyleItalic; else if (-1 !== this.indexB) return FontStyle.FontStyleBold; else return FontStyle.FontStyleBoldItalic; } } return FontStyle.FontStyleRegular; }, // по запрашиваемому стилю - возвращаем какой будем грузить и какие настройки нужно сделать самому GetNeedInfo : function(style) { let result = { index : -1, faceIndex : 0, needB : false, needI : false }; let resStyle = this.GetBaseStyle(style); switch (resStyle) { case FontStyle.FontStyleBoldItalic: { result.index = this.indexBI; result.faceIndex = this.faceIndexBI; break; } case FontStyle.FontStyleBold: { result.index = this.indexB; result.faceIndex = this.faceIndexB; if (0 !== (style & FontStyle.FontStyleItalic)) result.needI = true; break; } case FontStyle.FontStyleItalic: { result.index = this.indexI; result.faceIndex = this.faceIndexI; if (0 !== (style & FontStyle.FontStyleBold)) result.needB = true; break; } case FontStyle.FontStyleRegular: default: { result.index = this.indexR; result.faceIndex = this.faceIndexR; if (0 !== (style & FontStyle.FontStyleItalic)) result.needI = true; if (0 !== (style & FontStyle.FontStyleBold)) result.needB = true; break; } } return result; } }; function CFontInfoEmbed(name, index) { this.Name = name; this.indexR = index; this.faceIndexR = 0; } CFontInfoEmbed.prototype = { // начинаем грузить нужные стили CheckFontLoadStyles : function(global_loader) { let fontFile = global_loader.fontFiles[this.indexR]; fontFile.LoadFontAsync(); return false; }, // надо ли грузить хоть один шрифт из семейства CheckFontLoadStylesNoLoad : function(global_loader) { return false; }, LoadFont : function(font_loader, fontManager, fEmSize, style, dHorDpi, dVerDpi, transform, isNoSetupToManager) { let fontfile = font_loader.fontFiles[this.indexR]; var pFontFile = fontManager.LoadFont(fontfile, this.faceIndexR, fEmSize, false, false, false, false, isNoSetupToManager); if (pFontFile && (true !== isNoSetupToManager)) { pFontFile.m_pFaceInfo.family_name = this.Name; var newEmSize = fontManager.UpdateSize(fEmSize, dVerDpi, dVerDpi); pFontFile.SetSizeAndDpi(newEmSize, dHorDpi, dVerDpi); if (undefined !== transform) { fontManager.SetTextMatrix2(transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty); } else { fontManager.SetTextMatrix(1, 0, 0, 1, 0, 0); } } return pFontFile; }, GetFontID : function(font_loader) { let fontfile = font_loader.fontFiles[this.indexК]; return { id: fontfile.Id, faceIndex : this.faceIndexR, file : fontfile }; } }; // thumbnail - это позиция (y) в общем табнейле всех шрифтов function CFont(name, id, thumbnail, style) { this.name = name; this.id = id || ""; this.thumbnail = thumbnail || 0; this.NeedStyles = style || (fontstyle_mask_regular | fontstyle_mask_italic | fontstyle_mask_bold | fontstyle_mask_bolditalic); } CFont.prototype["asc_getFontId"] = CFont.prototype.asc_getFontId = function() { return this.id; }; CFont.prototype["asc_getFontName"] = CFont.prototype.asc_getFontName = function() { var _name = AscFonts.g_fontApplication ? AscFonts.g_fontApplication.NameToInterface[this.name] : null; return _name ? _name : this.name; }; CFont.prototype["asc_getFontThumbnail"] = CFont.prototype.asc_getFontThumbnail = function() { return this.thumbnail; }; // для совместимости CFont.prototype["asc_getFontType"] = CFont.prototype.asc_getFontType = function() { return 1; }; var ImageLoadStatus = { Loading : 0, Complete : 1 }; function CImage(src) { this.src = src; this.Image = null; this.Status = ImageLoadStatus.Complete; } function checkAllFonts() { if (undefined === window["__fonts_files"] && window["native"] && window["native"]["GenerateAllFonts"]) window["native"]["GenerateAllFonts"](); if (undefined === window["__fonts_files"]) return; let g_font_files, g_font_infos; var files = window["__fonts_files"]; let count_files = files ? files.length : 0; g_font_files = new Array(count_files); for (let i = 0; i < count_files; i++) { g_font_files[i] = new CFontFileLoader(files[i]); } let infos = window["__fonts_infos"]; let count_infos = infos ? infos.length : 0; g_font_infos = new Array(count_infos); let curIndex = 0; let ascFontFath = "ASC.ttf"; for (let i = 0; i < count_infos; i++) { let info = infos[i]; if ("ASCW3" === info[0]) { ascFontFath = g_font_files[info[1]].Id; continue; } g_font_infos[curIndex] = new CFontInfo(info[0], i, info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8]); g_map_font_index[info[0]] = curIndex; curIndex++; } g_font_infos.length = curIndex; ///////////////////////////////////////////////////////////////////// // наш шрифт для спецсимволов let ascW3 = new CFontFileLoader(ascFontFath); ascW3.Status = 0; let streams_count = g_fonts_streams.length; g_fonts_streams[streams_count] = AscFonts.CreateFontData2("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"); ascW3.SetStreamIndex(streams_count); g_font_files.push(ascW3); count_infos = g_font_infos.length; g_font_infos[count_infos] = new CFontInfo("ASCW3", 0, g_font_files.length - 1, 0, -1, -1, -1, -1, -1, -1); g_map_font_index["ASCW3"] = count_infos; ///////////////////////////////////////////////////////////////////// if (AscFonts.FontPickerByCharacter) AscFonts.FontPickerByCharacter.init(window["__fonts_infos"]); // удаляем временные переменные delete window["__fonts_files"]; delete window["__fonts_infos"]; window['AscFonts'].g_font_files = g_font_files; window['AscFonts'].g_font_infos = g_font_infos; } //------------------------------------------------------export------------------------------------------------------ window['AscFonts'] = window['AscFonts'] || {}; window['AscFonts'].g_map_font_index = g_map_font_index; window['AscFonts'].g_fonts_streams = g_fonts_streams; window['AscFonts'].CFontFileLoader = CFontFileLoader; window['AscFonts'].GenerateMapId = GenerateMapId; window['AscFonts'].CFontInfo = CFontInfo; window['AscFonts'].CFont = CFont; window['AscFonts'].CFontFileLoaderEmbed = CFontFileLoaderEmbed; window['AscFonts'].CFontInfoEmbed = CFontInfoEmbed; window['AscFonts'].ImageLoadStatus = ImageLoadStatus; window['AscFonts'].CImage = CImage; window['AscFonts'].checkAllFonts = checkAllFonts; window['AscFonts'].g_font_infos_embed = []; window['AscFonts'].g_map_font_index_embed = {}; window['AscFonts'].getEmbeddedFontPrefix = function() { return "Embedded: "; }; window['AscFonts'].initEmbeddedFonts = function(fonts, isMerge) { const prefix = AscFonts.getEmbeddedFontPrefix(); let fontFiles = AscFonts.g_font_files; if (!isMerge) { if (CFontFileLoaderEmbed.prototype.startIndex > 0) fontFiles.splice(CFontFileLoaderEmbed.prototype.startIndex); CFontFileLoaderEmbed.prototype.startIndex = fontFiles.length; let currentIndex = CFontFileLoaderEmbed.prototype.startIndex; for (let i = 0, len = fonts.length; i < len; i++) { let name = prefix + fonts[i]; AscFonts.g_font_files.push(new CFontFileLoaderEmbed(name)); AscFonts.g_font_infos_embed.push(new CFontInfoEmbed(name, currentIndex++)); AscFonts.g_map_font_index_embed[name] = i; } } else { let startIndex = CFontFileLoaderEmbed.prototype.startIndex; let endIndex = fontFiles.length; let currentIndex = endIndex; for (let i = 0, len = fonts.length; i < len; i++) { let name = prefix + fonts[i]; let isFound = false; for (let j = startIndex; j < endIndex; j++) { if (fontFiles[j].Id === name) { isFound = true; break; } } if (isFound) continue; AscFonts.g_font_files.push(new CFontFileLoaderEmbed(name)); AscFonts.g_font_infos_embed.push(new CFontInfoEmbed(name, currentIndex++)); AscFonts.g_map_font_index_embed[name] = i; } } }; checkAllFonts(); })(window, window.document); // сначала хотел писать "вытеснение" из этого мапа. // но тогда нужно хранить base64 строки. Это не круто. По памяти - даже // выигрыш будет. Не особо то шрифты жмутся lzw или deflate // поэтому лучше из памяти будем удалять base64 строки // ----------------------------------------------------------------------------