diff options
author | Neil <nyamatongwe@gmail.com> | 2014-03-26 10:07:32 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2014-03-26 10:07:32 +1100 |
commit | 7617b84467db2acec9de99a2a2e800f3d59689d5 (patch) | |
tree | e525d0a96e6e183cf0c63adfc27affc4601741e6 | |
parent | 907de3d67de5e1365d7c93c597dcfd9ae7373351 (diff) | |
download | scintilla-mirror-7617b84467db2acec9de99a2a2e800f3d59689d5.tar.gz |
Bug [#1588]. Round caret positions to the pixel grid instead of truncating.
This may move the caret to the right 1 pixel in some situations. While sometimes this
appears a little worse, on average it is slightly better than the precious code, with
carets appearing inside the previous character less often.
-rw-r--r-- | doc/ScintillaHistory.html | 5 | ||||
-rw-r--r-- | src/Editor.cxx | 12 |
2 files changed, 13 insertions, 4 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index b1b25eb45..225c18cda 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -470,6 +470,11 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1585/">Bug #1585</a>. </li> <li> + Caret positioning changed a little to appear inside characters less often by + rounding the caret position to the pixel grid instead of truncating. + <a href="http://sourceforge.net/p/scintilla/bugs/1588/">Bug #1588</a>. + </li> + <li> Bug fixed where automatic indentation wrong when caret in virtual space. <a href="http://sourceforge.net/p/scintilla/bugs/1586/">Bug #1586</a>. </li> diff --git a/src/Editor.cxx b/src/Editor.cxx index c340bedf2..6c29e7100 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -88,6 +88,10 @@ Timer::Timer() : Idler::Idler() : state(false), idlerID(0) {} +static int RoundXYPosition(XYPOSITION xyPos) { + return int(xyPos+0.5); +} + static inline bool IsControlCharacter(int ch) { // iscntrl returns true for lots of chars > 127 which are displayable return ch >= 0 && ch < ' '; @@ -3417,7 +3421,7 @@ void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xS bool caretAtEOL = false; bool drawBlockCaret = false; XYPOSITION widthOverstrikeCaret; - int caretWidthOffset = 0; + XYPOSITION caretWidthOffset = 0; PRectangle rcCaret = rcLine; if (posCaret.Position() == pdoc->Length()) { // At end of document @@ -3433,11 +3437,11 @@ void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xS widthOverstrikeCaret = 3; if (xposCaret > 0) - caretWidthOffset = 1; // Move back so overlaps both character cells. + caretWidthOffset = 0.51f; // Move back so overlaps both character cells. xposCaret += xStart; if (posDrag.IsValid()) { /* Dragging text, use a line caret */ - rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.left = RoundXYPosition(xposCaret - caretWidthOffset); rcCaret.right = rcCaret.left + vsDraw.caretWidth; } else if (inOverstrike && drawOverstrikeCaret) { /* Overstrike (insert mode), use a modified bar caret */ @@ -3455,7 +3459,7 @@ void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xS } } else { /* Line caret */ - rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.left = RoundXYPosition(xposCaret - caretWidthOffset); rcCaret.right = rcCaret.left + vsDraw.caretWidth; } ColourDesired caretColour = mainCaret ? vsDraw.caretcolour : vsDraw.additionalCaretColour; |