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

601 lines
16 KiB
JavaScript

/*
* (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, undefined){
function CTextMeasurer()
{
this.m_oManager = new AscFonts.CFontManager();
this.m_oFont = null;
// RFonts
this.m_oTextPr = null;
this.m_oGrFonts = new AscCommon.CGrRFonts();
this.m_oLastFont = new AscCommon.CFontSetup();
this.LastFontOriginInfo = {Name : "", Replace : null};
}
CTextMeasurer.prototype =
{
SetParams : function(params)
{
this.m_oManager.SetParams(params);
},
Init : function()
{
this.m_oManager.Initialize();
},
SetStringGid : function(bGID)
{
this.m_oManager.SetStringGID(bGID);
},
SetFont : function(font)
{
if (!font)
return;
this.m_oFont = font;
var bItalic = true === font.Italic;
var bBold = true === font.Bold;
var oFontStyle = FontStyle.FontStyleRegular;
if ( !bItalic && bBold )
oFontStyle = FontStyle.FontStyleBold;
else if ( bItalic && !bBold )
oFontStyle = FontStyle.FontStyleItalic;
else if ( bItalic && bBold )
oFontStyle = FontStyle.FontStyleBoldItalic;
var _lastSetUp = this.m_oLastFont;
if (_lastSetUp.SetUpName != font.FontFamily.Name || _lastSetUp.SetUpSize != font.FontSize || _lastSetUp.SetUpStyle != oFontStyle || _lastSetUp.SetUpDpi !== 72)
{
_lastSetUp.SetUpName = font.FontFamily.Name;
_lastSetUp.SetUpSize = font.FontSize;
_lastSetUp.SetUpStyle = oFontStyle;
_lastSetUp.SetUpDpi = 72;
g_fontApplication.LoadFont(_lastSetUp.SetUpName, AscCommon.g_font_loader, this.m_oManager, _lastSetUp.SetUpSize, _lastSetUp.SetUpStyle, 72, 72, undefined, this.LastFontOriginInfo);
}
},
SetFontInternal : function(_name, _size, _style, _dpi)
{
if (undefined === _dpi)
_dpi = 72;
var _lastSetUp = this.m_oLastFont;
if (_lastSetUp.SetUpName != _name || _lastSetUp.SetUpSize != _size || _lastSetUp.SetUpStyle != _style || _lastSetUp.SetUpDpi !== _dpi)
{
_lastSetUp.SetUpName = _name;
_lastSetUp.SetUpSize = _size;
_lastSetUp.SetUpStyle = _style;
_lastSetUp.SetUpDpi = undefined !== _dpi ? _dpi : 72;
g_fontApplication.LoadFont(_lastSetUp.SetUpName, AscCommon.g_font_loader, this.m_oManager, _lastSetUp.SetUpSize, _lastSetUp.SetUpStyle, _dpi, _dpi, undefined, this.LastFontOriginInfo);
}
},
CheckUnicodeInCurrentFont : function(codePoint)
{
let oFont = this.m_oManager.m_pFont;
if (!oFont)
return true;
if (null != this.LastFontOriginInfo.Replace)
codePoint = g_fontApplication.GetReplaceGlyph(codePoint, this.LastFontOriginInfo.Replace);
return (!!oFont.GetGIDByUnicode(codePoint));
},
GetFontBySymbol : function(codePoint, oPreferredFont, isForcePreferred)
{
let oFont = this.m_oManager.m_pFont;
if (oPreferredFont && isForcePreferred)
oFont = oPreferredFont;
if (!oFont)
return {Font : null, CodePoint : codePoint};
if (null != this.LastFontOriginInfo.Replace)
codePoint = g_fontApplication.GetReplaceGlyph(codePoint, this.LastFontOriginInfo.Replace);
if (!oFont.GetGIDByUnicode(codePoint))
{
if (oPreferredFont && oPreferredFont.GetGIDByUnicode(codePoint))
return {Font : oPreferredFont, CodePoint : codePoint};
let _oFont = this.m_oManager.m_pFont.Picker.GetFontBySymbolWithSize(this.m_oManager.m_pFont, codePoint);
if (_oFont)
oFont = _oFont;
}
return {Font : oFont, CodePoint : codePoint};
},
GetCurrentFont : function()
{
return this.m_oManager.m_pFont;
},
GetGraphemeByUnicode : function(codePoint, sFontName, nFontStyle)
{
this.SetFontInternal(sFontName, AscFonts.MEASURE_FONTSIZE, nFontStyle);
let oFont = this.m_oManager.m_oFont;
let nGID = oFont ? oFont.GetGIDByUnicode(codePoint) : 0;
if (!nGID)
{
oFont = this.GetFontBySymbol(codePoint).Font;
if (!oFont)
return AscFonts.NO_GRAPHEME;
nGID = oFont.GetGIDByUnicode(codePoint);
sFontName = oFont.GetFamilyName();
}
let oGlyph = oFont.GetChar(codePoint);
if (!oGlyph)
return AscFonts.NO_GRAPHEME;
AscFonts.InitGrapheme(AscCommon.FontNameMap.GetId(sFontName), nFontStyle);
AscFonts.AddGlyphToGrapheme(nGID, oGlyph.fAdvanceX * 64, 0, 0, 0);
return AscFonts.GetGrapheme(getSingleCodePointCalculator(codePoint));
},
SetTextPr : function(textPr, theme)
{
if (theme && textPr && textPr.ReplaceThemeFonts)
textPr.ReplaceThemeFonts(theme.themeElements.fontScheme);
this.m_oTextPr = textPr;
if (theme)
this.m_oGrFonts.checkFromTheme(theme.themeElements.fontScheme, this.m_oTextPr.RFonts);
else
this.m_oGrFonts.fromRFonts(this.m_oTextPr.RFonts);
},
SetFontSlot : function(slot, fontSizeKoef)
{
var _rfonts = this.m_oGrFonts;
var _lastFont = this.m_oLastFont;
switch (slot)
{
case fontslot_ASCII:
{
_lastFont.Name = _rfonts.Ascii.Name;
_lastFont.Index = _rfonts.Ascii.Index;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
case fontslot_CS:
{
_lastFont.Name = _rfonts.CS.Name;
_lastFont.Index = _rfonts.CS.Index;
_lastFont.Size = this.m_oTextPr.FontSizeCS;
_lastFont.Bold = this.m_oTextPr.BoldCS;
_lastFont.Italic = this.m_oTextPr.ItalicCS;
break;
}
case fontslot_EastAsia:
{
_lastFont.Name = _rfonts.EastAsia.Name;
_lastFont.Index = _rfonts.EastAsia.Index;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
case fontslot_HAnsi:
default:
{
_lastFont.Name = _rfonts.HAnsi.Name;
_lastFont.Index = _rfonts.HAnsi.Index;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
}
if (undefined !== fontSizeKoef)
_lastFont.Size *= fontSizeKoef;
var _style = 0;
if (_lastFont.Italic)
_style += 2;
if (_lastFont.Bold)
_style += 1;
if (_lastFont.Name != _lastFont.SetUpName || _lastFont.Size != _lastFont.SetUpSize || _style != _lastFont.SetUpStyle)
{
_lastFont.SetUpName = _lastFont.Name;
_lastFont.SetUpSize = _lastFont.Size;
_lastFont.SetUpStyle = _style;
g_fontApplication.LoadFont(_lastFont.SetUpName, AscCommon.g_font_loader, this.m_oManager, _lastFont.SetUpSize, _lastFont.SetUpStyle, 72, 72, undefined, this.LastFontOriginInfo);
}
},
GetTextPr : function()
{
return this.m_oTextPr;
},
GetFont : function()
{
return this.m_oFont;
},
Measure : function(text)
{
var Width = 0;
var Height = 0;
var _code = text.charCodeAt(0);
if (null != this.LastFontOriginInfo.Replace)
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
var Temp = this.m_oManager.MeasureChar( _code );
Width = Temp.fAdvanceX * 25.4 / 72;
Height = 0;//Temp.fHeight;
return { Width : Width, Height : Height };
},
Measure2 : function(text)
{
var Width = 0;
var _code = text.charCodeAt(0);
if (null != this.LastFontOriginInfo.Replace)
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
var Temp = this.m_oManager.MeasureChar( _code, true );
Width = Temp.fAdvanceX * 25.4 / 72;
if (Temp.oBBox.rasterDistances == null)
{
return {
Width : Width,
Ascent : (Temp.oBBox.fMaxY * 25.4 / 72),
Height : ((Temp.oBBox.fMaxY - Temp.oBBox.fMinY) * 25.4 / 72),
WidthG : ((Temp.oBBox.fMaxX - Temp.oBBox.fMinX) * 25.4 / 72),
rasterOffsetX: 0,
rasterOffsetY: 0
};
}
return {
Width : Width,
Ascent : (Temp.oBBox.fMaxY * 25.4 / 72),
Height : ((Temp.oBBox.fMaxY - Temp.oBBox.fMinY) * 25.4 / 72),
WidthG : ((Temp.oBBox.fMaxX - Temp.oBBox.fMinX) * 25.4 / 72),
rasterOffsetX: Temp.oBBox.rasterDistances.dist_l * 25.4 / 72,
rasterOffsetY: Temp.oBBox.rasterDistances.dist_t * 25.4 / 72
};
},
MeasureCode : function(lUnicode)
{
var Width = 0;
var Height = 0;
if (null != this.LastFontOriginInfo.Replace)
lUnicode = g_fontApplication.GetReplaceGlyph(lUnicode, this.LastFontOriginInfo.Replace);
var Temp = this.m_oManager.MeasureChar( lUnicode );
Width = Temp.fAdvanceX * 25.4 / 72;
Height = ((Temp.oBBox.fMaxY - Temp.oBBox.fMinY) * 25.4 / 72);
return { Width : Width, Height : Height, Ascent : (Temp.oBBox.fMaxY * 25.4 / 72) };
},
Measure2Code : function(lUnicode)
{
var Width = 0;
if (null != this.LastFontOriginInfo.Replace)
lUnicode = g_fontApplication.GetReplaceGlyph(lUnicode, this.LastFontOriginInfo.Replace);
var Temp = this.m_oManager.MeasureChar( lUnicode, true );
Width = Temp.fAdvanceX * 25.4 / 72;
if (Temp.oBBox.rasterDistances == null)
{
return {
Width : Width,
Ascent : (Temp.oBBox.fMaxY * 25.4 / 72),
Height : ((Temp.oBBox.fMaxY - Temp.oBBox.fMinY) * 25.4 / 72),
WidthG : ((Temp.oBBox.fMaxX - Temp.oBBox.fMinX) * 25.4 / 72),
rasterOffsetX: 0,
rasterOffsetY: 0
};
}
return {
Width : Width,
Ascent : (Temp.oBBox.fMaxY * 25.4 / 72),
Height : ((Temp.oBBox.fMaxY - Temp.oBBox.fMinY) * 25.4 / 72),
WidthG : ((Temp.oBBox.fMaxX - Temp.oBBox.fMinX) * 25.4 / 72),
rasterOffsetX: (Temp.oBBox.rasterDistances.dist_l + Temp.oBBox.fMinX) * 25.4 / 72,
rasterOffsetY: Temp.oBBox.rasterDistances.dist_t * 25.4 / 72
};
},
GetBBox : function(gid)
{
let _stringGID = false;//this.m_oManager.GetStringGID();
this.m_oManager.SetStringGID(true);
let temp = this.m_oManager.MeasureChar(gid);
this.m_oManager.SetStringGID(_stringGID);
return temp.oBBox;
},
GetAscender : function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
var Ascender = this.m_oManager.m_lAscender;
return Ascender * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
},
GetDescender : function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
var Descender = this.m_oManager.m_lDescender;
return Descender * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
},
GetHeight : function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
var Height = this.m_oManager.m_lLineHeight;
return Height * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
},
GetLimitsY : function()
{
var Limits = this.m_oManager.GetLimitsY();
var dKoef = this.m_oLastFont.SetUpSize / this.m_oManager.m_lUnits_Per_Em * g_dKoef_pt_to_mm;
Limits.min *= dKoef;
Limits.max *= dKoef;
return Limits;
}
};
var g_oTextMeasurer = new CTextMeasurer();
g_oTextMeasurer.Init();
function GetLoadInfoForMeasurer(info, lStyle)
{
// подбираем шрифт по стилю
var sReturnName = info.Name;
var bNeedBold = false;
var bNeedItalic = false;
var index = -1;
var faceIndex = 0;
var bSrcItalic = false;
var bSrcBold = false;
switch (lStyle)
{
case AscFonts.FontStyle.FontStyleBoldItalic:
{
bSrcItalic = true;
bSrcBold = true;
bNeedBold = true;
bNeedItalic = true;
if (-1 != info.indexBI)
{
index = info.indexBI;
faceIndex = info.faceIndexBI;
bNeedBold = false;
bNeedItalic = false;
}
else if (-1 != info.indexB)
{
index = info.indexB;
faceIndex = info.faceIndexB;
bNeedBold = false;
}
else if (-1 != info.indexI)
{
index = info.indexI;
faceIndex = info.faceIndexI;
bNeedItalic = false;
}
else
{
index = info.indexR;
faceIndex = info.faceIndexR;
}
break;
}
case AscFonts.FontStyle.FontStyleBold:
{
bSrcBold = true;
bNeedBold = true;
bNeedItalic = false;
if (-1 != info.indexB)
{
index = info.indexB;
faceIndex = info.faceIndexB;
bNeedBold = false;
}
else if (-1 != info.indexR)
{
index = info.indexR;
faceIndex = info.faceIndexR;
}
else if (-1 != info.indexBI)
{
index = info.indexBI;
faceIndex = info.faceIndexBI;
bNeedBold = false;
}
else
{
index = info.indexI;
faceIndex = info.faceIndexI;
}
break;
}
case AscFonts.FontStyle.FontStyleItalic:
{
bSrcItalic = true;
bNeedBold = false;
bNeedItalic = true;
if (-1 != info.indexI)
{
index = info.indexI;
faceIndex = info.faceIndexI;
bNeedItalic = false;
}
else if (-1 != info.indexR)
{
index = info.indexR;
faceIndex = info.faceIndexR;
}
else if (-1 != info.indexBI)
{
index = info.indexBI;
faceIndex = info.faceIndexBI;
bNeedItalic = false;
}
else
{
index = info.indexB;
faceIndex = info.faceIndexB;
}
break;
}
case AscFonts.FontStyle.FontStyleRegular:
{
bNeedBold = false;
bNeedItalic = false;
if (-1 != info.indexR)
{
index = info.indexR;
faceIndex = info.faceIndexR;
}
else if (-1 != info.indexI)
{
index = info.indexI;
faceIndex = info.faceIndexI;
}
else if (-1 != info.indexB)
{
index = info.indexB;
faceIndex = info.faceIndexB;
}
else
{
index = info.indexBI;
faceIndex = info.faceIndexBI;
}
}
}
return {
Path : AscFonts.g_font_files[index].Id,
FaceIndex : faceIndex,
NeedBold : bNeedBold,
NeedItalic : bNeedItalic,
SrcBold : bSrcBold,
SrcItalic : bSrcItalic
};
}
let singleCodePointCalculator = null;
function getSingleCodePointCalculator(codePoint)
{
if (!singleCodePointCalculator)
{
function SingleCodePointsCalculator()
{
this.codePoint = 0;
}
SingleCodePointsCalculator.prototype.set = function(codePoint)
{
this.codePoint = codePoint;
}
SingleCodePointsCalculator.prototype.get = function()
{
return this.codePoint;
};
SingleCodePointsCalculator.prototype.getCount = function()
{
return 1;
};
singleCodePointCalculator = new SingleCodePointsCalculator();
}
singleCodePointCalculator.set(codePoint);
return singleCodePointCalculator;
}
//--------------------------------------------------------export----------------------------------------------------
window['AscCommon'] = window['AscCommon'] || {};
window['AscCommon'].CTextMeasurer = CTextMeasurer;
window['AscCommon'].g_oTextMeasurer = g_oTextMeasurer;
window['AscCommon'].GetLoadInfoForMeasurer = GetLoadInfoForMeasurer;
})(window);