* Full author contact details are available in file CREDITS.
*/
-#ifdef Q_OS_MAC
-#define USE_RTL_OVERRIDE 1
-#endif
-
#include <config.h>
#include "GuiPainter.h"
int GuiPainter::text(int x, int y, docstring const & s,
- FontInfo const & f, bool const rtl)
+ FontInfo const & f, bool const rtl,
+ double const wordspacing)
{
//LYXERR0("text: x=" << x << ", s=" << s);
if (s.empty())
str = ' ' + str;
#endif
- QFont const & ff = getFont(f);
+ QFont ff = getFont(f);
+ ff.setWordSpacing(wordspacing);
GuiFontMetrics const & fm = getFontMetrics(f);
// Here we use the font width cache instead of
/* In LyX, the character direction is forced by the language.
* Therefore, we have to signal that fact to Qt.
*/
-#ifdef USE_RTL_OVERRIDE
+#if 1
/* Use unicode override characters to enforce drawing direction
* Source: http://www.iamcal.com/understanding-bidirectional-text/
*/
str = QChar(0x202D) + str;
drawText(x, y, str);
#else
- /* This is a cleanr solution, but it has two drawbacks
- * - it seems that it does not work under Mac OS X
+ /* This looks like a cleaner solution, but it has drawbacks
+ * - does not work reliably (Mac OS X, ...)
* - it is not really documented
+ * Keep it here for now, in case it can be helpful
*/
//This is much stronger than setLayoutDirection.
int flag = rtl ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight;
}
-int GuiPainter::text(int x, int y, docstring const & str, Font const & f)
+int GuiPainter::text(int x, int y, docstring const & str, Font const & f,
+ double const wordspacing)
{
- return text(x, y, str, f.fontInfo(), f.isVisibleRightToLeft());
+ return text(x, y, str, f.fontInfo(), f.isVisibleRightToLeft(), wordspacing);
}
int GuiPainter::text(int x, int y, docstring const & str, Font const & f,
- Color other, size_type from, size_type to)
+ Color other, size_type const from, size_type const to,
+ double const wordspacing)
{
GuiFontMetrics const & fm = getFontMetrics(f.fontInfo());
FontInfo fi = f.fontInfo();
// dimensions
int const ascent = fm.maxAscent();
int const height = fm.maxAscent() + fm.maxDescent();
- int xmin = fm.pos2x(str, from, rtl);
- int xmax = fm.pos2x(str, to, rtl);
+ int xmin = fm.pos2x(str, from, rtl, wordspacing);
+ int xmax = fm.pos2x(str, to, rtl, wordspacing);
if (xmin > xmax)
swap(xmin, xmax);
fi.setPaintColor(other);
QRegion const clip(x + xmin, y - ascent, xmax - xmin, height);
setClipRegion(clip);
- int const textwidth = text(x, y, str, fi, rtl);
+ int const textwidth = text(x, y, str, fi, rtl, wordspacing);
// Then the part in normal color
// Note that in Qt5, it is not possible to use Qt::UniteClip,
fi.setPaintColor(orig);
QRegion region(viewport());
setClipRegion(region - clip);
- text(x, y, str, fi, rtl);
+ text(x, y, str, fi, rtl, wordspacing);
setClipping(false);
return textwidth;
}
-void GuiPainter::doubleUnderline(FontInfo const & f, int x, int y, int width)
+void GuiPainter::underline(FontInfo const & f, int x, int y, int width,
+ line_style ls)
{
FontMetrics const & fm = theFontMetrics(f);
+ int const pos = fm.underlinePos();
- 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());
+ line(x, y + pos, x + width, y + pos,
+ f.realColor(), ls, fm.lineWidth());
}
-void GuiPainter::underline(FontInfo const & f, int x, int y, int width)
+void GuiPainter::strikeoutLine(FontInfo const & f, int x, int y, int width)
{
FontMetrics const & fm = theFontMetrics(f);
+ int const pos = fm.strikeoutPos();
- int const below = max(fm.maxDescent() / 2, 2);
- int const height = max((fm.maxDescent() / 4) - 1, 1);
-
- if (height < 2)
- line(x, y + below, x + width, y + below, f.realColor());
- else
- fillRectangle(x, y + below, width, below + height, f.realColor());
+ line(x, y - pos, x + width, y - pos,
+ f.realColor(), line_solid, fm.lineWidth());
}
-void GuiPainter::strikeoutLine(FontInfo const & f, int x, int y, int width)
+void GuiPainter::doubleUnderline(FontInfo const & f, int x, int y, int width)
{
FontMetrics const & fm = theFontMetrics(f);
+ int const pos1 = fm.underlinePos() + fm.lineWidth();
+ int const pos2 = fm.underlinePos() - fm.lineWidth() + 1;
- 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 - middle, width, height, f.realColor());
+ line(x, y + pos1, x + width, y + pos1,
+ f.realColor(), line_solid, fm.lineWidth());
+ line(x, y + pos2, x + width, y + pos2,
+ f.realColor(), line_solid, fm.lineWidth());
}