diff options
author | Neil <nyamatongwe@gmail.com> | 2018-03-09 21:05:33 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2018-03-09 21:05:33 +1100 |
commit | f8884c2adbb81bb91b3ac0d4bcaa8b9c62069f14 (patch) | |
tree | 0bcb5040b089eb140ce4fdef82411d68a3510a46 /src/EditView.cxx | |
parent | 73ca690be6390bdbd402d74bf85b71dea73761d0 (diff) | |
download | scintilla-mirror-f8884c2adbb81bb91b3ac0d4bcaa8b9c62069f14.tar.gz |
Backport: Use Position/Line/int more accurately in preparation for large documents.
Backport of changeset 6480:f2650eaa75e6.
Diffstat (limited to 'src/EditView.cxx')
-rw-r--r-- | src/EditView.cxx | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index 293f7737a..f3df80dc9 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -339,7 +339,7 @@ LineLayout *EditView::RetrieveLineLayout(Sci::Line lineNumber, const EditModel & PLATFORM_ASSERT(posLineEnd >= posLineStart); const Sci::Line lineCaret = static_cast<Sci::Line>(model.pdoc->LineFromPosition(model.sel.MainCaret())); return llc.Retrieve(lineNumber, lineCaret, - posLineEnd - posLineStart, model.pdoc->GetStyleClock(), + static_cast<int>(posLineEnd - posLineStart), model.pdoc->GetStyleClock(), model.LinesOnScreen() + 1, model.pdoc->LinesTotal()); } @@ -410,19 +410,20 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa ll->widthLine = LineLayout::wrapWidthInfinite; ll->lines = 1; if (vstyle.edgeState == EDGE_BACKGROUND) { - ll->edgeColumn = model.pdoc->FindColumn(line, vstyle.theEdge.column); - if (ll->edgeColumn >= posLineStart) { - ll->edgeColumn -= posLineStart; + Sci::Position edgePosition = model.pdoc->FindColumn(line, vstyle.theEdge.column); + if (edgePosition >= posLineStart) { + edgePosition -= posLineStart; } + ll->edgeColumn = static_cast<int>(edgePosition); } else { ll->edgeColumn = -1; } // Fill base line layout - const int lineLength = posLineEnd - posLineStart; + const int lineLength = static_cast<int>(posLineEnd - posLineStart); model.pdoc->GetCharRange(ll->chars.get(), posLineStart, lineLength); model.pdoc->GetStyleRange(ll->styles.get(), posLineStart, lineLength); - const int numCharsBeforeEOL = static_cast<Sci::Position>(model.pdoc->LineEnd(line)) - posLineStart; + const int numCharsBeforeEOL = static_cast<int>(model.pdoc->LineEnd(line) - posLineStart); const int numCharsInLine = (vstyle.viewEOL) ? lineLength : numCharsBeforeEOL; for (Sci::Position styleInLine = 0; styleInLine < numCharsInLine; styleInLine++) { const unsigned char styleByte = ll->styles[styleInLine]; @@ -541,10 +542,10 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa ll->wrapIndent = vstyle.aveCharWidth; // Indent to show start visual ll->lines = 0; // Calculate line start positions based upon width. - int lastGoodBreak = 0; - int lastLineStart = 0; + Sci::Position lastGoodBreak = 0; + Sci::Position lastLineStart = 0; XYACCUMULATOR startOffset = 0; - int p = 0; + Sci::Position p = 0; while (p < ll->numCharsInLine) { if ((ll->positions[p + 1] - startOffset) >= width) { if (lastGoodBreak == lastLineStart) { @@ -561,7 +562,7 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa } lastLineStart = lastGoodBreak; ll->lines++; - ll->SetLineStart(ll->lines, lastGoodBreak); + ll->SetLineStart(ll->lines, static_cast<int>(lastGoodBreak)); startOffset = ll->positions[lastGoodBreak]; // take into account the space for start wrap mark and indent startOffset -= ll->wrapIndent; @@ -604,7 +605,7 @@ Point EditView::LocationFromPosition(Surface *surface, const EditModel &model, S AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model)); if (surface && ll) { LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); - const int posInLine = pos.Position() - posLineStart; + const int posInLine = static_cast<int>(pos.Position() - posLineStart); pt = ll->PointFromPosition(posInLine, vs.lineHeight, pe); pt.y += (lineVisible - topLine) * vs.lineHeight; pt.x += vs.textStart - model.xOffset; @@ -624,7 +625,7 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, Sci:: if (surface && ll) { LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); - const int subLine = lineVisible - lineStartSet; + const int subLine = static_cast<int>(lineVisible - lineStartSet); if (subLine < ll->lines) { rangeSubLine = ll->SubLineRange(subLine); if (subLine == ll->lines-1) { @@ -654,7 +655,7 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo if (surface && ll) { LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); - const int subLine = visibleLine - lineStartSet; + const int subLine = static_cast<int>(visibleLine - lineStartSet); if (subLine < ll->lines) { const Range rangeSubLine = ll->SubLineRange(subLine); const XYPOSITION subLineStart = ll->positions[rangeSubLine.start]; @@ -787,7 +788,8 @@ static ColourDesired TextBackground(const EditModel &model, const ViewStyle &vsD void EditView::DrawIndentGuide(Surface *surface, Sci::Line lineVisible, int lineHeight, Sci::Position start, PRectangle rcSegment, bool highlight) { const Point from = Point::FromInts(0, ((lineVisible & 1) && (lineHeight & 1)) ? 1 : 0); - const PRectangle rcCopyArea = PRectangle::FromInts(start + 1, static_cast<int>(rcSegment.top), start + 2, static_cast<int>(rcSegment.bottom)); + const PRectangle rcCopyArea = PRectangle::FromInts(static_cast<int>(start + 1), static_cast<int>(rcSegment.top), + static_cast<int>(start + 2), static_cast<int>(rcSegment.bottom)); surface->Copy(rcCopyArea, from, highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide); } @@ -1305,7 +1307,7 @@ static void DrawBlockCaret(Surface *surface, const EditModel &model, const ViewS FontAlias fontText = vsDraw.styles[styleMain].font; surface->DrawTextClipped(rcCaret, fontText, rcCaret.top + vsDraw.maxAscent, &ll->chars[offsetFirstChar], - numCharsToDraw, vsDraw.styles[styleMain].back, + static_cast<int>(numCharsToDraw), vsDraw.styles[styleMain].back, caretColour); } @@ -1326,7 +1328,7 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt else posCaret.SetPosition(model.pdoc->MovePositionOutsideChar(posCaret.Position()-1, -1)); } - const int offset = posCaret.Position() - posLineStart; + const int offset = static_cast<int>(posCaret.Position() - posLineStart); const XYPOSITION spaceWidth = vsDraw.styles[ll->EndLineStyle()].spaceWidth; const XYPOSITION virtualOffset = posCaret.VirtualSpace() * spaceWidth; if (ll->InLine(offset, subLine) && offset <= ll->numCharsBeforeEOL) { @@ -1740,11 +1742,11 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi if (phasesDraw != phasesOne) { surface->DrawTextTransparent(rcSegment, textFont, rcSegment.top + vsDraw.maxAscent, &ll->chars[ts.start], - i - ts.start + 1, textFore); + static_cast<int>(i - ts.start + 1), textFore); } else { surface->DrawTextNoClip(rcSegment, textFont, rcSegment.top + vsDraw.maxAscent, &ll->chars[ts.start], - i - ts.start + 1, textFore, textBack); + static_cast<int>(i - ts.start + 1), textFore, textBack); } } if (vsDraw.viewWhitespace != wsInvisible || @@ -1821,7 +1823,7 @@ void EditView::DrawIndentGuidesOverEmpty(Surface *surface, const EditModel &mode // Find the most recent line with some text Sci::Line lineLastWithText = line; - while (lineLastWithText > std::max(line - 20, 0) && model.pdoc->IsWhiteLine(lineLastWithText)) { + while (lineLastWithText > std::max(line - 20, static_cast<Sci::Line>(0)) && model.pdoc->IsWhiteLine(lineLastWithText)) { lineLastWithText--; } if (lineLastWithText < line) { @@ -2038,7 +2040,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan // Only visible lines should be handled by the code within the loop PLATFORM_ASSERT(model.cs.GetVisible(lineDoc)); const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); - const int subLine = visibleLine - lineStartSet; + const int subLine = static_cast<int>(visibleLine - lineStartSet); // Copy this line and its styles from the document into local arrays // and determine the x position at which each character starts. @@ -2189,7 +2191,7 @@ static ColourDesired InvertedLight(ColourDesired orig) { return ColourDesired(std::min(r, 0xffu), std::min(g, 0xffu), std::min(b, 0xffu)); } -long EditView::FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *surface, Surface *surfaceMeasure, +Sci::Position EditView::FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *surface, Surface *surfaceMeasure, const EditModel &model, const ViewStyle &vs) { // Can't use measurements cached for screen posCache.Clear(); @@ -2298,7 +2300,7 @@ long EditView::FormatRange(bool draw, Sci_RangeToFormat *pfr, Surface *surface, // 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<Sci::Position>(model.pdoc->LineStart(lineDoc + 1) - model.pdoc->LineStart(lineDoc) + 1)); + LineLayout ll(static_cast<int>(model.pdoc->LineStart(lineDoc + 1) - model.pdoc->LineStart(lineDoc) + 1)); LayoutLine(model, lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint); ll.containsCaret = false; |