diff options
| author | nyamatongwe <devnull@localhost> | 2007-06-02 05:18:13 +0000 | 
|---|---|---|
| committer | nyamatongwe <devnull@localhost> | 2007-06-02 05:18:13 +0000 | 
| commit | 54ff7790908e2b31f976ba74ca353bc4507ea70d (patch) | |
| tree | 22d32a8aeccfda9902240bfca1ffad692136f45c /src/PositionCache.h | |
| parent | 739e6e3218041c656f62685fd2e19988e37e294f (diff) | |
| download | scintilla-mirror-54ff7790908e2b31f976ba74ca353bc4507ea70d.tar.gz | |
Addition of PositionCache module which adds cacing of string
to position information and segments long pieces of text so they
can be handled more efficiently.
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 | 
