* frontends/Painter:

- text(): now returns drawn text width()

* rowpainter:
 - paintChars(): use the returned width from Painter::text() instead of recalculating it.

All other files: implement the API change. qt3 and gtk not 100% guaranted to compile nor work.






git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15294 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2006-10-10 13:24:08 +00:00
parent f5f4b31f4a
commit 4add252628
9 changed files with 64 additions and 46 deletions

View File

@ -132,19 +132,26 @@ public:
lyx::graphics::Image const & image) = 0; lyx::graphics::Image const & image) = 0;
/// draw a string at position x, y (y is the baseline) /// draw a string at position x, y (y is the baseline)
virtual void text(int x, int y, /**
* \return the width of the drawn text.
*/
virtual int text(int x, int y,
lyx::docstring const & str, LyXFont const & f) = 0; lyx::docstring const & str, LyXFont const & f) = 0;
/** /**
* Draw a string at position x, y (y is the baseline) * Draw a string at position x, y (y is the baseline)
* This is just for fast drawing * This is just for fast drawing
* \return the width of the drawn text.
*/ */
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type const * str, size_t l, lyx::char_type const * str, size_t l,
LyXFont const & f) = 0; LyXFont const & f) = 0;
/// draw a char at position x, y (y is the baseline) /// draw a char at position x, y (y is the baseline)
virtual void text(int x, int y, /**
* \return the width of the drawn text.
*/
virtual int text(int x, int y,
lyx::char_type c, LyXFont const & f) = 0; lyx::char_type c, LyXFont const & f) = 0;
/** /**

View File

@ -196,7 +196,7 @@ inline XftFont * getXftFont(LyXFont const & f)
} // anon namespace } // anon namespace
void GPainter::text(int x, int y, int GPainter::text(int x, int y,
char_type const * s, size_t ls, char_type const * s, size_t ls,
LyXFont const & f) LyXFont const & f)
{ {
@ -204,6 +204,8 @@ void GPainter::text(int x, int y,
XftColor * xftClr = owner_.getColorHandler(). XftColor * xftClr = owner_.getColorHandler().
getXftColor(f.realColor()); getXftColor(f.realColor());
XftDraw * draw = owner_.getXftDraw(); XftDraw * draw = owner_.getXftDraw();
int textwidth = 0;
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) { if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
XftDrawString32(draw, XftDrawString32(draw,
xftClr, xftClr,
@ -211,11 +213,11 @@ void GPainter::text(int x, int y,
x, y, x, y,
reinterpret_cast<FcChar32 const *>(s), reinterpret_cast<FcChar32 const *>(s),
ls); ls);
textwidth = font_metrics::width(s, ls, f);
} else { } else {
LyXFont smallfont(f); LyXFont smallfont(f);
smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE); smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
XftFont * fontS = getXftFont(smallfont); XftFont * fontS = getXftFont(smallfont);
int tmpx = x;
for (unsigned int i = 0; i < ls; ++i) { for (unsigned int i = 0; i < ls; ++i) {
// Ok, this looks quite ugly... // Ok, this looks quite ugly...
char_type c = gdk_keyval_to_unicode(gdk_keyval_to_upper(gdk_unicode_to_keyval(s[i]))); char_type c = gdk_keyval_to_unicode(gdk_keyval_to_upper(gdk_unicode_to_keyval(s[i])));
@ -223,35 +225,37 @@ void GPainter::text(int x, int y,
XftDrawString32(draw, XftDrawString32(draw,
xftClr, xftClr,
fontS, fontS,
tmpx, y, x + textwidth, y,
reinterpret_cast<FcChar32 *>(&c), reinterpret_cast<FcChar32 *>(&c),
1); 1);
tmpx += font_metrics::width(c, smallfont); textwidth += font_metrics::width(c, smallfont);
} else { } else {
XftDrawString32(draw, XftDrawString32(draw,
xftClr, xftClr,
font, font,
tmpx, y, x + textwidth, y,
reinterpret_cast<FcChar32 *>(&c), reinterpret_cast<FcChar32 *>(&c),
1); 1);
tmpx += font_metrics::width(c, f); textwidth += font_metrics::width(c, f);
} }
} }
} }
if (f.underbar() == LyXFont::ON) if (f.underbar() == LyXFont::ON)
underline(f, x, y, font_metrics::width(s, ls, f)); underline(f, x, y, textwidth);
return textwidth;
} }
void GPainter::text(int x, int y, docstring const & s, LyXFont const & f) int GPainter::text(int x, int y, docstring const & s, LyXFont const & f)
{ {
text (x, y, reinterpret_cast<char_type const *>(s.data()), s.size(), f); return text (x, y, reinterpret_cast<char_type const *>(s.data()), s.size(), f);
} }
void GPainter::text(int x, int y, char_type c, LyXFont const & f) int GPainter::text(int x, int y, char_type c, LyXFont const & f)
{ {
text (x, y, &c, 1, f); return text (x, y, &c, 1, f);
} }

View File

@ -97,16 +97,16 @@ public:
graphics::Image const & image); graphics::Image const & image);
/// draw a string at position x, y (y is the baseline) /// draw a string at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::docstring const & str, LyXFont const & f); lyx::docstring const & str, LyXFont const & f);
/// draw a string at position x, y (y is the baseline) /// draw a string at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type const * str, size_t l, lyx::char_type const * str, size_t l,
LyXFont const & f); LyXFont const & f);
/// draw a char at position x, y (y is the baseline) /// draw a char at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type c, LyXFont const & f); lyx::char_type c, LyXFont const & f);
void start(); void start();

View File

@ -57,13 +57,13 @@ public:
/// ///
void image(int, int, int, int, lyx::graphics::Image const &) {} void image(int, int, int, int, lyx::graphics::Image const &) {}
/// ///
void text(int, int, lyx::docstring const &, LyXFont const &) {} int text(int, int, lyx::docstring const &, LyXFont const &) { return 0; }
// /// // ///
// void text(int, int, char const *, size_t, LyXFont const &) {} // int text(int, int, char const *, size_t, LyXFont const &) { return 0; }
/// ///
void text(int, int, lyx::char_type const *, size_t, LyXFont const &) {} int text(int, int, lyx::char_type const *, size_t, LyXFont const &) { return 0; }
/// ///
void text(int, int, lyx::char_type, LyXFont const &) {} int text(int, int, lyx::char_type, LyXFont const &) { return 0; }
/// ///
void rectText(int, int, lyx::docstring const &, void rectText(int, int, lyx::docstring const &,
LyXFont const &, LColor_color, LColor_color) {} LyXFont const &, LColor_color, LColor_color) {}

View File

@ -159,21 +159,21 @@ void QLPainter::image(int x, int y, int w, int h,
} }
void QLPainter::text(int x, int y, docstring const & s, LyXFont const & f) int QLPainter::text(int x, int y, docstring const & s, LyXFont const & f)
{ {
lyxerr << "Drawing string" << endl; lyxerr << "Drawing string" << endl;
return text(x, y, reinterpret_cast<lyx::char_type const *>(s.data()), s.length(), f); return text(x, y, reinterpret_cast<lyx::char_type const *>(s.data()), s.length(), f);
} }
void QLPainter::text(int x, int y, lyx::char_type c, LyXFont const & f) int QLPainter::text(int x, int y, lyx::char_type c, LyXFont const & f)
{ {
char_type s[2] = { c, L'\0' }; char_type s[2] = { c, L'\0' };
return text(x, y, s, 1, f); return text(x, y, s, 1, f);
} }
void QLPainter::smallCapsText(int x, int y, int QLPainter::smallCapsText(int x, int y,
QString const & s, LyXFont const & f) QString const & s, LyXFont const & f)
{ {
LyXFont smallfont(f); LyXFont smallfont(f);
@ -184,25 +184,27 @@ void QLPainter::smallCapsText(int x, int y,
QFontMetrics const & qfontm = QFontMetrics(qfont); QFontMetrics const & qfontm = QFontMetrics(qfont);
QFontMetrics const & qsmallfontm = QFontMetrics(qsmallfont); QFontMetrics const & qsmallfontm = QFontMetrics(qsmallfont);
int tmpx = x;
size_t ls = s.length(); size_t ls = s.length();
int textwidth = 0;
for (size_t i = 0; i < ls; ++i) { for (size_t i = 0; i < ls; ++i) {
// Brain-dead MSVC wants at(i) rather than operator[] // Brain-dead MSVC wants at(i) rather than operator[]
QChar const c = s.at(i).upper(); QChar const c = s.at(i).upper();
if (c != s.at(i)) { if (c != s.at(i)) {
qp_->setFont(qsmallfont); qp_->setFont(qsmallfont);
qp_->drawText(tmpx, y, c); qp_->drawText(x + textwidth, y, c);
tmpx += qsmallfontm.width(c); textwidth += qsmallfontm.width(c);
} else { } else {
qp_->setFont(qfont); qp_->setFont(qfont);
qp_->drawText(tmpx, y, c); qp_->drawText(x + textwidth, y, c);
tmpx += qfontm.width(c); textwidth += qfontm.width(c);
} }
} }
return textwidth;
} }
void QLPainter::text(int x, int y, lyx::char_type const * s, size_t ls, int QLPainter::text(int x, int y, lyx::char_type const * s, size_t ls,
LyXFont const & f) LyXFont const & f)
{ {
lyxerr << "Drawing lyx::char_type const * s" << endl; lyxerr << "Drawing lyx::char_type const * s" << endl;
@ -235,18 +237,23 @@ void QLPainter::text(int x, int y, lyx::char_type const * s, size_t ls,
str = ' ' + str; str = ' ' + str;
#endif #endif
int textwidth;
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) { if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
qp_->setFont(fontloader.get(f)); qp_->setFont(fontloader.get(f));
// We need to draw the text as LTR as we use our own bidi // We need to draw the text as LTR as we use our own bidi
// code. // code.
qp_->drawText(x, y, str, -1, QPainter::LTR); qp_->drawText(x, y, str, -1, QPainter::LTR);
textwidth = qp_->fontMetrics().width(str);
} else { } else {
smallCapsText(x, y, str, f); textwidth = smallCapsText(x, y, str, f);
} }
if (f.underbar() == LyXFont::ON) { if (f.underbar() == LyXFont::ON) {
underline(f, x, y, qp_->fontMetrics().width(str)); underline(f, x, y, textwidth);
} }
return textwidth;
} }
} // namespace frontend } // namespace frontend

View File

@ -98,22 +98,22 @@ public:
lyx::graphics::Image const & image); lyx::graphics::Image const & image);
/// draw a string at position x, y (y is the baseline) /// draw a string at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::docstring const & str, LyXFont const & f); lyx::docstring const & str, LyXFont const & f);
/** Draw a string at position x, y (y is the baseline) /** Draw a string at position x, y (y is the baseline)
* This is just for fast drawing * This is just for fast drawing
*/ */
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type const * str, size_t l, lyx::char_type const * str, size_t l,
LyXFont const & f); LyXFont const & f);
/// draw a char at position x, y (y is the baseline) /// draw a char at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type c, LyXFont const & f); lyx::char_type c, LyXFont const & f);
private: private:
/// draw small caps text /// draw small caps text
void smallCapsText(int x, int y, int smallCapsText(int x, int y,
QString const & str, LyXFont const & f); QString const & str, LyXFont const & f);
/// set pen parameters /// set pen parameters

