]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/support.C
brush off the decoration drawing code a bit
[lyx.git] / src / mathed / support.C
index 94e2751a9207e90fd61fb803d04bdb276365d1a1..04750e68fc2868e0e7752a46660e1cb7f441a7a9 100644 (file)
@@ -11,6 +11,7 @@
 #include "Painter.h"
 #include "debug.h"
 
+using std::map;
 using std::endl;
 using std::max;
 
@@ -25,73 +26,32 @@ bool isBinaryOp(char c, MathTextCodes type)
 class Matrix {
 public:
        ///
-       typedef float matriz_data[2][2];
+       Matrix(int, double, double);
        ///
-       Matrix();
-       ///
-       void rotate(int);
-       ///
-       void escalate(float, float);
-       ///
-       void transform(float, float, float &, float &);
+       void transform(double &, double &);
 private:
        ///
-       matriz_data m_;
-       ///
-       void multiply(matriz_data & a);
+       double m_[2][2];
 };
 
-Matrix::Matrix()
-{
-       m_[0][0] = 1;
-       m_[0][1] = 0;
-       m_[1][0] = 0;
-       m_[1][1] = 1;
-}
-
-void Matrix::rotate(int code)
-{
-       matriz_data r;
-       r[0][0] = 1;
-       r[0][1] = 0;
-       r[1][0] = 0;
-       r[1][1] = 1;
-       float const cs = (code & 1) ? 0 : (1 - code);
-       float const sn = (code & 1) ? (2 - code) : 0;
-       r[0][0] = cs;
-       r[0][1] = sn;
-       r[1][0] = -r[0][1];
-       r[1][1] = r[0][0];
-       multiply(r);
-}
 
-void Matrix::escalate(float x, float y)
+Matrix::Matrix(int code, double x, double y)
 {
-       matriz_data s;
-       s[0][0] = x;
-       s[0][1] = 0;
-       s[1][0] = 0;
-       s[1][1] = y;
-       multiply(s);
+       double const cs = (code & 1) ? 0 : (1 - code);
+       double const sn = (code & 1) ? (2 - code) : 0;
+       m_[0][0] =  cs * x;
+       m_[0][1] =  sn * x;
+       m_[1][0] = -sn * y;
+       m_[1][1] =  cs * y;
 }
 
-void Matrix::multiply(matriz_data & a)
-{
-       matriz_data c;
-       c[0][0] = a[0][0] * m_[0][0] + a[0][1] * m_[1][0];
-       c[1][0] = a[1][0] * m_[0][0] + a[1][1] * m_[1][0];
-       c[0][1] = a[0][0] * m_[0][1] + a[0][1] * m_[1][1];
-       c[1][1] = a[1][0] * m_[0][1] + a[1][1] * m_[1][1];
-       m_[0][0] = c[0][0];     
-       m_[0][1] = c[0][1];     
-       m_[1][0] = c[1][0];     
-       m_[1][1] = c[1][1];     
-}
 
-void Matrix::transform(float xp, float yp, float & x, float & y)
+void Matrix::transform(double & x, double & y)
 {
-       x = m_[0][0] * xp + m_[0][1] * yp;
-       y = m_[1][0] * xp + m_[1][1] * yp;
+       double xx = m_[0][0] * x + m_[0][1] * y;
+       double yy = m_[1][0] * x + m_[1][1] * y;
+       x = xx;
+       y = yy;
 }
 
 
