diff options
author | Neil <nyamatongwe@gmail.com> | 2018-06-02 08:37:47 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2018-06-02 08:37:47 +1000 |
commit | 2e003602f29edff5d38137472edee82fab9f5376 (patch) | |
tree | efcd2d4466c2bb894d5354d0652e986fdfcbea22 /src/EditView.cxx | |
parent | e67783d907b0ae186d794b205cf89c645fe50270 (diff) | |
download | scintilla-mirror-2e003602f29edff5d38137472edee82fab9f5376.tar.gz |
Define IScreenLineLayout as the main interface for implementing bidirectional
features by platform code.
Implement IScreenLineLayout for Win32 / DirectWrite as ScreenLineLayout.
Diffstat (limited to 'src/EditView.cxx')
-rw-r--r-- | src/EditView.cxx | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index 5b58d367a..7e2694366 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -650,7 +650,8 @@ Point EditView::LocationFromPosition(Surface *surface, const EditModel &model, S // Get the point from current position const ScreenLine screenLine(ll, subLine, vs, rcClient.right, tabWidthMinimumPixels); - pt.x = surface->XFromPosition(&screenLine, caretPosition); + std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); + pt.x = slLayout->XFromPosition(caretPosition); pt.x += vs.textStart - model.xOffset; @@ -719,7 +720,8 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo UpdateBidiData(model, vs, ll); const ScreenLine screenLine(ll, subLine, vs, rcClient.right, tabWidthMinimumPixels); - positionInLine = surface->PositionFromX(&screenLine, static_cast<XYPOSITION>(pt.x), charPosition) + + std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); + positionInLine = slLayout->PositionFromX(static_cast<XYPOSITION>(pt.x), charPosition) + rangeSubLine.start; } else { positionInLine = ll->FindPositionFromX(static_cast<XYPOSITION>(pt.x + subLineStart), @@ -1096,7 +1098,8 @@ static void DrawIndicator(int indicNum, Sci::Position startPos, Sci::Position en ScreenLine screenLine(ll, subLine, vsDraw, rcLine.right - xStart, tabWidthMinimumPixels); const Range lineRange = ll->SubLineRange(subLine, LineLayout::Scope::visibleOnly); - std::vector<Interval> intervals = surface->FindRangeIntervals(&screenLine, + std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); + std::vector<Interval> intervals = slLayout->FindRangeIntervals( startPos - lineRange.start, endPos - lineRange.start); for (const Interval &interval : intervals) { PRectangle rcInterval = rcIndic; @@ -1429,7 +1432,8 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt const int caretPosition = static_cast<int>(posCaret.Position() - posLineStart - ll->LineStart(subLine)); - const XYPOSITION caretLeft = surface->XFromPosition(&screenLine, caretPosition); + std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); + const XYPOSITION caretLeft = slLayout->XFromPosition(caretPosition); // In case of start of line, the cursor should be at the right xposCaret = caretLeft + virtualOffset; @@ -1675,8 +1679,9 @@ static void DrawTranslucentSelection(Surface *surface, const EditModel &model, c const ColourDesired background = SelectionBackground(vsDraw, r == model.sel.Main(), model.primarySelection); const ScreenLine screenLine(ll, subLine, vsDraw, rcLine.right, tabWidthMinimumPixels); + std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); - const std::vector<Interval> intervals = surface->FindRangeIntervals(&screenLine, selectionStart, selectionEnd); + const std::vector<Interval> intervals = slLayout->FindRangeIntervals(selectionStart, selectionEnd); for (const Interval &interval : intervals) { const XYPOSITION rcRight = interval.right + xStart; const XYPOSITION rcLeft = interval.left + xStart; |