View File

@ -183,13 +183,13 @@ void QLPainter::image(int x, int y, int w, int h,
} }
void QLPainter::text(int x, int y, docstring const & s, LyXFont const & f) int QLPainter::text(int x, int y, docstring const & s, LyXFont const & f)
{ {
return text(x, y, reinterpret_cast<char_type const *>(s.data()), s.length(), f); return text(x, y, reinterpret_cast<char_type const *>(s.data()), s.length(), f);
} }
void QLPainter::text(int x, int y, char_type c, LyXFont const & f) int QLPainter::text(int x, int y, char_type c, LyXFont const & f)
{ {
char_type s[2] = { c, char_type('\0') }; char_type s[2] = { c, char_type('\0') };
return text(x, y, s, 1, f); return text(x, y, s, 1, f);
@ -222,7 +222,7 @@ int QLPainter::smallCapsText(int x, int y,
} }
void QLPainter::text(int x, int y, char_type const * s, size_t ls, int QLPainter::text(int x, int y, char_type const * s, size_t ls,
LyXFont const & f) LyXFont const & f)
{ {
#if 0 #if 0
@ -260,6 +260,7 @@ void QLPainter::text(int x, int y, char_type const * s, size_t ls,
underline(f, x, y, textwidth); underline(f, x, y, textwidth);
} }
return textwidth;
} }

