aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2011-07-21 16:33:42 +1000
committernyamatongwe <devnull@localhost>2011-07-21 16:33:42 +1000
commita57bbf73951d047ec5b96d5c81381b8b6c52abb3 (patch)
tree56b8b15fc1be384fb3ceca6b2bd02e5e10f76b90
parenta2ec13fe577a76af4ce49639f93ce125597686f7 (diff)
downloadscintilla-mirror-a57bbf73951d047ec5b96d5c81381b8b6c52abb3.tar.gz
Added dotted box indicator.
-rw-r--r--doc/ScintillaDoc.html15
-rw-r--r--include/Scintilla.h1
-rw-r--r--include/Scintilla.iface1
-rw-r--r--src/Indicator.cxx29
-rw-r--r--src/XPM.cxx22
-rw-r--r--src/XPM.h1
6 files changed, 61 insertions, 8 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 7a8f03e88..f698a09ca 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -79,7 +79,7 @@
<h1>Scintilla Documentation</h1>
- <p>Last edited 19/July/2011 NH</p>
+ <p>Last edited 21/July/2011 NH</p>
<p>There is <a class="jump" href="Design.html">an overview of the internal design of
Scintilla</a>.<br />
@@ -3737,6 +3737,19 @@ struct Sci_TextToFind {
so will fit under small fonts.</td>
</tr>
+ <tr>
+ <td align="left"><code>DOTBOX</code></td>
+
+ <td align="center">12</td>
+
+ <td>A dotted rectangle around the text using translucent drawing.
+ Translucency alternates between the alpha and outline alpha settings with the top-left pixel using the alpha setting.
+ <a class="message" href="#SCI_INDICSETALPHA">SCI_INDICSETALPHA</a> and
+ <a class="message" href="#SCI_INDICSETOUTLINEALPHA">SCI_INDICSETOUTLINEALPHA</a>
+ control the alpha transparency values. The default values are 30 for alpha and 50 for outline alpha.
+ To avoid excessive memory allocation the maximum width of a dotted box is 4000 pixels.</td>
+ </tr>
+
</tbody>
</table>
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 403c0dce7..34e4f793d 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -252,6 +252,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define INDIC_DASH 9
#define INDIC_DOTS 10
#define INDIC_SQUIGGLELOW 11
+#define INDIC_DOTBOX 12
#define INDIC_MAX 31
#define INDIC_CONTAINER 8
#define INDIC0_MASK 0x20
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 95e784e19..36ead0ece 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -555,6 +555,7 @@ val INDIC_STRAIGHTBOX=8
val INDIC_DASH=9
val INDIC_DOTS=10
val INDIC_SQUIGGLELOW=11
+val INDIC_DOTBOX=12
val INDIC_MAX=31
val INDIC_CONTAINER=8
val INDIC0_MASK=0x20
diff --git a/src/Indicator.cxx b/src/Indicator.cxx
index 5efee75e6..7059a55bd 100644
--- a/src/Indicator.cxx
+++ b/src/Indicator.cxx
@@ -5,9 +5,17 @@
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
+#include <vector>
+#include <map>
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4786)
+#endif
+
#include "Platform.h"
#include "Scintilla.h"
+#include "XPM.h"
#include "Indicator.h"
#ifdef SCI_NAMESPACE
@@ -84,6 +92,27 @@ void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &r
rcBox.left = rc.left;
rcBox.right = rc.right;
surface->AlphaRectangle(rcBox, (style == INDIC_ROUNDBOX) ? 1 : 0, fore.allocated, fillAlpha, fore.allocated, outlineAlpha, 0);
+ } else if (style == INDIC_DOTBOX) {
+ PRectangle rcBox = rcLine;
+ rcBox.top = rcLine.top + 1;
+ rcBox.left = rc.left;
+ rcBox.right = rc.right;
+ // Cap width at 4000 to avoid large allocations when mistakes made
+ int width = Platform::Minimum(rcBox.Width(), 4000);
+ RGBAImage image(width, rcBox.Height(), 0);
+ // Draw horizontal lines top and bottom
+ for (int x=0; x<width; x++) {
+ for (int y=0; y<rcBox.Height(); y += rcBox.Height()-1) {
+ image.SetPixel(x, y, fore.desired, ((x + y) % 2) ? outlineAlpha : fillAlpha);
+ }
+ }
+ // Draw vertical lines left and right
+ for (int y=1; y<rcBox.Height(); y++) {
+ for (int x=0; x<width; x += width-1) {
+ image.SetPixel(x, y, fore.desired, ((x + y) % 2) ? outlineAlpha : fillAlpha);
+ }
+ }
+ surface->DrawRGBAImage(rcBox, image.GetWidth(), image.GetHeight(), image.Pixels());
} else if (style == INDIC_DASH) {
int x = rc.left;
while (x < rc.right) {
diff --git a/src/XPM.cxx b/src/XPM.cxx
index 6c615dd94..f0277c65f 100644
--- a/src/XPM.cxx
+++ b/src/XPM.cxx
@@ -353,7 +353,11 @@ int XPMSet::GetWidth() {
RGBAImage::RGBAImage(int width_, int height_, const unsigned char *pixels_) :
height(height_), width(width_) {
- pixelBytes.assign(pixels_, pixels_ + CountBytes());
+ if (pixels_) {
+ pixelBytes.assign(pixels_, pixels_ + CountBytes());
+ } else {
+ pixelBytes.resize(CountBytes());
+ }
}
RGBAImage::RGBAImage(const XPM &xpm) {
@@ -365,12 +369,7 @@ RGBAImage::RGBAImage(const XPM &xpm) {
ColourDesired colour;
bool transparent = false;
xpm.PixelAt(x, y, colour, transparent);
- unsigned char *pixel = &pixelBytes[0] + (y*width+x) * 4;
- // RGBA
- pixel[0] = colour.GetRed();
- pixel[1] = colour.GetGreen();
- pixel[2] = colour.GetBlue();
- pixel[3] = transparent ? 0 : 255;
+ SetPixel(x, y, colour, transparent ? 0 : 255);
}
}
}
@@ -386,6 +385,15 @@ const unsigned char *RGBAImage::Pixels() const {
return &pixelBytes[0];
}
+void RGBAImage::SetPixel(int x, int y, ColourDesired colour, int alpha) {
+ unsigned char *pixel = &pixelBytes[0] + (y*width+x) * 4;
+ // RGBA
+ pixel[0] = colour.GetRed();
+ pixel[1] = colour.GetGreen();
+ pixel[2] = colour.GetBlue();
+ pixel[3] = alpha;
+}
+
RGBAImageSet::RGBAImageSet() : height(-1), width(-1){
}
diff --git a/src/XPM.h b/src/XPM.h
index 8b72ef08d..b9c7308af 100644
--- a/src/XPM.h
+++ b/src/XPM.h
@@ -93,6 +93,7 @@ public:
int GetWidth() const { return width; }
int CountBytes() const;
const unsigned char *Pixels() const;
+ void SetPixel(int x, int y, ColourDesired colour, int alpha=0xff);
};
/**