From 4e1b6b11190a429b77fecc9ca26e1e0a662304ae Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Sun, 5 Aug 2012 17:25:16 +1000 Subject: Add INDIC_SQUIGGLEPIXMAP as a faster version of INDIC_SQUIGGLE. Based on work by Matthew Brush and Lex Trottman. --- src/Indicator.cxx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/Indicator.cxx') diff --git a/src/Indicator.cxx b/src/Indicator.cxx index bd17c3d1c..7eab44433 100644 --- a/src/Indicator.cxx +++ b/src/Indicator.cxx @@ -18,6 +18,11 @@ using namespace Scintilla; #endif +static PRectangle PixelGridAlign(const PRectangle &rc) { + // Move left and right side to nearest pixel to avoid blurry visuals + return PRectangle(int(rc.left + 0.5), rc.top, int(rc.right + 0.5), rc.bottom); +} + void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) { surface->PenColour(fore); int ymid = (rc.bottom + rc.top) / 2; @@ -31,6 +36,25 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r y = 2 - y; } surface->LineTo(rc.right, rc.top + y); // Finish the line + } else if (style == INDIC_SQUIGGLEPIXMAP) { + PRectangle rcSquiggle = PixelGridAlign(rc); + + int width = Platform::Minimum(4000, rcSquiggle.Width()); + RGBAImage image(width, 3, 1.0, 0); + enum { alphaFull = 0xff, alphaSide = 0x2f, alphaSide2=0x5f }; + for (int x = 0; x < width; x++) { + if (x%2) { + // Two halfway columns have a full pixel in middle flanked by light pixels + image.SetPixel(x, 0, fore, alphaSide); + image.SetPixel(x, 1, fore, alphaFull); + image.SetPixel(x, 2, fore, alphaSide); + } else { + // Extreme columns have a full pixel at bottom or top and a mid-tone pixel in centre + image.SetPixel(x, (x%4) ? 0 : 2, fore, alphaFull); + image.SetPixel(x, 1, fore, alphaSide2); + } + } + surface->DrawRGBAImage(rcSquiggle, image.GetWidth(), image.GetHeight(), image.Pixels()); } else if (style == INDIC_SQUIGGLELOW) { surface->MoveTo(rc.left, rc.top); int x = rc.left + 3; -- cgit v1.2.3