View File

@ -103,18 +103,18 @@ public:
lyx::graphics::Image const & image); lyx::graphics::Image const & image);
/// draw a string at position x, y (y is the baseline) /// draw a string at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::docstring const & str, LyXFont const & f); lyx::docstring const & str, LyXFont const & f);
/** Draw a string at position x, y (y is the baseline) /** Draw a string at position x, y (y is the baseline)
* This is just for fast drawing * This is just for fast drawing
*/ */
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type const * str, size_t l, lyx::char_type const * str, size_t l,
LyXFont const & f); LyXFont const & f);
/// draw a char at position x, y (y is the baseline) /// draw a char at position x, y (y is the baseline)
virtual void text(int x, int y, virtual int text(int x, int y,
lyx::char_type c, LyXFont const & f); lyx::char_type c, LyXFont const & f);
/// draw a pixmap from the image cache /// draw a pixmap from the image cache

View File

@ -316,12 +316,11 @@ void RowPainter::paintChars(pos_type & vpos, LyXFont font,
// Draw text and set the new x position // Draw text and set the new x position
//lyxerr << "paint row: yo_ " << yo_ << "\n"; //lyxerr << "paint row: yo_ " << yo_ << "\n";
#if 0 #if 0
pain_.text(int(x_), yo_, str, font); int width = pain_.text(int(x_), yo_, str, font);
x_ += theApp->fontLoader().metrics(font).width(str);
#else #else
pain_.text(int(x_), yo_, &str[0], str.size(), font); int width = pain_.text(int(x_), yo_, &str[0], str.size(), font);
x_ += theApp->fontLoader().metrics(font).width(&str[0], str.size());
#endif #endif
x_ += width;
} }