diff options
Diffstat (limited to 'src/LineMarker.cxx')
| -rw-r--r-- | src/LineMarker.cxx | 144 | 
1 files changed, 141 insertions, 3 deletions
| diff --git a/src/LineMarker.cxx b/src/LineMarker.cxx index 90c2710ce..7414b5b4d 100644 --- a/src/LineMarker.cxx +++ b/src/LineMarker.cxx @@ -10,13 +10,47 @@  #include "Scintilla.h"  #include "LineMarker.h" -void LineMarker::Draw(Surface *surface, PRectangle &rc) { +static void DrawBox(Surface *surface, int centreX, int centreY, int armSize) { +	surface->MoveTo(centreX - armSize, centreY - armSize); +	surface->LineTo(centreX + armSize, centreY - armSize); +	surface->LineTo(centreX + armSize, centreY + armSize); +	surface->LineTo(centreX - armSize, centreY + armSize); +	surface->LineTo(centreX - armSize, centreY - armSize); +} + +static void DrawCircle(Surface *surface, int centreX, int centreY, int armSize, Colour fore, Colour back) { +	PRectangle rcCircle; +	rcCircle.left = centreX - armSize; +	rcCircle.top = centreY - armSize; +	rcCircle.right = centreX + armSize + 1; +	rcCircle.bottom = centreY + armSize + 1; +	surface->Ellipse(rcCircle, back, fore); +} + +static void DrawPlus(Surface *surface, int centreX, int centreY, int armSize) { +	surface->MoveTo(centreX - armSize + 2, centreY); +	surface->LineTo(centreX + armSize - 2 + 1, centreY); +	surface->MoveTo(centreX, centreY - armSize + 2); +	surface->LineTo(centreX, centreY + armSize - 2 + 1); +} + +static void DrawMinus(Surface *surface, int centreX, int centreY, int armSize) { +	surface->MoveTo(centreX - armSize + 2, centreY); +	surface->LineTo(centreX + armSize - 2 + 1, centreY); +} + +void LineMarker::Draw(Surface *surface, PRectangle &rcWhole) { +	// Restrict most shapes a bit +	PRectangle rc = rcWhole; +	rc.top++; +	rc.bottom--;  	int minDim = Platform::Minimum(rc.Width(), rc.Height());  	minDim--;	// Ensure does not go beyond edge  	int centreX = (rc.right + rc.left) / 2;  	int centreY = (rc.bottom + rc.top) / 2;  	int dimOn2 = minDim / 2;  	int dimOn4 = minDim / 4; +	int armSize = dimOn2-2;  	if (rc.Width() > (rc.Height() * 2)) {  		// Wide column is line number so move to left to try to avoid overlapping number  		centreX = rc.left + dimOn2 + 1; @@ -52,7 +86,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {                   		fore.allocated, back.allocated);  	} else if (markType == SC_MARK_PLUS) { -		int armSize = dimOn2-2;  		Point pts[] = {      		Point(centreX - armSize, centreY - 1),      		Point(centreX - 1, centreY - 1), @@ -71,7 +104,6 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {                   		fore.allocated, back.allocated);  	} else if (markType == SC_MARK_MINUS) { -		int armSize = dimOn2-2;  		Point pts[] = {      		Point(centreX - armSize, centreY - 1),      		Point(centreX + armSize, centreY -1), @@ -88,8 +120,114 @@ void LineMarker::Draw(Surface *surface, PRectangle &rc) {  		rcSmall.right = rc.right - 1;  		rcSmall.bottom = rc.bottom - 2;  		surface->RectangleDraw(rcSmall, fore.allocated, back.allocated); +		  	} else if (markType == SC_MARK_EMPTY) {  		// An invisible marker so don't draw anything +		 +	} else if (markType == SC_MARK_VLINE) { +		surface->PenColour(back.allocated); +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, rcWhole.bottom); +		 +	} else if (markType == SC_MARK_LCORNER) { +		surface->PenColour(back.allocated); +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, rc.top + dimOn2); +		surface->LineTo(rc.right - 2, rc.top + dimOn2); +		 +	} else if (markType == SC_MARK_TCORNER) { +		surface->PenColour(back.allocated); +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, rcWhole.bottom); +		surface->MoveTo(centreX, rc.top + dimOn2); +		surface->LineTo(rc.right - 2, rc.top + dimOn2); +		 +	} else if (markType == SC_MARK_LCORNERCURVE) { +		surface->PenColour(back.allocated); +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, rc.top + dimOn2-3); +		surface->LineTo(centreX+3, rc.top + dimOn2); +		surface->LineTo(rc.right - 1, rc.top + dimOn2); +		 +	} else if (markType == SC_MARK_TCORNERCURVE) { +		surface->PenColour(back.allocated); +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, rcWhole.bottom); +		 +		surface->MoveTo(centreX, rc.top + dimOn2-3); +		surface->LineTo(centreX+3, rc.top + dimOn2); +		surface->LineTo(rc.right - 1, rc.top + dimOn2); +		 +	} else if (markType == SC_MARK_BOXPLUS) { +		surface->PenColour(back.allocated); +		DrawBox(surface, centreX, centreY, armSize); +		DrawPlus(surface, centreX, centreY, armSize); +		 +	} else if (markType == SC_MARK_BOXPLUSCONNECTED) { +		surface->PenColour(back.allocated); +		DrawBox(surface, centreX, centreY, armSize); +		DrawPlus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, centreY - armSize); +		 +	} else if (markType == SC_MARK_BOXMINUS) { +		surface->PenColour(back.allocated); +		DrawBox(surface, centreX, centreY, armSize); +		DrawMinus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +	} else if (markType == SC_MARK_BOXMINUSCONNECTED) { +		surface->PenColour(back.allocated); +		DrawBox(surface, centreX, centreY, armSize); +		DrawMinus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, centreY - armSize); +		 +	} else if (markType == SC_MARK_CIRCLEPLUS) { +		DrawCircle(surface, centreX, centreY, armSize, fore.allocated, back.allocated); +		surface->PenColour(back.allocated); +		DrawPlus(surface, centreX, centreY, armSize); +		 +	} else if (markType == SC_MARK_CIRCLEPLUSCONNECTED) { +		DrawCircle(surface, centreX, centreY, armSize, fore.allocated, back.allocated); +		surface->PenColour(back.allocated); +		DrawPlus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, centreY - armSize); +		 +	} else if (markType == SC_MARK_CIRCLEMINUS) { +		DrawCircle(surface, centreX, centreY, armSize, fore.allocated, back.allocated); +		surface->PenColour(back.allocated); +		DrawMinus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +	} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) { +		DrawCircle(surface, centreX, centreY, armSize, fore.allocated, back.allocated); +		surface->PenColour(back.allocated); +		DrawMinus(surface, centreX, centreY, armSize); +		 +		surface->MoveTo(centreX, centreY + armSize); +		surface->LineTo(centreX, rcWhole.bottom); +		 +		surface->MoveTo(centreX, rcWhole.top); +		surface->LineTo(centreX, centreY - armSize); +		  	} else { // SC_MARK_SHORTARROW  		Point pts[] = {  			Point(centreX, centreY + dimOn2), | 
