Aesthetics: off-by-one in line drawing

It is a general problem when doing graphics to know where a line
begins and where it ends pixel-wise. At the instigation of Scott, and
with the use of the kmag magnifier, this commit corrects 3 areas:

* foreign marks were larger than the row element they were supposed to
  mark. This could lead to moving lines, depending on paint ordering.

* visible spaces were drawn outside of their box (select a single
  space to see this).

* the `L' blinking caret would leave a cursor dropping because the
  horizontal part was too wide.
This commit is contained in:
Jean-Marc Lasgouttes 2018-07-23 17:07:48 +02:00
parent 022228e56f
commit ad954a32a5
3 changed files with 9 additions and 9 deletions

View File

@ -159,7 +159,7 @@ void RowPainter::paintForeignMark(Row::Element const & e) const
int const desc = e.inset ? e.dim.descent() : 0; int const desc = e.inset ? e.dim.descent() : 0;
int const y = yo_ + min(3 * pi_.base.solidLineOffset() / 2 + desc, int const y = yo_ + min(3 * pi_.base.solidLineOffset() / 2 + desc,
row_.descent() - 1); row_.descent() - 1);
pi_.pain.line(int(x_), y, int(x_ + e.full_width()), y, Color_language, pi_.pain.line(int(x_), y, int(x_ + e.full_width() - 1), y, Color_language,
Painter::line_solid, pi_.base.solidLineThickness()); Painter::line_solid, pi_.base.solidLineThickness());
} }

View File

@ -150,9 +150,9 @@ public:
painter.setPen(color_); painter.setPen(color_);
if (l_shape_) { if (l_shape_) {
if (rtl_) if (rtl_)
painter.drawLine(x_, bot, x_ - l, bot); painter.drawLine(x_, bot, x_ - l + 1, bot);
else else
painter.drawLine(x_, bot, x_ + caret_width_ + r, bot); painter.drawLine(x_, bot, x_ + caret_width_ + r - 1, bot);
} }
// draw completion triangle // draw completion triangle

View File

@ -355,18 +355,18 @@ void InsetSpace::draw(PainterInfo & pi, int x, int y) const
int const h = theFontMetrics(pi.base.font).xHeight(); int const h = theFontMetrics(pi.base.font).xHeight();
int xp[4], yp[4]; int xp[4], yp[4];
xp[0] = x; xp[0] = x + 1;
yp[0] = y - max(h / 4, 1); yp[0] = y - max(h / 4, 1);
if (params_.kind == InsetSpaceParams::NORMAL || if (params_.kind == InsetSpaceParams::NORMAL ||
params_.kind == InsetSpaceParams::PROTECTED || params_.kind == InsetSpaceParams::PROTECTED ||
params_.kind == InsetSpaceParams::VISIBLE) { params_.kind == InsetSpaceParams::VISIBLE) {
xp[1] = x; yp[1] = y; xp[1] = x + 1; yp[1] = y;
xp[2] = x + w; yp[2] = y; xp[2] = x + w - 2; yp[2] = y;
} else { } else {
xp[1] = x; yp[1] = y + max(h / 4, 1); xp[1] = x + 1; yp[1] = y + max(h / 4, 1);
xp[2] = x + w; yp[2] = y + max(h / 4, 1); xp[2] = x + w - 2; yp[2] = y + max(h / 4, 1);
} }
xp[3] = x + w; xp[3] = x + w - 2;
yp[3] = y - max(h / 4, 1); yp[3] = y - max(h / 4, 1);
Color col = Color_special; Color col = Color_special;