MathArray::~MathArray()
{
for (int pos = 0; pos < size(); next(pos))
- if (MathIsInset(pos))
+ if (isInset(pos))
delete nextInset(pos);
}
{
if (pos >= size())
return false;
- return MathIsInset(bf_[pos]);
+ return MathIsInset(static_cast<MathTextCodes>(bf_[pos]));
}
int greek_kb_flag = 0;
extern char const * latex_mathenv[];
-LyXFont * Math_Fonts = 0;
MathCursor * mathcursor = 0;
-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)
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);
}
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);
mathcursor->clearLastCode();
varcode = LM_TC_MIN;
} else if (!varcode) {
- short f = mathcursor->getLastCode() ?
+ MathTextCodes f = mathcursor->getLastCode() ?
mathcursor->getLastCode() :
mathcursor->nextCode();
varcode = MathIsAlphaFont(f) ?
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_);
///
string ssym_;
///
- short code_;
+ MathTextCodes code_;
/// 1: \limits, -1: \nolimits, 0: use default
int limits_;
/// x offset for drawing the superscript
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<MathTextCodes>(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");
}
-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_ << ' ';
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_);
}
#include "LaTeXFeatures.h"
-LyXFont WhichFont(short type, int size);
-
namespace {
string const getAlign(short int type, int cols)
{
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_);
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;
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));
+ }
}
}
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<MathTextCodes>(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));
};
-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;
}
};
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;
}
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
#ifndef MATHUTILS_H
#define MATHUTILS_H
-extern
int MathLookupBOP(short id);
#endif
#include "math_defs.h"
#include "math_parser.h"
#include "Painter.h"
-#include "symbol_def.h"
#include "debug.h"
#include "math_utils.h"
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;
}
}
+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",
} // 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);
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);
}
-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;
}
-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);
}
-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))
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));
}
// 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;
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;
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);
+}
+
#ifndef MATH_SUPPORT_H
#define MATH_SUPPORT_H
-#include "lyxfont.h"
#include "math_defs.h"
+#include "LString.h"
class Painter;
class MathArray;
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