}
+int InsetMathScript::dy01(int asc, int des, int what) const
+{
+ int dasc = 0;
+ int slevel = 0;
+ if (hasDown()) {
+ dasc = down().ascent();
+ slevel = nuc().slevel();
+ int ascdrop = dasc - slevel;
+ int desdrop = des + nuc().sshift();
+ int mindes = nuc().mindes();
+ des = max(desdrop, ascdrop);
+ des = max(mindes, des);
+ }
+ if (hasUp()) {
+ int minasc = nuc().minasc();
+ int ascdrop = asc - up().mindes();
+ int udes = up().descent();
+ asc = udes + nuc().sshift();
+ asc = max(ascdrop, asc);
+ asc = max(minasc, asc);
+ if (hasDown()) {
+ int del = asc - udes - dasc;
+ if (del + des <= 2) {
+ des = 2 - del;
+ del = slevel - asc + udes;
+ if (del > 0) {
+ asc += del;
+ des -= del;
+ }
+ }
+ }
+ }
+ return what ? asc : des;
+}
+
+
int InsetMathScript::dy0() const
{
int nd = ndes();
int des = down().ascent();
if (hasLimits())
des += nd + 2;
- else
- des = max(des, nd);
+ else {
+ int na = nasc();
+ des = dy01(na, nd, 0);
+ }
return des;
}
int asc = up().descent();
if (hasLimits())
asc += na + 2;
- else
- asc = max(asc, na);
+ else {
+ int nd = ndes();
+ asc = dy01(na, nd, 1);
+ }
asc = max(asc, 5);
return asc;
}
dim.wid = max(dim.wid, down().width());
dim.wid += nwid();
}
- dim.asc = dy1() + (hasUp() ? up().ascent() : 0);
- dim.des = dy0() + (hasDown() ? down().descent() : 0);
+ int na = nasc();
+ if (hasUp()) {
+ int asc = dy1() + up().ascent();
+ dim.asc = max(na, asc);
+ } else
+ dim.asc = na;
+ int nd = ndes();
+ if (hasDown()) {
+ int des = dy0() + down().descent();
+ dim.des = max(nd, des);
+ } else
+ dim.des = nd;
metricsMarkers(dim);
if (dim_ == dim)
return false;
int dxx() const;
/// returns width of nucleus if any
int nwid() const;
+ /// returns y offset for either superscript or subscript
+ int dy01(int asc, int des, int what) const;
/// returns y offset for superscript
int dy0() const;
/// returns y offset for subscript
void MathArray::metrics(MetricsInfo & mi) const
{
dim_ = theFontMetrics(mi.base.font).dimension('I');
+ int xascent = theFontMetrics(mi.base.font).dimension('x').ascent();
+ minasc_ = xascent;
+ mindes_ = (3 * xascent) / 4;
+ slevel_ = (4 * xascent) / 5;
+ sshift_ = xascent / 4;
if (empty())
return;
+ dim_.asc = 0;
dim_.wid = 0;
Dimension d;
//BufferView & bv = *mi.base.bv;
Dimension const & dim() const { return dim_; }
/// dimensions of cell
void setDim(Dimension const & d) const { dim_ = d; }
+ /// minimum ascent offset for superscript
+ int minasc() const { return minasc_; }
+ /// minimum descent offset for subscript
+ int mindes() const { return mindes_; }
+ /// level above/below which super/subscript should extend
+ int slevel() const { return slevel_; }
+ /// additional super/subscript shift
+ int sshift() const { return sshift_; }
protected:
/// cached dimensions of cell
mutable Dimension dim_;
+ /// cached values for super/subscript placement
+ mutable int minasc_;
+ mutable int mindes_;
+ mutable int slevel_;
+ mutable int sshift_;
private:
/// is this an exact match at this position?