diff options
author | Neil <nyamatongwe@gmail.com> | 2013-06-29 20:32:52 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2013-06-29 20:32:52 +1000 |
commit | 1a05a259558efd7dffb118ca9b12257a1346d2ea (patch) | |
tree | ba1add8f0a55423febdb76ee76814d3c78d62fb3 /lexlib/StyleContext.h | |
parent | 557cf43ce45fff3d9af697bc19754428f1b5a6a6 (diff) | |
download | scintilla-mirror-1a05a259558efd7dffb118ca9b12257a1346d2ea.tar.gz |
Bug: [#1483]. Split GetRelativePosition into 2 calls one for moving between character
positions and the other for retrieving a character and width.
Diffstat (limited to 'lexlib/StyleContext.h')
-rw-r--r-- | lexlib/StyleContext.h | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/lexlib/StyleContext.h b/lexlib/StyleContext.h index 0b5dee379..fc6c60d2f 100644 --- a/lexlib/StyleContext.h +++ b/lexlib/StyleContext.h @@ -49,6 +49,7 @@ inline int BytesInUnicodeCodePoint(int codePoint) { // syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80 class StyleContext { LexAccessor &styler; + IDocumentWithLineEnd *multiByteAccess; unsigned int endPos; unsigned int lengthDocument; @@ -60,11 +61,11 @@ class StyleContext { StyleContext &operator=(const StyleContext &); void GetNextChar() { - if (styler.Encoding() == enc8bit) { + if (multiByteAccess) { + chNext = multiByteAccess->GetCharacterAndWidth(currentPos+width, &widthNext); + } else { chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+width, 0)); widthNext = 1; - } else { - styler.GetRelativePosition(currentPos+width, 0, &chNext, &widthNext); } // End of line determined from line end position, allowing CR, LF, // CRLF and Unicode line ends as set by document. @@ -91,6 +92,7 @@ public: StyleContext(unsigned int startPos, unsigned int length, int initStyle, LexAccessor &styler_, char chMask=31) : styler(styler_), + multiByteAccess(0), endPos(startPos + length), posRelative(0), currentPosLastRelative(0x7FFFFFFF), @@ -105,6 +107,9 @@ public: width(0), chNext(0), widthNext(1) { + if (styler.Encoding() != enc8bit) { + multiByteAccess = styler.MultiByteAccess(); + } styler.StartAt(startPos, chMask); styler.StartSegment(startPos); currentLine = styler.GetLine(startPos); @@ -182,13 +187,7 @@ public: int GetRelativeCharacter(int n) { if (n == 0) return ch; - if (styler.Encoding() == enc8bit) { - // fast version for single byte encodings - return static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + n, 0)); - } else { - int ch = 0; - int width = 0; - //styler.GetRelativePosition(currentPos, n, &ch, &width); + if (multiByteAccess) { if ((currentPosLastRelative != currentPos) || ((n > 0) && ((offsetRelative < 0) || (n < offsetRelative))) || ((n < 0) && ((offsetRelative > 0) || (n > offsetRelative)))) { @@ -196,11 +195,15 @@ public: offsetRelative = 0; } int diffRelative = n - offsetRelative; - int posNew = styler.GetRelativePosition(posRelative, diffRelative, &ch, &width); + int posNew = multiByteAccess->GetRelativePosition(posRelative, diffRelative); + int ch = multiByteAccess->GetCharacterAndWidth(posNew, 0); posRelative = posNew; currentPosLastRelative = currentPos; offsetRelative = n; return ch; + } else { + // fast version for single byte encodings + return static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + n, 0)); } } bool Match(char ch0) const { |