#include "QLPainter.h"
-#include "QWorkArea.h"
+#include "GuiApplication.h"
+#include "GuiWorkArea.h"
#include "QLImage.h"
+#include "FontLoader.h"
-#include "lcolorcache.h"
-#include "qfont_loader.h"
+#include "GuiApplication.h"
+#include "qt_helpers.h"
#include "debug.h"
#include "language.h"
#include "frontends/font_metrics.h"
+#include "support/unicode.h"
+
#include <QPainter>
#include <QPicture>
#include <QPixmap>
#include <QImage>
+using lyx::char_type;
+using lyx::docstring;
+
using std::endl;
using std::string;
+namespace lyx {
+namespace frontend {
QLPainter::~QLPainter()
{
}
-QLPainter::QLPainter(QWorkArea * qwa)
- : Painter(), paint_check_(0), qwa_(qwa)
+
+QLPainter::QLPainter(GuiWorkArea * qwa)
+ : Painter(), qwa_(qwa)
{
}
+
void QLPainter::start()
{
+ qp_.reset(new QPainter(qwa_->paintDevice()));
+ // new QPainter has default QPen:
+ current_color_ = LColor::black;
+ current_ls_ = line_solid;
+ current_lw_ = line_thin;
}
void QLPainter::end()
{
-// if (qp_->isActive())
-// qp_->end();
+ qp_->end();
}
return qwa_->viewport()->height();
}
-/*
-QPainter & QLPainter::setPen(LColor_color c,
+void QLPainter::setQPainterPen(LColor_color col,
Painter::line_style ls, Painter::line_width lw)
{
- QPen pen = qp_->pen();
+ if (col == current_color_ && ls == current_ls_ && lw == current_lw_)
+ return;
- pen.setColor(lcolorcache.get(c));
+ current_color_ = col;
+ current_ls_ = ls;
+ current_lw_ = lw;
- switch (ls) {
- case line_solid: pen.setStyle(Qt::SolidLine); break;
- case line_onoffdash: pen.setStyle(Qt::DotLine); break;
- }
+ QPen pen = qp_.get()->pen();
- switch (lw) {
- case line_thin: pen.setWidth(0); break;
- case line_thick: pen.setWidth(3); break;
- }
-
- qp_->setPen(pen);
-
- return *qp_;
-}
-*/
-QPainter & QLPainter::setQPainterPen(QPainter & qp, LColor_color c,
- Painter::line_style ls, Painter::line_width lw)
-{
- QPen pen = qp.pen();
-
- pen.setColor(lcolorcache.get(c));
+ pen.setColor(guiApp->colorCache().get(col));
switch (ls) {
case line_solid: pen.setStyle(Qt::SolidLine); break;
case line_thick: pen.setWidth(3); break;
}
- qp.setPen(pen);
-
- return qp;
+ qp_.get()->setPen(pen);
}
-void QLPainter::point(int x, int y, LColor_color c)
+
+void QLPainter::point(int x, int y, LColor_color col)
{
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, c).drawPoint(x, y);
+ setQPainterPen(col);
+ qp_->drawPoint(x, y);
}
line_style ls,
line_width lw)
{
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, col, ls, lw).drawLine(x1, y1, x2, y2);
+ setQPainterPen(col, ls, lw);
+ qp_->drawLine(x1, y1, x2, y2);
}
points[i].setY(yp[i]);
}
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, col, ls, lw).drawPolyline(points.get(), np);
+ setQPainterPen(col, ls, lw);
+ qp_->drawPolyline(points.get(), np);
}
line_style ls,
line_width lw)
{
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, col, ls, lw).drawRect(x, y, w, h);
+ setQPainterPen(col, ls, lw);
+ qp_->drawRect(x, y, w, h);
}
void QLPainter::fillRectangle(int x, int y, int w, int h, LColor_color col)
{
-// lyxerr[Debug::GRAPHICS] << BOOST_CURRENT_FUNCTION
-// << "\nx=" << x << " y=" << y << " w=" << w << " h=" << h
-// << " LColor " << col << endl;
-
- QPainter qp(qwa_->pixmap());
- qp.fillRect(x, y, w, h, lcolorcache.get(col));
-}
-
-
-void QLPainter::fillPolygon(int const * xp, int const * yp,
- int np, LColor_color col)
-{
- // Must use new as np is not known at compile time.
- boost::scoped_array<QPoint> points(new QPoint[np]);
-
- for (int i = 0; i < np; ++i) {
- points[i].setX(xp[i]);
- points[i].setY(yp[i]);
- }
-
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, col);
- qp.setBrush(lcolorcache.get(col));
- qp.drawPolygon(points.get(), np);
- qp.setBrush(Qt::NoBrush);
+ qp_->fillRect(x, y, w, h, guiApp->colorCache().get(col));
}
int a1, int a2, LColor_color col)
{
// LyX usings 1/64ths degree, Qt usings 1/16th
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, col).drawArc(x, y, w, h, a1 / 4, a2 / 4);
+ setQPainterPen(col);
+ qp_->drawArc(x, y, w, h, a1 / 4, a2 / 4);
}
fillRectangle(x, y, w, h, LColor::graphicsbg);
- QPainter qp(qwa_->pixmap());
- qp.drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
+ qp_->drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
}
-void QLPainter::text(int x, int y, string const & s, LyXFont const & f)
+void QLPainter::text(int x, int y, docstring const & s, LyXFont const & f)
{
- return text(x, y, 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 c, LyXFont const & f)
+void QLPainter::text(int x, int y, char_type c, LyXFont const & f)
{
- char s[2] = { c, '\0' };
+ char_type s[2] = { c, char_type('\0') };
return text(x, y, s, 1, f);
}
LyXFont smallfont(f);
smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
- QFont const & qfont = fontloader.get(f);
- QFont const & qsmallfont = fontloader.get(smallfont);
+ QFont const & qfont = guiApp->guiFontLoader().get(f);
+ QFont const & qsmallfont = guiApp->guiFontLoader().get(smallfont);
QFontMetrics const & qfontm = QFontMetrics(qfont);
QFontMetrics const & qsmallfontm = QFontMetrics(qsmallfont);
- QPainter qp(qwa_->pixmap());
+ setQPainterPen(f.realColor());
int tmpx = x;
size_t ls = s.length();
- for (size_t i = 0; i < ls; ++i) {
- // Brain-dead MSVC wants at(i) rather than operator[]
- QChar const c = s.at(i).upper();
+ for (unsigned int i = 0; i < ls; ++i) {
+ QChar const c = s[i].toUpper();
if (c != s.at(i)) {
- qp.setFont(qsmallfont);
- qp.drawText(tmpx, y, c);
+ qp_->setFont(qsmallfont);
+ qp_->drawText(tmpx, y, c);
tmpx += qsmallfontm.width(c);
} else {
- qp.setFont(qfont);
- qp.drawText(tmpx, y, c);
+ qp_->setFont(qfont);
+ qp_->drawText(tmpx, y, c);
tmpx += qfontm.width(c);
}
}
}
-void QLPainter::text(int x, int y, char const * s, size_t ls,
+void QLPainter::text(int x, int y, char_type const * s, size_t ls,
LyXFont const & f)
{
- QPainter qp(qwa_->pixmap());
- setQPainterPen(qp, f.realColor());
-
+#if 0
Encoding const * encoding = f.language()->encoding();
if (f.isSymbolFont())
encoding = encodings.symbol_encoding();
+#endif
+#if 0
QString str;
str.setLength(ls);
- for (size_t i = 0; i < ls; ++i)
- // Brain-dead MSVC wants at(i) rather than operator[]
+ for (unsigned int i = 0; i < ls; ++i)
str[i] = QChar(encoding->ucs(s[i]));
+#else
+ QString str = ucs4_to_qstring(s, ls);
+#endif
+
+#if 0
// HACK: QT3 refuses to show single compose characters
+ // Still needed with Qt4?
if (ls == 1 && str[0].unicode() >= 0x05b0 && str[0].unicode() <= 0x05c2)
str = ' ' + str;
+#endif
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
- qp.setFont(fontloader.get(f));
- // We need to draw the text as LTR as we use our own bidi
- // code.
- qp.setLayoutDirection(Qt::LeftToRight);
- qp.drawText(x, y, str, -1);
+ setQPainterPen(f.realColor());
+ qp_->setFont(guiApp->guiFontLoader().get(f));
+ // We need to draw the text as LTR as we use our own bidi code.
+ qp_->setLayoutDirection(Qt::LeftToRight);
+ qp_->drawText(x, y, str);
} else {
smallCapsText(x, y, str, f);
}
}
}
-/// draw a pixmap from the image cache
-void QLPainter::pixmap(int x, int y, QPixmap const & pixmap)
+
+
+void QLPainter::drawPixmap(int x, int y, QPixmap const & pixmap)
+{
+ qp_->drawPixmap(x, y, pixmap);
+}
+
+
+void QLPainter::drawImage(int x, int y, QImage const & image)
{
- QPainter qp(qwa_->pixmap());
- qp.drawPixmap(x, y, pixmap);
+ qp_->drawImage(x, y, image);
}
+
+} // namespace frontend
+} // namespace lyx