]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathSupport.cpp
Revert "Fix #10863 compiler warnings."
[lyx.git] / src / mathed / MathSupport.cpp
index 3d708406d3c2cfe9a5dbc8dd248d6d7935b7bbbf..325d640915e4ea2500693451e38494d4096c2286 100644 (file)
 
 #include "InsetMathFont.h"
 #include "InsetMathSymbol.h"
+#include "Length.h"
 #include "MathData.h"
+#include "MathFactory.h"
 #include "MathParser.h"
 #include "MathStream.h"
 
+#include "LaTeXFeatures.h"
 #include "MetricsInfo.h"
 
 #include "frontends/FontLoader.h"
@@ -492,7 +495,7 @@ public:
        }
 };
 
-static init_deco_table dummy;
+static init_deco_table dummy_deco_table;
 
 
 deco_struct const * search_deco(docstring const & name)
@@ -502,7 +505,7 @@ deco_struct const * search_deco(docstring const & name)
 }
 
 
-} // namespace anon
+} // namespace
 
 
 int mathed_font_em(FontInfo const & font)
@@ -510,6 +513,12 @@ int mathed_font_em(FontInfo const & font)
        return theFontMetrics(font).em();
 }
 
+
+int mathed_font_x_height(FontInfo const & font)
+{
+       return theFontMetrics(font).ascent('x');
+}
+
 /* The math units. Quoting TeX by Topic, p.205:
  *
  * Spacing around mathematical objects is measured in mu units. A mu
@@ -533,25 +542,15 @@ int mathed_font_em(FontInfo const & font)
  * above.
  */
 
-int mathed_thinmuskip(FontInfo font)
+int mathed_mu(FontInfo const & font, double mu)
 {
-       font.setFamily(SYMBOL_FAMILY);
-       return support::iround(3.0 / 18 * theFontMetrics(font).em());
+       MetricsBase mb(nullptr, font);
+       return Length(mu, Length::MU).inPixels(mb);
 }
 
-
-int mathed_medmuskip(FontInfo font)
-{
-       font.setFamily(SYMBOL_FAMILY);
-       return support::iround(4.0 / 18 * theFontMetrics(font).em());
-}
-
-
-int mathed_thickmuskip(FontInfo font)
-{
-       font.setFamily(SYMBOL_FAMILY);
-       return support::iround(5.0 / 18 * theFontMetrics(font).em());
-}
+int mathed_thinmuskip(FontInfo const & font) { return mathed_mu(font, 3.0); }
+int mathed_medmuskip(FontInfo const & font) { return mathed_mu(font, 4.0); }
+int mathed_thickmuskip(FontInfo const & font) { return mathed_mu(font, 5.0); }
 
 
 int mathed_char_width(FontInfo const & font, char_type c)
@@ -563,7 +562,7 @@ int mathed_char_width(FontInfo const & font, char_type c)
 int mathed_char_kerning(FontInfo const & font, char_type c)
 {
        frontend::FontMetrics const & fm = theFontMetrics(font);
-       return fm.rbearing(c) - fm.width(c);
+       return max(0, fm.rbearing(c) - fm.width(c));
 }
 
 
@@ -641,8 +640,8 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                } else {
                        int xp[32];
                        int yp[32];
-                       int const n = int(d[i++]);
-                       for (int j = 0; j < n; ++j) {
+                       int const n2 = int(d[i++]);
+                       for (int j = 0; j < n2; ++j) {
                                double xx = d[i++];
                                double yy = d[i++];
 //          lyxerr << ' ' << xx << ' ' << yy << ' ';
@@ -654,13 +653,13 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                                yp[j] = int(y + yy + 0.5);
                                //  lyxerr << "P[" << j ' ' << xx << ' ' << yy << ' ' << x << ' ' << y << ']';
                        }
-                       pi.pain.lines(xp, yp, n, pi.base.font.color());
+                       pi.pain.lines(xp, yp, n2, pi.base.font.color());
                }
        }
 }
 
 
-void mathedSymbolDim(MetricsInfo & mi, Dimension & dim, latexkeys const * sym)
+void mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym)
 {
        LASSERT((bool)sym, return);
        //lyxerr << "metrics: symbol: '" << sym->name
@@ -670,10 +669,10 @@ void mathedSymbolDim(MetricsInfo & mi, Dimension & dim, latexkeys const * sym)
 
        bool const italic_upcase_greek = sym->inset == "cmr" &&
                sym->extra == "mathalpha" &&
-               mi.base.fontname == "mathit";
+               mb.fontname == "mathit";
        std::string const font = italic_upcase_greek ? "cmm" : sym->inset;
-       Changer dummy = mi.base.changeFontSet(font);
-       mathed_string_dim(mi.base.font, sym->draw, dim);
+       Changer dummy = mb.changeFontSet(font);
+       mathed_string_dim(mb.font, sym->draw, dim);
 }
 
 
@@ -968,8 +967,13 @@ docstring asString(MathData const & ar)
 
 void asArray(docstring const & str, MathData & ar, Parse::flags pf)
 {
+       // If the QUIET flag is set, we are going to parse for either
+       // a paste operation or a macro definition. We try to do the
+       // right thing in all cases.
+
        bool quiet = pf & Parse::QUIET;
-       if ((str.size() == 1 && quiet) || (!mathed_parse_cell(ar, str, pf) && quiet))
+       bool macro = pf & Parse::MACRODEF;
+       if ((str.size() == 1 && quiet) || (!mathed_parse_cell(ar, str, pf) && quiet && !macro))
                mathed_parse_cell(ar, str, pf | Parse::VERBATIM);
 }
 
@@ -994,4 +998,23 @@ docstring asString(MathAtom const & at)
 }
 
 
+int axis_height(MetricsBase & mb)
+{
+       Changer dummy = mb.changeFontSet("mathnormal");
+       return theFontMetrics(mb.font).ascent('-') - 1;
+}
+
+
+void validate_math_word(LaTeXFeatures & features, docstring const & word)
+{
+       MathWordList const & words = mathedWordList();
+       MathWordList::const_iterator it = words.find(word);
+       if (it != words.end()) {
+               string const req = it->second.requires;
+               if (!req.empty())
+                       features.require(req);
+       }
+}
+
+
 } // namespace lyx