aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Indicator.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Indicator.cxx')
-rw-r--r--src/Indicator.cxx87
1 files changed, 46 insertions, 41 deletions
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);
}
}