• R/O
  • SSH


File Info

Rev. 12085
Größe 4,177 Bytes
Zeit 2008-02-10 01:04:50
Autor stefankueng
Log Message

Update to version 1.75 of Scintilla.


// 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.


namespace Scintilla {

static inline bool IsEOLChar(char ch) {
	return (ch == '\r') || (ch == '\n');

class LineLayout {
	friend class LineLayoutCache;
	int *lineStarts;
	int lenLineStarts;
	/// Drawing is only performed for @a maxLineLength characters on each line.
	int lineNumber;
	bool inCache;
	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;
	bool InLine(int offset, 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);
	virtual ~LineLayoutCache();
	void Deallocate();
	enum {
	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;
	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 = 300 };
	// Try to make each subdivided run lengthEachSubdivision or shorter.
	enum { lengthEachSubdivision = 100 };
	LineLayout *ll;
	int lineStart;
	int lineEnd;
	int posLineStart;
	bool utf8;
	int nextBreak;
	int *selAndEdge;
	unsigned int saeSize;
	unsigned int saeLen;
	unsigned int saeCurrentPos;
	int saeNext;
	int subBreak;
	void Insert(int val);
	BreakFinder(LineLayout *ll_, int lineStart_, int lineEnd_, int posLineStart_, bool utf8_, int xStart);
	int First();
	int Next();

class PositionCache {
	PositionCacheEntry *pces;
	size_t size;
	unsigned int clock;
	bool allClear;
	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';


Show on old repository browser