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

Reply via email to