aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/LineMarker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/LineMarker.cxx')
-rw-r--r--src/LineMarker.cxx144
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),