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), |