diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/EditView.cxx | 49 | ||||
-rw-r--r-- | src/EditView.h | 30 | ||||
-rw-r--r-- | src/Editor.cxx | 16 | ||||
-rw-r--r-- | src/PositionCache.cxx | 30 | ||||
-rw-r--r-- | src/PositionCache.h | 7 |
5 files changed, 41 insertions, 91 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index d107ac3a9..2d32c8997 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -319,7 +319,7 @@ void EditView::RefreshPixMaps(Surface *surfaceWindow, const ViewStyle &vsDraw) { } } -LineLayout *EditView::RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model) { +std::shared_ptr<LineLayout> EditView::RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model) { const Sci::Position posLineStart = model.pdoc->LineStart(lineNumber); const Sci::Position posLineEnd = model.pdoc->LineStart(lineNumber + 1); PLATFORM_ASSERT(posLineEnd >= posLineStart); @@ -636,23 +636,23 @@ Point EditView::LocationFromPosition(Surface *surface, const EditModel &model, S posLineStart = model.pdoc->LineStart(lineDoc); } const Sci::Line lineVisible = model.pcs->DisplayFromDoc(lineDoc); - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(lineDoc, model); if (surface && ll) { - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), model.wrapWidth); const int posInLine = static_cast<int>(pos.Position() - posLineStart); pt = ll->PointFromPosition(posInLine, vs.lineHeight, pe); pt.x += vs.textStart - model.xOffset; if (model.BidirectionalEnabled()) { // Fill the line bidi data - UpdateBidiData(model, vs, ll); + UpdateBidiData(model, vs, ll.get()); // Find subLine const int subLine = ll->SubLineFromPosition(posInLine, pe); const int caretPosition = posInLine - ll->LineStart(subLine); // Get the point from current position - const ScreenLine screenLine(ll, subLine, vs, rcClient.right, tabWidthMinimumPixels); + const ScreenLine screenLine(ll.get(), subLine, vs, rcClient.right, tabWidthMinimumPixels); std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); pt.x = slLayout->XFromPosition(caretPosition); @@ -676,9 +676,9 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, Sci:: } const Sci::Line lineDoc = model.pcs->DocFromDisplay(lineVisible); const Sci::Position positionLineStart = model.pdoc->LineStart(lineDoc); - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(lineDoc, model); if (surface && ll) { - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), model.wrapWidth); const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc); const int subLine = static_cast<int>(lineVisible - lineStartSet); if (subLine < ll->lines) { @@ -707,9 +707,9 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo return SelectionPosition(canReturnInvalid ? INVALID_POSITION : model.pdoc->Length()); const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(lineDoc, model); if (surface && ll) { - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), model.wrapWidth); const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc); const int subLine = static_cast<int>(visibleLine - lineStartSet); if (subLine < ll->lines) { @@ -720,9 +720,9 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo Sci::Position positionInLine = 0; if (model.BidirectionalEnabled()) { // Fill the line bidi data - UpdateBidiData(model, vs, ll); + UpdateBidiData(model, vs, ll.get()); - const ScreenLine screenLine(ll, subLine, vs, rcClient.right, tabWidthMinimumPixels); + const ScreenLine screenLine(ll.get(), subLine, vs, rcClient.right, tabWidthMinimumPixels); std::unique_ptr<IScreenLineLayout> slLayout = surface->Layout(&screenLine); positionInLine = slLayout->PositionFromX(static_cast<XYPOSITION>(pt.x), charPosition) + rangeSubLine.start; @@ -758,10 +758,10 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo * This method is used for rectangular selections and does not work on wrapped lines. */ SelectionPosition EditView::SPositionFromLineX(Surface *surface, const EditModel &model, Sci::Line lineDoc, int x, const ViewStyle &vs) { - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(lineDoc, model); if (surface && ll) { const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), 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); @@ -779,9 +779,9 @@ SelectionPosition EditView::SPositionFromLineX(Surface *surface, const EditModel Sci::Line EditView::DisplayFromPosition(Surface *surface, const EditModel &model, Sci::Position pos, const ViewStyle &vs) { const Sci::Line lineDoc = model.pdoc->SciLineFromPosition(pos); Sci::Line lineDisplay = model.pcs->DisplayFromDoc(lineDoc); - AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(lineDoc, model); if (surface && ll) { - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), model.wrapWidth); const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc); const Sci::Position posInLine = pos - posLineStart; lineDisplay--; // To make up for first increment ahead. @@ -796,11 +796,11 @@ Sci::Line EditView::DisplayFromPosition(Surface *surface, const EditModel &model Sci::Position EditView::StartEndDisplayLine(Surface *surface, const EditModel &model, Sci::Position pos, bool start, const ViewStyle &vs) { const Sci::Line line = model.pdoc->SciLineFromPosition(pos); - AutoLineLayout ll(llc, RetrieveLineLayout(line, model)); + std::shared_ptr<LineLayout> ll = RetrieveLineLayout(line, model); Sci::Position posRet = INVALID_POSITION; if (surface && ll) { const Sci::Position posLineStart = model.pdoc->LineStart(line); - LayoutLine(model, surface, vs, ll, model.wrapWidth); + LayoutLine(model, surface, vs, ll.get(), model.wrapWidth); const Sci::Position posInLine = pos - posLineStart; if (posInLine <= ll->maxLineLength) { for (int subLine = 0; subLine < ll->lines; subLine++) { @@ -2314,7 +2314,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan (vsDraw.braceBadLightIndicatorSet && (model.bracesMatchStyle == STYLE_BRACEBAD))); Sci::Line lineDocPrevious = -1; // Used to avoid laying out one document line multiple times - AutoLineLayout ll(llc, nullptr); + std::shared_ptr<LineLayout> ll; std::vector<DrawPhase> phases; if ((phasesDraw == PhasesDraw::multiple) && !bufferedDraw) { for (DrawPhase phase = DrawPhase::back; phase <= DrawPhase::carets; phase = static_cast<DrawPhase>(static_cast<int>(phase) * 2)) { @@ -2343,9 +2343,8 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan ElapsedPeriod ep; #endif if (lineDoc != lineDocPrevious) { - ll.Set(nullptr); - ll.Set(RetrieveLineLayout(lineDoc, model)); - LayoutLine(model, surface, vsDraw, ll, model.wrapWidth); + ll = RetrieveLineLayout(lineDoc, model); + LayoutLine(model, surface, vsDraw, ll.get(), model.wrapWidth); lineDocPrevious = lineDoc; } #if defined(TIME_PAINTING) @@ -2376,10 +2375,10 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan if (model.BidirectionalEnabled()) { // Fill the line bidi data - UpdateBidiData(model, vsDraw, ll); + UpdateBidiData(model, vsDraw, ll.get()); } - DrawLine(surface, model, vsDraw, ll, lineDoc, visibleLine, xStart, rcLine, subLine, phase); + DrawLine(surface, model, vsDraw, ll.get(), lineDoc, visibleLine, xStart, rcLine, subLine, phase); #if defined(TIME_PAINTING) durPaint += ep.Duration(true); #endif @@ -2391,7 +2390,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan } if (FlagSet(phase, DrawPhase::carets)) { - DrawCarets(surface, model, vsDraw, ll, lineDoc, xStart, rcLine, subLine); + DrawCarets(surface, model, vsDraw, ll.get(), lineDoc, xStart, rcLine, subLine); } if (bufferedDraw) { @@ -2418,7 +2417,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan visibleLine++; } } - ll.Set(nullptr); + ll.reset(); #if defined(TIME_PAINTING) if (durPaint < 0.00000001) durPaint = 0.00000001; diff --git a/src/EditView.h b/src/EditView.h index cf500e06f..bea42cbe9 100644 --- a/src/EditView.h +++ b/src/EditView.h @@ -113,7 +113,7 @@ public: void DropGraphics() noexcept; void RefreshPixMaps(Surface *surfaceWindow, const ViewStyle &vsDraw); - LineLayout *RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model); + std::shared_ptr<LineLayout> RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model); void LayoutLine(const EditModel &model, Surface *surface, const ViewStyle &vstyle, LineLayout *ll, int width = LineLayout::wrapWidthInfinite); @@ -158,34 +158,6 @@ public: const EditModel &model, const ViewStyle &vs); }; -/** -* Convenience class to ensure LineLayout objects are always disposed. -*/ -class AutoLineLayout { - LineLayoutCache &llc; - LineLayout *ll; -public: - AutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) noexcept : llc(llc_), ll(ll_) {} - AutoLineLayout(const AutoLineLayout &) = delete; - AutoLineLayout(AutoLineLayout &&) = delete; - AutoLineLayout &operator=(const AutoLineLayout &) = delete; - AutoLineLayout &operator=(AutoLineLayout &&) = delete; - ~AutoLineLayout() noexcept { - llc.Dispose(ll); - ll = nullptr; - } - LineLayout *operator->() const noexcept { - return ll; - } - operator LineLayout *() const noexcept { - return ll; - } - void Set(LineLayout *ll_) noexcept { - llc.Dispose(ll); - ll = ll_; - } -}; - } #endif diff --git a/src/Editor.cxx b/src/Editor.cxx index bca4bb0b2..f843a08d2 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1490,10 +1490,10 @@ void Editor::NeedWrapping(Sci::Line docLineStart, Sci::Line docLineEnd) { } bool Editor::WrapOneLine(Surface *surface, Sci::Line lineToWrap) { - AutoLineLayout ll(view.llc, view.RetrieveLineLayout(lineToWrap, *this)); + std::shared_ptr<LineLayout> ll = view.RetrieveLineLayout(lineToWrap, *this); int linesWrapped = 1; if (ll) { - view.LayoutLine(*this, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll.get(), wrapWidth); linesWrapped = ll->lines; } return pcs->SetHeight(lineToWrap, linesWrapped + @@ -1651,10 +1651,10 @@ void Editor::LinesSplit(int pixelWidth) { UndoGroup ug(pdoc); for (Sci::Line line = lineStart; line <= lineEnd; line++) { AutoSurface surface(this); - AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); + std::shared_ptr<LineLayout> ll = view.RetrieveLineLayout(line, *this); if (surface && ll) { const Sci::Position posLineStart = pdoc->LineStart(line); - view.LayoutLine(*this, surface, vs, ll, pixelWidth); + view.LayoutLine(*this, surface, vs, ll.get(), pixelWidth); Sci::Position lengthInsertedTotal = 0; for (int subLine = 1; subLine < ll->lines; subLine++) { const Sci::Position lengthInserted = pdoc->InsertString( @@ -5265,9 +5265,9 @@ void Editor::SetAnnotationHeights(Sci::Line start, Sci::Line end) { int linesWrapped = 1; if (Wrapping()) { AutoSurface surface(this); - AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); + std::shared_ptr<LineLayout> ll = view.RetrieveLineLayout(line, *this); if (surface && ll) { - view.LayoutLine(*this, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll.get(), wrapWidth); linesWrapped = ll->lines; } } @@ -5666,10 +5666,10 @@ int Editor::CodePage() const noexcept { Sci::Line Editor::WrapCount(Sci::Line line) { AutoSurface surface(this); - AutoLineLayout ll(view.llc, view.RetrieveLineLayout(line, *this)); + std::shared_ptr<LineLayout> ll = view.RetrieveLineLayout(line, *this); if (surface && ll) { - view.LayoutLine(*this, surface, vs, ll, wrapWidth); + view.LayoutLine(*this, surface, vs, ll.get(), wrapWidth); return ll->lines; } else { return 1; diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index 9ca6db7a3..c1e0a77bd 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -60,7 +60,6 @@ void BidiData::Resize(size_t maxLineLength_) { LineLayout::LineLayout(Sci::Line lineNumber_, int maxLineLength_) : lenLineStarts(0), lineNumber(lineNumber_), - inCache(false), maxLineLength(-1), numCharsInLine(0), numCharsBeforeEOL(0), @@ -363,7 +362,7 @@ XYPOSITION ScreenLine::TabPositionAfter(XYPOSITION xPosition) const { LineLayoutCache::LineLayoutCache() : level(Cache::none), - allInvalidated(false), styleClock(-1), useCount(0) { + allInvalidated(false), styleClock(-1) { } LineLayoutCache::~LineLayoutCache() = default; @@ -394,7 +393,6 @@ size_t LineLayoutCache::EntryForLine(Sci::Line line) const noexcept { } void LineLayoutCache::AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesInDoc) { - PLATFORM_ASSERT(useCount == 0); size_t lengthForLevel = 0; if (level == Cache::caret) { lengthForLevel = 1; @@ -405,7 +403,6 @@ void LineLayoutCache::AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesI } if (lengthForLevel != cache.size()) { - PLATFORM_ASSERT(useCount == 0); allInvalidated = false; cache.resize(lengthForLevel); // Cache::none -> no entries @@ -449,13 +446,12 @@ void LineLayoutCache::AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesI } void LineLayoutCache::Deallocate() noexcept { - PLATFORM_ASSERT(useCount == 0); cache.clear(); } void LineLayoutCache::Invalidate(LineLayout::ValidLevel validity_) noexcept { if (!cache.empty() && !allInvalidated) { - for (const std::unique_ptr<LineLayout> &ll : cache) { + for (const std::shared_ptr<LineLayout> &ll : cache) { if (ll) { ll->Invalidate(validity_); } @@ -475,9 +471,8 @@ void LineLayoutCache::SetLevel(Cache level_) noexcept { } } -LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, int maxChars, int styleClock_, +std::shared_ptr<LineLayout> LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, int maxChars, int styleClock_, Sci::Line linesOnScreen, Sci::Line linesInDoc) { - PLATFORM_ASSERT(useCount == 0); AllocateForLevel(linesOnScreen, linesInDoc); if (styleClock != styleClock_) { Invalidate(LineLayout::ValidLevel::checkTextAndStyle); @@ -518,9 +513,8 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, cache[pos].reset(); } if (!cache[pos]) { - cache[pos] = std::make_unique<LineLayout>(lineNumber, maxChars); + cache[pos] = std::make_shared<LineLayout>(lineNumber, maxChars); } - cache[pos]->inCache = true; #ifdef CHECK_LLC // Expensive check that there is only one entry for any line number std::vector<bool> linesInCache(linesInDoc); @@ -531,23 +525,11 @@ LineLayout *LineLayoutCache::Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, } } #endif - useCount++; - return cache[pos].get(); + return cache[pos]; } // Only reach here for level == Cache::none - return new LineLayout(lineNumber, maxChars); -} - -void LineLayoutCache::Dispose(LineLayout *ll) noexcept { - allInvalidated = false; - if (ll) { - if (!ll->inCache) { - delete ll; - } else { - useCount--; - } - } + return std::make_shared<LineLayout>(lineNumber, maxChars); } // Simply pack the (maximum 4) character bytes into an int diff --git a/src/PositionCache.h b/src/PositionCache.h index 41da53bcf..4c62900e8 100644 --- a/src/PositionCache.h +++ b/src/PositionCache.h @@ -61,7 +61,6 @@ private: int lenLineStarts; /// Drawing is only performed for @a maxLineLength characters on each line. Sci::Line lineNumber; - bool inCache; public: enum { wrapWidthInfinite = 0x7ffffff }; @@ -160,10 +159,9 @@ public: }; private: Cache level; - std::vector<std::unique_ptr<LineLayout>>cache; + std::vector<std::shared_ptr<LineLayout>>cache; bool allInvalidated; int styleClock; - int useCount; size_t EntryForLine(Sci::Line line) const noexcept; void AllocateForLevel(Sci::Line linesOnScreen, Sci::Line linesInDoc); public: @@ -178,9 +176,8 @@ public: void Invalidate(LineLayout::ValidLevel validity_) noexcept; void SetLevel(Cache level_) noexcept; Cache GetLevel() const noexcept { return level; } - LineLayout *Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, int maxChars, int styleClock_, + std::shared_ptr<LineLayout> Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, int maxChars, int styleClock_, Sci::Line linesOnScreen, Sci::Line linesInDoc); - void Dispose(LineLayout *ll) noexcept; }; class PositionCacheEntry { |