diff options
| author | Neil <nyamatongwe@gmail.com> | 2018-05-01 14:14:45 +1000 | 
|---|---|---|
| committer | Neil <nyamatongwe@gmail.com> | 2018-05-01 14:14:45 +1000 | 
| commit | f4c9e005de319d79fffae89e2695eb3d27005e85 (patch) | |
| tree | c6dff56c891aa8eb33b0d659b4f5d39e20d6d80c | |
| parent | 086549b12567da2e3750dd7d45ff0f42bb5cb620 (diff) | |
| download | scintilla-mirror-f4c9e005de319d79fffae89e2695eb3d27005e85.tar.gz | |
Add IntegerRectangle to simplify drawing lines without casting.
| -rw-r--r-- | scripts/HeaderOrder.txt | 1 | ||||
| -rw-r--r-- | src/CallTip.cxx | 10 | ||||
| -rw-r--r-- | src/EditView.cxx | 52 | ||||
| -rw-r--r-- | src/Indicator.cxx | 87 | ||||
| -rw-r--r-- | src/IntegerRectangle.h | 29 | ||||
| -rw-r--r-- | src/LineMarker.cxx | 77 | ||||
| -rw-r--r-- | src/MarginView.cxx | 13 | 
7 files changed, 157 insertions, 112 deletions
| diff --git a/scripts/HeaderOrder.txt b/scripts/HeaderOrder.txt index bd8a3b215..37ef50241 100644 --- a/scripts/HeaderOrder.txt +++ b/scripts/HeaderOrder.txt @@ -115,6 +115,7 @@  #include "Catalogue.h"  #include "Position.h" +#include "IntegerRectangle.h"  #include "UniqueString.h"  #include "SplitVector.h"  #include "Partitioning.h" diff --git a/src/CallTip.cxx b/src/CallTip.cxx index f8bb77c48..21cf6e3d3 100644 --- a/src/CallTip.cxx +++ b/src/CallTip.cxx @@ -19,6 +19,7 @@  #include "Scintilla.h" +#include "IntegerRectangle.h"  #include "StringCopy.h"  #include "Position.h"  #include "CallTip.h" @@ -233,13 +234,14 @@ void CallTip::PaintCT(Surface *surfaceWindow) {  #ifndef __APPLE__  	// OSX doesn't put borders on "help tags"  	// Draw a raised border around the edges of the window -	surfaceWindow->MoveTo(0, static_cast<int>(rcClientSize.bottom) - 1); +	const IntegerRectangle ircClientSize(rcClientSize); +	surfaceWindow->MoveTo(0, ircClientSize.bottom - 1);  	surfaceWindow->PenColour(colourShade); -	surfaceWindow->LineTo(static_cast<int>(rcClientSize.right) - 1, static_cast<int>(rcClientSize.bottom) - 1); -	surfaceWindow->LineTo(static_cast<int>(rcClientSize.right) - 1, 0); +	surfaceWindow->LineTo(ircClientSize.right - 1, ircClientSize.bottom - 1); +	surfaceWindow->LineTo(ircClientSize.right - 1, 0);  	surfaceWindow->PenColour(colourLight);  	surfaceWindow->LineTo(0, 0); -	surfaceWindow->LineTo(0, static_cast<int>(rcClientSize.bottom) - 1); +	surfaceWindow->LineTo(0, ircClientSize.bottom - 1);  #endif  } diff --git a/src/EditView.cxx b/src/EditView.cxx index 51bd0f634..dc8ba1c2d 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -32,6 +32,7 @@  #include "StringCopy.h"  #include "CharacterSet.h"  #include "Position.h" +#include "IntegerRectangle.h"  #include "UniqueString.h"  #include "SplitVector.h"  #include "Partitioning.h" @@ -294,22 +295,23 @@ static const char *ControlCharacterString(unsigned char ch) {  }  static void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid, const ViewStyle &vsDraw) { +	const IntegerRectangle ircTab(rcTab);  	if ((rcTab.left + 2) < (rcTab.right - 1)) -		surface->MoveTo(static_cast<int>(rcTab.left) + 2, ymid); +		surface->MoveTo(ircTab.left + 2, ymid);  	else -		surface->MoveTo(static_cast<int>(rcTab.right) - 1, ymid); -	surface->LineTo(static_cast<int>(rcTab.right) - 1, ymid); +		surface->MoveTo(ircTab.right - 1, ymid); +	surface->LineTo(ircTab.right - 1, ymid);  	// Draw the arrow head if needed  	if (vsDraw.tabDrawMode == tdLongArrow) { -		int ydiff = static_cast<int>(rcTab.bottom - rcTab.top) / 2; -		int xhead = static_cast<int>(rcTab.right) - 1 - ydiff; +		int ydiff = (ircTab.bottom - ircTab.top) / 2; +		int xhead = ircTab.right - 1 - ydiff;  		if (xhead <= rcTab.left) { -			ydiff -= static_cast<int>(rcTab.left) - xhead - 1; -			xhead = static_cast<int>(rcTab.left) - 1; +			ydiff -= ircTab.left - xhead - 1; +			xhead = ircTab.left - 1;  		}  		surface->LineTo(xhead, ymid - ydiff); -		surface->MoveTo(static_cast<int>(rcTab.right) - 1, ymid); +		surface->MoveTo(ircTab.right - 1, ymid);  		surface->LineTo(xhead, ymid + ydiff);  	}  } @@ -1165,14 +1167,15 @@ void EditView::DrawFoldDisplayText(Surface *surface, const EditModel &model, con  			PRectangle rcBox = rcSegment;  			rcBox.left = round(rcSegment.left);  			rcBox.right = round(rcSegment.right); -			surface->MoveTo(static_cast<int>(rcBox.left), static_cast<int>(rcBox.top)); -			surface->LineTo(static_cast<int>(rcBox.left), static_cast<int>(rcBox.bottom)); -			surface->MoveTo(static_cast<int>(rcBox.right), static_cast<int>(rcBox.top)); -			surface->LineTo(static_cast<int>(rcBox.right), static_cast<int>(rcBox.bottom)); -			surface->MoveTo(static_cast<int>(rcBox.left), static_cast<int>(rcBox.top)); -			surface->LineTo(static_cast<int>(rcBox.right), static_cast<int>(rcBox.top)); -			surface->MoveTo(static_cast<int>(rcBox.left), static_cast<int>(rcBox.bottom - 1)); -			surface->LineTo(static_cast<int>(rcBox.right), static_cast<int>(rcBox.bottom - 1)); +			const IntegerRectangle ircBox(rcBox); +			surface->MoveTo(ircBox.left, ircBox.top); +			surface->LineTo(ircBox.left, ircBox.bottom); +			surface->MoveTo(ircBox.right, ircBox.top); +			surface->LineTo(ircBox.right, ircBox.bottom); +			surface->MoveTo(ircBox.left, ircBox.top); +			surface->LineTo(ircBox.right, ircBox.top); +			surface->MoveTo(ircBox.left, ircBox.bottom - 1); +			surface->LineTo(ircBox.right, ircBox.bottom - 1);  		}  	} @@ -1228,17 +1231,18 @@ void EditView::DrawAnnotation(Surface *surface, const EditModel &model, const Vi  			stAnnotation, start, lengthAnnotation, phase);  		if ((phase & drawBack) && (vsDraw.annotationVisible == ANNOTATION_BOXED)) {  			surface->PenColour(vsDraw.styles[vsDraw.annotationStyleOffset].fore); -			surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.top)); -			surface->LineTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.bottom)); -			surface->MoveTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.top)); -			surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.bottom)); +			const IntegerRectangle ircSegment(rcSegment); +			surface->MoveTo(ircSegment.left, ircSegment.top); +			surface->LineTo(ircSegment.left, ircSegment.bottom); +			surface->MoveTo(ircSegment.right, ircSegment.top); +			surface->LineTo(ircSegment.right, ircSegment.bottom);  			if (subLine == ll->lines) { -				surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.top)); -				surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.top)); +				surface->MoveTo(ircSegment.left, ircSegment.top); +				surface->LineTo(ircSegment.right, ircSegment.top);  			}  			if (subLine == ll->lines + annotationLines - 1) { -				surface->MoveTo(static_cast<int>(rcSegment.left), static_cast<int>(rcSegment.bottom - 1)); -				surface->LineTo(static_cast<int>(rcSegment.right), static_cast<int>(rcSegment.bottom - 1)); +				surface->MoveTo(ircSegment.left, ircSegment.bottom - 1); +				surface->LineTo(ircSegment.right, ircSegment.bottom - 1);  			}  		}  	} diff --git a/src/Indicator.cxx b/src/Indicator.cxx index a18238cde..f9d0ca04a 100644 --- a/src/Indicator.cxx +++ b/src/Indicator.cxx @@ -16,6 +16,7 @@  #include "Platform.h"  #include "Scintilla.h" +#include "IntegerRectangle.h"  #include "Indicator.h"  #include "XPM.h" @@ -35,13 +36,15 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  	if (drawState == drawHover) {  		sacDraw = sacHover;  	} +	const IntegerRectangle irc(rc);  	surface->PenColour(sacDraw.fore); -	const int ymid = static_cast<int>(rc.bottom + rc.top) / 2; +	const int ymid = (irc.bottom + irc.top) / 2;  	if (sacDraw.style == INDIC_SQUIGGLE) { -		int x = static_cast<int>(lround(rc.left)); -		const int xLast = static_cast<int>(lround(rc.right)); +		const IntegerRectangle ircSquiggle(PixelGridAlign(rc)); +		int x = ircSquiggle.left; +		const int xLast = ircSquiggle.right;  		int y = 0; -		surface->MoveTo(x, static_cast<int>(rc.top) + y); +		surface->MoveTo(x, irc.top + y);  		while (x < xLast) {  			if ((x + 2) > xLast) {  				if (xLast > x) @@ -51,7 +54,7 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  				x += 2;  				y = 2 - y;  			} -			surface->LineTo(x, static_cast<int>(rc.top) + y); +			surface->LineTo(x, irc.top + y);  		}  	} else if (sacDraw.style == INDIC_SQUIGGLEPIXMAP) {  		const PRectangle rcSquiggle = PixelGridAlign(rc); @@ -73,19 +76,19 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  		}  		surface->DrawRGBAImage(rcSquiggle, image.GetWidth(), image.GetHeight(), image.Pixels());  	} else if (sacDraw.style == INDIC_SQUIGGLELOW) { -		surface->MoveTo(static_cast<int>(rc.left), static_cast<int>(rc.top)); -		int x = static_cast<int>(rc.left) + 3; +		surface->MoveTo(irc.left, irc.top); +		int x = irc.left + 3;  		int y = 0;  		while (x < rc.right) { -			surface->LineTo(x - 1, static_cast<int>(rc.top) + y); +			surface->LineTo(x - 1, irc.top + y);  			y = 1 - y; -			surface->LineTo(x, static_cast<int>(rc.top) + y); +			surface->LineTo(x, irc.top + y);  			x += 3;  		} -		surface->LineTo(static_cast<int>(rc.right), static_cast<int>(rc.top) + y);	// Finish the line +		surface->LineTo(irc.right, irc.top + y);	// Finish the line  	} else if (sacDraw.style == INDIC_TT) { -		surface->MoveTo(static_cast<int>(rc.left), ymid); -		int x = static_cast<int>(rc.left) + 5; +		surface->MoveTo(irc.left, ymid); +		int x = irc.left + 5;  		while (x < rc.right) {  			surface->LineTo(x, ymid);  			surface->MoveTo(x-3, ymid); @@ -94,35 +97,36 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  			surface->MoveTo(x, ymid);  			x += 5;  		} -		surface->LineTo(static_cast<int>(rc.right), ymid);	// Finish the line +		surface->LineTo(irc.right, ymid);	// Finish the line  		if (x - 3 <= rc.right) {  			surface->MoveTo(x-3, ymid);  			surface->LineTo(x-3, ymid+2);  		}  	} else if (sacDraw.style == INDIC_DIAGONAL) { -		int x = static_cast<int>(rc.left); +		int x = irc.left;  		while (x < rc.right) { -			surface->MoveTo(x, static_cast<int>(rc.top) + 2); +			surface->MoveTo(x, irc.top + 2);  			int endX = x+3; -			int endY = static_cast<int>(rc.top) - 1; +			int endY = irc.top - 1;  			if (endX > rc.right) { -				endY += endX - static_cast<int>(rc.right); -				endX = static_cast<int>(rc.right); +				endY += endX - irc.right; +				endX = irc.right;  			}  			surface->LineTo(endX, endY);  			x += 4;  		}  	} else if (sacDraw.style == INDIC_STRIKE) { -		surface->MoveTo(static_cast<int>(rc.left), static_cast<int>(rc.top) - 4); -		surface->LineTo(static_cast<int>(rc.right), static_cast<int>(rc.top) - 4); +		surface->MoveTo(irc.left, irc.top - 4); +		surface->LineTo(irc.right, irc.top - 4);  	} else if ((sacDraw.style == INDIC_HIDDEN) || (sacDraw.style == INDIC_TEXTFORE)) {  		// Draw nothing  	} else if (sacDraw.style == INDIC_BOX) { -		surface->MoveTo(static_cast<int>(rc.left), ymid + 1); -		surface->LineTo(static_cast<int>(rc.right), ymid + 1); -		surface->LineTo(static_cast<int>(rc.right), static_cast<int>(rcLine.top) + 1); -		surface->LineTo(static_cast<int>(rc.left), static_cast<int>(rcLine.top) + 1); -		surface->LineTo(static_cast<int>(rc.left), ymid + 1); +		surface->MoveTo(irc.left, ymid + 1); +		surface->LineTo(irc.right, ymid + 1); +		const int lineTop = static_cast<int>(rcLine.top) + 1; +		surface->LineTo(irc.right, lineTop); +		surface->LineTo(irc.left, lineTop); +		surface->LineTo(irc.left, ymid + 1);  	} else if (sacDraw.style == INDIC_ROUNDBOX ||  		sacDraw.style == INDIC_STRAIGHTBOX ||  		sacDraw.style == INDIC_FULLBOX) { @@ -137,32 +141,33 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  		PRectangle rcBox = PixelGridAlign(rc);  		rcBox.top = rcLine.top + 1;  		rcBox.bottom = rcLine.bottom; +		IntegerRectangle ircBox(rcBox);  		// Cap width at 4000 to avoid large allocations when mistakes made -		const int width = std::min(static_cast<int>(rcBox.Width()), 4000); -		RGBAImage image(width, static_cast<int>(rcBox.Height()), 1.0, 0); +		const int width = std::min(ircBox.Width(), 4000); +		RGBAImage image(width, ircBox.Height(), 1.0, 0);  		// Draw horizontal lines top and bottom  		for (int x=0; x<width; x++) { -			for (int y = 0; y<static_cast<int>(rcBox.Height()); y += static_cast<int>(rcBox.Height()) - 1) { +			for (int y = 0; y<ircBox.Height(); y += ircBox.Height() - 1) {  				image.SetPixel(x, y, sacDraw.fore, ((x + y) % 2) ? outlineAlpha : fillAlpha);  			}  		}  		// Draw vertical lines left and right -		for (int y = 1; y<static_cast<int>(rcBox.Height()); y++) { +		for (int y = 1; y<ircBox.Height(); y++) {  			for (int x=0; x<width; x += width-1) {  				image.SetPixel(x, y, sacDraw.fore, ((x + y) % 2) ? outlineAlpha : fillAlpha);  			}  		}  		surface->DrawRGBAImage(rcBox, image.GetWidth(), image.GetHeight(), image.Pixels());  	} else if (sacDraw.style == INDIC_DASH) { -		int x = static_cast<int>(rc.left); +		int x = irc.left;  		while (x < rc.right) {  			surface->MoveTo(x, ymid); -			surface->LineTo(std::min(x + 4, static_cast<int>(rc.right)), ymid); +			surface->LineTo(std::min(x + 4, irc.right), ymid);  			x += 7;  		}  	} else if (sacDraw.style == INDIC_DOTS) { -		int x = static_cast<int>(rc.left); -		while (x < static_cast<int>(rc.right)) { +		int x = irc.left; +		while (x < irc.right) {  			const PRectangle rcDot = PRectangle::FromInts(x, ymid, x + 1, ymid + 1);  			surface->FillRectangle(rcDot, sacDraw.fore);  			x += 2; @@ -175,20 +180,20 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r  		surface->FillRectangle(rcComposition, sacDraw.fore);  	} else if (sacDraw.style == INDIC_POINT || sacDraw.style == INDIC_POINTCHARACTER) {  		if (rcCharacter.Width() >= 0.1) { -			const int pixelHeight = static_cast<int>(rc.Height() - 1.0f);	// 1 pixel onto next line if multiphase +			const XYPOSITION pixelHeight = floor(rc.Height() - 1.0f);	// 1 pixel onto next line if multiphase  			const XYPOSITION x = (sacDraw.style == INDIC_POINT) ? (rcCharacter.left) : ((rcCharacter.right + rcCharacter.left) / 2); -			const int ix = static_cast<int>(lround(x)); -			const int iy = static_cast<int>(rc.top + 1.0f); +			const XYPOSITION ix = round(x); +			const XYPOSITION iy = floor(rc.top + 1.0f);  			Point pts[] = { -				Point::FromInts(ix - pixelHeight, iy + pixelHeight),	// Left -				Point::FromInts(ix + pixelHeight, iy + pixelHeight),	// Right -				Point::FromInts(ix, iy)									// Top +				Point(ix - pixelHeight, iy + pixelHeight),	// Left +				Point(ix + pixelHeight, iy + pixelHeight),	// Right +				Point(ix, iy)								// Top  			};  			surface->Polygon(pts, 3, sacDraw.fore, sacDraw.fore);  		}  	} else {	// Either INDIC_PLAIN or unknown -		surface->MoveTo(static_cast<int>(rc.left), ymid); -		surface->LineTo(static_cast<int>(rc.right), ymid); +		surface->MoveTo(irc.left, ymid); +		surface->LineTo(irc.right, ymid);  	}  } diff --git a/src/IntegerRectangle.h b/src/IntegerRectangle.h new file mode 100644 index 000000000..4eaf39c43 --- /dev/null +++ b/src/IntegerRectangle.h @@ -0,0 +1,29 @@ +// Scintilla source code edit control +/** @file IntegerRectangle.h + ** A rectangle with integer coordinates. + **/ +// Copyright 2018 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef INTEGERRECTANGLE_H +#define INTEGERRECTANGLE_H + +namespace Scintilla { + +struct IntegerRectangle { +	int left; +	int top; +	int right; +	int bottom; + +	explicit IntegerRectangle(PRectangle rc) noexcept : +		left(static_cast<int>(rc.left)), top(static_cast<int>(rc.top)), +		right(static_cast<int>(rc.right)), bottom(static_cast<int>(rc.bottom)) { +	} +	int Width() const noexcept { return right - left; } +	int Height() const noexcept { return bottom - top; } +}; + +} + +#endif diff --git a/src/LineMarker.cxx b/src/LineMarker.cxx index 820ab9fae..7a66d5326 100644 --- a/src/LineMarker.cxx +++ b/src/LineMarker.cxx @@ -19,6 +19,7 @@  #include "Scintilla.h"  #include "StringCopy.h" +#include "IntegerRectangle.h"  #include "XPM.h"  #include "LineMarker.h" @@ -151,21 +152,20 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		surface->DrawRGBAImage(rcImage, image->GetWidth(), image->GetHeight(), image->Pixels());  		return;  	} +	const IntegerRectangle ircWhole(rcWhole);  	// Restrict most shapes a bit -	PRectangle rc = rcWhole; -	rc.top++; -	rc.bottom--; -	int minDim = std::min(static_cast<int>(rc.Width()), static_cast<int>(rc.Height())); -	minDim--;	// Ensure does not go beyond edge -	int centreX = static_cast<int>(floor((rc.right + rc.left) / 2.0)); -	const int centreY = static_cast<int>(floor((rc.bottom + rc.top) / 2.0)); +	const PRectangle rc(rcWhole.left, rcWhole.top + 1, rcWhole.right, rcWhole.bottom - 1); +	// Ensure does not go beyond edge +	const int minDim = std::min(ircWhole.Width(), ircWhole.Height()-2) - 1; +	int centreX = (ircWhole.right + ircWhole.left) / 2; +	const int centreY = (ircWhole.bottom + ircWhole.top) / 2;  	const int dimOn2 = minDim / 2;  	const int dimOn4 = minDim / 4;  	const int blobSize = dimOn2-1;  	const int armSize = dimOn2-2;  	if (marginStyle == SC_MARGIN_NUMBER || marginStyle == SC_MARGIN_TEXT || marginStyle == SC_MARGIN_RTEXT) {  		// On textual margins move marker to the left to try to avoid overlapping the text -		centreX = static_cast<int>(rc.left) + dimOn2 + 1; +		centreX = ircWhole.left + dimOn2 + 1;  	}  	if (markType == SC_MARK_ROUNDRECT) {  		PRectangle rcRounded = rc; @@ -235,46 +235,46 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  	} else if (markType == SC_MARK_VLINE) {  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->MoveTo(centreX, ircWhole.top); +		surface->LineTo(centreX, ircWhole.bottom);  	} else if (markType == SC_MARK_LCORNER) {  		surface->PenColour(colourTail); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY); -		surface->LineTo(static_cast<int>(rc.right) - 1, centreY); +		surface->LineTo(ircWhole.right - 1, centreY);  	} else if (markType == SC_MARK_TCORNER) {  		surface->PenColour(colourTail);  		surface->MoveTo(centreX, centreY); -		surface->LineTo(static_cast<int>(rc.right) - 1, centreY); +		surface->LineTo(ircWhole.right - 1, centreY);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY + 1);  		surface->PenColour(colourHead); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  	} else if (markType == SC_MARK_LCORNERCURVE) {  		surface->PenColour(colourTail); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY-3);  		surface->LineTo(centreX+3, centreY); -		surface->LineTo(static_cast<int>(rc.right) - 1, centreY); +		surface->LineTo(ircWhole.right - 1, centreY);  	} else if (markType == SC_MARK_TCORNERCURVE) {  		surface->PenColour(colourTail);  		surface->MoveTo(centreX, centreY-3);  		surface->LineTo(centreX+3, centreY); -		surface->LineTo(static_cast<int>(rc.right) - 1, centreY); +		surface->LineTo(ircWhole.right - 1, centreY);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY-2);  		surface->PenColour(colourHead); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  	} else if (markType == SC_MARK_BOXPLUS) {  		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead); @@ -286,10 +286,10 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		else  			surface->PenColour(colourBody);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY - blobSize);  		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead); @@ -312,7 +312,7 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		surface->PenColour(colourHead);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  	} else if (markType == SC_MARK_BOXMINUSCONNECTED) {  		DrawBox(surface, centreX, centreY, blobSize, fore, colourHead); @@ -320,10 +320,10 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		surface->PenColour(colourHead);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY - blobSize);  		if (tFold == LineMarker::body) { @@ -347,10 +347,10 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		else  			surface->PenColour(colourBody);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY - blobSize);  		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead); @@ -359,7 +359,7 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  	} else if (markType == SC_MARK_CIRCLEMINUS) {  		surface->PenColour(colourHead);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead);  		DrawMinus(surface, centreX, centreY, blobSize, colourTail); @@ -367,10 +367,10 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  	} else if (markType == SC_MARK_CIRCLEMINUSCONNECTED) {  		surface->PenColour(colourHead);  		surface->MoveTo(centreX, centreY + blobSize); -		surface->LineTo(centreX, static_cast<int>(rcWhole.bottom)); +		surface->LineTo(centreX, ircWhole.bottom);  		surface->PenColour(colourBody); -		surface->MoveTo(centreX, static_cast<int>(rcWhole.top)); +		surface->MoveTo(centreX, ircWhole.top);  		surface->LineTo(centreX, centreY - blobSize);  		DrawCircle(surface, centreX, centreY, blobSize, fore, colourHead); @@ -380,9 +380,10 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  		char character[1];  		character[0] = static_cast<char>(markType - SC_MARK_CHARACTER);  		const XYPOSITION width = surface->WidthText(fontForCharacter, character, 1); -		rc.left += (rc.Width() - width) / 2; -		rc.right = rc.left + width; -		surface->DrawTextClipped(rc, fontForCharacter, rc.bottom - 2, +		PRectangle rcText = rc; +		rcText.left += (rc.Width() - width) / 2; +		rcText.right = rc.left + width; +		surface->DrawTextClipped(rcText, fontForCharacter, rcText.bottom - 2,  			character, 1, fore, back);  	} else if (markType == SC_MARK_DOTDOTDOT) { @@ -422,11 +423,11 @@ void LineMarker::Draw(Surface *surface, PRectangle &rcWhole, Font &fontForCharac  	} else if (markType == SC_MARK_BOOKMARK) {  		const int halfHeight = minDim / 3;  		Point pts[] = { -			Point::FromInts(static_cast<int>(rc.left), centreY-halfHeight), -			Point::FromInts(static_cast<int>(rc.right) - 3, centreY - halfHeight), -			Point::FromInts(static_cast<int>(rc.right) - 3 - halfHeight, centreY), -			Point::FromInts(static_cast<int>(rc.right) - 3, centreY + halfHeight), -			Point::FromInts(static_cast<int>(rc.left), centreY + halfHeight), +			Point::FromInts(ircWhole.left, centreY-halfHeight), +			Point::FromInts(ircWhole.right - 3, centreY - halfHeight), +			Point::FromInts(ircWhole.right - 3 - halfHeight, centreY), +			Point::FromInts(ircWhole.right - 3, centreY + halfHeight), +			Point::FromInts(ircWhole.left, centreY + halfHeight),  		};  		surface->Polygon(pts, ELEMENTS(pts), fore, back);  	} else { // SC_MARK_FULLRECT diff --git a/src/MarginView.cxx b/src/MarginView.cxx index 2b40b10bc..804ffcfcd 100644 --- a/src/MarginView.cxx +++ b/src/MarginView.cxx @@ -28,6 +28,7 @@  #include "StringCopy.h"  #include "Position.h" +#include "IntegerRectangle.h"  #include "UniqueString.h"  #include "SplitVector.h"  #include "Partitioning.h" @@ -58,16 +59,18 @@ void DrawWrapMarker(Surface *surface, PRectangle rcPlace,  	bool isEndMarker, ColourDesired wrapColour) {  	surface->PenColour(wrapColour); +	const IntegerRectangle ircPlace(rcPlace); +  	enum { xa = 1 }; // gap before start -	const int w = static_cast<int>(rcPlace.right - rcPlace.left) - xa - 1; +	const int w = ircPlace.Width() - xa - 1;  	const bool xStraight = isEndMarker;  // x-mirrored symbol for start marker -	const int x0 = static_cast<int>(xStraight ? rcPlace.left : rcPlace.right - 1); -	const int y0 = static_cast<int>(rcPlace.top); +	const int x0 = xStraight ? ircPlace.left : ircPlace.right - 1; +	const int y0 = ircPlace.top; -	const int dy = static_cast<int>(rcPlace.bottom - rcPlace.top) / 5; -	const int y = static_cast<int>(rcPlace.bottom - rcPlace.top) / 2 + dy; +	const int dy = ircPlace.Height() / 5; +	const int y = ircPlace.Height() / 2 + dy;  	struct Relative {  		Surface *surface; | 