@@ -290,7 +250,7 @@ namespace {
  */
 
 
-float const parenthHigh[] = {
+double const parenthHigh[] = {
        2.0, 13.0,
        0.9840, 0.0014, 0.7143, 0.0323, 0.4603, 0.0772,
        0.2540, 0.1278, 0.1746, 0.1966, 0.0952, 0.3300,
@@ -301,7 +261,7 @@ float const parenthHigh[] = {
 };
 
 
-float const parenth[] = {
+double const parenth[] = {
        2.0, 13.0,
        0.9930, 0.0071, 0.7324, 0.0578, 0.5141, 0.1126,
        0.3380, 0.1714, 0.2183, 0.2333, 0.0634, 0.3621,
@@ -312,7 +272,7 @@ float const parenth[] = {
 };
 
 
-float const brace[] = {
+double const brace[] = {
        2.0, 21.0,
        0.9492, 0.0020, 0.9379, 0.0020, 0.7458, 0.0243,
        0.5819, 0.0527, 0.4859, 0.0892, 0.4463, 0.1278,
@@ -326,7 +286,7 @@ float const brace[] = {
 
 
 // Is this correct? (Lgb)
-float const arrow[] = {
+double const arrow[] = {
        4, 7,
        0.0150, 0.7500, 0.2000, 0.6000, 0.3500, 0.3500,
        0.5000, 0.0500, 0.6500, 0.3500, 0.8000, 0.6000,
@@ -337,7 +297,7 @@ float const arrow[] = {
 
 
 // Is this correct? (Lgb)
-float const Arrow[] = {
+double const Arrow[] = {
        4, 7,
        0.0150, 0.7500, 0.2000, 0.6000, 0.3500, 0.3500,
        0.5000, 0.0500, 0.6500, 0.3500, 0.8000, 0.6000,
@@ -348,7 +308,7 @@ float const Arrow[] = {
 };
 
 
-float const udarrow[] = {
+double const udarrow[] = {
        2, 3,
        0.015, 0.25,  0.5, 0.05, 0.95, 0.25,
        2, 3,
@@ -358,7 +318,7 @@ float const udarrow[] = {
 };
 
 
-float const Udarrow[] = {
+double const Udarrow[] = {
        2, 3,
        0.015, 0.25,  0.5, 0.05, 0.95, 0.25,
        2, 3,
@@ -369,47 +329,47 @@ float const Udarrow[] = {
 };
 
 
-float const brack[] = {
+double const brack[] = {
        2.0, 4,
        0.95, 0.05,  0.05, 0.05,  0.05, 0.95,  0.95, 0.95,
        0.0
 };
 
 
-float const corner[] = {
+double const corner[] = {
        2.0, 3,
        0.95, 0.05,  0.05, 0.05,  0.05, 0.95,
        0.0
 };
 
 
-float const angle[] = {
+double const angle[] = {
        2.0, 3,
        1, 0,  0.05, 0.5,  1, 1,
        0.0
 };
 
 
-float const slash[] = {
+double const slash[] = {
        1, 0.95, 0.05,  0.05, 0.95, 
        0.0
 };
 
 
-float const hline[] = {
+double const hline[] = {
        1, 0.05, 0.5,  0.95, 0.5, 
        0.0
 };
 
 
-float const hline2[] = {
+double const hline2[] = {
    1, 0.1, 0.5,  0.3, 0.5,
    1, 0.7, 0.5,  0.9, 0.5,
    0.0
 }; 
 
 
-float const hline3[] = {
+double const hline3[] = {
        1, 0.1, 0,  0.15, 0,
        1, 0.475, 0,  0.525, 0,
        1, 0.85, 0,  0.9, 0,  
@@ -417,7 +377,7 @@ float const hline3[] = {
 };
 
 
-float const dline3[] = {
+double const dline3[] = {
        1, 0.1, 0.1,  0.15, 0.15,
        1, 0.475, 0.475,  0.525, 0.525,
        1, 0.85, 0.85,  0.9, 0.9,
@@ -425,26 +385,26 @@ float const dline3[] = {
 };     
 
 
-float const hlinesmall[] = {
+double const hlinesmall[] = {
        1, 0.4, 0.5,  0.6, 0.5, 
        0.0
 };
 
 
-float const vert[] = {
+double const vert[] = {
        1, 0.5, 0.05,  0.5, 0.95, 
        0.0
 };
 
 
-float const  Vert[] = {
+double const  Vert[] = {
        1, 0.3, 0.05,  0.3, 0.95, 
        1, 0.7, 0.05,  0.7, 0.95,
        0.0
 };
 
 
-float const tilde[] = {
+double const tilde[] = {
        2.0, 4,
        0.05, 0.8,  0.25, 0.2,  0.75, 0.8,  0.95, 0.2,
        0.0
@@ -452,73 +412,74 @@ float const tilde[] = {
 
 
 struct deco_struct {
-       float const * data;
+       double const * data;
        int angle;
 };
 
 struct named_deco_struct {
        char const * name;
-       float const * data;
+       double const * data;
        int angle;
 };
 
 named_deco_struct deco_table[] = {   
        // Decorations
-       {"widehat",       angle,      3 },
-       {"widetilde",     tilde,      0 },
-       {"underline",     hline,      0 },
-       {"overline",      hline,      0 },
-       {"underbrace",    brace,      1 },
-       {"overbrace",     brace,      3 },
-       {"overleftarrow", arrow,      1 },
-       {"overightarrow", arrow,      3 },
+       {"widehat",        angle,      3 },
+       {"widetilde",      tilde,      0 },
+       {"underline",      hline,      0 },
+       {"overline",       hline,      0 },
+       {"underbrace",     brace,      1 },
+       {"overbrace",      brace,      3 },
+       {"overleftarrow",  arrow,      1 },
+       {"overrightarrow", arrow,      3 },
                                                          
        // Delimiters 
-       {"(",            parenth,    0 },
-       {")",            parenth,    2 },
-       {"{",            brace,      0 },
-       {"}",            brace,      2 },
-       {"[",            brack,      0 },
-       {"]",            brack,      2 },
-       {"|",            vert,       0 },
-       {"/",            slash,      0 },
-       {"Vert",         Vert,       0 },
-       {"'",            slash,      1 },
-       {"langle",       angle,      0 },
-       {"lceil",        corner,     0 }, 
-       {"lfloor",       corner,     1 },  
-       {"rangle",       angle,      2 }, 
-       {"rceil",        corner,     3 }, 
-       {"rfloor",       corner,     2 },
-       {"downarrow",    arrow,      2 },
-       {"Downarrow",    Arrow,      2 }, 
-       {"uparrow",      arrow,      0 },
-       {"Uparrow",      Arrow,      0 },
-       {"updownarrow",  udarrow,    0 },
-       {"Updownarrow",  Udarrow,    0 },        
-                                                         
-       // Accents
-       {"ddot",         hline2,     0 },
-       {"hat",          angle,      3 },
-       {"grave",        slash,      1 },
-       {"acute",        slash,      0 },
-       {"tilde",        tilde,      0 },
-       {"bar",          hline,      0 },
-       {"dot",          hlinesmall, 0 },
-       {"check",        angle,      1 },
-       {"breve",        parenth,    1 },
-       {"vec",          arrow,      3 },
-       {"not",          slash,      0 },  
-                                                         
-       // Dots
-       {"ldots",        hline3,     0 }, 
-       {"cdots",        hline3,     0 },
-       {"vdots",        hline3,     1 },
-       {"ddots",        dline3,     0 }
+       {"(",              parenth,    0 },
+       {")",              parenth,    2 },
+       {"{",              brace,      0 },
+       {"}",              brace,      2 },
+       {"[",              brack,      0 },
+       {"]",              brack,      2 },
+       {"|",              vert,       0 },
+       {"/",              slash,      0 },
+       {"Vert",           Vert,       0 },
+       {"'",              slash,      1 },
+       {"backslash",      slash,      1 },
+       {"langle",         angle,      0 },
+       {"lceil",          corner,     0 }, 
+       {"lfloor",         corner,     1 },  
+       {"rangle",         angle,      2 }, 
+       {"rceil",          corner,     3 }, 
+       {"rfloor",         corner,     2 },
+       {"downarrow",      arrow,      2 },
+       {"Downarrow",      Arrow,      2 }, 
+       {"uparrow",        arrow,      0 },
+       {"Uparrow",        Arrow,      0 },
+       {"updownarrow",    udarrow,    0 },
+       {"Updownarrow",    Udarrow,    0 },      
+                                                           
+       // Accents         
+       {"ddot",           hline2,     0 },
+       {"hat",            angle,      3 },
+       {"grave",          slash,      1 },
+       {"acute",          slash,      0 },
+       {"tilde",          tilde,      0 },
+       {"bar",            hline,      0 },
+       {"dot",            hlinesmall, 0 },
+       {"check",          angle,      1 },
+       {"breve",          parenth,    1 },
+       {"vec",            arrow,      3 },
+       {"not",            slash,      0 },  
+                                                           
+       // Dots            
+       {"ldots",          hline3,     0 }, 
+       {"cdots",          hline3,     0 },
+       {"vdots",          hline3,     1 },
+       {"ddots",          dline3,     0 }
 };
 
 
-std::map<string, deco_struct> deco_list;
+map<string, deco_struct> deco_list;
 
 // sort the table on startup
 struct init_deco_table {
@@ -630,10 +591,6 @@ int mathed_string_width(MathTextCodes type, MathStyles size, string const & s)
 void mathed_draw_deco(Painter & pain, int x, int y, int w, int h,
        const string & name)
 {
-       Matrix mt;
-       Matrix sqmt;
-       int i = 0;
-
        if (name == ".") {
                pain.line(x + w/2, y, x + w/2, y + h,
                          LColor::mathcursor, Painter::line_onoffdash);
@@ -643,23 +600,19 @@ void mathed_draw_deco(Painter & pain, int x, int y, int w, int h,
        deco_struct const * mds = search_deco(name);
        if (!mds) {
                lyxerr << "Deco was not found. Programming error?\n";
-               lyxerr << "name: '" << name << "\n";
+               lyxerr << "name: '" << name << "'\n";
                return;
        }
        
+       int const n = (w < h) ? w : h;
        int const r = mds->angle;
-       float const * d = mds->data;
+       double const * d = mds->data;
        
        if (h > 70 && (name == "(" || name == ")"))
                d = parenthHigh;
        
-       mt.rotate(r);
-       mt.escalate(w, h);
-       
-       int const n = (w < h) ? w : h;
-
-       sqmt.rotate(r);
-       sqmt.escalate(n, n);
+       Matrix mt(r, w, h);
+       Matrix sqmt(r, n, n);
 
        if (r > 0 && r < 3)
                y += h;
@@ -667,52 +620,39 @@ void mathed_draw_deco(Painter & pain, int x, int y, int w, int h,
        if (r >= 2)
                x += w;   
 
-       int code;
-       do {
-               float xx;
-               float yy;
-               float x2;
-               float y2;
-
-               code = int(d[i++]);
-               switch (code) {
-               case 0: break;
-               case 1: 
-               case 3:
-               {
-                       xx = d[i++]; yy = d[i++];
-                       x2 = d[i++]; y2 = d[i++];
+       for (int i = 0; d[i]; ) {
+               int code = int(d[i++]);
+               if (code & 1) {  // code == 1 || code == 3
+                       double xx = d[i++];
+                       double yy = d[i++];
+                       double x2 = d[i++];
+                       double y2 = d[i++];
                        if (code == 3) 
-                               sqmt.transform(xx, yy, xx, yy);
+                               sqmt.transform(xx, yy);
                        else
-                               mt.transform(xx, yy, xx, yy);
-                       mt.transform(x2, y2, x2, y2);
-                       pain.line(x + int(xx), y + int(yy),
-                                 x + int(x2), y + int(y2),
-                                 LColor::mathline);
-                       break;
-               }        
-               case 2: 
-               case 4:
-               {
+                               mt.transform(xx, yy);
+                       mt.transform(x2, y2);
+                       pain.line(x + int(xx), y + int(yy), x + int(x2), y + int(y2),
+                                       LColor::mathline);
+               }       else {
                        int xp[32];
                        int yp[32];
                        int const n = int(d[i++]);
                        for (int j = 0; j < n; ++j) {
-                               xx = d[i++]; yy = d[i++];
+                               double xx = d[i++];
+                               double yy = d[i++];
 //          lyxerr << " " << xx << " " << yy << " ";
                                if (code == 4) 
-                                       sqmt.transform(xx, yy, xx, yy);
+                                       sqmt.transform(xx, yy);
                                else
-                                       mt.transform(xx, yy, xx, yy);
+                                       mt.transform(xx, yy);
                                xp[j] = x + int(xx);
                                yp[j] = y + int(yy);
                                //  lyxerr << "P[" << j " " << xx << " " << yy << " " << x << " " << y << "]";
                        }
                        pain.lines(xp, yp, n, LColor::mathline);
                }
-               }
-       } while (code);
+       }
 }