aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2016-12-09 09:05:21 +1100
committerNeil <nyamatongwe@gmail.com>2016-12-09 09:05:21 +1100
commit82ee0a0a14f83b3d85e7298f82165667c77b9a34 (patch)
tree5fb285e157cdbd5d761b8dedf67c77c83f302b4c /src
parent6a529a0ea1126b231577507ed03389f32b962f67 (diff)
downloadscintilla-mirror-82ee0a0a14f83b3d85e7298f82165667c77b9a34.tar.gz
Use double coordinates instead of float in some cases as float ran out of
precision in long documents. This meant that individual lines could not be selected by mouse when the document exceeded 16.7 million lines.
Diffstat (limited to 'src')
-rw-r--r--src/EditView.cxx2
-rw-r--r--src/EditView.h2
-rw-r--r--src/Editor.cxx8
-rw-r--r--src/Editor.h2
-rw-r--r--src/PositionCache.h17
5 files changed, 24 insertions, 7 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 8ffc1bcff..b2855eb97 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -650,7 +650,7 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, int l
return rangeSubLine;
}
-SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs) {
+SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditModel &model, PointDocument pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs) {
pt.x = pt.x - vs.textStart;
int visibleLine = static_cast<int>(floor(pt.y / vs.lineHeight));
if (!canReturnInvalid && (visibleLine < 0))
diff --git a/src/EditView.h b/src/EditView.h
index 83dd8bb1f..8551daa3b 100644
--- a/src/EditView.h
+++ b/src/EditView.h
@@ -114,7 +114,7 @@ public:
Point LocationFromPosition(Surface *surface, const EditModel &model, SelectionPosition pos, int topLine,
const ViewStyle &vs, PointEnd pe);
Range RangeDisplayLine(Surface *surface, const EditModel &model, int lineVisible, const ViewStyle &vs);
- SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, Point pt, bool canReturnInvalid,
+ SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, PointDocument pt, bool canReturnInvalid,
bool charPosition, bool virtualSpace, const ViewStyle &vs);
SelectionPosition SPositionFromLineX(Surface *surface, const EditModel &model, int lineDoc, int x, const ViewStyle &vs);
int DisplayFromPosition(Surface *surface, const EditModel &model, int pos, const ViewStyle &vs);
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 5c9e20d71..8e4ebf18a 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -283,8 +283,8 @@ Point Editor::GetVisibleOriginInMain() const {
return Point(0,0);
}
-Point Editor::DocumentPointFromView(Point ptView) const {
- Point ptDocument = ptView;
+PointDocument Editor::DocumentPointFromView(Point ptView) const {
+ PointDocument ptDocument(ptView);
if (wMargin.GetID()) {
Point ptOrigin = GetVisibleOriginInMain();
ptDocument.x += ptOrigin.x;
@@ -399,8 +399,8 @@ SelectionPosition Editor::SPositionFromLocation(Point pt, bool canReturnInvalid,
if (pt.y < 0)
return SelectionPosition(INVALID_POSITION);
}
- pt = DocumentPointFromView(pt);
- return view.SPositionFromLocation(surface, *this, pt, canReturnInvalid, charPosition, virtualSpace, vs);
+ PointDocument ptdoc = DocumentPointFromView(pt);
+ return view.SPositionFromLocation(surface, *this, ptdoc, canReturnInvalid, charPosition, virtualSpace, vs);
}
int Editor::PositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition) {
diff --git a/src/Editor.h b/src/Editor.h
index 64eb42db7..864bac94f 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -275,7 +275,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
// The top left visible point in main window coordinates. Will be 0,0 except for
// scroll views where it will be equivalent to the current scroll position.
virtual Point GetVisibleOriginInMain() const;
- Point DocumentPointFromView(Point ptView) const; // Convert a point from view space to document
+ PointDocument DocumentPointFromView(Point ptView) const; // Convert a point from view space to document
int TopLineOfMain() const; // Return the line at Main's y coordinate 0
virtual PRectangle GetClientRectangle() const;
virtual PRectangle GetClientDrawingRectangle();
diff --git a/src/PositionCache.h b/src/PositionCache.h
index 5a829b76b..c0d2b7f3e 100644
--- a/src/PositionCache.h
+++ b/src/PositionCache.h
@@ -16,6 +16,23 @@ static inline bool IsEOLChar(char ch) {
return (ch == '\r') || (ch == '\n');
}
+/**
+* A point in document space.
+* Uses double for sufficient resolution in large (>20,000,000 line) documents.
+*/
+class PointDocument {
+public:
+ double x;
+ double y;
+
+ explicit PointDocument(double x_ = 0, double y_ = 0) : x(x_), y(y_) {
+ }
+
+ // Conversion from Point.
+ explicit PointDocument(Point pt) : x(pt.x), y(pt.y) {
+ }
+};
+
// There are two points for some positions and this enumeration
// can choose between the end of the first line or subline
// and the start of the next line or subline.