# HG changeset patch # User Neil # Date 1517542495 -39600 # Node ID 431b814a54a62d81c8069655bbbebec7bda782e3 # Parent 44ff2195a2026367e556e7dd9ef83af81a07219e Implement SC_DOCUMENTOPTION_STYLES_NONE. diff -r 44ff2195a202 -r 431b814a54a6 doc/ScintillaDoc.html --- a/doc/ScintillaDoc.html Fri Feb 02 08:37:32 2018 +1100 +++ b/doc/ScintillaDoc.html Fri Feb 02 14:34:55 2018 +1100 @@ -119,7 +119,7 @@

Scintilla Documentation

-

Last edited 31 January 2018 NH

+

Last edited 1 February 2018 NH

There is an overview of the internal design of Scintilla.
@@ -5743,9 +5743,38 @@ to allocate once rather than rely on the buffer growing as data is added. If SCI_CREATEDOCUMENT fails then 0 is returned.

-

The documentOption argument may be used in future versions - to choose between different document capabilities which affect memory allocation and performance. - The only valid value for now is SC_DOCUMENTOPTION_DEFAULT (0).

+

The documentOption argument + chooses between different document capabilities which affect memory allocation and performance with + SC_DOCUMENTOPTION_DEFAULT (0) choosing standard options. + SC_DOCUMENTOPTION_STYLES_NONE (1) stops allocation of memory to style characters + which saves significant memory, often 40% with the whole document treated as being style 0. + Lexers may still produce visual styling by using indicators.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolValueEffect
SC_DOCUMENTOPTION_DEFAULT0Standard behaviour
SC_DOCUMENTOPTION_STYLES_NONE1Stop allocation of memory for styles and treat all text as style 0.

SCI_ADDREFDOCUMENT(<unused>, document *doc)
This increases the reference count of a document by 1. If you want to replace the current @@ -5788,9 +5817,8 @@ to allocate once rather than rely on the buffer growing as data is added. If SCI_CREATELOADER fails then 0 is returned.

-

The documentOption argument may be used in future versions - to choose between different document capabilities which affect memory allocation and performance. - The only valid value for now is SC_DOCUMENTOPTION_DEFAULT (0).

+

The documentOption argument + is described in the SCI_CREATEDOCUMENT section.

ILoader

