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

1. Поправила баг : не пересчитывались Gaps у элементов на быстром пересчете

2. Сокращение времени выполнения функций, свзанных с выставлением Gaps за счет :
   a. сокращения числа вызовов (на обычном пересчете вызвается один раз в начале пересчета, на быстром соответствующие функции вызваются исключительно для строк, которые пересчитываются на Recalculate_Range, а Gaps пересчитываются только для тех элементов, где произошли изменения)
   b. убрала функцию округления ceil

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@62887 954022d7-b5bf-4e40-9824-e11837661b57
parent b1fb488a
......@@ -1092,30 +1092,26 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var MathSettings = Get_WordDocumentDefaultMathSettings();
// информация о пересчете
var RPI = new CRPI();
RPI.MergeMathInfo(this.ParaMathRPI);
var ArgSize = new CMathArgSize();
// первый пересчет
if(PrevLineObject == null && true == bStartLine && PRS.bFastRecalculate == false)
{
this.PageInfo.Reset();
this.PageInfo.SetStartPos(Page, ParaLine);
this.Root.PreRecalc(null, this, ArgSize, RPI);
}
// пока будем каждый раз обновлять информацию (т.к. когда не inline формула становиться inline может получиться так, что пересчет для первой строки не придет)
// когда пересчет всегда будет приходить для первой строки, эта часть будет выполняться только при первом пересчете первой строки
// информация о пересчете
var RPI = new CRPI();
RPI.MergeMathInfo(this.ParaMathRPI);
var ArgSize = new CMathArgSize();
this.Root.Set_Paragraph(Para);
this.Root.Set_ParaMath(this, null);
// в случае если нужно сделать для пересчета каждой строки этот блоки, необходимо переделать PreRecalc, чтобы не перезаписывались Gaps, которые были уже рассчитаны на UpdateOperators
if(this.Root.IsFirstRange(ParaLine, ParaRange))
{
this.Root.PreRecalc(null, this, ArgSize, RPI);
}
////////////////////////////////////////////////////////////
this.PageInfo.UpdateCurrentPage(Page);
......@@ -1153,6 +1149,14 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.PrevLineRecalcInfo.Object = null;
}
// заглушка для пересчета Gaps элементов в текущей строке
// если быстрый пересчет проверим нужно ли пересчитывать gaps у элементов текущей строки
if(PRS.bFastRecalculate == true)
{
this.Root.Math_UpdateGaps(ParaLine, ParaRange);
}
this.Root.Recalculate_Range(PRS, ParaPr, Depth);
if(PRS.NewRange == false)
......@@ -1351,9 +1355,6 @@ ParaMath.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
var RPI = new CRPI();
RPI.MergeMathInfo(this.ParaMathRPI);
RPI.NeedResize = true;
RPI.PRS = this.Paragraph.m_oPRSW;
this.Root.PreRecalc(null, this, new CMathArgSize(), RPI);
this.Root.Resize(g_oTextMeasurer, RPI);
......@@ -3194,10 +3195,6 @@ function MatGetKoeffArgSize(FontSize, ArgSize)
return FontKoef;
}
function MatReverseFontSize(FontSize, FontKoef)
{
return (((FontSize/FontKoef * 2 + 0.5) | 0) / 2) ;
}
function CMathRecalculateInfo()
{
......@@ -3249,6 +3246,7 @@ CMathRecalculateObject.prototype.Compare = function(PageInfo)
{
var result = true;
if(this.bFastRecalculate == false)
result = false;
......
......@@ -1911,11 +1911,16 @@ ParaRun.prototype.Recalculate_MeasureContent = function()
var InfoMathText;
if(para_Math_Run == this.Type)
{
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText(),
bEqArray = this.Parent.IsEqArray();
var InfoTextPr =
{
TextPr: Pr,
ArgSize: this.Parent.Compiled_ArgSz.value,
bNormalText: this.IsNormalText(),
bEqArray: this.Parent.IsEqArray()
};
InfoMathText = new CMathInfoTextPr(Pr, ArgSize, bNormalText, bEqArray);
InfoMathText = new CMathInfoTextPr(InfoTextPr);
}
for ( var Pos = 0; Pos < ContentLength; Pos++ )
......@@ -3950,7 +3955,15 @@ ParaRun.prototype.Draw_Elements = function(PDSE)
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
InfoMathText = new CMathInfoTextPr(CurTextPr, ArgSize, bNormalText, this.bEqArray);
var InfoTextPr =
{
TextPr: CurTextPr,
ArgSize: ArgSize,
bNormalText: bNormalText,
bEqArray: this.bEqArray
};
InfoMathText = new CMathInfoTextPr(InfoTextPr);
}
if ( undefined !== CurTextPr.Shd && shd_Nil !== CurTextPr.Shd.Value )
......@@ -8682,6 +8695,7 @@ ParaRun.prototype.Math_Is_End = function(_CurLine, _CurRange)
return EndPos == this.Content.length;
};
ParaRun.prototype.IsEmptyLine = function(_CurLine, _CurRange)
{
var CurLine = _CurLine - this.StartLine;
......@@ -8826,7 +8840,7 @@ ParaRun.prototype.Math_PreRecalc = function(Parent, ParaMath, ArgSize, RPI, Gaps
if(this.Pr.FontSize !== null && this.Pr.FontSize !== undefined)
{
FontKoef = MatGetKoeffArgSize(this.Pr.FontSize, ArgSize);
Pr.FontSize = MatReverseFontSize(this.Pr.FontSize, FontKoef);
Pr.FontSize = (((this.Pr.FontSize/FontKoef * 2 + 0.5) | 0) / 2);
this.RecalcInfo.TextPr = true;
this.RecalcInfo.Measure = true;
}
......@@ -8834,7 +8848,7 @@ ParaRun.prototype.Math_PreRecalc = function(Parent, ParaMath, ArgSize, RPI, Gaps
if(this.Pr.FontSizeCS !== null && this.Pr.FontSizeCS !== undefined)
{
FontKoef = MatGetKoeffArgSize( this.Pr.FontSizeCS, ArgSize);
Pr.FontSizeCS = MatReverseFontSize(this.Pr.FontSizeCS, FontKoef);
Pr.FontSizeCS = (((this.Pr.FontSizeCS/FontKoef * 2 + 0.5) | 0) / 2);
this.RecalcInfo.TextPr = true;
this.RecalcInfo.Measure = true;
}
......@@ -8848,8 +8862,49 @@ ParaRun.prototype.Math_PreRecalc = function(Parent, ParaMath, ArgSize, RPI, Gaps
if( !this.Content[Pos].IsAlignPoint() )
GapsInfo.setGaps(this.Content[Pos], FontSize);
this.Content[Pos].PreRecalc(this);
this.Content[Pos].PreRecalc(this, ParaMath);
this.Content[Pos].SetUpdateGaps(false);
}
};
ParaRun.prototype.Math_UpdateGaps = function(_CurLine, _CurRange, GapsInfo)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange);
var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange);
var FontSize = this.Get_CompiledPr(false).FontSize;
for(var Pos = StartPos; Pos < EndPos; Pos++)
{
GapsInfo.updateCurrentObject(this.Content[Pos], FontSize);
var bUpdateCurrent = this.Content[Pos].IsNeedUpdateGaps();
if(bUpdateCurrent || GapsInfo.bUpdate)
{
GapsInfo.updateGaps();
}
GapsInfo.bUpdate = bUpdateCurrent;
this.Content[Pos].SetUpdateGaps(false);
}
};
ParaRun.prototype.UpdLastElementForGaps = function(_CurLine, _CurRange, GapsInfo)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange);
var FontSize = this.Get_CompiledPr(false).FontSize;
var Last = this.Content[EndPos];
GapsInfo.updateCurrentObject(Last, FontSize);
};
ParaRun.prototype.IsPlaceholder = function()
{
......
......@@ -462,6 +462,25 @@ CMathBase.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI, GapsInf
this.elements[i][j].PreRecalc(this, ParaMath, ArgSize, RPI);
};
CMathBase.prototype.Math_UpdateGaps = function(_CurLine, _CurRange, GapsInfo)
{
GapsInfo.updateCurrentObject(this, this.TextPrControlLetter.FontSize);
if(GapsInfo.bUpdate == true)
{
GapsInfo.updateGaps();
}
if(this.bOneLine == false)
{
var BrPos = this.NumBreakContent;
this.Content[BrPos].Math_UpdateGaps(_CurLine, _CurRange);
}
};
CMathBase.prototype.UpdLastElementForGaps = function(CurLine, CurRange, GapsInfo)
{
GapsInfo.updateCurrentObject(this, this.TextPrControlLetter.FontSize);
};
CMathBase.prototype.recalculateSize = function(oMeasure, RPI)
{
var width = 0;
......
......@@ -9,8 +9,6 @@ function CRPI()
this.bEqArray = false; /*для амперсанда*/
this.bMathFunc = false;
this.bRecalcCtrPrp = false; // пересчет ctrPrp нужен, когда на Undo и тп изменился размер первого Run, а ctrPrp уже для мат объектов пересчитались
this.PRS = null;
this.bCorrect_FontSize = false;
}
CRPI.prototype.Copy = function()
......@@ -24,7 +22,6 @@ CRPI.prototype.Copy = function()
RPI.bEqArray = this.bEqArray;
RPI.bMathFunc = this.bMathFunc;
RPI.bRecalcCtrPrp = this.bRecalcCtrPrp;
RPI.PRS = this.PRS;
RPI.bCorrect_FontSize = this.bCorrect_FontSize;
return RPI;
......@@ -32,7 +29,6 @@ CRPI.prototype.Copy = function()
CRPI.prototype.MergeMathInfo = function(MathInfo)
{
this.bInline = MathInfo.bInline;
this.bRecalcCtrPrp = MathInfo.bRecalcCtrPrp;
this.bChangeInline = MathInfo.bChangeInline;
this.bCorrect_FontSize = MathInfo.bCorrect_FontSize;
......@@ -196,7 +192,6 @@ function CGeneralObjectGaps(Left, Right)
this.right = Right;
}
function CGaps(oSign, oEqual, oZeroOper, oLett)
{
this.sign = oSign;
......@@ -361,18 +356,25 @@ function CMathGapsInfo(argSize)
this.LeftFontSize = null;
this.CurrentFontSize = null;
this.bUpdate = false;
}
CMathGapsInfo.prototype =
{
setGaps: function(Current, CurrentFontSize)
{
this.updateCurrentObject(Current, CurrentFontSize);
this.updateGaps();
},
updateCurrentObject: function(Current, CurrentFontSize)
{
this.Left = this.Current;
this.LeftFontSize = this.CurrentFontSize;
this.Current = Current;
this.CurrentFontSize = CurrentFontSize;
},
updateGaps: function()
{
if(this.argSize < 0)
{
this.Current.GapLeft = 0;
......@@ -445,16 +447,13 @@ CMathGapsInfo.prototype =
leftCoeff = 0;
}
leftCoeff = Math.ceil(leftCoeff*10)/10;
rightCoeff = Math.ceil(rightCoeff*10)/10;
var LGapSign = 0.1513*this.CurrentFontSize;
this.Current.GapLeft = Math.ceil(leftCoeff*LGapSign*10)/10; // если ни один случай не выполнился, выставляем "нулевые" gaps (default): необходимо, если что-то удалили и объект стал первый или последним в контенте
this.Current.GapLeft = (leftCoeff*LGapSign*100 | 0)/100; // если ни один случай не выполнился, выставляем "нулевые" gaps (default): необходимо, если что-то удалили и объект стал первый или последним в контенте
if(this.Left != null)
{
var RGapSign = 0.1513*this.LeftFontSize;
this.Left.GapRight = Math.ceil(rightCoeff*RGapSign*10)/10;
this.Left.GapRight = (rightCoeff*RGapSign*100 | 0)/100;
}
}
},
......@@ -507,7 +506,6 @@ CMathGapsInfo.prototype =
return {bEmptyGaps: bEmptyGaps, bChildGaps: bChildGaps};
}
};
function CMPrp()
......@@ -634,7 +632,6 @@ CMPrp.prototype =
};
function CMathContent()
{
CMathContent.superclass.constructor.call(this);
......@@ -750,6 +747,31 @@ CMathContent.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI)
GapsInfo.Current.GapRight = 0;
};
CMathContent.prototype.Math_UpdateGaps = function(_CurLine, _CurRange)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange);
var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange);
var GapsInfo = new CMathGapsInfo(this.Compiled_ArgSz.value);
if(StartPos !== undefined && EndPos !== undefined && CurLine < this.protected_GetLinesCount())
{
if(CurLine > 0 && StartPos !== EndPos) // выставим объект, который будет Left для первого элемента в текущей строке
{
var EndPosPrev = this.protected_GetRangeEndPos(CurLine - 1, CurRange);
this.Content[EndPosPrev].UpdLastElementForGaps(_CurLine - 1, _CurRange, GapsInfo);
}
for(var Pos = StartPos; Pos <= EndPos; Pos++)
{
this.Content[Pos].Math_UpdateGaps(_CurLine, _CurRange, GapsInfo);
}
}
};
CMathContent.prototype.Resize = function(oMeasure, RPI) // пересчитываем всю формулу
{
if ( false === this.RecalcInfo.Measure )
......@@ -2051,8 +2073,6 @@ CMathContent.prototype.Insert_MathContent = function(oMathContent, Pos, bSelect)
this.Correct_Content(true);
this.Correct_ContentPos(-1);
};
CMathContent.prototype.Set_Paragraph = ParaHyperlink.prototype.Set_Paragraph;
CMathContent.prototype.Get_ElementByPos = ParaHyperlink.prototype.Get_ElementByPos;
CMathContent.prototype.Set_ParaMath = function(ParaMath, Parent)
{
this.Parent = Parent;
......
......@@ -14,9 +14,12 @@
// http://www.dpva.info/Guide/GuideMathematics/GuideMathematicsNumericalSystems/TableCodeEquivalent/
var DIV_CENT = 0.1386;
var StartTextElement = 0x2B1A; // Cambria Math
var MathTextInfo_MathText = 1;
var MathTextInfo_SpecialOperator = 2;
var MathTextInfo_NormalText = 3;
function CMathSize()
{
this.Type = MATH_SIZE;
......@@ -139,6 +142,7 @@ function CMathText(bJDraw)
this.Type = para_Math_Text;
this.bJDraw = (undefined === bJDraw ? false : bJDraw);
this.bUpdateGaps = true;
this.RecalcInfo =
{
......@@ -658,7 +662,7 @@ CMathText.prototype.Measure = function(oMeasure, TextPr, InfoMathText)
this.RecalcInfo.StyleCode = this.value;
metricsTxt = oMeasure.Measure2Code(this.value);
}
}
else
{
var ascent, width, height, descent;
......@@ -726,13 +730,23 @@ CMathText.prototype.Measure = function(oMeasure, TextPr, InfoMathText)
this.Width = (this.size.width * TEXTWIDTH_DIVIDER) | 0;
};
CMathText.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI)
CMathText.prototype.PreRecalc = function(Parent, ParaMath)
{
this.ParaMath = ParaMath;
if(!this.bJDraw)
this.Parent = Parent;
else
this.Parent = null;
this.bUpdateGaps = false;
};
CMathText.prototype.SetUpdateGaps = function(bUpd)
{
this.bUpdateGaps = bUpd;
};
CMathText.prototype.IsNeedUpdateGaps = function()
{
return this.bUpdateGaps;
};
CMathText.prototype.Draw = function(x, y, pGraphics, InfoTextPr)
{
......@@ -1011,25 +1025,21 @@ CMathAmp.prototype.Read_FromBinary = function(Reader)
{
};
var MathTextInfo_MathText = 1;
var MathTextInfo_SpecialOperator = 2;
var MathTextInfo_NormalText = 3;
function CMathInfoTextPr(TextPr, ArgSize, bNormalText, bEqArray)
function CMathInfoTextPr(InfoTextPr)
{
this.CurrType = -1; // в первый раз Font всегда выставляем
this.TextPr = TextPr;
this.ArgSize = ArgSize;
this.TextPr = InfoTextPr.TextPr;
this.ArgSize = InfoTextPr.ArgSize;
this.Font =
{
FontFamily: {Name: "Cambria Math", Index : -1},
FontSize: TextPr.FontSize,
FontSize: this.TextPr.FontSize,
Italic: false,
Bold: false
};
this.bNormalText = bNormalText;
this.bEqArray = bEqArray;
this.bNormalText = InfoTextPr.bNormalText;
this.bEqArray = InfoTextPr.bEqArray;
this.RFontsCompare = [];
......@@ -1095,4 +1105,4 @@ CMathInfoTextPr.prototype.IsSpecilalOperator = function(val)
// отдельно 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