+2001-02-08 Andre Poenitz <poenitz@HTWM.De>
+
+ * several files: get rid of reinterpret_cast
+
2001-02-04 Allan Rae <rae@lyx.org>
* math_parser.C (mathed_parse): I'm sure Lars has a better fix than
}
-int mathed_string_width(short type, int size, byte const * s, int ls)
+int mathed_string_width(short type, int size, string const & s)
{
string st;
if (MathIsBinary(type))
- for (int i = 0; i < ls; ++i) {
+ for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
st += ' ';
- st += s[i];
+ st += *it;
st += ' ';
}
else
- st = string(reinterpret_cast<char const *>(s), ls);
+ st = s;
LyXFont const f = WhichFont(type, size);
return lyxfont::width(st, f);
}
-int mathed_string_width(short type, int size, string const & str)
-{
- return mathed_string_width(type, size, reinterpret_cast<unsigned char const *>(str.c_str()), str.length());
-}
-
-
int mathed_char_width(short type, int size, byte c)
{
- int t = (MathIsBinary(type)) ? mathed_string_width(type, size, &c, 1) :
- lyxfont::width(c, WhichFont(type, size));
- return t;
-}
-
-
-int mathed_string_height(short type, int size, byte const * s,
- int ls, int & asc, int & des)
-{
- LyXFont font = WhichFont(type, size);
- asc = des = 0;
- for (int i = 0; i < ls; ++i) {
- des = max(des, lyxfont::descent(s[i], font));
- asc = max(asc, lyxfont::ascent(s[i], font));
- }
- return asc + des;
+ if (MathIsBinary(type)) {
+ string s;
+ s += c;
+ return mathed_string_width(type, size, s);
+ }
+ else
+ return lyxfont::width(c, WhichFont(type, size));
}
-int mathed_string_height(short type, int size, string const & str,
+int mathed_string_height(short type, int size, string const & s,
int & asc, int & des)
{
- return mathed_string_height(type, size,
- reinterpret_cast<unsigned char const *>(str.c_str()), str.length(),
- asc, des);
+ LyXFont font = WhichFont(type, size);
+ asc = des = 0;
+ for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
+ des = max(des, lyxfont::descent(*it, font));
+ asc = max(asc, lyxfont::ascent(*it, font));
+ }
+ return asc + des;
}
// In a near future maybe we use a better fonts renderer
void MathedInset::drawStr(Painter & pain, short type, int siz,
- int x, int y, byte const * s, int ls)
+ int x, int y, string const & s)
{
string st;
if (MathIsBinary(type))
- for (int i = 0; i < ls; ++i) {
+ for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
st += ' ';
- st += char(s[i]);
+ st += *it;
st += ' ';
}
else
- st = string(reinterpret_cast<char const *>(s), ls);
+ st = s;
LyXFont const mf = mathed_get_font(type, siz);
pain.text(x, y, st, mf);
///
static int df_width;
/// In a near future maybe we use a better fonts renderer than X
- void drawStr(Painter &, short, int, int, int, byte const *, int);
+ void drawStr(Painter &, short, int, int, int, string const &);
///
friend class MathedCursor;
///
void
MathAccentInset::draw(Painter & pain, int x, int y)
{
- int dw = width - 2;
-
- if (inset) {
- inset->draw(pain, x, y);
- } else {
- drawStr(pain, fn, size, x, y, &c, 1);
- }
- x += (code == LM_not) ? (width-dw) / 2 : 2;
- mathed_draw_deco(pain, x, y - dy, dw, dh, code);
+ int dw = width - 2;
+
+ if (inset)
+ inset->draw(pain, x, y);
+ else {
+ string s;
+ s += c;
+ drawStr(pain, fn, size, x, y, s);
+ }
+ x += (code == LM_not) ? (width-dw) / 2 : 2;
+ mathed_draw_deco(pain, x, y - dy, dw, dh, code);
}
void
MathParInset::draw(Painter & pain, int x, int y)
{
- byte cx, cxp = 0;
- int xp = 0, ls;
- int asc = df_asc, des = 0;
- bool limits = false;
-
- xo = x; yo = y;
- if (!array || array->empty()) {
- if (array) {
- MathedXIter data(this);
- data.GetPos(x, y);
- }
- pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
- return;
- }
- MathedXIter data(this);
- data.GoBegin();
- while (data.OK()) {
- data.GetPos(x, y);
- cx = data.GetChar();
- if (cx >= ' ') {
- byte * s = data.GetString(ls);
- drawStr(pain, data.FCode(), size, x, y, s, ls);
- mathed_char_height(LM_TC_CONST, size, 'y', asc, des);
- limits = false;
- } else {
- if (cx == 0) break;
- if (MathIsInset(cx)) {
- int yy = y;
- MathedInset * p = data.GetInset();
- if (cx == LM_TC_UP) {
- if (limits) { x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp;
- yy -= (asc + p->Descent()+4);
- } else
- yy -= (p->Descent()>asc) ? p->Descent()+4: asc;
- } else
- if (cx == LM_TC_DOWN) {
- if (limits) {
- x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp;
- yy += des + p->Ascent() + 2;
- } else
- yy += des + p->Ascent()/2;
- } else {
- asc = p->Ascent();
- des = p->Descent();
- }
- p->draw(pain, x, yy);
- if (cx!= LM_TC_UP && cx!= LM_TC_DOWN) {
- limits = p->GetLimits();
- if (limits) xp = p->Width();
- }
- data.Next();
- } else
- if (cx == LM_TC_TAB) {
- if ((cxp == cx || cxp == LM_TC_CR || data.IsFirst())) { // && objtype == L
- pain.rectangle(x, y - df_asc, df_width, df_asc,
- LColor::mathline);
- }
- data.Next();
- limits = false;
- } else
- if (cx == LM_TC_CR) {
- if (cxp == LM_TC_TAB || cxp == LM_TC_CR || data.IsFirst()) { // && objtype == LM_OT_MATRIX) {
- pain.rectangle(x, y - df_asc, df_width, df_asc,
- LColor::mathline);
+ byte cxp = 0;
+ int xp = 0;
+ int asc = df_asc, des = 0;
+ bool limits = false;
+
+ xo = x; yo = y;
+ if (!array || array->empty()) {
+ if (array) {
+ MathedXIter data(this);
+ data.GetPos(x, y);
}
- data.Next();
- limits = false;
- }
- else {
- lyxerr << "GMathed Error: Unrecognized code[" << cx
- << "]" << endl;
- break;
- }
- }
- cxp = cx;
- }
- if (cxp == LM_TC_TAB || cxp == LM_TC_CR) { // && objtype == LM_OT_MATRIX) {
- data.GetPos(x, y);
- pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
- }
+ pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
+ return;
+ }
+ MathedXIter data(this);
+ data.GoBegin();
+ while (data.OK()) {
+ data.GetPos(x, y);
+ byte cx = data.GetChar();
+ if (cx >= ' ') {
+ string s = data.GetString();
+ drawStr(pain, data.FCode(), size, x, y, s);
+ mathed_char_height(LM_TC_CONST, size, 'y', asc, des);
+ limits = false;
+ }
+ else {
+ if (cx == 0)
+ break;
+ if (MathIsInset(cx)) {
+ int yy = y;
+ MathedInset * p = data.GetInset();
+ if (cx == LM_TC_UP) {
+ if (limits) {
+ x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp;
+ yy -= (asc + p->Descent()+4);
+ }
+ else
+ yy -= (p->Descent()>asc) ? p->Descent()+4: asc;
+ }
+ else if (cx == LM_TC_DOWN) {
+ if (limits) {
+ x -= (xp>p->Width()) ? p->Width()+(xp-p->Width())/2: xp;
+ yy += des + p->Ascent() + 2;
+ } else
+ yy += des + p->Ascent()/2;
+ }
+ else {
+ asc = p->Ascent();
+ des = p->Descent();
+ }
+ p->draw(pain, x, yy);
+ if (cx!= LM_TC_UP && cx!= LM_TC_DOWN) {
+ limits = p->GetLimits();
+ if (limits)
+ xp = p->Width();
+ }
+ data.Next();
+ }
+ else if (cx == LM_TC_TAB) {
+ if (cxp == cx || cxp == LM_TC_CR || data.IsFirst()) {
+ pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
+ }
+ data.Next();
+ limits = false;
+ }
+ else if (cx == LM_TC_CR) {
+ if (cxp == LM_TC_TAB || cxp == LM_TC_CR || data.IsFirst()) {
+ pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
+ }
+ data.Next();
+ limits = false;
+ }
+ else {
+ lyxerr << "GMathed Error: Unrecognized code[" << cx << "]" << endl;
+ break;
+ }
+ }
+ cxp = cx;
+ }
+ if (cxp == LM_TC_TAB || cxp == LM_TC_CR) {
+ data.GetPos(x, y);
+ pain.rectangle(x, y - df_asc, df_width, df_asc, LColor::mathline);
+ }
}
const int SizeInset = sizeof(char*) + 2;
extern int mathed_char_width(short type, int style, byte c);
-extern int mathed_string_width(short type, int style, byte const * s, int ls);
+extern int mathed_string_width(short type, int style, string const & s);
extern int mathed_char_height(short, int, byte, int &, int &);
// the builtin memcpy() is broken in egcs and gcc 2.95.x on alpha
}
-byte * MathedIter::GetString(int & len) const
-{
- if (IsFont()) {
- fcode = array->bf[++pos];
- ++pos;
- }
- byte * s = &array->bf[pos];
- len = pos;
- while (array->bf[pos] >= ' ' && pos < array->last) ++pos;
- len = pos - len;
-
- return s;
-}
-
string const MathedIter::GetString() const
{
- int ls = 0;
- byte const * s = GetString(ls);
- return string(reinterpret_cast<char const *>(s), ls);
-}
+ if (IsFont()) {
+ fcode = array->bf[++pos];
+ ++pos;
+ }
+ string s;
+ for ( ; array->bf[pos] >= ' ' && pos < array->last; ++pos)
+ s += array->bf[pos];
+ return s;
+}
MathedInset * MathedIter::GetInset() const
{
}
-byte * MathedXIter::GetString(int & ls) const
-{
- static byte s[255];
- byte const * sxs = MathedIter::GetString(ls);
- if (ls > 0) {
- strncpy(reinterpret_cast<char*>(s),
- reinterpret_cast<char const *>(sxs), ls);
- x += mathed_string_width(fcode, size, s, ls);
- return &s[0];
- }
- return 0;
-}
-
-
string const MathedXIter::GetString() const
{
- int ls;
- byte const * s = GetString(ls);
- return string(reinterpret_cast<char const *>(s), ls);
+ string s = MathedIter::GetString();
+ x += mathed_string_width(fcode, size, s);
+ return s;
}
///
byte GetChar() const;
///
- byte * GetString(int & len) const;
- ///
string const GetString() const;
///
MathedInset * GetInset() const;
return o << int(mmf);
}
-extern int mathed_string_width(short type, int style, byte const* s, int ls);
-extern int mathed_string_height(short, int, byte const*, int, int&, int&);
+extern int mathed_string_width(short type, int style, string const & s);
+extern int mathed_string_height(short, int, string const &, int &, int &);
MathMacro::MathMacro(MathMacroTemplate* t):
void MathMacroArgument::draw(Painter & pain, int x, int baseline)
{
- if (expnd_mode) {
- MathParInset::draw(pain, x, baseline);
- } else {
- std::ostringstream ost;
- ost << '#' << number;
- drawStr(pain, LM_TC_TEX, size, x, baseline,
- reinterpret_cast<byte const *>(ost.str().c_str()), 2);
- }
+ if (expnd_mode) {
+ MathParInset::draw(pain, x, baseline);
+ }
+ else {
+ std::ostringstream ost;
+ ost << '#' << number;
+ drawStr(pain, LM_TC_TEX, size, x, baseline, ost.str());
+ }
}
void MathMacroArgument::Metrics()
{
- if (expnd_mode) {
- MathParInset::Metrics();
- } else {
- std::ostringstream ost;
- ost << '#' << number;
- width = mathed_string_width(LM_TC_TEX, size,
- reinterpret_cast<byte const *>(ost.str().c_str()), 2);
- mathed_string_height(LM_TC_TEX, size,
- reinterpret_cast<byte const *>(ost.str().c_str()),
- 2, ascent, descent);
- }
+ if (expnd_mode) {
+ MathParInset::Metrics();
+ }
+ else {
+ std::ostringstream ost;
+ ost << '#' << number;
+ width = mathed_string_width(LM_TC_TEX, size, ost.str());
+ mathed_string_height(LM_TC_TEX, size, ost.str(), ascent, descent);
+ }
}
while (data.OK()) {
byte cx = data.GetChar();
if (cx >= ' ') {
- int ls;
- byte * s = data.GetString(ls);
+ string str = data.GetString();
if (data.FCode() >= LM_TC_RM && data.FCode() <= LM_TC_TEXTRM) {
os << '\\' << math_font_name[data.FCode()-LM_TC_RM] << '{';
}
- while (ls > 0) {
+ for (string::const_iterator s = str.begin();
+ s != str.end(); ++s) {
+ byte c = *s;
if (MathIsSymbol(data.FCode())) {
- l = lm_get_key_by_id(*s, (data.FCode() == LM_TC_BSYM) ?
+ l = lm_get_key_by_id(c, (data.FCode() == LM_TC_BSYM) ?
LM_TK_BIGSYM : LM_TK_SYM);
if (l) {
os << '\\' << l->name << ' ';
- } else {
- lyxerr << "Illegal symbol code[" << *s
- << " " << ls << " " << data.FCode() << "]";
+ } else {
+#warning This does not compile (Lgb)
+ //lyxerr << "Illegal symbol code[" << c
+ // << " " << str.end() - s << " " << data.FCode() << "]";
}
} else {
// Is there a standard logical XOR?
- if ((data.FCode() == LM_TC_TEX && *s != '{' && *s != '}') ||
+ if ((data.FCode() == LM_TC_TEX && c != '{' && c != '}') ||
(data.FCode() == LM_TC_SPECIAL))
os << '\\';
else {
- if (*s == '{') ++brace;
- if (*s == '}') --brace;
+ if (c == '{') ++brace;
+ if (c == '}') --brace;
}
- if (*s == '}' && data.FCode() == LM_TC_TEX && brace < 0)
+ if (c == '}' && data.FCode() == LM_TC_TEX && brace < 0)
lyxerr <<"Math warning: Unexpected closing brace."
<< endl;
else
- os << char(*s);
+ os << char(c);
}
- ++s; --ls;
}
if (data.FCode()>= LM_TC_RM && data.FCode()<= LM_TC_TEXTRM)
os << '}';