Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

784 lines
38 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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 строки
// ----------------------------------------------------------------------------