diff options
author | mitchell <unknown> | 2018-05-05 11:52:27 -0400 |
---|---|---|
committer | mitchell <unknown> | 2018-05-05 11:52:27 -0400 |
commit | 93462d87c3c8f398d5900be84349f29cb088d849 (patch) | |
tree | 631eb19ad8d818e262f4988139d96709b4ee8cd5 /qt/ScintillaEditBase/PlatQt.cpp | |
parent | 156c3f0e53ea2a7f932f6079cb122c2cf66fb3df (diff) | |
download | scintilla-mirror-93462d87c3c8f398d5900be84349f29cb088d849.tar.gz |
Backport: Feature [feature-requests:#1211]. Use pre-computed table for UTF8BytesOfLead.
Friendlier treatment of invalid UTF-8. Add tests for UniConversion handling invalid UTF-8. Simplify UTF8Classify tests.
Backport of changeset 6643:ebbb4e5aaf93.
Diffstat (limited to 'qt/ScintillaEditBase/PlatQt.cpp')
-rw-r--r-- | qt/ScintillaEditBase/PlatQt.cpp | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/qt/ScintillaEditBase/PlatQt.cpp b/qt/ScintillaEditBase/PlatQt.cpp index 713f4c46f..87496a191 100644 --- a/qt/ScintillaEditBase/PlatQt.cpp +++ b/qt/ScintillaEditBase/PlatQt.cpp @@ -10,6 +10,7 @@ #include "PlatQt.h" #include "Scintilla.h" +#include "UniConversion.h" #include "DBCS.h" #include "FontQuality.h" @@ -438,19 +439,6 @@ void SurfaceImpl::SetClip(PRectangle rc) GetPainter()->setClipRect(QRectFFromPRect(rc)); } -static size_t utf8LengthFromLead(unsigned char uch) -{ - if (uch >= (0x80 + 0x40 + 0x20 + 0x10)) { - return 4; - } else if (uch >= (0x80 + 0x40 + 0x20)) { - return 3; - } else if (uch >= (0x80)) { - return 2; - } else { - return 1; - } -} - void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, @@ -470,10 +458,10 @@ void SurfaceImpl::MeasureWidths(Font &font, const unsigned char *us = reinterpret_cast<const unsigned char *>(s); int i=0; while (ui<fit) { - size_t lenChar = utf8LengthFromLead(us[i]); - int codeUnits = (lenChar < 4) ? 1 : 2; + const unsigned int byteCount = UTF8BytesOfLead[us[i]]; + const int codeUnits = UTF16LengthFromUTF8ByteCount(byteCount); qreal xPosition = tl.cursorToX(ui+codeUnits); - for (unsigned int bytePos=0; (bytePos<lenChar) && (i<len); bytePos++) { + for (unsigned int bytePos=0; (bytePos<byteCount) && (i<len); bytePos++) { positions[i++] = xPosition; } ui += codeUnits; |