move things around, fix bug in ~MathArray.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2297 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2001-07-20 14:54:13 +00:00
parent 7c0dad35b3
commit abaa02466a
12 changed files with 200 additions and 220 deletions

View File

@ -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<MathTextCodes>(bf_[pos]));
}

View File

@ -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) ?

View File

@ -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_);

View File

@ -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

View File

@ -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<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");

View File

@ -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_);
}

View File

@ -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));
}
}
}

View File

@ -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<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));

View File

@ -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

View File

@ -3,7 +3,6 @@
#ifndef MATHUTILS_H
#define MATHUTILS_H
extern
int MathLookupBOP(short id);
#endif

View File

@ -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 {
extern LyXFont WhichFont(short type, int size);
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;
}
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);
}

View File

@ -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