diff options
Diffstat (limited to 'src/Editor.cxx')
| -rw-r--r-- | src/Editor.cxx | 63 | 
1 files changed, 22 insertions, 41 deletions
| diff --git a/src/Editor.cxx b/src/Editor.cxx index 6c5ba7330..478c20fb2 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -160,14 +160,12 @@ void Editor::RefreshColourPalette(Palette &pal, bool want) {  void Editor::RefreshStyleData() {  	if (!stylesValid) {  		stylesValid = true; -		Surface *surface = Surface::Allocate(); +		AutoSurface surface(IsUnicodeMode());  		if (surface) { -			surface->Init();  			vs.Refresh(*surface);  			RefreshColourPalette(palette, true);  			palette.Allocate(wMain);  			RefreshColourPalette(palette, false); -			delete surface;  		}  		SetScrollBars();  	} @@ -236,7 +234,7 @@ Point Editor::LocationFromPosition(int pos) {  	int line = pdoc->LineFromPosition(pos);  	int lineVisible = cs.DisplayFromDoc(line);  	//Platform::DebugPrintf("line=%d\n", line); -	Surface *surface = Surface::Allocate(); +	AutoSurface surface(IsUnicodeMode());  	if (surface) {  		surface->Init();  		surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); @@ -250,7 +248,6 @@ Point Editor::LocationFromPosition(int pos) {  		} else {  			pt.x = ll.positions[pos - posLineStart] + vs.fixedColumnWidth - xOffset;  		} -		delete surface;  	}  	return pt;  } @@ -272,30 +269,26 @@ void Editor::SetTopLine(int topLineNew) {  int Editor::PositionFromLocation(Point pt) {  	RefreshStyleData();  	pt.x = pt.x - vs.fixedColumnWidth + xOffset; -	int line = cs.DocFromDisplay(pt.y / vs.lineHeight + topLine); +	int lineDoc = cs.DocFromDisplay(pt.y / vs.lineHeight + topLine);  	if (pt.y < 0) {	// Division rounds towards 0 -		line = cs.DocFromDisplay((pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine); +		lineDoc = cs.DocFromDisplay((pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine);  	} -	if (line < 0) +	if (lineDoc < 0)  		return 0; -	if (line >= pdoc->LinesTotal()) +	if (lineDoc >= pdoc->LinesTotal())  		return pdoc->Length(); -	Surface *surface = Surface::Allocate(); +	AutoSurface surface(IsUnicodeMode());  	if (surface) { -		surface->Init(); -		surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); -		unsigned int posLineStart = pdoc->LineStart(line); +		unsigned int posLineStart = pdoc->LineStart(lineDoc);  		LineLayout ll; -		LayoutLine(line, surface, vs, ll); +		LayoutLine(lineDoc, surface, vs, ll);  		for (int i = 0; i < ll.numCharsInLine; i++) {  			if (pt.x < ((ll.positions[i] + ll.positions[i + 1]) / 2) ||  				ll.chars[i] == '\r' || ll.chars[i] == '\n') { -				delete surface;  				return i + posLineStart;  			}  		} -		delete surface;  		return ll.numCharsInLine + posLineStart;  	}  	return 0; @@ -320,10 +313,8 @@ int Editor::PositionFromLocationClose(Point pt) {  		return INVALID_POSITION;  	if (line >= pdoc->LinesTotal())  		return INVALID_POSITION; -	Surface *surface = Surface::Allocate(); +	AutoSurface surface(IsUnicodeMode());  	if (surface) { -		surface->Init(); -		surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);  		unsigned int posLineStart = pdoc->LineStart(line);  		LineLayout ll; @@ -331,11 +322,9 @@ int Editor::PositionFromLocationClose(Point pt) {  		for (int i = 0; i < ll.numCharsInLine; i++) {  			if (pt.x < ((ll.positions[i] + ll.positions[i + 1]) / 2) ||  				ll.chars[i] == '\r' || ll.chars[i] == '\n') { -				delete surface;  				return i + posLineStart;  			}  		} -		delete surface;  	}  	return INVALID_POSITION; @@ -346,10 +335,8 @@ int Editor::PositionFromLineX(int line, int x) {  	if (line >= pdoc->LinesTotal())  		return pdoc->Length();  	//Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine); -	Surface *surface = Surface::Allocate(); +	AutoSurface surface(IsUnicodeMode());  	if (surface) { -		surface->Init(); -		surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);  		unsigned int posLineStart = pdoc->LineStart(line);  		LineLayout ll; @@ -357,12 +344,10 @@ int Editor::PositionFromLineX(int line, int x) {  		for (int i = 0; i < ll.numCharsInLine; i++) {  			if (x < ((ll.positions[i] + ll.positions[i + 1]) / 2) ||  				ll.chars[i] == '\r' || ll.chars[i] == '\n') { -				delete surface;  				return i + posLineStart;  			}  		} -		delete surface;  		return ll.numCharsInLine + posLineStart;  	}  	return 0; @@ -1369,7 +1354,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  		if (bufferedDraw) {  			surface = pixmapLine;  		} -		surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); +		surface->SetUnicodeMode(IsUnicodeMode());  		int visibleLine = topLine + screenLinePaintFirst;  		int line = cs.DocFromDisplay(visibleLine); @@ -1387,7 +1372,9 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  		surfaceWindow->SetClip(rcTextArea);  		// Loop on visible lines -		//GTimer *tim=g_timer_new(); +		double durLayout = 0.0; +		double durPaint = 0.0; +		double durCopy = 0.0;  		while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) {  			//g_timer_start(tim);  			//Platform::DebugPrintf("Painting line %d\n", line); @@ -1505,10 +1492,8 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  			visibleLine++;  			line = cs.DocFromDisplay(visibleLine);  			//gdk_flush(); -			//g_timer_stop(tim); -			//Platform::DebugPrintf("Paint [%0d] took %g\n", line, g_timer_elapsed(tim, 0));  		} -		//g_timer_destroy(tim); +		Platform::DebugPrintf("Layout:%9.6g    Paint:%9.6g    Ratio:%9.6g   Copy:%9.6g\n", durLayout, durPaint, durLayout / durPaint, durCopy);  		// Right column limit indicator @@ -1555,18 +1540,13 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {  	if (!pfr)  		return 0; -	Surface *surface = Surface::Allocate(); +	AutoSurface surface(pfr->hdc, IsUnicodeMode());  	if (!surface)  		return 0; -	surface->Init(pfr->hdc); -	surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); -	Surface *surfaceMeasure = Surface::Allocate(); +	AutoSurface surfaceMeasure(pfr->hdcTarget, IsUnicodeMode());  	if (!surfaceMeasure) { -		delete surface;  		return 0;  	} -	surfaceMeasure->Init(pfr->hdcTarget); -	surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage);  	ViewStyle vsPrint(vs); @@ -1690,9 +1670,6 @@ long Editor::FormatRange(bool draw, RangeToFormat *pfr) {  		}  	} -	delete surface; -	delete surfaceMeasure; -  	return endPosPrint;  } @@ -3557,6 +3534,10 @@ int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) {  	return length;  } +bool Editor::IsUnicodeMode() const { +	return pdoc && (SC_CP_UTF8 == pdoc->dbcsCodePage); +} +  static bool ValidMargin(unsigned long wParam) {  	return wParam < ViewStyle::margins;  } | 
