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

1. Поправила gaps для ширины радикала, расстояние для степени радикала

2. Поправила ascent для delimiters и позиционирование

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@54979 954022d7-b5bf-4e40-9824-e11837661b57
parent a3ac920a
...@@ -49,7 +49,7 @@ CGlyphOperator.prototype.fixSize = function(stretch) ...@@ -49,7 +49,7 @@ CGlyphOperator.prototype.fixSize = function(stretch)
width = sizeGlyph.width; width = sizeGlyph.width;
height = sizeGlyph.height; height = sizeGlyph.height;
center = height/2; ascent = height/2;
this.stretch = stretch > width ? stretch : width; this.stretch = stretch > width ? stretch : width;
} }
else else
...@@ -60,11 +60,11 @@ CGlyphOperator.prototype.fixSize = function(stretch) ...@@ -60,11 +60,11 @@ CGlyphOperator.prototype.fixSize = function(stretch)
// baseLine смещен чуть вверх, чтобы текст при вставке в скобки располагался по центру, относительно высоты скобок // baseLine смещен чуть вверх, чтобы текст при вставке в скобки располагался по центру, относительно высоты скобок
// плейсхолдер из-за этого располагается чуть выше, как в Ворде // плейсхолдер из-за этого располагается чуть выше, как в Ворде
//center = height/2 - 1.234722222222222*betta; //center = height/2 - 1.234722222222222*betta;
center = height/2; ascent = height/2;
this.stretch = stretch > height ? stretch : height; this.stretch = stretch > height ? stretch : height;
} }
this.size = {width: width, height: height, center: center}; this.size = {width: width, height: height, ascent: ascent};
} }
CGlyphOperator.prototype.draw_other = function() // с выравниванием к краю (относительно аргумента) CGlyphOperator.prototype.draw_other = function() // с выравниванием к краю (относительно аргумента)
{ {
...@@ -2271,29 +2271,27 @@ COperator.prototype.init = function(properties, defaultProps) // props (c ...@@ -2271,29 +2271,27 @@ COperator.prototype.init = function(properties, defaultProps) // props (c
}; };
operator.init(props); operator.init(props);
} }
else if(code === 0x3C || type === BRACKET_ANGLE_LEFT) else if(code === 0x27E8 || type === BRACKET_ANGLE_LEFT) // 0x3C => 0x27E8
{ {
codeChr = 0x3C; codeChr = 0x27E8;
typeOper = BRACKET_ANGLE_LEFT; typeOper = BRACKET_ANGLE_LEFT;
operator = new COperatorAngleBracket(); operator = new COperatorAngleBracket();
var props = var props =
{ {
location: location, location: location,
//location: DELIMITER_LOCATION_LEFT,
turn: TURN_0 turn: TURN_0
}; };
operator.init(props); operator.init(props);
} }
else if(code === 0x3E || type === BRACKET_ANGLE_RIGHT) else if(code === 0x27E9 || type === BRACKET_ANGLE_RIGHT) // 0x3E => 0x27E9
{ {
codeChr = 0x3E; codeChr = 0x27E9;
typeOper = BRACKET_ANGLE_RIGHT; typeOper = BRACKET_ANGLE_RIGHT;
operator = new COperatorAngleBracket(); operator = new COperatorAngleBracket();
var props = var props =
{ {
//location: DELIMITER_LOCATION_RIGHT,
location: location, location: location,
turn: TURN_180 turn: TURN_180
}; };
...@@ -2861,7 +2859,7 @@ COperator.prototype.drawSeparator = function(absX, absY, pGraphics) ...@@ -2861,7 +2859,7 @@ COperator.prototype.drawSeparator = function(absX, absY, pGraphics)
} }
} }
} }
COperator.prototype.fixSize = function(oMeasure, stretch) COperator.prototype.old_fixSize = function(oMeasure, stretch)
{ {
if(this.operator !== -1) if(this.operator !== -1)
{ {
...@@ -2890,8 +2888,9 @@ COperator.prototype.fixSize = function(oMeasure, stretch) ...@@ -2890,8 +2888,9 @@ COperator.prototype.fixSize = function(oMeasure, stretch)
else else
{ {
width = this.operator.size.width; width = this.operator.size.width;
height = stretch > this.operator.size.height ? stretch : this.operator.size.height; //height = stretch > this.operator.size.height ? stretch : this.operator.size.height;
ascent = this.operator.size.height/2; height = this.operator.size.height;
ascent = height/2;
} }
} }
else else
...@@ -2921,6 +2920,69 @@ COperator.prototype.fixSize = function(oMeasure, stretch) ...@@ -2921,6 +2920,69 @@ COperator.prototype.fixSize = function(oMeasure, stretch)
this.size = { width: width, height: height, ascent: ascent}; this.size = { width: width, height: height, ascent: ascent};
} }
} }
COperator.prototype.fixSize = function(oMeasure, stretch)
{
if(this.operator !== -1)
{
var width, height, ascent;
if(this.typeOper == OPERATOR_TEXT) // отдельный случай для текста в качестве оператора
{
var ctrPrp = this.getCtrPrp();
var rPrp = new CMathTextPrp();
var defaultRPrp = this.Parent.Composition.DEFAULT_RUN_PRP;
rPrp.Merge(defaultRPrp);
rPrp.Merge(ctrPrp);
rPrp.Italic = false;
oMeasure.SetFont(rPrp);
this.operator.Resize(oMeasure);
if(this.operator.loc == 0 || this.operator.loc == 1)
{
height = this.operator.size.height;
width = this.operator.size.width;
}
else
{
width = this.operator.size.width;
height = this.operator.size.height;
}
}
else
{
this.operator.fixSize(stretch);
var dims = this.operator.getCoordinateGlyph();
this.coordGlyph = {XX: dims.XX, YY: dims.YY};
if(this.operator.loc == 0 || this.operator.loc == 1)
{
width = dims.Width;
//width = this.operator.size.width;
height = this.operator.size.height;
}
else
{
width = this.operator.size.width;
height = dims.Height;
//height = this.operator.size.height;
}
//var betta = this.getCtrPrp().FontSize;
//ascent = height/2 + 0.2*betta;
}
var mgCtrPrp = this.Parent.mergeCtrTPrp();
var shCenter = this.Parent.Composition.GetShiftCenter(oMeasure, mgCtrPrp);
ascent = height/2 + shCenter;
this.size = { width: width, height: height, ascent: ascent};
}
}
COperator.prototype.setPosition = function(pos) COperator.prototype.setPosition = function(pos)
{ {
this.pos = pos; // для оператора, это будет просто позиция this.pos = pos; // для оператора, это будет просто позиция
...@@ -2928,13 +2990,18 @@ COperator.prototype.setPosition = function(pos) ...@@ -2928,13 +2990,18 @@ COperator.prototype.setPosition = function(pos)
if(this.typeOper == OPERATOR_TEXT) if(this.typeOper == OPERATOR_TEXT)
{ {
this.operator.setPosition({x: pos.x, y: pos.y}); /*var ascent = this.size.ascent,
//this.operator.setPosition(pos); height = this.size.height;
var k = ascent/height > 0.1 ? ascent/height : 0.1;
var x = pos.x,
y = pos.y + ascent - k*this.operator.size.height;
this.operator.setPosition({x: x, y: y});*/
this.operator.setPosition(pos);
} }
//this.operator.setPosition({x: pos.x, y: pos.y + this.size.center});
/*if(this.typeOper == OPERATOR_TEXT)
this.operator.setPosition(pos);*/
} }
COperator.prototype.IsJustDraw = function() COperator.prototype.IsJustDraw = function()
{ {
...@@ -3074,6 +3141,9 @@ CDelimiter.prototype.init = function(props) ...@@ -3074,6 +3141,9 @@ CDelimiter.prototype.init = function(props)
type: DELIMITER_LINE type: DELIMITER_LINE
}; };
if(props.column == 1 )
sepPrp.type = OPERATOR_EMPTY;
this.sepOper.init(sepPrp, sepDefaultPrp); this.sepOper.init(sepPrp, sepDefaultPrp);
this.sepOper.relate(this); this.sepOper.relate(this);
...@@ -3229,6 +3299,109 @@ CDelimiter.prototype.old_recalculateSize = function() ...@@ -3229,6 +3299,109 @@ CDelimiter.prototype.old_recalculateSize = function()
} }
CDelimiter.prototype.Resize = function(oMeasure) CDelimiter.prototype.Resize = function(oMeasure)
{
// размеры аргумента
var heightG = 0, widthG = 0,
ascentG = 0, descentG = 0;
// Аргумент
for(var j = 0; j < this.nCol; j++)
{
this.elements[0][j].Resize(oMeasure);
var content = this.elements[0][j].size;
widthG += content.width;
ascentG = content.ascent > ascentG ? content.ascent : ascentG;
descentG = content.height - content.ascent > descentG ? content.height - content.ascent: descentG;
}
heightG = ascentG + descentG;
var mgCtrPrp = this.mergeCtrTPrp();
var shCenter = this.Composition.GetShiftCenter(oMeasure, mgCtrPrp);
var maxAD = ascentG - shCenter > descentG + shCenter ? ascentG - shCenter: descentG + shCenter;
var bCentered = this.shape == DELIMITER_SHAPE_CENTERED,
b2Max = bCentered && (2*maxAD - heightG > 0.001);
var heightStretch = b2Max ? 2*maxAD : ascentG + descentG;
this.begOper.fixSize(oMeasure, heightStretch);
this.endOper.fixSize(oMeasure, heightStretch);
this.sepOper.fixSize(oMeasure, heightStretch);
// Общая ширина
var width = widthG + this.begOper.size.width + this.endOper.size.width + (this.nCol - 1)*this.sepOper.size.width;
var maxDimOper;
if(this.begOper.size.height > this.endOper.size.height && this.begOper.size.height > this.sepOper.size.height)
maxDimOper = this.begOper.size;
else if(this.endOper.size.height > this.sepOper.size.height)
maxDimOper = this.endOper.size;
else
maxDimOper = this.sepOper.size;
// Общие высота и ascent
var height, ascent, descent;
if(this.shape == DELIMITER_SHAPE_CENTERED)
{
var deltaHeight = heightG - maxDimOper.height;
if(deltaHeight < 0)
deltaHeight = -deltaHeight;
var deltaMaxAD = maxAD - maxDimOper.height/ 2;
if(deltaMaxAD < 0)
deltaMaxAD = -deltaMaxAD;
var deltaMinAD = (heightG - maxAD) - maxDimOper.height/2;
var bLHeight = deltaHeight < 0.001,
bLMaxAD = deltaMaxAD > 0.001,
bLMinAD = deltaMinAD > 0.001,
bTextContent = deltaMinAD < -0.001;
var bEqualOper = bLHeight,
bMiddleOper = bLMaxAD && !bLMinAD,
bLittleOper = bLMinAD;
if(bEqualOper)
{
height = 2*maxAD;
ascent = maxAD + shCenter;
}
else if(bMiddleOper)
{
height = maxDimOper.height/2 + maxAD;
ascent = ascentG > maxDimOper.ascent? ascentG : maxDimOper.ascent;
}
else if(bTextContent)
{
ascent = maxDimOper.ascent;
height = maxDimOper.height;
}
else
{
ascent = ascentG;
height = ascentG + descentG;
}
}
else
{
ascent = ascentG;
height = ascentG + descentG;
}
this.size = {width: width, height: height, ascent: ascent};
}
CDelimiter.prototype.old_Resize = function(oMeasure)
{ {
var height = 0, var height = 0,
width = 0; width = 0;
...@@ -3246,7 +3419,7 @@ CDelimiter.prototype.Resize = function(oMeasure) ...@@ -3246,7 +3419,7 @@ CDelimiter.prototype.Resize = function(oMeasure)
var Height = 0.4*FontSize; // g_oTextMeasurer.GetHeight() var Height = 0.4*FontSize; // g_oTextMeasurer.GetHeight()
var plH = 0.275*FontSize, // плейсхолдер var plH = 0.275*FontSize, // плейсхолдер
H2 = 0.08*FontSize; // временно baseLine H2 = 0.05*FontSize; // временно baseLine
if(this.shape == DELIMITER_SHAPE_CENTERED) if(this.shape == DELIMITER_SHAPE_CENTERED)
...@@ -3262,12 +3435,12 @@ CDelimiter.prototype.Resize = function(oMeasure) ...@@ -3262,12 +3435,12 @@ CDelimiter.prototype.Resize = function(oMeasure)
_ascent = ascent - DIV_CENT*FontSize; _ascent = ascent - DIV_CENT*FontSize;
_descent = descent + DIV_CENT*FontSize; _descent = descent + DIV_CENT*FontSize;
maxH = _ascent > _descent ? _ascent : _descent; var maxDim = _ascent > _descent ? _ascent : _descent;
// для случая, когда в контенте степень и пр. элементы где нужно учитовать baseLine // для случая, когда в контенте степень и пр. элементы где нужно учитовать baseLine
if(_descent < plH || _ascent < plH) if(_descent < plH || _ascent < plH)
{ {
if(maxH < plH) if(maxDim < plH)
{ {
height = _ascent + _descent; height = _ascent + _descent;
} }
...@@ -3279,7 +3452,7 @@ CDelimiter.prototype.Resize = function(oMeasure) ...@@ -3279,7 +3452,7 @@ CDelimiter.prototype.Resize = function(oMeasure)
} }
else else
{ {
height = 2*maxH; height = 2*maxDim;
ascent = height/2 + DIV_CENT*FontSize; ascent = height/2 + DIV_CENT*FontSize;
} }
} }
...@@ -3370,7 +3543,7 @@ CDelimiter.prototype.Resize = function(oMeasure) ...@@ -3370,7 +3543,7 @@ CDelimiter.prototype.Resize = function(oMeasure)
this.size = {width: width, height: height, ascent: ascent}; this.size = {width: width, height: height, ascent: ascent};
} }
CDelimiter.prototype.alignOperator = function(height) CDelimiter.prototype.old_alignOperator = function(height)
{ {
var align = 0; var align = 0;
...@@ -3396,6 +3569,39 @@ CDelimiter.prototype.alignOperator = function(height) ...@@ -3396,6 +3569,39 @@ CDelimiter.prototype.alignOperator = function(height)
return align; return align;
} }
CDelimiter.prototype.alignOperator = function(operator) // в качестве аргумента передаем высоту оператора
{
var align = 0;
var dimOper = operator.size;
var bAlign = this.size.height - dimOper.height > 0.001;
// ascent идет по бейзлайну, соответствено и сравнивать надо относительно бейзлайна (или центра)
if(bAlign)
{
if(this.shape == DELIMITER_SHAPE_CENTERED)
{
align = this.size.ascent > dimOper.ascent ? this.size.ascent - dimOper.ascent : 0;
}
else if(this.shape === DELIMITER_SHAPE_MATH)
{
var shCenter = dimOper.ascent - dimOper.height/2; // так получаем shCenter, иначе соотношение м/ду ascent и descent будет неверное
var k = 2*(this.size.ascent - shCenter)/this.size.height ;
// k/(k + 1)
// 0.2/(0.2 + 1) = 1/6
k = k > 1/4 ? k : 1/4w;
align = this.size.ascent - shCenter - k*(dimOper.ascent - shCenter);
}
}
return align;
}
CDelimiter.prototype.setPosition = function(position) CDelimiter.prototype.setPosition = function(position)
{ {
this.pos = {x: position.x, y: position.y - this.size.ascent}; this.pos = {x: position.x, y: position.y - this.size.ascent};
...@@ -3403,7 +3609,7 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3403,7 +3609,7 @@ CDelimiter.prototype.setPosition = function(position)
var x = this.pos.x, var x = this.pos.x,
y = this.pos.y; y = this.pos.y;
var pos = {x: x, y: y + this.align(this.begOper)}; var pos = {x: x, y: y + this.alignOperator(this.begOper)};
this.begOper.setPosition(pos); this.begOper.setPosition(pos);
x += this.begOper.size.width; x += this.begOper.size.width;
...@@ -3416,7 +3622,7 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3416,7 +3622,7 @@ CDelimiter.prototype.setPosition = function(position)
var Positions = new Array(); var Positions = new Array();
for(var j = 1 ; j < this.nCol; j++) for(var j = 1 ; j < this.nCol; j++)
{ {
pos = {x: x, y: y + this.align(this.sepOper)}; pos = {x: x, y: y + this.alignOperator(this.sepOper)};
Positions.push(pos); Positions.push(pos);
x += this.sepOper.size.width; x += this.sepOper.size.width;
...@@ -3428,7 +3634,7 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3428,7 +3634,7 @@ CDelimiter.prototype.setPosition = function(position)
this.sepOper.setPosition(Positions); this.sepOper.setPosition(Positions);
pos = {x: x, y: y + this.align(this.endOper)}; pos = {x: x, y: y + this.alignOperator(this.endOper)};
this.endOper.setPosition(pos); this.endOper.setPosition(pos);
} }
CDelimiter.prototype.findDisposition = function(pos) CDelimiter.prototype.findDisposition = function(pos)
......
...@@ -890,6 +890,8 @@ function CRadical() ...@@ -890,6 +890,8 @@ function CRadical()
this.signRadical = null; this.signRadical = null;
this.gapDegree = 0; this.gapDegree = 0;
this.gapWidth = 0; // в случае со степенью, если ширина степени не нулевая, добавляется расстояние для ширины
CMathBase.call(this); CMathBase.call(this);
} }
...@@ -938,11 +940,10 @@ CRadical.prototype.recalculateSize = function(oMeasure) ...@@ -938,11 +940,10 @@ CRadical.prototype.recalculateSize = function(oMeasure)
var txtPrp = this.getCtrPrp(); var txtPrp = this.getCtrPrp();
var sign = this.signRadical.size, var sign = this.signRadical.size,
gSign = this.signRadical.gapSign, gSign = this.signRadical.gapSign,
// в случае смещения бейзлайн контента тоже смещается, и по высоте артгумент может выйти чуть за пределы (т.о. значок интеграла будет расположен чуть выше, чем следовало бы, и размер аргумента выйде за аграницы) // в случае смещения baseline контента тоже смещается, и по высоте артгумент может выйти чуть за пределы (т.о. значок интеграла будет расположен чуть выше, чем следовало бы, и размер аргумента выйде за аграницы)
gArg = this.signRadical.gapArg > 2*g_dKoef_pt_to_mm ? this.signRadical.gapArg : 2*g_dKoef_pt_to_mm; // делаем смещение, т.к. для fontSize 11, 14 и меньше высота плейсхолдера не совпадает gArg = this.signRadical.gapArg > 2*g_dKoef_pt_to_mm ? this.signRadical.gapArg : 2*g_dKoef_pt_to_mm; // делаем смещение, т.к. для fontSize 11, 14 и меньше высота плейсхолдера не совпадает
// с высотой отрисовки плейсхолдера и происходит наложение черты значка радикала и плейсхолдера // с высотой отрисовки плейсхолдера и происходит наложение черты значка радикала и плейсхолдера
var gapBase = gSign + gArg; var gapBase = gSign + gArg;
if(this.type == SQUARE_RADICAL) if(this.type == SQUARE_RADICAL)
...@@ -966,21 +967,22 @@ CRadical.prototype.recalculateSize = function(oMeasure) ...@@ -966,21 +967,22 @@ CRadical.prototype.recalculateSize = function(oMeasure)
var wTick = this.signRadical.measure.widthTick, var wTick = this.signRadical.measure.widthTick,
hTick = this.signRadical.measure.heightTick; hTick = this.signRadical.measure.heightTick;
var plH = 9.877777777777776 * txtPrp.FontSize /36;
// общие gaps
var gapHeight = 0.011*txtPrp.FontSize; // добавляем это расстояние к общей высоте радикала, также как и gapWidth
this.gapWidth = 0.011*txtPrp.FontSize;
var wDegree = degr.width > wTick ? degr.width - wTick : 0; var wDegree = degr.width > wTick ? degr.width - wTick : 0;
var width = wDegree + sign.width; var width = wDegree + sign.width + this.gapWidth;
//var width = degr.width - wTick + sign.width;
var plH = 9.877777777777776 * txtPrp.FontSize /36;
var gapDegree; var gapDegree;
var shTop = 0.011*txtPrp.FontSize;
if( base.height < plH ) if( base.height < plH )
gapDegree = 1.5*txtPrp.FontSize/36; gapDegree = 1.5*txtPrp.FontSize/36;
else else
gapDegree = 3*txtPrp.FontSize/36; gapDegree = 3*txtPrp.FontSize/36;
var h1 = gapHeight + degr.height + gapDegree + hTick,
var h1 = degr.height + gapDegree + hTick + shTop,
h2 = sign.height; h2 = sign.height;
...@@ -998,7 +1000,7 @@ CRadical.prototype.recalculateSize = function(oMeasure) ...@@ -998,7 +1000,7 @@ CRadical.prototype.recalculateSize = function(oMeasure)
ascent = gapBase + shTop + base.ascent; ascent = gapBase + shTop + base.ascent;
} }
this.gapDegree = height - gapDegree - hTick - degr.height; this.gapDegree = height - h1 + gapHeight;
this.size = {width: width, height: height, ascent: ascent}; this.size = {width: width, height: height, ascent: ascent};
} }
...@@ -1009,7 +1011,6 @@ CRadical.prototype.setPosition = function(pos) ...@@ -1009,7 +1011,6 @@ CRadical.prototype.setPosition = function(pos)
if(this.type == SQUARE_RADICAL) if(this.type == SQUARE_RADICAL)
{ {
var gapLeft = this.size.width - this.elements[0][0].size.width; var gapLeft = this.size.width - this.elements[0][0].size.width;
var gapTop = this.size.ascent - this.elements[0][0].size.ascent; var gapTop = this.size.ascent - this.elements[0][0].size.ascent;
...@@ -1027,12 +1028,7 @@ CRadical.prototype.setPosition = function(pos) ...@@ -1027,12 +1028,7 @@ CRadical.prototype.setPosition = function(pos)
var wTick = this.signRadical.measure.widthTick; var wTick = this.signRadical.measure.widthTick;
/*var hTick = this.signRadical.measure.heightTick; var x1 = this.pos.x + this.gapWidth,
var hDg = degr.height + this.gap + hTick;
this.topDegr = this.size.height - hDg;*/
var x1 = this.pos.x,
y1 = this.pos.y + this.gapDegree; y1 = this.pos.y + this.gapDegree;
this.elements[0][0].setPosition({x: x1, y: y1}); this.elements[0][0].setPosition({x: x1, y: y1});
...@@ -1109,9 +1105,14 @@ CRadical.prototype.findDisposition = function(mCoord) ...@@ -1109,9 +1105,14 @@ CRadical.prototype.findDisposition = function(mCoord)
mouseCoord.x = degr.width; mouseCoord.x = degr.width;
inside_flag = 1; inside_flag = 1;
} }
else if(mCoord.x < this.gapWidth)
{
mouseCoord.x = 0;
inside_flag = 0;
}
else else
{ {
mouseCoord.x = mCoord.x; mouseCoord.x = mCoord.x - this.gapWidth;
} }
mouseCoord.x = mCoord.x; mouseCoord.x = mCoord.x;
......
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