From 86266d4700632860705fc2d4e88d4be4f5228be1 Mon Sep 17 00:00:00 2001 From: mitchell Date: Tue, 16 Apr 2019 22:50:17 -0400 Subject: Backport: Feature [feature-requests:#1259]. Add SCI_SETCHARACTERCATEGORYOPTIMIZATION API to optimize speed of character category features. Backport of changeset 7392:2832adedd0f4, but with added includes for Sci::clamp(). --- src/Document.cxx | 10 +++++++++- src/Document.h | 3 +++ src/Editor.cxx | 7 +++++++ 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Document.cxx b/src/Document.cxx index 4aad2e370..dd11ae42d 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1710,7 +1710,7 @@ CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { if (dbcsCodePage && (!UTF8IsAscii(ch))) { if (SC_CP_UTF8 == dbcsCodePage) { // Use hard coded Unicode class - const CharacterCategory cc = CategoriseCharacter(ch); + const CharacterCategory cc = charMap.CategoryFor(ch); switch (cc) { // Separator, Line/Paragraph @@ -2169,6 +2169,14 @@ int Document::GetCharsOfClass(CharClassify::cc characterClass, unsigned char *bu return charClass.GetCharsOfClass(characterClass, buffer); } +void Document::SetCharacterCategoryOptimization(int countCharacters) { + charMap.Optimize(countCharacters); +} + +int Document::CharacterCategoryOptimization() const noexcept { + return charMap.Size(); +} + void SCI_METHOD Document::StartStyling(Sci_Position position, char) { endStyled = position; } diff --git a/src/Document.h b/src/Document.h index f97e1393f..adbdc3413 100644 --- a/src/Document.h +++ b/src/Document.h @@ -230,6 +230,7 @@ private: int refCount; CellBuffer cb; CharClassify charClass; + CharacterCategoryMap charMap; std::unique_ptr pcf; Sci::Position endStyled; int styleClock; @@ -444,6 +445,8 @@ public: void SetDefaultCharClasses(bool includeWordClass); void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass); int GetCharsOfClass(CharClassify::cc characterClass, unsigned char *buffer) const; + void SetCharacterCategoryOptimization(int countCharacters); + int CharacterCategoryOptimization() const noexcept; void SCI_METHOD StartStyling(Sci_Position position, char mask) override; bool SCI_METHOD SetStyleFor(Sci_Position length, char style) override; bool SCI_METHOD SetStyles(Sci_Position length, const char *styles) override; diff --git a/src/Editor.cxx b/src/Editor.cxx index 75c5d14a0..a9df59f96 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6249,6 +6249,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { pdoc->SetDefaultCharClasses(true); break; + case SCI_SETCHARACTERCATEGORYOPTIMIZATION: + pdoc->SetCharacterCategoryOptimization(static_cast(wParam)); + break; + + case SCI_GETCHARACTERCATEGORYOPTIMIZATION: + return pdoc->CharacterCategoryOptimization(); + case SCI_GETLENGTH: return pdoc->Length(); -- cgit v1.2.3