aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Editor.cxx
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2001-12-01 02:56:35 +0000
committernyamatongwe <devnull@localhost>2001-12-01 02:56:35 +0000
commita56bec4e034a49c9275b4475ebc8814bcddef352 (patch)
tree18d18db8862aa645d5c37e2379b9551e08e754ff /src/Editor.cxx
parentbe6cb0eaf1a6693de4add83c76f6708fd25e32bc (diff)
downloadscintilla-mirror-a56bec4e034a49c9275b4475ebc8814bcddef352.tar.gz
Display optimisations.
When horizontally scrolled on Windows, an extra message turns up to say the scrolling has ended. Now has no effect as new scroll position compared to old and processing only occurs if different. Avoid working on line segments that are before horizontal visible range. Guards against working on line segments that are outside visible range horizontally applied to tabs and control characters as well as text.
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r--src/Editor.cxx153
1 files changed, 75 insertions, 78 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 4fa10968d..e852723b2 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -603,11 +603,13 @@ void Editor::ScrollText(int /* linesToMove */) {
void Editor::HorizontalScrollTo(int xPos) {
//Platform::DebugPrintf("HorizontalScroll %d\n", xPos);
- xOffset = xPos;
- if (xOffset < 0)
- xOffset = 0;
- SetHorizontalScrollPos();
- RedrawRect(GetClientRectangle());
+ if (xPos < 0)
+ xPos = 0;
+ if (xOffset != xPos) {
+ xOffset = xPos;
+ SetHorizontalScrollPos();
+ RedrawRect(GetClientRectangle());
+ }
}
void Editor::MoveCaretInsideView() {
@@ -1075,83 +1077,78 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis
IsControlCharacter(ll.chars[i]) || IsControlCharacter(ll.chars[i + 1]) ||
((ll.selStart != ll.selEnd) && ((iDoc + 1 == ll.selStart) || (iDoc + 1 == ll.selEnd))) ||
(i == (ll.edgeColumn - 1))) {
- int styleMain = ll.styles[i];
- ColourAllocated textBack = vsDraw.styles[styleMain].back.allocated;
- ColourAllocated textFore = vsDraw.styles[styleMain].fore.allocated;
- Font &textFont = vsDraw.styles[styleMain].font;
- bool inSelection = (iDoc >= ll.selStart) && (iDoc < ll.selEnd) && (ll.selStart != ll.selEnd);
- if (inSelection) {
- if (vsDraw.selbackset) {
- if (primarySelection)
- textBack = vsDraw.selbackground.allocated;
- else
- textBack = vsDraw.selbackground2.allocated;
- }
- if (vsDraw.selforeset)
- textFore = vsDraw.selforeground.allocated;
- } else {
- if (overrideBackground)
- textBack = background;
- if ((vsDraw.edgeState == EDGE_BACKGROUND) && (i >= ll.edgeColumn) && (ll.chars[i] != '\n') && (ll.chars[i] != '\r'))
- textBack = vsDraw.edgecolour.allocated;
- }
- // Manage tab display
- if (ll.chars[i] == '\t') {
- rcSegment.left = ll.positions[i] + xStart;
- rcSegment.right = ll.positions[i + 1] + xStart;
- surface->FillRectangle(rcSegment, textBack);
- if ((vsDraw.viewWhitespace != wsInvisible) || ((inIndentation && vsDraw.viewIndentationGuides))) {
- surface->PenColour(textFore);
+ rcSegment.left = ll.positions[startseg] + xStart;
+ rcSegment.right = ll.positions[i + 1] + xStart;
+ // Only try to draw if really visible - enhances performance by not calling environment to
+ // draw strings that are completely past the right side of the window.
+ //if (rcSegment.left <= rcLine.right) {
+ if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) {
+ int styleMain = ll.styles[i];
+ ColourAllocated textBack = vsDraw.styles[styleMain].back.allocated;
+ ColourAllocated textFore = vsDraw.styles[styleMain].fore.allocated;
+ Font &textFont = vsDraw.styles[styleMain].font;
+ bool inSelection = (iDoc >= ll.selStart) && (iDoc < ll.selEnd) && (ll.selStart != ll.selEnd);
+ if (inSelection) {
+ if (vsDraw.selbackset) {
+ if (primarySelection)
+ textBack = vsDraw.selbackground.allocated;
+ else
+ textBack = vsDraw.selbackground2.allocated;
+ }
+ if (vsDraw.selforeset)
+ textFore = vsDraw.selforeground.allocated;
+ } else {
+ if (overrideBackground)
+ textBack = background;
+ if ((vsDraw.edgeState == EDGE_BACKGROUND) && (i >= ll.edgeColumn) && (ll.chars[i] != '\n') && (ll.chars[i] != '\r'))
+ textBack = vsDraw.edgecolour.allocated;
}
- if (inIndentation && vsDraw.viewIndentationGuides) {
- for (int xIG = ll.positions[i] / indentWidth * indentWidth; xIG < ll.positions[i + 1]; xIG += indentWidth) {
- if (xIG >= ll.positions[i] && xIG > 0) {
- Point from(0, ((lineVisible & 1) && (vsDraw.lineHeight & 1)) ? 1 : 0);
- PRectangle rcCopyArea(xIG + xStart + 1, rcSegment.top, xIG + xStart + 2, rcSegment.bottom);
- surface->Copy(rcCopyArea, from, (ll.xHighlightGuide == xIG) ?
- *pixmapIndentGuideHighlight : *pixmapIndentGuide);
+ if (ll.chars[i] == '\t') {
+ // Manage tab display
+ surface->FillRectangle(rcSegment, textBack);
+ if ((vsDraw.viewWhitespace != wsInvisible) || ((inIndentation && vsDraw.viewIndentationGuides))) {
+ surface->PenColour(textFore);
+ }
+ if (inIndentation && vsDraw.viewIndentationGuides) {
+ for (int xIG = ll.positions[i] / indentWidth * indentWidth; xIG < ll.positions[i + 1]; xIG += indentWidth) {
+ if (xIG >= ll.positions[i] && xIG > 0) {
+ Point from(0, ((lineVisible & 1) && (vsDraw.lineHeight & 1)) ? 1 : 0);
+ PRectangle rcCopyArea(xIG + xStart + 1, rcSegment.top, xIG + xStart + 2, rcSegment.bottom);
+ surface->Copy(rcCopyArea, from, (ll.xHighlightGuide == xIG) ?
+ *pixmapIndentGuideHighlight : *pixmapIndentGuide);
+ }
}
}
- }
- if (vsDraw.viewWhitespace != wsInvisible) {
- if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) {
- PRectangle rcTab(rcSegment.left + 1, rcSegment.top + 4,
- rcSegment.right - 1, rcSegment.bottom - vsDraw.maxDescent);
- DrawTabArrow(surface, rcTab, rcSegment.top + vsDraw.lineHeight / 2);
+ if (vsDraw.viewWhitespace != wsInvisible) {
+ if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) {
+ PRectangle rcTab(rcSegment.left + 1, rcSegment.top + 4,
+ rcSegment.right - 1, rcSegment.bottom - vsDraw.maxDescent);
+ DrawTabArrow(surface, rcTab, rcSegment.top + vsDraw.lineHeight / 2);
+ }
}
- }
- // Manage control character display
- }
- else if (IsControlCharacter(ll.chars[i])) {
- inIndentation = false;
- const char *ctrlChar = ControlCharacterString(ll.chars[i]);
- rcSegment.left = ll.positions[i] + xStart;
- rcSegment.right = ll.positions[i + 1] + xStart;
- surface->FillRectangle(rcSegment, textBack);
- int normalCharHeight = surface->Ascent(ctrlCharsFont) -
- surface->InternalLeading(ctrlCharsFont);
- PRectangle rcCChar = rcSegment;
- rcCChar.left = rcCChar.left + 1;
- rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight;
- rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1;
- PRectangle rcCentral = rcCChar;
- rcCentral.top++;
- rcCentral.bottom--;
- surface->FillRectangle(rcCentral, textFore);
- PRectangle rcChar = rcCChar;
- rcChar.left++;
- rcChar.right--;
- surface->DrawTextClipped(rcChar, ctrlCharsFont,
- rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar),
- textBack, textFore);
- // Manage normal display
- }
- else {
- rcSegment.left = ll.positions[startseg] + xStart;
- rcSegment.right = ll.positions[i + 1] + xStart;
- // Only try to draw if really visible - enhances performance by not calling environment to
- // draw strings that are completely past the right side of the window.
- if (rcSegment.left <= rcLine.right) {
+ } else if (IsControlCharacter(ll.chars[i])) {
+ // Manage control character display
+ inIndentation = false;
+ const char *ctrlChar = ControlCharacterString(ll.chars[i]);
+ surface->FillRectangle(rcSegment, textBack);
+ int normalCharHeight = surface->Ascent(ctrlCharsFont) -
+ surface->InternalLeading(ctrlCharsFont);
+ PRectangle rcCChar = rcSegment;
+ rcCChar.left = rcCChar.left + 1;
+ rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight;
+ rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1;
+ PRectangle rcCentral = rcCChar;
+ rcCentral.top++;
+ rcCentral.bottom--;
+ surface->FillRectangle(rcCentral, textFore);
+ PRectangle rcChar = rcCChar;
+ rcChar.left++;
+ rcChar.right--;
+ surface->DrawTextClipped(rcChar, ctrlCharsFont,
+ rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar),
+ textBack, textFore);
+ } else {
+ // Manage normal display
surface->DrawTextNoClip(rcSegment, textFont,
rcSegment.top + vsDraw.maxAscent, ll.chars + startseg,
i - startseg + 1, textFore, textBack);