aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
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.