Revision: 4625
http://skim-app.svn.sourceforge.net/skim-app/?rev=4625&view=rev
Author: hofman
Date: 2008-09-14 17:37:29 +0000 (Sun, 14 Sep 2008)
Log Message:
-----------
Hittest for Ink note, should be near the line, as for Line notes.
Modified Paths:
--------------
trunk/NSGeometry_SKExtensions.h
trunk/NSGeometry_SKExtensions.m
trunk/PDFAnnotationInk_SKExtensions.m
trunk/PDFAnnotationLine_SKExtensions.m
Modified: trunk/NSGeometry_SKExtensions.h
===================================================================
--- trunk/NSGeometry_SKExtensions.h 2008-09-14 16:37:50 UTC (rev 4624)
+++ trunk/NSGeometry_SKExtensions.h 2008-09-14 17:37:29 UTC (rev 4625)
@@ -122,6 +122,10 @@
#pragma mark -
+extern BOOL SKPointNearLineFromPointToPoint(NSPoint point, NSPoint startPoint,
NSPoint endPoint, float delta);
+
+#pragma mark -
+
static inline
Rect SKQDRectFromNSRect(NSRect nsRect) {
Rect qdRect;
Modified: trunk/NSGeometry_SKExtensions.m
===================================================================
--- trunk/NSGeometry_SKExtensions.m 2008-09-14 16:37:50 UTC (rev 4624)
+++ trunk/NSGeometry_SKExtensions.m 2008-09-14 17:37:29 UTC (rev 4625)
@@ -99,3 +99,21 @@
rect.size.width = width;
return rect;
}
+
+BOOL SKPointNearLineFromPointToPoint(NSPoint point, NSPoint aPoint, NSPoint
bPoint, float delta) {
+ if (point.x < fminf(aPoint.x, bPoint.x) - delta || point.y <
fminf(aPoint.y, bPoint.y) - delta || point.x > fmaxf(aPoint.x, bPoint.x) +
delta || point.y > fmaxf(aPoint.y, bPoint.y) + delta)
+ return NO;
+
+ NSPoint relPoint = SKSubstractPoints(bPoint, aPoint);
+ float lengthSquared = relPoint.x * relPoint.x + relPoint.y * relPoint.y;
+ float deltaSquared = delta * delta;
+ float extProduct;
+
+ if (lengthSquared < deltaSquared)
+ return YES;
+
+ point = SKSubstractPoints(point, aPoint);
+ extProduct = point.x * relPoint.y - point.y * relPoint.x;
+
+ return extProduct * extProduct < deltaSquared * lengthSquared;
+}
Modified: trunk/PDFAnnotationInk_SKExtensions.m
===================================================================
--- trunk/PDFAnnotationInk_SKExtensions.m 2008-09-14 16:37:50 UTC (rev
4624)
+++ trunk/PDFAnnotationInk_SKExtensions.m 2008-09-14 17:37:29 UTC (rev
4625)
@@ -42,6 +42,7 @@
#import "SKStringConstants.h"
#import "SKFDFParser.h"
#import "NSUserDefaults_SKExtensions.h"
+#import "SKGeometry.h"
@implementation PDFAnnotationInk (SKExtensions)
@@ -90,6 +91,32 @@
- (BOOL)isConvertibleAnnotation { return NO; }
+- (BOOL)hitTest:(NSPoint)point {
+ NSRect bounds = [self bounds];
+ NSPoint startPoint = [self startPoint];
+ NSPoint endPoint = [self endPoint];
+
+ if ([super hitTest:point]) {
+ NSEnumerator *pathEnum = [[self paths] objectEnumerator];
+ NSBezierPath *path;
+ NSPoint prevPoint, nextPoint = NSZeroPoint;
+ NSPoint points[3];
+ int i, iMax;
+ NSBezierPathElement element;
+ while (path = [pathEnum nextObject]) {
+ iMax = [path elementCount];
+ for (i = 0; i < iMax; i++) {
+ element = [path elementAtIndex:i associatedPoints:points];
+ prevPoint = nextPoint;
+ nextPoint = element == NSCurveToBezierPathElement ? points[2]
: points[0];
+ if (i > 0 && SKPointNearLineFromPointToPoint(point, prevPoint,
nextPoint, 4.0))
+ return YES;
+ }
+ }
+ }
+ return NO;
+}
+
- (NSArray *)pointLists {
NSMutableArray *pointLists = [NSMutableArray array];
NSMutableArray *pointValues;
Modified: trunk/PDFAnnotationLine_SKExtensions.m
===================================================================
--- trunk/PDFAnnotationLine_SKExtensions.m 2008-09-14 16:37:50 UTC (rev
4624)
+++ trunk/PDFAnnotationLine_SKExtensions.m 2008-09-14 17:37:29 UTC (rev
4625)
@@ -120,25 +120,13 @@
NSRect bounds = [self bounds];
NSPoint startPoint = [self startPoint];
NSPoint endPoint = [self endPoint];
+ NSPoint relPoint = SKSubstractPoints(point, bounds.origin);
- if ([super hitTest:point]) {
- NSPoint relPoint = SKSubstractPoints(endPoint, startPoint);
- float lengthSquared = relPoint.x * relPoint.x + relPoint.y *
relPoint.y;
- float extProduct;
-
- if (lengthSquared < 16.0)
- return YES;
-
- point = SKSubstractPoints(SKSubstractPoints(point, bounds.origin),
startPoint);
- extProduct = point.x * relPoint.y - point.y * relPoint.x;
-
- return extProduct * extProduct < 16.0 * lengthSquared;
- } else {
-
- point = SKSubstractPoints(point, bounds.origin);
- return (fabsf(point.x - startPoint.x) < 3.5 && fabsf(point.y -
startPoint.y) < 3.5) ||
- (fabsf(point.x - endPoint.x) < 3.5 && fabsf(point.y -
endPoint.y) < 3.5);
- }
+ if ([super hitTest:point])
+ return SKPointNearLineFromPointToPoint(relPoint, startPoint, endPoint,
4.0);
+ else
+ return (fabsf(relPoint.x - startPoint.x) < 3.5 && fabsf(relPoint.y -
startPoint.y) < 3.5) ||
+ (fabsf(relPoint.x - endPoint.x) < 3.5 && fabsf(relPoint.y -
endPoint.y) < 3.5);
}
- (NSRect)displayRectForBounds:(NSRect)bounds {
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit