From: André Pönitz Date: Fri, 20 Jul 2001 14:54:13 +0000 (+0000) Subject: move things around, fix bug in ~MathArray. X-Git-Tag: 1.6.10~21041 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=abaa02466a323f2b1ca06ea411731c6de5ad47b6;p=features.git move things around, fix bug in ~MathArray. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2297 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/mathed/array.C b/src/mathed/array.C index 8963a66b71..a15ec82ded 100644 --- a/src/mathed/array.C +++ b/src/mathed/array.C @@ -20,7 +20,7 @@ MathArray::MathArray() MathArray::~MathArray() { for (int pos = 0; pos < size(); next(pos)) - if (MathIsInset(pos)) + if (isInset(pos)) delete nextInset(pos); } @@ -240,7 +240,7 @@ bool MathArray::isInset(int pos) const { if (pos >= size()) return false; - return MathIsInset(bf_[pos]); + return MathIsInset(static_cast(bf_[pos])); } diff --git a/src/mathed/formulabase.C b/src/mathed/formulabase.C index 3e9159bf14..f89d4c85b6 100644 --- a/src/mathed/formulabase.C +++ b/src/mathed/formulabase.C @@ -51,7 +51,6 @@ extern char const * latex_special_chars; int greek_kb_flag = 0; extern char const * latex_mathenv[]; -LyXFont * Math_Fonts = 0; MathCursor * mathcursor = 0; @@ -108,120 +107,8 @@ bool openNewInset(BufferView * bv, UpdatableInset * new_inset) -LyXFont WhichFont(short type, int size) -{ - LyXFont f; - - if (!Math_Fonts) - mathed_init_fonts(); - - switch (type) { - case LM_TC_SYMB: - f = Math_Fonts[2]; - break; - - case LM_TC_BSYM: - f = Math_Fonts[2]; - break; - - case LM_TC_VAR: - case LM_TC_IT: - f = Math_Fonts[0]; - break; - - case LM_TC_BF: - f = Math_Fonts[3]; - break; - - case LM_TC_SF: - f = Math_Fonts[7]; - break; - - case LM_TC_CAL: - f = Math_Fonts[4]; - break; - - case LM_TC_TT: - f = Math_Fonts[5]; - break; - - case LM_TC_SPECIAL: //f = Math_Fonts[0]; break; - case LM_TC_TEXTRM: - case LM_TC_TEX: - case LM_TC_RM: - f = Math_Fonts[6]; - break; - - default: - f = Math_Fonts[1]; - break; - } - - switch (size) { - case LM_ST_DISPLAY: - if (type == LM_TC_BSYM) { - f.incSize(); - f.incSize(); - } - break; - - case LM_ST_TEXT: - break; - - case LM_ST_SCRIPT: - f.decSize(); - break; - - case LM_ST_SCRIPTSCRIPT: - f.decSize(); - f.decSize(); - break; - - default: - lyxerr << "Math Error: wrong font size: " << size << endl; - break; - } - - if (type != LM_TC_TEXTRM) - f.setColor(LColor::math); - - if (type == LM_TC_TEX) - f.setColor(LColor::latex); - - return f; -} - - namespace { -void mathed_init_fonts() -{ - Math_Fonts = new LyXFont[8]; //DEC cxx cannot initialize all fonts - //at once (JMarc) rc - - for (int i = 0 ; i < 8 ; ++i) { - Math_Fonts[i] = LyXFont(LyXFont::ALL_SANE); - } - - Math_Fonts[0].setShape(LyXFont::ITALIC_SHAPE); - - Math_Fonts[1].setFamily(LyXFont::SYMBOL_FAMILY); - - Math_Fonts[2].setFamily(LyXFont::SYMBOL_FAMILY); - Math_Fonts[2].setShape(LyXFont::ITALIC_SHAPE); - - Math_Fonts[3].setSeries(LyXFont::BOLD_SERIES); - - Math_Fonts[4].setFamily(LyXFont::SANS_FAMILY); - Math_Fonts[4].setShape(LyXFont::ITALIC_SHAPE); - - Math_Fonts[5].setFamily(LyXFont::TYPEWRITER_FAMILY); - - Math_Fonts[6].setFamily(LyXFont::ROMAN_FAMILY); - - Math_Fonts[7].setFamily(LyXFont::SANS_FAMILY); -} - // returns the nearest enclosing matrix MathArrayInset * matrixpar(int & idx) @@ -360,11 +247,9 @@ void InsetFormulaBase::toggleInsetCursor(BufferView * bv) mathcursor->GetPos(x, y); //x -= par_->xo(); y -= par_->yo(); - - LyXFont font = WhichFont(LM_TC_TEXTRM, LM_ST_TEXT); - int const asc = lyxfont::maxAscent(font); - int const desc = lyxfont::maxDescent(font); - + int asc; + int desc; + math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc); bv->showLockedInsetCursor(x, y, asc, desc); } @@ -381,9 +266,9 @@ void InsetFormulaBase::showInsetCursor(BufferView * bv, bool) mathcursor->GetPos(x, y); x -= par_->xo(); y -= par_->yo(); - LyXFont font = WhichFont(LM_TC_TEXTRM, LM_ST_TEXT); - int const asc = lyxfont::maxAscent(font); - int const desc = lyxfont::maxDescent(font); + int asc; + int desc; + math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc); bv->fitLockedInsetCursor(x, y, asc, desc); } toggleInsetCursor(bv); @@ -882,7 +767,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, mathcursor->clearLastCode(); varcode = LM_TC_MIN; } else if (!varcode) { - short f = mathcursor->getLastCode() ? + MathTextCodes f = mathcursor->getLastCode() ? mathcursor->getLastCode() : mathcursor->nextCode(); varcode = MathIsAlphaFont(f) ? diff --git a/src/mathed/math_bigopinset.C b/src/mathed/math_bigopinset.C index d081406217..96eeb84aa8 100644 --- a/src/mathed/math_bigopinset.C +++ b/src/mathed/math_bigopinset.C @@ -117,7 +117,7 @@ void MathBigopInset::draw(Painter & pain, int x, int y) xo(x); yo(y); - pain.text(x + dxx_, y, ssym_, mathed_get_font(code_, size())); + drawStr(pain, code_, size_, x + dxx_, y, ssym_); if (up()) xcell(0).draw(pain, x + dx0_, y + dy0_); diff --git a/src/mathed/math_bigopinset.h b/src/mathed/math_bigopinset.h index c347e35166..cf4f50ed57 100644 --- a/src/mathed/math_bigopinset.h +++ b/src/mathed/math_bigopinset.h @@ -33,7 +33,7 @@ private: /// string ssym_; /// - short code_; + MathTextCodes code_; /// 1: \limits, -1: \nolimits, 0: use default int limits_; /// x offset for drawing the superscript diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index 51fe37089e..43b6ef3a95 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -719,12 +719,14 @@ in_word_set(s) << " \n"; p = new MathBigopInset(l->name, l->id); break; - case LM_TK_SYM: - if (l->id < 255) - insert(l->id, MathIsBOPS(l->id) ? LM_TC_BOPS : LM_TC_SYMB); + case LM_TK_SYM: { + MathTextCodes code = static_cast(l->id); + if (code < 255) + insert(l->id, MathIsBOPS(code) ? LM_TC_BOPS : LM_TC_SYMB); else p = new MathFuncInset(l->name); break; + } case LM_TK_STACK: p = new MathFracInset("stackrel"); diff --git a/src/mathed/math_funcinset.C b/src/mathed/math_funcinset.C index f88af12da8..a75ba7360c 100644 --- a/src/mathed/math_funcinset.C +++ b/src/mathed/math_funcinset.C @@ -27,19 +27,6 @@ MathInset * MathFuncInset::clone() const } -void MathFuncInset::draw(Painter & pain, int x, int y) -{ - if (!name_.empty() && name_[0] > ' ') { - LyXFont font = WhichFont(LM_TC_TEXTRM, size()); -#ifndef NO_LATEX - font.setLatex(LyXFont::ON); -#endif - x += (lyxfont::width('I', font) + 3) / 4; - pain.text(x, y, name_, font); - } -} - - void MathFuncInset::Write(std::ostream & os, bool /* fragile */) const { os << "\\" << name_ << ' '; @@ -54,17 +41,20 @@ void MathFuncInset::WriteNormal(std::ostream & os) const void MathFuncInset::Metrics(MathStyles st, int, int) { - LyXFont font = WhichFont(LM_TC_TEXTRM, size()); -#ifndef NO_LATEX - font.setLatex(LyXFont::ON); -#endif size_ = st; - if (name_.empty()) { - width_ = lyxfont::width('M', font); - ascent_ = lyxfont::ascent('M', font); - descent_ = 0; - } else { - width_ = lyxfont::width(name_, font) + lyxfont::width('I', font) / 2; - mathed_string_height(LM_TC_TEXTRM, size_, name_, ascent_, descent_); - } + if (name_.empty()) + mathed_char_dim(LM_TC_TEXTRM, size_, 'I', ascent_, descent_, width_); + else + mathed_string_dim(LM_TC_TEXTRM, size_, name_, ascent_, descent_, width_); +} + + +void MathFuncInset::draw(Painter & pain, int x, int y) +{ + xo(x); + yo(y); + if (name_.empty()) + drawChar(pain, LM_TC_TEXTRM, size_, x, y, ' '); + else + drawStr(pain, LM_TC_TEXTRM, size_, x, y, name_); } diff --git a/src/mathed/math_matrixinset.C b/src/mathed/math_matrixinset.C index a7341f7d51..d552e20242 100644 --- a/src/mathed/math_matrixinset.C +++ b/src/mathed/math_matrixinset.C @@ -11,8 +11,6 @@ #include "LaTeXFeatures.h" -LyXFont WhichFont(short type, int size); - namespace { string const getAlign(short int type, int cols) @@ -98,9 +96,6 @@ void MathMatrixInset::Metrics(MathStyles /* st */, int, int) { size_ = (GetType() == LM_OT_SIMPLE) ? LM_ST_TEXT : LM_ST_DISPLAY; - //LyXFont wfont = WhichFont(LM_TC_BF, size()); - //wfont.setLatex(LyXFont::OFF); - // let the cells adjust themselves MathGridInset::Metrics(size_); @@ -112,7 +107,7 @@ void MathMatrixInset::Metrics(MathStyles /* st */, int, int) if (numberedType()) { int l = 0; for (int row = 0; row < nrows(); ++row) - l = std::max(l, mathed_string_width(LM_TC_TEXTRM, size(), nicelabel(row))); + l = std::max(l, mathed_string_width(LM_TC_BF, size(), nicelabel(row))); if (l) width_ += 30 + l; @@ -128,13 +123,11 @@ void MathMatrixInset::draw(Painter & pain, int x, int y) MathGridInset::draw(pain, x, y); if (numberedType()) { - LyXFont wfont = WhichFont(LM_TC_BF, size()); -#ifndef NO_LATEX - wfont.setLatex(LyXFont::OFF); -#endif int xx = x + colinfo_.back().offset_ + colinfo_.back().width_ + 20; - for (int row = 0; row < nrows(); ++row) - pain.text(xx, y + rowinfo_[row].offset_, nicelabel(row), wfont); + for (int row = 0; row < nrows(); ++row) { + int yy = y + rowinfo_[row].offset_; + drawStr(pain, LM_TC_BF, size(), xx, yy, nicelabel(row)); + } } } diff --git a/src/mathed/math_parser.C b/src/mathed/math_parser.C index 535432d84e..863346232d 100644 --- a/src/mathed/math_parser.C +++ b/src/mathed/math_parser.C @@ -630,7 +630,8 @@ void mathed_parse(MathArray & array, unsigned flags) case LM_TK_SYM: if (yylval.l->id < 256) { - MathTextCodes tc = MathIsBOPS(yylval.l->id) ? LM_TC_BOPS : LM_TC_SYMB; + MathTextCodes c = static_cast(yylval.l->id); + MathTextCodes tc = MathIsBOPS(c) ? LM_TC_BOPS : LM_TC_SYMB; array.push_back(yylval.l->id, tc); } else array.push_back(new MathFuncInset(yylval.l->name)); diff --git a/src/mathed/math_utils.C b/src/mathed/math_utils.C index 7d559ec52c..0773885ed0 100644 --- a/src/mathed/math_utils.C +++ b/src/mathed/math_utils.C @@ -64,11 +64,11 @@ binary_op_pair binary_op_table[] = { }; -struct compara { +struct comparator { // used by sort and lower_bound inline - int operator()(binary_op_pair const & a, - binary_op_pair const & b) const { + int operator()(binary_op_pair const & a, binary_op_pair const & b) const + { return a.id < b.id; } }; @@ -83,7 +83,7 @@ int MathLookupBOP(short id) static bool issorted = false; if (!issorted) { - sort(binary_op_table, binary_op_table + bopCount, compara()); + sort(binary_op_table, binary_op_table + bopCount, comparator()); issorted = true; } @@ -91,7 +91,7 @@ int MathLookupBOP(short id) binary_op_pair * res = lower_bound(binary_op_table, binary_op_table + bopCount, - search_elem, compara()); + search_elem, comparator()); if (res != binary_op_table + bopCount && res->id == id) return res->isrel; else diff --git a/src/mathed/math_utils.h b/src/mathed/math_utils.h index 9e0126ad1f..2895ce17fc 100644 --- a/src/mathed/math_utils.h +++ b/src/mathed/math_utils.h @@ -3,7 +3,6 @@ #ifndef MATHUTILS_H #define MATHUTILS_H -extern int MathLookupBOP(short id); #endif diff --git a/src/mathed/support.C b/src/mathed/support.C index 4185742cd6..47f4736fca 100644 --- a/src/mathed/support.C +++ b/src/mathed/support.C @@ -8,7 +8,6 @@ #include "math_defs.h" #include "math_parser.h" #include "Painter.h" -#include "symbol_def.h" #include "debug.h" #include "math_utils.h" @@ -18,31 +17,31 @@ using std::endl; using std::max; -bool MathIsInset(short x) +bool MathIsInset(MathTextCodes x) { return LM_TC_INSET == x; } -bool MathIsAlphaFont(short x) +bool MathIsAlphaFont(MathTextCodes x) { return LM_TC_VAR <= x && x <= LM_TC_TEXTRM; } -bool MathIsBOPS(short x) +bool MathIsBOPS(MathTextCodes x) { - return MathLookupBOP(x) > LMB_NONE; + return MathLookupBOP(x) != LMB_NONE; } -bool MathIsBinary(short x) +bool MathIsBinary(MathTextCodes x) { return x == LM_TC_BOP || x == LM_TC_BOPS; } -bool MathIsSymbol(short x) +bool MathIsSymbol(MathTextCodes x) { return x == LM_TC_SYMB || x == LM_TC_BOPS || x == LM_TC_BSYM; } @@ -123,8 +122,123 @@ void Matrix::transform(float xp, float yp, float & x, float & y) } +namespace { + +LyXFont * Math_Fonts = 0; + +void mathed_init_fonts() +{ + Math_Fonts = new LyXFont[8]; //DEC cxx cannot initialize all fonts + //at once (JMarc) rc + + for (int i = 0 ; i < 8 ; ++i) { + Math_Fonts[i] = LyXFont(LyXFont::ALL_SANE); + } + + Math_Fonts[0].setShape(LyXFont::ITALIC_SHAPE); + + Math_Fonts[1].setFamily(LyXFont::SYMBOL_FAMILY); + + Math_Fonts[2].setFamily(LyXFont::SYMBOL_FAMILY); + Math_Fonts[2].setShape(LyXFont::ITALIC_SHAPE); + + Math_Fonts[3].setSeries(LyXFont::BOLD_SERIES); + + Math_Fonts[4].setFamily(LyXFont::SANS_FAMILY); + Math_Fonts[4].setShape(LyXFont::ITALIC_SHAPE); + + Math_Fonts[5].setFamily(LyXFont::TYPEWRITER_FAMILY); + + Math_Fonts[6].setFamily(LyXFont::ROMAN_FAMILY); + + Math_Fonts[7].setFamily(LyXFont::SANS_FAMILY); +} + +} // namespace + + +LyXFont WhichFont(MathTextCodes type, MathStyles size) +{ + LyXFont f; + + if (!Math_Fonts) + mathed_init_fonts(); + + switch (type) { + case LM_TC_SYMB: + f = Math_Fonts[2]; + break; + + case LM_TC_BSYM: + f = Math_Fonts[2]; + break; + + case LM_TC_VAR: + case LM_TC_IT: + f = Math_Fonts[0]; + break; + + case LM_TC_BF: + f = Math_Fonts[3]; + break; + + case LM_TC_SF: + f = Math_Fonts[7]; + break; + + case LM_TC_CAL: + f = Math_Fonts[4]; + break; + + case LM_TC_TT: + f = Math_Fonts[5]; + break; + + case LM_TC_SPECIAL: //f = Math_Fonts[0]; break; + case LM_TC_TEXTRM: + case LM_TC_TEX: + case LM_TC_RM: + f = Math_Fonts[6]; + break; + + default: + f = Math_Fonts[1]; + break; + } + + switch (size) { + case LM_ST_DISPLAY: + if (type == LM_TC_BSYM) { + f.incSize(); + f.incSize(); + } + break; + + case LM_ST_TEXT: + break; + + case LM_ST_SCRIPT: + f.decSize(); + break; + + case LM_ST_SCRIPTSCRIPT: + f.decSize(); + f.decSize(); + break; + + default: + lyxerr << "Math Error: wrong font size: " << size << endl; + break; + } -extern LyXFont WhichFont(short type, int size); + if (type != LM_TC_TEXTRM) + f.setColor(LColor::math); + + if (type == LM_TC_TEX) + f.setColor(LColor::latex); + + return f; +} char const * math_font_name[] = { "mathrm", @@ -407,7 +521,7 @@ static init_deco_table idt; } // namespace anon -void mathed_char_dim (short type, int size, unsigned char c, +void mathed_char_dim (MathTextCodes type, MathStyles size, unsigned char c, int & asc, int & des, int & wid) { LyXFont const font = WhichFont(type, size); @@ -416,7 +530,7 @@ void mathed_char_dim (short type, int size, unsigned char c, wid = mathed_char_width(type, size, c); } -int mathed_char_height(short type, int size, unsigned char c, +int mathed_char_height(MathTextCodes type, MathStyles size, unsigned char c, int & asc, int & des) { LyXFont const font = WhichFont(type, size); @@ -426,7 +540,7 @@ int mathed_char_height(short type, int size, unsigned char c, } -int mathed_char_width(short type, int size, unsigned char c) +int mathed_char_width(MathTextCodes type, MathStyles size, unsigned char c) { if (MathIsBinary(type)) { string s; @@ -437,14 +551,14 @@ int mathed_char_width(short type, int size, unsigned char c) } -void mathed_string_dim(short type, int size, string const & s, +void mathed_string_dim(MathTextCodes type, MathStyles size, string const & s, int & asc, int & des, int & wid) { mathed_string_height(type, size, s, asc, des); wid = mathed_string_width(type, size, s); } -int mathed_string_height(short type, int size, string const & s, +int mathed_string_height(MathTextCodes type, MathStyles size, string const & s, int & asc, int & des) { LyXFont const font = WhichFont(type, size); @@ -457,7 +571,7 @@ int mathed_string_height(short type, int size, string const & s, } -int mathed_string_width(short type, int size, string const & s) +int mathed_string_width(MathTextCodes type, MathStyles size, string const & s) { string st; if (MathIsBinary(type)) @@ -470,20 +584,7 @@ int mathed_string_width(short type, int size, string const & s) else st = s; - LyXFont const f = WhichFont(type, size); - return lyxfont::width(st, f); -} - - -LyXFont mathed_get_font(short type, int size) -{ - LyXFont f = WhichFont(type, size); -#ifndef NO_LATEX - if (type == LM_TC_TEX) { - f.setLatex(LyXFont::ON); - } -#endif - return f; + return lyxfont::width(st, WhichFont(type, size)); } @@ -581,7 +682,7 @@ void mathed_draw_deco(Painter & pain, int x, int y, int w, int h, int code) // In a near future maybe we use a better fonts renderer -void drawStr(Painter & pain, short type, int siz, +void drawStr(Painter & pain, MathTextCodes type, MathStyles siz, int x, int y, string const & s) { string st; @@ -595,11 +696,10 @@ void drawStr(Painter & pain, short type, int siz, else st = s; - LyXFont const mf = mathed_get_font(type, siz); - pain.text(x, y, st, mf); + pain.text(x, y, st, WhichFont(type, siz)); } -void drawChar(Painter & pain, short type, int siz, int x, int y, char c) +void drawChar(Painter & pain, MathTextCodes type, MathStyles siz, int x, int y, char c) { string s; s += c; @@ -639,3 +739,12 @@ bool MathIsRelOp(unsigned char c, MathTextCodes f) return true; return false; } + + +void math_font_max_dim(MathTextCodes code, MathStyles siz, int & asc, int & des) +{ + LyXFont font = WhichFont(code, siz); + asc = lyxfont::maxAscent(font); + des = lyxfont::maxDescent(font); +} + diff --git a/src/mathed/support.h b/src/mathed/support.h index 9f4b811f98..73282c194f 100644 --- a/src/mathed/support.h +++ b/src/mathed/support.h @@ -3,8 +3,8 @@ #ifndef MATH_SUPPORT_H #define MATH_SUPPORT_H -#include "lyxfont.h" #include "math_defs.h" +#include "LString.h" class Painter; class MathArray; @@ -13,31 +13,32 @@ class MathMatrixInset; extern char const * math_font_name[]; extern char const * latex_mathspace[]; -int mathed_char_height(short type, int size, unsigned char c, +int mathed_char_height(MathTextCodes type, MathStyles size, unsigned char c, int & asc, int & des); -int mathed_char_width(short type, int size, unsigned char c); -void mathed_char_dim(short type, int size, unsigned char c, +int mathed_char_width(MathTextCodes type, MathStyles size, unsigned char c); +void mathed_char_dim(MathTextCodes type, MathStyles size, unsigned char c, int & asc, int & des, int & wid); void mathed_draw_deco(Painter & pain, int x, int y, int w, int h, int code); -LyXFont mathed_get_font(short type, int size); - -void mathed_string_dim(short type, int size, string const & s, +void mathed_string_dim(MathTextCodes type, MathStyles size, string const & s, int & asc, int & des, int & wid); -int mathed_string_height(short type, int size, string const & s, +int mathed_string_height(MathTextCodes type, MathStyles size, string const & s, int & asc, int & des); -int mathed_string_width(short type, int size, string const & s); +int mathed_string_width(MathTextCodes type, MathStyles size, string const & s); -bool MathIsInset(short x); -bool MathIsAlphaFont(short x); -bool MathIsBOPS(short x); -bool MathIsSymbol(short x); +bool MathIsInset(MathTextCodes x); +bool MathIsAlphaFont(MathTextCodes x); +bool MathIsBOPS(MathTextCodes x); +bool MathIsSymbol(MathTextCodes x); bool MathIsRelOp(unsigned char c, MathTextCodes f); -void drawStr(Painter & pain, short type, int siz, +void drawStr(Painter & pain, MathTextCodes type, MathStyles siz, int x, int y, string const & s); -void drawChar(Painter & pain, short type, int siz, +void drawChar(Painter & pain, MathTextCodes type, MathStyles siz, int x, int y, char c); +void math_font_max_dim + (MathTextCodes code, MathStyles siz, int & asc, int & desc); + #endif