diff -r 44ff2195a202 -r 431b814a54a6 doc/ScintillaHistory.html --- a/doc/ScintillaHistory.html Fri Feb 02 08:37:32 2018 +1100 +++ b/doc/ScintillaHistory.html Fri Feb 02 14:34:55 2018 +1100 @@ -539,6 +539,11 @@
  • SCI_CREATEDOCUMENT adds a bytes argument to allocate memory for an initial size. + SCI_CREATELOADER and SCI_CREATEDOCUMENT add a documentOption argument to + allow choosing different document capabilities. +
  • +
  • + Add SC_DOCUMENTOPTION_STYLES_NONE option to stop allocating memory for styles.
  • Add SCI_GETMOVEEXTENDSSELECTION to allow applications to add more diff -r 44ff2195a202 -r 431b814a54a6 include/Scintilla.h --- a/include/Scintilla.h Fri Feb 02 08:37:32 2018 +1100 +++ b/include/Scintilla.h Fri Feb 02 14:34:55 2018 +1100 @@ -690,6 +690,7 @@ #define SCI_SETZOOM 2373 #define SCI_GETZOOM 2374 #define SC_DOCUMENTOPTION_DEFAULT 0 +#define SC_DOCUMENTOPTION_STYLES_NONE 1 #define SCI_CREATEDOCUMENT 2375 #define SCI_ADDREFDOCUMENT 2376 #define SCI_RELEASEDOCUMENT 2377 diff -r 44ff2195a202 -r 431b814a54a6 include/Scintilla.iface --- a/include/Scintilla.iface Fri Feb 02 08:37:32 2018 +1100 +++ b/include/Scintilla.iface Fri Feb 02 14:34:55 2018 +1100 @@ -1773,6 +1773,7 @@ enu DocumentOption=SC_DOCUMENTOPTION_ val SC_DOCUMENTOPTION_DEFAULT=0 +val SC_DOCUMENTOPTION_STYLES_NONE=1 # Create a new document object. # Starts with reference count of 1 and not selected into editor. diff -r 44ff2195a202 -r 431b814a54a6 qt/ScintillaEdit/ScintillaDocument.cpp --- a/qt/ScintillaEdit/ScintillaDocument.cpp Fri Feb 02 08:37:32 2018 +1100 +++ b/qt/ScintillaEdit/ScintillaDocument.cpp Fri Feb 02 14:34:55 2018 +1100 @@ -91,7 +91,7 @@ ScintillaDocument::ScintillaDocument(QObject *parent, void *pdoc_) : QObject(parent), pdoc(pdoc_), docWatcher(0) { if (!pdoc) { - pdoc = new Document(); + pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT); } docWatcher = new WatcherHelper(this); (static_cast(pdoc))->AddRef(); diff -r 44ff2195a202 -r 431b814a54a6 src/CellBuffer.cxx --- a/src/CellBuffer.cxx Fri Feb 02 08:37:32 2018 +1100 +++ b/src/CellBuffer.cxx Fri Feb 02 14:34:55 2018 +1100 @@ -342,7 +342,8 @@ currentAction++; } -CellBuffer::CellBuffer() { +CellBuffer::CellBuffer(bool hasStyles_) : + hasStyles(hasStyles_) { readOnly = false; utf8LineEnds = 0; collectingUndo = true; @@ -369,7 +370,7 @@ } char CellBuffer::StyleAt(Sci::Position position) const { - return style.ValueAt(position); + return hasStyles ? style.ValueAt(position) : 0; } void CellBuffer::GetStyleRange(unsigned char *buffer, Sci::Position position, Sci::Position lengthRetrieve) const { @@ -377,6 +378,10 @@ return; if (position < 0) return; + if (!hasStyles) { + std::fill(buffer, buffer + lengthRetrieve, static_cast(0)); + return; + } if ((position + lengthRetrieve) > style.Length()) { Platform::DebugPrintf("Bad GetStyleRange %d for %d of %d\n", position, lengthRetrieve, style.Length()); @@ -414,6 +419,9 @@ } bool CellBuffer::SetStyleAt(Sci::Position position, char styleValue) { + if (!hasStyles) { + return false; + } const char curVal = style.ValueAt(position); if (curVal != styleValue) { style.SetValueAt(position, styleValue); @@ -424,6 +432,9 @@ } bool CellBuffer::SetStyleFor(Sci::Position position, Sci::Position lengthStyle, char styleValue) { + if (!hasStyles) { + return false; + } bool changed = false; PLATFORM_ASSERT(lengthStyle == 0 || (lengthStyle > 0 && lengthStyle + position <= style.Length())); @@ -462,7 +473,9 @@ void CellBuffer::Allocate(Sci::Position newSize) { substance.ReAllocate(newSize); - style.ReAllocate(newSize); + if (hasStyles) { + style.ReAllocate(newSize); + } } void CellBuffer::SetLineEndTypes(int utf8LineEnds_) { @@ -608,7 +621,9 @@ } substance.InsertFromArray(position, s, 0, insertLength); - style.InsertValue(position, insertLength, 0); + if (hasStyles) { + style.InsertValue(position, insertLength, 0); + } Sci::Line lineInsert = lv.LineFromPosition(position) + 1; bool atLineStart = lv.LineStart(lineInsert-1) == position; @@ -738,7 +753,9 @@ } } substance.DeleteRange(position, deleteLength); - style.DeleteRange(position, deleteLength); + if (hasStyles) { + style.DeleteRange(position, deleteLength); + } } bool CellBuffer::SetUndoCollection(bool collectUndo) { diff -r 44ff2195a202 -r 431b814a54a6 src/CellBuffer.h --- a/src/CellBuffer.h Fri Feb 02 08:37:32 2018 +1100 +++ b/src/CellBuffer.h Fri Feb 02 14:34:55 2018 +1100 @@ -133,6 +133,7 @@ */ class CellBuffer { private: + bool hasStyles; SplitVector substance; SplitVector style; bool readOnly; @@ -151,7 +152,7 @@ public: - CellBuffer(); + CellBuffer(bool hasStyles_); ~CellBuffer(); /// Retrieving positions outside the range of the buffer works and returns 0 diff -r 44ff2195a202 -r 431b814a54a6 src/Document.cxx --- a/src/Document.cxx Fri Feb 02 08:37:32 2018 +1100 +++ b/src/Document.cxx Fri Feb 02 14:34:55 2018 +1100 @@ -90,7 +90,8 @@ return 0; } -Document::Document() { +Document::Document(int options) : + cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0) { refCount = 0; #ifdef _WIN32 eolMode = SC_EOL_CRLF; diff -r 44ff2195a202 -r 431b814a54a6 src/Document.h --- a/src/Document.h Fri Feb 02 08:37:32 2018 +1100 +++ b/src/Document.h Fri Feb 02 14:34:55 2018 +1100 @@ -265,7 +265,7 @@ DecorationList decorations; - Document(); + Document(int options); virtual ~Document(); int AddRef(); diff -r 44ff2195a202 -r 431b814a54a6 src/EditModel.cxx --- a/src/EditModel.cxx Fri Feb 02 08:37:32 2018 +1100 +++ b/src/EditModel.cxx Fri Feb 02 14:34:55 2018 +1100 @@ -69,7 +69,7 @@ hotspot = Range(Sci::invalidPosition); hoverIndicatorPos = Sci::invalidPosition; wrapWidth = LineLayout::wrapWidthInfinite; - pdoc = new Document(); + pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT); pdoc->AddRef(); } diff -r 44ff2195a202 -r 431b814a54a6 src/Editor.cxx --- a/src/Editor.cxx Fri Feb 02 08:37:32 2018 +1100 +++ b/src/Editor.cxx Fri Feb 02 14:34:55 2018 +1100 @@ -5162,7 +5162,7 @@ pdoc->RemoveWatcher(this, 0); pdoc->Release(); if (document == NULL) { - pdoc = new Document(); + pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT); } else { pdoc = document; } @@ -7554,7 +7554,7 @@ return 0; case SCI_CREATEDOCUMENT: { - Document *doc = new Document(); + Document *doc = new Document(static_cast(lParam)); doc->AddRef(); doc->Allocate(static_cast(wParam)); return reinterpret_cast(doc); @@ -7569,7 +7569,7 @@ break; case SCI_CREATELOADER: { - Document *doc = new Document(); + Document *doc = new Document(static_cast(lParam)); doc->AddRef(); doc->Allocate(static_cast(wParam)); doc->SetUndoCollection(false); diff -r 44ff2195a202 -r 431b814a54a6 test/unit/testCellBuffer.cxx --- a/test/unit/testCellBuffer.cxx Fri Feb 02 08:37:32 2018 +1100 +++ b/test/unit/testCellBuffer.cxx Fri Feb 02 14:34:55 2018 +1100 @@ -25,7 +25,7 @@ const char sText[] = "Scintilla"; const Sci::Position sLength = static_cast(strlen(sText)); - CellBuffer cb; + CellBuffer cb(true); SECTION("InsertOneLine") { bool startSequence = false;