aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/EditView.cxx21
-rw-r--r--src/EditView.h2
-rw-r--r--src/Editor.cxx8
-rw-r--r--src/PositionCache.cxx28
-rw-r--r--src/PositionCache.h4
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 };