Commit e59cd03f authored by Anna.Pavlova's avatar Anna.Pavlova Committed by Alexander.Trofimov

Поправила баг http://bugzserver/show_bug.cgi?id=27921

Баг возникал в связи с тем, что не был выствлен FontSizeCS для текстовых настроек в SetTextPr
Переделала схему выставления шрифтов для математического текста. Теперь выставляю SetTextPr в Run, а если настройки шрифта нужно перебить, то делаю это в MathText, использую при этом SetFont (с каким шрифтом отрисовать разруливается след. способом : если ничего подменять не нужно, то идет ф-ия SetFontSlot и учитываются текстовые настройки те, которые передали в SetTextPr; а если настройки подменяются, то использую ф-ию SetFont и уже учитываются текстовые настройки, которые были переданы в функцию SetFont)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@60166 954022d7-b5bf-4e40-9824-e11837661b57
parent 6eb14ef7
......@@ -233,6 +233,7 @@ ParaMath.prototype.Add = function(Item)
EndPos: StartPos + lng2 - lng
};
TextPr.RFonts.Set_All("Cambria Math", -1);
oContent.Apply_TextPr(TextPr, undefined, false, Pos_ApplyTextPr);
//oContent.Set_MathTextPr2(MathTxtPr.TextPr, MathTxtPr.MathPr, false, StartPos + 1, lng2 - lng);
}
......@@ -2782,19 +2783,26 @@ CChangesMathEqArrayPr.prototype.Load_Changes = function(Reader, Class)
this.Redo(Class);
};
function MathApplyArgSize(FontSize, argSize)
function MatGetKoeffArgSize(FontSize, ArgSize)
{
var ResultFontSize = FontSize;
if(argSize == -1)
var FontKoef = 1;
if(ArgSize == -1)
{
ResultFontSize *= g_dMathArgSizeKoeff_1;
FontKoef = g_dMathArgSizeKoeff_1;
}
else if(argSize == -2)
else if(ArgSize == -2)
{
FontKoef = g_dMathArgSizeKoeff_2;
}
if (1 !== FontKoef )
{
ResultFontSize *= g_dMathArgSizeKoeff_2;
FontKoef = (((FontSize * FontKoef * 2 + 0.5) | 0) / 2) / FontSize;
}
return ResultFontSize;
return FontKoef;
}
function CMathRecalculateInfo()
......
......@@ -1195,15 +1195,19 @@ ParaRun.prototype.Create_FontMap = function(Map, ArgSize)
if ( undefined !== this.Paragraph && null !== this.Paragraph )
{
var TextPr;
var FontSize;
var FontSize, FontSizeCS;
if(this.Type === para_Math_Run)
{
TextPr = this.Get_CompiledPr(false);
FontSize = TextPr.FontSize;
FontSizeCS = TextPr.FontSizeCS;
if(null !== this.Parent && undefined !== this.Parent && null !== this.Parent.ParaMath && undefined !== this.Parent.ParaMath)
TextPr.FontSize = MathApplyArgSize(TextPr.FontSize, ArgSize.value);
{
TextPr.FontSize *= MatGetKoeffArgSize(TextPr.FontSize, ArgSize.value);
TextPr.FontSizeCS *= MatGetKoeffArgSize(TextPr.FontSizeCS, ArgSize.value);
}
}
else
TextPr = this.Get_CompiledPr(false);
......@@ -1220,7 +1224,8 @@ ParaRun.prototype.Create_FontMap = function(Map, ArgSize)
if(this.Type === para_Math_Run)
{
TextPr.FontSize = FontSize;
TextPr.FontSize = FontSize;
TextPr.FontSizeCS = FontSizeCS;
}
}
};
......@@ -3326,10 +3331,13 @@ ParaRun.prototype.Draw_Elements = function(PDSE)
{
Y += this.size.ascent;
//var ArgSize = this.Parent.Compiled_ArgSz.value,
// bNormalText = this.IsNormalText();
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
InfoMathText = new CMathInfoTextPr(CurTextPr, ArgSize, bNormalText, Theme);
InfoMathText = new CMathInfoTextPr_2(CurTextPr, ArgSize, bNormalText);
//NewMathTextPr = GetMathModifiedFont(MathFont_ForMathText, CurTextPr, this);
//pGraphics.SetTextPr( NewMathTextPr, Theme );
}
......@@ -7878,16 +7886,17 @@ ParaRun.prototype.Math_Recalculate = function(oMeasure, RPI, WidthPoints)
if(RPI.NeedResize)
{
var oWPrp = this.Get_CompiledPr(false);
var Theme = this.Paragraph.Get_Theme();
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
//var Theme = this.Paragraph.Get_Theme();
//var NewMathTextPr = GetMathModifiedFont(MathFont_ForMathText, oWPrp, this);
//g_oTextMeasurer.SetTextPr( NewMathTextPr, Theme );
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
var Theme = this.Paragraph.Get_Theme();
g_oTextMeasurer.SetTextPr( oWPrp, Theme );
var InfoMathText = new CMathInfoTextPr(oWPrp, ArgSize, bNormalText, Theme);
var InfoMathText = new CMathInfoTextPr_2(oWPrp, ArgSize, bNormalText);
this.bEqqArray = RPI.bEqqArray;
......
......@@ -123,11 +123,11 @@ CMathBase.prototype =
CompiledCtrPrp = this.Get_CompiledCtrPrp_2();
if(bAllowInline !== false && this.ParaMath)
CompiledCtrPrp.FontSize = MathApplyArgSize(CompiledCtrPrp.FontSize, this.Parent.Get_CompiledArgSize().value);
CompiledCtrPrp.FontSize *= MatGetKoeffArgSize(CompiledCtrPrp.FontSize, this.Parent.Get_CompiledArgSize().value);
}
if(bAllowInline !== false && this.ParaMath)
CompiledCtrPrp.FontSize = MathApplyArgSize(CompiledCtrPrp.FontSize, this.ArgSize.value);// для настроек inline формул
CompiledCtrPrp.FontSize *= MatGetKoeffArgSize(CompiledCtrPrp.FontSize, this.ArgSize.value);// для настроек inline формул
return CompiledCtrPrp;
},
......@@ -459,12 +459,12 @@ CMathBase.prototype =
{
var TxtPr = Parent.Get_TxtPrControlLetter(RPI);
FontSize = TxtPr.FontSize;
FontSize = MathApplyArgSize(FontSize, this.ArgSize.value);
FontSize *= MatGetKoeffArgSize(FontSize, this.ArgSize.value);
}
else
{
FontSize = MathApplyArgSize(FontSize, Parent.Get_CompiledArgSize().value);
FontSize = MathApplyArgSize(FontSize, this.ArgSize.value);
FontSize *= MatGetKoeffArgSize(FontSize, Parent.Get_CompiledArgSize().value);
FontSize *= MatGetKoeffArgSize(FontSize, this.ArgSize.value);
}
this.TextPrControlLetter.FontSize = FontSize;
......
......@@ -56,6 +56,8 @@ function CMathText(bJDraw)
this.GapLeft = 0;
this.GapRight = 0;
this.FontSlot = fontslot_ASCII;
// TO DO
// убрать
......@@ -566,7 +568,7 @@ CMathText.prototype =
this.FontSlot = InfoTextPr.GetFontSlot(this.value); // возвращает fontslot_ASCII || fontslot_EastAsia || fontslot_CS || fontslot_HAnsi
var letter = this.getCode(InfoTextPr);
var letter = this.getCode();
// в не математическом тексте i и j не подменяются на i и j без точек
var bAccentIJ = !InfoTextPr.bNormalText && this.Parent.IsAccent() && (this.value == 0x69 || this.value == 0x6A);
......@@ -577,18 +579,29 @@ CMathText.prototype =
if(bAccentIJ || this.RecalcInfo.bApostrophe)
oMeasure.SetStringGid(true);
if( InfoTextPr.NeedUpdateTextPrp(this.value, this.FontSlot, this.IsPlaceholder()) )
if( InfoTextPr.NeedUpdateFont(this.value, this.FontSlot, this.IsPlaceholder()) )
{
g_oTextMeasurer.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
g_oTextMeasurer.SetFont(InfoTextPr.Font);
//g_oTextMeasurer.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
}
else if(InfoTextPr.CurrType == MathTextInfo_NormalText)
{
/*this.FontKoef = InfoTextPr.FontKoef;
if (1 !== this.FontKoef )
{
var FontSize = this.FontSlot == fontslot_CS ? InfoTextPr.TextPr.FontSizeCS : InfoTextPr.TextPr.FontSize;
this.FontKoef = (((FontSize * this.FontKoef * 2 + 0.5) | 0) / 2) / FontSize;
}*/
var FontKoef = InfoTextPr.GetFontKoef(this.FontSlot);
g_oTextMeasurer.SetFontSlot(this.FontSlot, 1);
g_oTextMeasurer.SetFontSlot(this.FontSlot, FontKoef);
}
metricsTxt = oMeasure.MeasureCode(letter);
if(bAccentIJ || this.RecalcInfo.bApostrophe)
oMeasure.SetStringGid(false);
}
if(letter == 0x2061)
......@@ -670,12 +683,17 @@ CMathText.prototype =
}
else if(this.RecalcInfo.bSpaceSpecial == false)
{
if( InfoTextPr.NeedUpdateTextPrp(this.value, this.FontSlot, this.IsPlaceholder()) )
if( InfoTextPr.NeedUpdateFont(this.value, this.FontSlot, this.IsPlaceholder()) )
{
pGraphics.SetFont(InfoTextPr.Font);
//pGraphics.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
}
else if(InfoTextPr.CurrType == MathTextInfo_NormalText)
{
pGraphics.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
var FontKoef = InfoTextPr.GetFontKoef(this.FontSlot);
pGraphics.SetFontSlot(this.FontSlot, FontKoef);
}
pGraphics.SetFontSlot(this.FontSlot, 1);
if(this.RecalcInfo.bAccentIJ || this.RecalcInfo.bApostrophe)
pGraphics.tg(this.RecalcInfo.StyleCode, X, Y);
......@@ -995,25 +1013,14 @@ function GetMathModifiedFont(type, TextPr, Class)
return NewMathTextPr;
}
function Math_Is_SpecilalOperator(val)
{
var bSpecialOperator = val == 0x21 || val == 0x23 || (val >= 0x28 && val <= 0x2F) || (val >= 0x3A && val <= 0x3F) || (val >=0x5B && val <= 0x5F) || (val >= 0x7B && val <= 0xA1) || val == 0xAC || val == 0xB1 || val == 0xB7 || val == 0xBF || val == 0xD7 || val == 0xF7 || (val >= 0x2010 && val <= 0x2014) || val == 0x2016 || (val >= 0x2020 && val <= 0x2022) || val == 0x2026,
bSpecialArrow = val >= 0x2190 && val <= 0x21FF,
bSpecialSymbols = val == 0x2200 || val == 0x2201 || val == 0x2203 || val == 0x2204 || val == 0x2206|| (val >= 0x2208 && val <= 0x220D) || (val >= 0x220F && val <= 0x221E) || (val >= 0x2223 && val <= 0x223E) || (val >= 0x223F && val <= 0x22BD) || (val >= 0x22C0 && val <= 0x22FF) || val == 0x2305 || val == 0x2306 || (val >= 0x2308 && val <= 0x230B) || (val >= 0x231C && val <= 0x231F) || val == 0x2322 || val == 0x2323 || val == 0x2329 || val == 0x232A ||val == 0x233F || val == 0x23B0 || val == 0x23B1,
bOtherArrows = (val >= 0x27D1 && val <= 0x2980) || (val >= 0x2982 && val <= 0x299A) || (val >= 0x29B6 && val <= 0x29B9) || val == 0x29C0 || val == 0x29C1 || (val >= 0x29C4 && val <= 0x29C8) || (val >= 0x29CE && val <= 0x29DB) || val == 0x29DF || (val >= 0x29E1 && val <= 0x29E6) || val == 0x29EB || (val >= 0x29F4 && val <= 0x2AFF && val !== 0x2AE1 && val !== 0x2AF1) || (val >= 0x3014 && val <= 0x3017);
// apostrophe
// отдельно Cambria Math 0x27
return bSpecialOperator || bSpecialArrow || bSpecialSymbols || bOtherArrows;
}
function CMathInfoTextPr(TextPr, ArgSize, bNormalText, Theme)
{
this.BFirstSetTextPr = true;
this.TextPr = new CTextPr();
this.CurrentTextPr = new CTextPr();
this.bSpecialOperator = false;
this.bNormalText = bNormalText;
this.bSpecialOperator = false;
......@@ -1116,4 +1123,181 @@ CMathInfoTextPr.prototype.GetFontSlot = function(code)
var lcid = this.TextPr.Lang.EastAsia;
return g_font_detector.Get_FontClass(code, Hint, lcid, bCS, bRTL);
};
\ No newline at end of file
};
var MathTextInfo_MathText = 1;
var MathTextInfo_SpecialOperator = 2;
var MathTextInfo_NormalText = 3;
function CMathInfoTextPr_2(TextPr, ArgSize, bNormalText)
{
this.CurrType = -1; // в первый раз Font всегда выставляем
this.TextPr = TextPr;
this.ArgSize = ArgSize;
//this.CurrentTextPr = new CTextPr();
this.Font =
{
FontFamily: {Name: "Cambria Math", Index : -1},
FontSize: TextPr.FontSize,
Italic: false,
Bold: false
};
this.bNormalText = bNormalText;
this.RFontsCompare = [];
// скопируем эти свойства для SetFontSlot
// для SpecialOperator нужны уже скомпилированные для мат текста текстовые настройки, поэтому важно эи свойства скопировать именно здесь, а не передавать в MathText обычные текст. настройки
this.RFontsCompare[fontslot_ASCII] = undefined !== this.TextPr.RFonts.Ascii && this.TextPr.RFonts.Ascii.Name == "Cambria Math";
this.RFontsCompare[fontslot_HAnsi] = undefined !== this.TextPr.RFonts.HAnsi && this.TextPr.RFonts.HAnsi.Name == "Cambria Math";
this.RFontsCompare[fontslot_CS] = undefined !== this.TextPr.RFonts.CS && this.TextPr.RFonts.CS.Name == "Cambria Math";
this.RFontsCompare[fontslot_EastAsia] = undefined !== this.TextPr.RFonts.EastAsia && this.TextPr.RFonts.EastAsia.Name == "Cambria Math";
}
CMathInfoTextPr_2.prototype.NeedUpdateFont = function(code, fontSlot, IsPlaceholder)
{
var NeedUpdateFont = false;
var bMathText = this.bNormalText == false || IsPlaceholder;
var Type;
if(bMathText && (this.RFontsCompare[fontSlot] == true || IsPlaceholder))
Type = MathTextInfo_MathText;
else if(bMathText && this.RFontsCompare[fontSlot] == false && this.IsSpecilalOperator(code))
Type = MathTextInfo_SpecialOperator;
else
Type = MathTextInfo_NormalText;
var bChangeType = this.CurrType !== MathTextInfo_MathText && this.CurrType !== MathTextInfo_SpecialOperator; // -1 or MathTextInfo_NormalText
if(bChangeType && Type !== MathTextInfo_NormalText)
{
this.Font.FontSize = fontSlot !== fontslot_CS ? this.TextPr.FontSize : this.TextPr.FontSizeCS;
this.Font.FontSize *= this.GetFontKoef(fontSlot);
NeedUpdateFont = true;
}
this.CurrType = Type;
return NeedUpdateFont;
};
CMathInfoTextPr_2.prototype.NeedUpdateFont_2 = function(code, fontSlot, IsPlaceholder)
{
var NeedUpdateFont = false;
var bMathText = this.bNormalText == false || IsPlaceholder;
var Type;
if(bMathText && (this.RFontsCompare[fontSlot] == true || IsPlaceholder))
Type = MathTextInfo_MathText;
else if(bMathText && this.RFontsCompare[fontSlot] == false && this.IsSpecilalOperator(code))
Type = MathTextInfo_SpecialOperator;
else
Type = MathTextInfo_NormalText;
if(this.CurrType !== Type)
{
if(Type == MathTextInfo_MathText)
{
this.Font.Italic = false;
this.Font.Bold = false;
NeedUpdateFont = true;
}
else if(Type == MathTextInfo_SpecialOperator)
{
// FontFamily Cambria Math !
if(fontSlot !== fontslot_CS)
{
this.Font.Italic = this.TextPr.Italic;
this.Font.Bold = this.TextPr.Bold;
}
else
{
this.Font.Italic = this.TextPr.ItalicCS;
this.Font.Bold = this.TextPr.BoldCS;
}
NeedUpdateFont = true;
}
if(NeedUpdateFont)
{
this.Font.FontSize = fontSlot !== fontslot_CS ? this.TextPr.FontSize : this.TextPr.FontSizeCS;
this.Font.FontSize *= this.GetFontKoef(fontSlot);
}
this.CurrType = Type;
}
return NeedUpdateFont;
};
CMathInfoTextPr_2.prototype.NeedSetFont_2 = function(code, fontSlot, IsPlaceholder)
{
var NeedSetFont = false;
// IsMathematicalText || Placeholder ?
if(this.bNormalText == false || IsPlaceholder)
{
if(this.RFontsCompare[fontSlot] == true || IsPlaceholder) // Cambria Math
{
this.Font.Italic = false;
this.Font.Bold = false;
NeedSetFont = true;
}
else if(this.IsSpecilalOperator(code))
{
// FontFamily Cambria Math !
if(fontSlot !== fontslot_CS)
{
this.Font.Italic = this.TextPr.Italic;
this.Font.Bold = this.TextPr.Bold;
}
else
{
this.Font.Italic = this.TextPr.ItalicCS;
this.Font.Bold = this.TextPr.BoldCS;
}
NeedSetFont = true;
}
if(NeedSetFont)
{
this.Font.FontSize = fontSlot !== fontslot_CS ? this.TextPr.FontSize : this.TextPr.FontSizeCS;
this.Font.FontSize *= this.GetFontKoef(fontSlot);
}
}
return NeedSetFont;
};
CMathInfoTextPr_2.prototype.GetFontKoef = function(fontSlot)
{
var FontSize = fontSlot == fontslot_CS ? this.TextPr.FontSizeCS : this.TextPr.FontSize;
return MatGetKoeffArgSize(FontSize, this.ArgSize);
};
CMathInfoTextPr_2.prototype.GetFontSlot = function(code)
{
var Hint = this.TextPr.RFonts.Hint;
var bCS = this.TextPr.CS;
var bRTL = this.TextPr.RTL;
var lcid = this.TextPr.Lang.EastAsia;
return g_font_detector.Get_FontClass(code, Hint, lcid, bCS, bRTL);
};
CMathInfoTextPr_2.prototype.IsSpecilalOperator = function(val)
{
var bSpecialOperator = val == 0x21 || val == 0x23 || (val >= 0x28 && val <= 0x2F) || (val >= 0x3A && val <= 0x3F) || (val >=0x5B && val <= 0x5F) || (val >= 0x7B && val <= 0xA1) || val == 0xAC || val == 0xB1 || val == 0xB7 || val == 0xBF || val == 0xD7 || val == 0xF7 || (val >= 0x2010 && val <= 0x2014) || val == 0x2016 || (val >= 0x2020 && val <= 0x2022) || val == 0x2026,
bSpecialArrow = val >= 0x2190 && val <= 0x21FF,
bSpecialSymbols = val == 0x2200 || val == 0x2201 || val == 0x2203 || val == 0x2204 || val == 0x2206|| (val >= 0x2208 && val <= 0x220D) || (val >= 0x220F && val <= 0x221E) || (val >= 0x2223 && val <= 0x223E) || (val >= 0x223F && val <= 0x22BD) || (val >= 0x22C0 && val <= 0x22FF) || val == 0x2305 || val == 0x2306 || (val >= 0x2308 && val <= 0x230B) || (val >= 0x231C && val <= 0x231F) || val == 0x2322 || val == 0x2323 || val == 0x2329 || val == 0x232A ||val == 0x233F || val == 0x23B0 || val == 0x23B1,
bOtherArrows = (val >= 0x27D1 && val <= 0x2980) || (val >= 0x2982 && val <= 0x299A) || (val >= 0x29B6 && val <= 0x29B9) || val == 0x29C0 || val == 0x29C1 || (val >= 0x29C4 && val <= 0x29C8) || (val >= 0x29CE && val <= 0x29DB) || val == 0x29DF || (val >= 0x29E1 && val <= 0x29E6) || val == 0x29EB || (val >= 0x29F4 && val <= 0x2AFF && val !== 0x2AE1 && val !== 0x2AF1) || (val >= 0x3014 && val <= 0x3017);
// apostrophe GetMathModifiedFont
// отдельно Cambria Math 0x27
return bSpecialOperator || bSpecialArrow || bSpecialSymbols || bOtherArrows;
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment