mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-10 20:04:46 +00:00
the remove reinterpret_cast patch from Andre Poenitz
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1463 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
79c4c549f4
commit
742ebe1f13
@ -1,3 +1,7 @@
|
||||
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
|
||||
|
@ -197,55 +197,44 @@ LyXFont mathed_get_font(short type, int size)
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
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, 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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -260,17 +249,17 @@ int mathed_char_height(short type, int size, byte c, int & asc, int & 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);
|
||||
|
@ -279,7 +279,7 @@ class MathedInset {
|
||||
///
|
||||
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;
|
||||
///
|
||||
|
@ -527,15 +527,17 @@ MathDecorationInset::Metrics()
|
||||
void
|
||||
MathAccentInset::draw(Painter & pain, int x, int y)
|
||||
{
|
||||
int dw = width - 2;
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,86 +54,89 @@ MathSpaceInset::draw(Painter & pain, int x, int y)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,7 +32,7 @@ using std::endl;
|
||||
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
|
||||
@ -73,27 +73,18 @@ byte MathedIter::GetChar() const
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
{
|
||||
@ -587,25 +578,11 @@ void MathedXIter::SetData(MathParInset * pp)
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -68,8 +68,6 @@ class MathedIter {
|
||||
///
|
||||
byte GetChar() const;
|
||||
///
|
||||
byte * GetString(int & len) const;
|
||||
///
|
||||
string const GetString() const;
|
||||
///
|
||||
MathedInset * GetInset() const;
|
||||
|
@ -49,8 +49,8 @@ ostream & operator<<(ostream & o, MathedMacroFlag mmf)
|
||||
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):
|
||||
@ -216,30 +216,28 @@ MathMacroArgument::MathMacroArgument(int n)
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -192,38 +192,39 @@ void MathParInset::Write(ostream & os, bool fragile)
|
||||
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 << '}';
|
||||
|
Loading…
Reference in New Issue
Block a user