diff options
author | Neil <nyamatongwe@gmail.com> | 2021-05-07 17:24:58 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2021-05-07 17:24:58 +1000 |
commit | da718f8909b937bd839fc8e09d0b81727644c5fd (patch) | |
tree | 58df42332ba07f3c28475461135fef393b99f564 /src | |
parent | ed07e1aa1c0c5ae0168add6ed9964c6aefc19578 (diff) | |
download | scintilla-mirror-da718f8909b937bd839fc8e09d0b81727644c5fd.tar.gz |
Add lineNumber_ argument to LineLayout constructor so always knows which line it
is for. Add accessor for line number and method to say whether compatible with
a line number and number of characters.
Since LineLayout can report its line number, remove line argument from
EditView::LayoutLine which simplifies calling it.
Diffstat (limited to 'src')
-rw-r--r-- | src/EditView.cxx | 21 | ||||
-rw-r--r-- | src/EditView.h | 2 | ||||
-rw-r--r-- | src/Editor.cxx | 8 | ||||
-rw-r--r-- | src/PositionCache.cxx | 28 | ||||
-rw-r--r-- | src/PositionCache.h | 4 |
5 files changed, 35 insertions, 28 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index 0bde50833..d107ac3a9 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -370,10 +370,11 @@ constexpr bool IsControlCharacter(int ch) noexcept { * Copy the given @a line and its styles from the document into local arrays. * Also determine the x position at which each character starts. */ -void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surface, const ViewStyle &vstyle, LineLayout *ll, int width) { +void EditView::LayoutLine(const EditModel &model, Surface *surface, const ViewStyle &vstyle, LineLayout *ll, int width) { if (!ll) return; + const Sci::Line line = ll->LineNumber(); PLATFORM_ASSERT(line < model.pdoc->LinesTotal()); PLATFORM_ASSERT(ll->chars); const Sci::Position posLineStart = model.pdoc->LineStart(line); @@ -637,7 +638,7 @@ Point EditView::LocationFromPosition(Surface *surface, const EditModel &model, S const Sci::Line lineVisible = model.pcs->DisplayFromDoc(lineDoc); AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { - LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const int posInLine = static_cast<int>(pos.Position() - posLineStart); pt = ll->PointFromPosition(posInLine, vs.lineHeight, pe); pt.x += vs.textStart - model.xOffset; @@ -677,7 +678,7 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, Sci:: const Sci::Position positionLineStart = model.pdoc->LineStart(lineDoc); AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { - LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc); const int subLine = static_cast<int>(lineVisible - lineStartSet); if (subLine < ll->lines) { @@ -708,7 +709,7 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { - LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc); const int subLine = static_cast<int>(visibleLine - lineStartSet); if (subLine < ll->lines) { @@ -760,7 +761,7 @@ SelectionPosition EditView::SPositionFromLineX(Surface *surface, const EditModel AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); - LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const Range rangeSubLine = ll->SubLineRange(0, LineLayout::Scope::visibleOnly); const XYPOSITION subLineStart = ll->positions[rangeSubLine.start]; const Sci::Position positionInLine = ll->FindPositionFromX(x + subLineStart, rangeSubLine, false); @@ -780,7 +781,7 @@ Sci::Line EditView::DisplayFromPosition(Surface *surface, const EditModel &model Sci::Line lineDisplay = model.pcs->DisplayFromDoc(lineDoc); AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { - LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); const Sci::Position posInLine = pos - posLineStart; lineDisplay--; // To make up for first increment ahead. @@ -799,7 +800,7 @@ Sci::Position EditView::StartEndDisplayLine(Surface *surface, const EditModel &m Sci::Position posRet = INVALID_POSITION; if (surface && ll) { const Sci::Position posLineStart = model.pdoc->LineStart(line); - LayoutLine(model, line, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll, model.wrapWidth); const Sci::Position posInLine = pos - posLineStart; if (posInLine <= ll->maxLineLength) { for (int subLine = 0; subLine < ll->lines; subLine++) { @@ -2344,7 +2345,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan if (lineDoc != lineDocPrevious) { ll.Set(nullptr); ll.Set(RetrieveLineLayout(lineDoc, model)); - LayoutLine(model, lineDoc, surface, vsDraw, ll, model.wrapWidth); + LayoutLine(model, surface, vsDraw, ll, model.wrapWidth); lineDocPrevious = lineDoc; } #if defined(TIME_PAINTING) @@ -2610,8 +2611,8 @@ Sci::Position EditView::FormatRange(bool draw, const Sci_RangeToFormat *pfr, Sur // Copy this line and its styles from the document into local arrays // and determine the x position at which each character starts. - LineLayout ll(static_cast<int>(model.pdoc->LineStart(lineDoc + 1) - model.pdoc->LineStart(lineDoc) + 1)); - LayoutLine(model, lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint); + LineLayout ll(lineDoc, static_cast<int>(model.pdoc->LineStart(lineDoc + 1) - model.pdoc->LineStart(lineDoc) + 1)); + LayoutLine(model, surfaceMeasure, vsPrint, &ll, widthPrint); ll.containsCaret = false; diff --git a/src/EditView.h b/src/EditView.h index add58065b..cf500e06f 100644 --- a/src/EditView.h +++ b/src/EditView.h @@ -114,7 +114,7 @@ public: void RefreshPixMaps(Surface *surfaceWindow, const ViewStyle &vsDraw); LineLayout *RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model); - void LayoutLine(const EditModel &model, Sci::Line line, Surface *surface, const ViewStyle &vstyle, + void LayoutLine(const EditModel &model, Surface *surface, const ViewStyle &vstyle, LineLayout *ll, int width = LineLayout::wrapWidthInfinite); static void UpdateBidiData(const EditModel &model, const ViewStyle &vstyle, LineLayout *ll); diff --git a/src/Editor.cxx b/src/Editor.cxx index bfe68bad7..bca4bb0b2 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1493,7 +1493,7 @@ bool Editor::WrapOneLine(Surface *surface, Sci::Line lineToWrap) { AutoLineLayout ll(view.llc, view.RetrieveLineLayout(lineToWrap, *this)); int linesWrapped = 1; if (ll) { - view.LayoutLine(*this, lineToWrap, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll, wrapWidth); linesWrapped = ll->lines; } return pcs->SetHeight(lineToWrap, linesWrapped + @@ -1654,7 +1654,7 @@ void Editor::LinesSplit(int pixelWidth) { AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); if (surface && ll) { const Sci::Position posLineStart = pdoc->LineStart(line); - view.LayoutLine(*this, line, surface, vs, ll, pixelWidth); + view.LayoutLine(*this, surface, vs, ll, pixelWidth); Sci::Position lengthInsertedTotal = 0; for (int subLine = 1; subLine < ll->lines; subLine++) { const Sci::Position lengthInserted = pdoc->InsertString( @@ -5267,7 +5267,7 @@ void Editor::SetAnnotationHeights(Sci::Line start, Sci::Line end) { AutoSurface surface(this); AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); if (surface && ll) { - view.LayoutLine(*this, line, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll, wrapWidth); linesWrapped = ll->lines; } } @@ -5669,7 +5669,7 @@ Sci::Line Editor::WrapCount(Sci::Line line) { AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); if (surface && ll) { - view.LayoutLine(*this, line, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll, wrapWidth); return ll->lines; } else { return 1; diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index 87fa544cd..bf7c4623a 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -57,9 +57,9 @@ void BidiData::Resize(size_t maxLineLength_) { widthReprs.resize(maxLineLength_ + 1); } -LineLayout::LineLayout(int maxLineLength_) : +LineLayout::LineLayout(Sci::Line lineNumber_, int maxLineLength_) : lenLineStarts(0), - lineNumber(-1), + lineNumber(lineNumber_), inCache(false), maxLineLength(-1), numCharsInLine(0), @@ -117,6 +117,14 @@ void LineLayout::Invalidate(ValidLevel validity_) noexcept { validity = validity_; } +Sci::Line LineLayout::LineNumber() const noexcept { + return lineNumber; +} + +bool LineLayout::CanHold(Sci::Line lineDoc, int lineLength_) const noexcept { + return (lineNumber == lineDoc) && (lineLength_ <= maxLineLength); +} + int LineLayout::LineStart(int line) const noexcept { if (line <= 0) { return 0; @@ -458,22 +466,20 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, } if (pos < cache.size()) { - if (cache[pos] && - ((cache[pos]->lineNumber != lineNumber) || (cache[pos]->maxLineLength < maxChars))) { + if (cache[pos] && !cache[pos]->CanHold(lineNumber, maxChars)) { cache[pos].reset(); } if (!cache[pos]) { - cache[pos] = std::make_unique<LineLayout>(maxChars); + cache[pos] = std::make_unique<LineLayout>(lineNumber, maxChars); } - cache[pos]->lineNumber = lineNumber; cache[pos]->inCache = true; -#ifdef CHECK_LLC_UNIQUE +#ifndef CHECK_LLC_UNIQUE // Expensive check that there is only one entry for any line number std::vector<bool> linesInCache(linesInDoc); for (const auto &entry : cache) { if (entry) { - PLATFORM_ASSERT(!linesInCache[entry->lineNumber]); - linesInCache[entry->lineNumber] = true; + PLATFORM_ASSERT(!linesInCache[entry->LineNumber()]); + linesInCache[entry->LineNumber()] = true; } } #endif @@ -482,9 +488,7 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, } // Only reach here for level == Cache::none - LineLayout *ret = new LineLayout(maxChars); - ret->lineNumber = lineNumber; - return ret; + return new LineLayout(lineNumber, maxChars); } void LineLayoutCache::Dispose(LineLayout *ll) noexcept { diff --git a/src/PositionCache.h b/src/PositionCache.h index e86b2bd51..479476eb9 100644 --- a/src/PositionCache.h +++ b/src/PositionCache.h @@ -88,7 +88,7 @@ public: int lines; XYPOSITION wrapIndent; // In pixels - explicit LineLayout(int maxLineLength_); + LineLayout(Sci::Line lineNumber_, int maxLineLength_); // Deleted so LineLayout objects can not be copied. LineLayout(const LineLayout &) = delete; LineLayout(LineLayout &&) = delete; @@ -99,6 +99,8 @@ public: void EnsureBidiData(); void Free() noexcept; void Invalidate(ValidLevel validity_) noexcept; + Sci::Line LineNumber() const noexcept; + bool CanHold(Sci::Line lineDoc, int lineLength_) const noexcept; int LineStart(int line) const noexcept; int LineLength(int line) const noexcept; enum class Scope { visibleOnly, includeEnd }; |