diff options
Diffstat (limited to 'src/PositionCache.h')
-rw-r--r-- | src/PositionCache.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/PositionCache.h b/src/PositionCache.h new file mode 100644 index 000000000..fc261fbbc --- /dev/null +++ b/src/PositionCache.h @@ -0,0 +1,154 @@ +// Scintilla source code edit control +/** @file PositionCache.h + ** Classes for caching layout information. + **/ +// Copyright 1998-2007 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef POSITIONCACHE_H +#define POSITIONCACHE_H + +static inline bool IsEOLChar(char ch) { + return (ch == '\r') || (ch == '\n'); +} + +/** + */ +class LineLayout { +private: + friend class LineLayoutCache; + int *lineStarts; + int lenLineStarts; + /// Drawing is only performed for @a maxLineLength characters on each line. + int lineNumber; + bool inCache; +public: + enum { wrapWidthInfinite = 0x7ffffff }; + int maxLineLength; + int numCharsInLine; + enum validLevel { llInvalid, llCheckTextAndStyle, llPositions, llLines } validity; + int xHighlightGuide; + bool highlightColumn; + int selStart; + int selEnd; + bool containsCaret; + int edgeColumn; + char *chars; + unsigned char *styles; + int styleBitsSet; + char *indicators; + int *positions; + char bracePreviousStyles[2]; + + // Hotspot support + int hsStart; + int hsEnd; + + // Wrapped line support + int widthLine; + int lines; + + LineLayout(int maxLineLength_); + virtual ~LineLayout(); + void Resize(int maxLineLength_); + void Free(); + void Invalidate(validLevel validity_); + int LineStart(int line) const; + int LineLastVisible(int line) const; + void SetLineStart(int line, int start); + void SetBracesHighlight(Range rangeLine, Position braces[], + char bracesMatchStyle, int xHighlight); + void RestoreBracesHighlight(Range rangeLine, Position braces[]); + int FindBefore(int x, int lower, int upper) const; +}; + +/** + */ +class LineLayoutCache { + int level; + int length; + int size; + LineLayout **cache; + bool allInvalidated; + int styleClock; + int useCount; + void Allocate(int length_); + void AllocateForLevel(int linesOnScreen, int linesInDoc); +public: + LineLayoutCache(); + virtual ~LineLayoutCache(); + void Deallocate(); + enum { + llcNone=SC_CACHE_NONE, + llcCaret=SC_CACHE_CARET, + llcPage=SC_CACHE_PAGE, + llcDocument=SC_CACHE_DOCUMENT + }; + void Invalidate(LineLayout::validLevel validity_); + void SetLevel(int level_); + int GetLevel() { return level; } + LineLayout *Retrieve(int lineNumber, int lineCaret, int maxChars, int styleClock_, + int linesOnScreen, int linesInDoc); + void Dispose(LineLayout *ll); +}; + +class PositionCacheEntry { + unsigned int styleNumber:8; + unsigned int len:8; + unsigned int clock:16; + short *positions; +public: + PositionCacheEntry(); + ~PositionCacheEntry(); + void Set(unsigned int styleNumber_, const char *s_, unsigned int len_, int *positions_, unsigned int clock); + void Clear(); + bool Retrieve(unsigned int styleNumber_, const char *s_, unsigned int len_, int *positions_) const; + static int Hash(unsigned int styleNumber, const char *s, unsigned int len); + bool NewerThan(const PositionCacheEntry &other); + void ResetClock(); +}; + +// Class to break a line of text into shorter runs at sensible places. +class BreakFinder { + // If a whole run is longer than lengthStartSubdivision then subdivide + // into smaller runs at spaces or punctuation. + enum { lengthStartSubdivision = 10 }; + // Try to make each subdivided run lengthEachSubdivision or shorter. + enum { lengthEachSubdivision = 5 }; + LineLayout *ll; + int lineStart; + int lineEnd; + int posLineStart; + int nextBreak; + int selAndEdge[5]; + unsigned int saeLen; + unsigned int saeCurrentPos; + int saeNext; + int subBreak; + void Insert(int val); +public: + BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_, int xStart); + int First(); + int Next(); +}; + +class PositionCache { + PositionCacheEntry *pces; + size_t size; + unsigned int clock; + bool allClear; +public: + PositionCache(); + ~PositionCache(); + void Clear(); + void SetSize(size_t size_); + int GetSize() { return size; } + void MeasureWidths(Surface *surface, ViewStyle &vstyle, unsigned int styleNumber, + const char *s, unsigned int len, int *positions); +}; + +inline bool IsSpaceOrTab(int ch) { + return ch == ' ' || ch == '\t'; +} + +#endif |