X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiPainter.cpp;h=afa2182eb671f4ee3e53208c0df13efc4a273e86;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=2499b0eb4ceafc92f44a1691a4b8185b15ca82e3;hpb=6a64982eb513762c8007870ced8345b2d8b82ea4;p=lyx.git diff --git a/src/frontends/qt4/GuiPainter.cpp b/src/frontends/qt4/GuiPainter.cpp index 2499b0eb4c..afa2182eb6 100644 --- a/src/frontends/qt4/GuiPainter.cpp +++ b/src/frontends/qt4/GuiPainter.cpp @@ -13,15 +13,20 @@ #include "GuiPainter.h" +#include "ColorCache.h" #include "GuiApplication.h" #include "GuiFontLoader.h" #include "GuiFontMetrics.h" #include "GuiImage.h" #include "qt_helpers.h" +#include "FontInfo.h" #include "Language.h" #include "LyXRC.h" +#include "insets/Inset.h" + +#include "support/lassert.h" #include "support/debug.h" #include @@ -107,7 +112,7 @@ QString GuiPainter::generateStringSignature(QString const & str, FontInfo const } -QColor GuiPainter::computeColor(ColorCode col) +QColor GuiPainter::computeColor(Color col) { return filterColor(guiApp->colorCache().get(col)); } @@ -139,7 +144,7 @@ QColor GuiPainter::filterColor(QColor const & col) } -void GuiPainter::enterMonochromeMode(ColorCode const & min, ColorCode const & max) +void GuiPainter::enterMonochromeMode(Color const & min, Color const & max) { QColor qmin = filterColor(guiApp->colorCache().get(min)); QColor qmax = filterColor(guiApp->colorCache().get(max)); @@ -150,13 +155,13 @@ void GuiPainter::enterMonochromeMode(ColorCode const & min, ColorCode const & ma void GuiPainter::leaveMonochromeMode() { - BOOST_ASSERT(!monochrome_min_.empty()); + LASSERT(!monochrome_min_.empty(), /**/); monochrome_min_.pop(); monochrome_max_.pop(); } -void GuiPainter::point(int x, int y, ColorCode col) +void GuiPainter::point(int x, int y, Color col) { if (!isDrawingEnabled()) return; @@ -167,7 +172,7 @@ void GuiPainter::point(int x, int y, ColorCode col) void GuiPainter::line(int x1, int y1, int x2, int y2, - ColorCode col, + Color col, line_style ls, line_width lw) { @@ -184,7 +189,7 @@ void GuiPainter::line(int x1, int y1, int x2, int y2, void GuiPainter::lines(int const * xp, int const * yp, int np, - ColorCode col, + Color col, line_style ls, line_width lw) { @@ -212,7 +217,7 @@ void GuiPainter::lines(int const * xp, int const * yp, int np, void GuiPainter::rectangle(int x, int y, int w, int h, - ColorCode col, + Color col, line_style ls, line_width lw) { @@ -224,14 +229,17 @@ void GuiPainter::rectangle(int x, int y, int w, int h, } -void GuiPainter::fillRectangle(int x, int y, int w, int h, ColorCode col) +void GuiPainter::fillRectangle(int x, int y, int w, int h, Color col) { + if (!isDrawingEnabled()) + return; + fillRect(x, y, w, h, guiApp->colorCache().get(col)); } void GuiPainter::arc(int x, int y, unsigned int w, unsigned int h, - int a1, int a2, ColorCode col) + int a1, int a2, Color col) { if (!isDrawingEnabled()) return; @@ -255,7 +263,7 @@ void GuiPainter::image(int x, int y, int w, int h, graphics::Image const & i) if (!isDrawingEnabled()) return; - drawImage(x, y, qlimage.qimage(), 0, 0, w, h); + drawImage(x, y, qlimage.image(), 0, 0, w, h); } @@ -328,6 +336,12 @@ int GuiPainter::text(int x, int y, docstring const & s, textwidth = smallCapsText(x, y, str, f); if (f.underbar() == FONT_ON) underline(f, x, y, textwidth); + if (f.strikeout() == FONT_ON) + strikeoutLine(f, x, y, textwidth); + if (f.uuline() == FONT_ON) + doubleUnderline(f, x, y, textwidth); + if (f.uwave() == FONT_ON) + wavyHorizontalLine(x, y, textwidth, f.realColor().baseColor); return textwidth; } @@ -337,6 +351,13 @@ int GuiPainter::text(int x, int y, docstring const & s, textwidth = fm.width(s); if (f.underbar() == FONT_ON) underline(f, x, y, textwidth); + if (f.strikeout() == FONT_ON) + strikeoutLine(f, x, y, textwidth); + if (f.uuline() == FONT_ON) + doubleUnderline(f, x, y, textwidth); + if (f.uwave() == FONT_ON) + // f.color() doesn't work on some circumstances + wavyHorizontalLine(x, y, textwidth, f.realColor().baseColor); if (!isDrawingEnabled()) return textwidth; @@ -358,31 +379,24 @@ int GuiPainter::text(int x, int y, docstring const & s, return textwidth; } - if (!use_pixmap_cache_) { - // don't use the pixmap cache, - // draw directly onto the painting device - setQPainterPen(computeColor(f.realColor())); - if (font() != ff) - setFont(ff); - // We need to draw the text as LTR as we use our own bidi code. - setLayoutDirection(Qt::LeftToRight); - drawText(x, y, str); - //LYXERR(Debug::PAINTING, "draw " << string(str.toUtf8()) - // << " at " << x << "," << y); - return textwidth; - } + if (use_pixmap_cache_) { + QPixmap pm; + QString key = generateStringSignature(str, f); + + // Warning: Left bearing is in general negative! Only the case + // where left bearing is negative is of interest WRT the + // pixmap width and the text x-position. + // Only the left bearing of the first character is important + // as we always write from left to right, even for + // right-to-left languages. + int const lb = min(fm.lbearing(s[0]), 0); + int const mA = fm.maxAscent(); + if (QPixmapCache::find(key, pm)) { + // Draw the cached pixmap. + drawPixmap(x + lb, y - mA, pm); + return textwidth; + } - QPixmap pm; - QString key = generateStringSignature(str, f); - // Warning: Left bearing is in general negative! Only the case - // where left bearing is negative is of interest WRT the the - // pixmap width and the text x-position. - // Only the left bearing of the first character is important - // as we always write from left to right, even for - // right-to-left languages. - int const lb = min(fm.lbearing(s[0]), 0); - int const mA = fm.maxAscent(); - if (!QPixmapCache::find(key, pm)) { // Only the right bearing of the last character is // important as we always write from left to right, // even for right-to-left languages. @@ -390,23 +404,38 @@ int GuiPainter::text(int x, int y, docstring const & s, int const w = textwidth + rb - lb; int const mD = fm.maxDescent(); int const h = mA + mD; - pm = QPixmap(w, h); - pm.fill(Qt::transparent); - GuiPainter p(&pm); - p.setQPainterPen(computeColor(f.realColor())); - if (p.font() != ff) - p.setFont(ff); - // We need to draw the text as LTR as we use our own bidi code. - p.setLayoutDirection(Qt::LeftToRight); - p.drawText(-lb, mA, str); - QPixmapCache::insert(key, pm); - //LYXERR(Debug::PAINTING, "h=" << h << " mA=" << mA << " mD=" << mD - // << " w=" << w << " lb=" << lb << " tw=" << textwidth - // << " rb=" << rb); + if (w > 0 && h > 0) { + pm = QPixmap(w, h); + pm.fill(Qt::transparent); + GuiPainter p(&pm); + p.setQPainterPen(computeColor(f.realColor())); + if (p.font() != ff) + p.setFont(ff); + // We need to draw the text as LTR as we use our own bidi code. + p.setLayoutDirection(Qt::LeftToRight); + p.drawText(-lb, mA, str); + QPixmapCache::insert(key, pm); + //LYXERR(Debug::PAINTING, "h=" << h << " mA=" << mA << " mD=" << mD + // << " w=" << w << " lb=" << lb << " tw=" << textwidth + // << " rb=" << rb); + + // Draw the new cached pixmap. + drawPixmap(x + lb, y - mA, pm); + + return textwidth; + } } - // Draw the cached pixmap. - drawPixmap(x + lb, y - mA, pm); + // don't use the pixmap cache, + // draw directly onto the painting device + setQPainterPen(computeColor(f.realColor())); + if (font() != ff) + setFont(ff); + // We need to draw the text as LTR as we use our own bidi code. + QPainter::setLayoutDirection(Qt::LeftToRight); + drawText(x, y, str); + //LYXERR(Debug::PAINTING, "draw " << string(str.toUtf8()) + // << " at " << x << "," << y); return textwidth; } @@ -434,7 +463,7 @@ void GuiPainter::buttonFrame(int x, int y, int w, int h) void GuiPainter::rectText(int x, int y, docstring const & str, - FontInfo const & font, ColorCode back, ColorCode frame) + FontInfo const & font, Color back, Color frame) { int width; int ascent; @@ -504,6 +533,17 @@ int GuiPainter::preeditText(int x, int y, char_type c, } +void GuiPainter::doubleUnderline(FontInfo const & f, int x, int y, int width) +{ + FontMetrics const & fm = theFontMetrics(f); + + int const below = max(fm.maxDescent() / 2, 2); + + line(x, y + below, x + width, y + below, f.realColor()); + line(x, y + below - 2, x + width, y + below - 2, f.realColor()); +} + + void GuiPainter::underline(FontInfo const & f, int x, int y, int width) { FontMetrics const & fm = theFontMetrics(f); @@ -512,9 +552,23 @@ void GuiPainter::underline(FontInfo const & f, int x, int y, int width) int const height = max((fm.maxDescent() / 4) - 1, 1); if (height < 2) - line(x, y + below, x + width, y + below, f.color()); + line(x, y + below, x + width, y + below, f.realColor()); + else + fillRectangle(x, y + below, width, below + height, f.realColor()); +} + + +void GuiPainter::strikeoutLine(FontInfo const & f, int x, int y, int width) +{ + FontMetrics const & fm = theFontMetrics(f); + + int const middle = max((fm.maxHeight() / 4), 1); + int const height = middle/3; + + if (height < 2) + line(x, y - middle, x + width, y - middle, f.realColor()); else - fillRectangle(x, y + below, width, below + height, f.color()); + fillRectangle(x, y - middle, width, height, f.realColor()); } @@ -529,7 +583,26 @@ void GuiPainter::dashedUnderline(FontInfo const & f, int x, int y, int width) height += below; for (int n = 0; n != height; ++n) - line(x, y + below + n, x + width, y + below + n, f.color(), line_onoffdash); + line(x, y + below + n, x + width, y + below + n, f.realColor(), line_onoffdash); +} + + +void GuiPainter::wavyHorizontalLine(int x, int y, int width, ColorCode col) +{ + setQPainterPen(computeColor(col)); + int const step = 4; + int const xend = x + width; + int height = 1; + //FIXME: I am not sure if Antialiasing gives the best effect. + //setRenderHint(Antialiasing, true); + while (x < xend) { + height = - height; + drawLine(x, y - height, x + step, y + height); + x += step; + drawLine(x, y + height, x + 2, y + height); + x += 2; + } + //setRenderHint(Antialiasing, false); } } // namespace frontend