Merge pull request #9 from gunyarakun/fix-typo
[cocotron.git] / Foundation / NSGeometry.m
blobed17fcb1fdef83d79c496261c364ef270f653f33
1 /* Copyright (c) 2006-2007 Christopher J. W. Lloyd
3 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
8 #import <Foundation/NSGeometry.h>
9 #import <Foundation/NSDictionary.h>
10 #import <Foundation/NSStringFormatter.h>
11 #import <Foundation/NSObjCRuntime.h>
12 #import <Foundation/NSRaise.h>
13 #include <math.h>
14 #include <stdio.h>
16 const NSPoint NSZeroPoint={0,0};
18 BOOL NSEqualPoints(NSPoint point0,NSPoint point1) {
19    return ((point0.x==point1.x) && (point0.y==point1.y))?YES:NO;
22 NSString *NSStringFromPoint(NSPoint point) {
23     return [NSString stringWithFormat:@"{%g, %g}", point.x, point.y];
27 NSPoint NSPointFromString(NSString *string)
29     NSPoint result = NSZeroPoint;
30     
31     if (string != nil) {
32         sscanf([string UTF8String], "{" CGFLOAT_SCAN ", " CGFLOAT_SCAN "}", &result.x, &result.y);
33     }
34     return result;
39 const NSSize NSZeroSize={0,0};
41 BOOL NSEqualSizes(NSSize size0,NSSize size1) {
42    return (size0.width==size1.width) && (size0.height==size1.height);
45 NSString *NSStringFromSize(NSSize size) {
46    return [NSString stringWithFormat:@"{%g, %g}", size.width, size.height];
50 NSSize NSSizeFromString(NSString *string)
52     NSSize result = NSZeroSize;
53     
54     if (string != nil) {
55         sscanf([string UTF8String], "{" CGFLOAT_SCAN ", " CGFLOAT_SCAN "}", &result.width, &result.height);
56     }
57     return result;
62 const NSRect NSZeroRect={{0,0},{0,0}};
64 BOOL NSEqualRects(NSRect rect0,NSRect rect1) {
65    return NSEqualPoints(rect0.origin,rect1.origin) && NSEqualSizes(rect0.size,rect1.size);
68 BOOL NSIsEmptyRect(NSRect rect) {
69    if(rect.size.width>0 && rect.size.height>0)
70     return NO;
72    return YES;
76 NSRect NSInsetRect(NSRect rect,CGFloat dx,CGFloat dy) {
77    rect.origin.x+=dx;
78    rect.origin.y+=dy;
79    rect.size.width-=dx*2;
80    rect.size.height-=dy*2;
81    return rect;
84 NSRect NSOffsetRect(NSRect rect,CGFloat dx,CGFloat dy) {
85    rect.origin.x+=dx; 
86    rect.origin.y+=dy; 
87    return rect; 
91 NSRect NSIntegralRect(NSRect rect) {
92    if (!NSIsEmptyRect(rect)) { 
93       rect.origin.x = floor(rect.origin.x); 
94       rect.origin.y = floor(rect.origin.y); 
95       rect.size.width = ceil(rect.size.width); 
96       rect.size.height = ceil(rect.size.height); 
97    } 
98    return rect; 
102 NSRect NSUnionRect(NSRect rect0,NSRect rect1) {
103    if(NSIsEmptyRect(rect0))
104     if(NSIsEmptyRect(rect1))
105      return NSZeroRect;
106     else
107      return rect1;
108    else
109     if(NSIsEmptyRect(rect1))
110      return rect0;
111     else {
112      NSRect result;
114      result.origin.x=MIN(rect0.origin.x,rect1.origin.x);
115      result.origin.y=MIN(rect0.origin.y,rect1.origin.y);
116      result.size.width=MAX(NSMaxX(rect0),NSMaxX(rect1))-result.origin.x;
117      result.size.height=MAX(NSMaxY(rect0),NSMaxY(rect1))-result.origin.y;
119      return result;
120     }
123 NSRect NSIntersectionRect(NSRect rect0,NSRect rect1) {
124    NSRect result;
126    if(NSMaxX(rect0)<=NSMinX(rect1) || NSMinX(rect0)>=NSMaxX(rect1) ||
127       NSMaxY(rect0)<=NSMinY(rect1) || NSMinY(rect0)>=NSMaxY(rect1))
128     return NSZeroRect;
130    result.origin.x=MAX(NSMinX(rect0),NSMinX(rect1));
131    result.origin.y=MAX(NSMinY(rect0),NSMinY(rect1));
132    result.size.width=MIN(NSMaxX(rect0),NSMaxX(rect1))-result.origin.x;
133    result.size.height=MIN(NSMaxY(rect0),NSMaxY(rect1))-result.origin.y;
135    return result;
139 void NSDivideRect(NSRect rect,NSRect *slicep,NSRect *remainderp,CGFloat amount,NSRectEdge edge) {
140    *slicep = rect;
141    *remainderp = rect;
142    CGFloat temp;
144    switch(edge) {
145     case NSMinXEdge:
146          slicep->size.width = amount;
147          remainderp->size.width -= amount;
148          remainderp->origin.x += amount;
149          break;
150     case NSMinYEdge:
151      slicep->size.height = amount;
152          remainderp->size.height -= amount;
153          remainderp->origin.y += amount;
154          break;
155     case NSMaxXEdge:
156          temp = slicep->size.width - amount;
157          remainderp->size.width = temp;
158          slicep->size.width = amount;
159          slicep->origin.x += temp;
160          break;
161     case NSMaxYEdge:
162          temp = slicep->size.height - amount;
163          remainderp->size.height = temp;
164          slicep->size.height = amount;
165          slicep->origin.y += temp;
166          break;
167    }
171 BOOL NSContainsRect(NSRect rect0,NSRect rect1) {
172   return ((NSMinX(rect0) <=NSMinX(rect1)) && (NSMinY(rect0) <=NSMinY(rect1)) &&
173           (NSMaxX(rect0) >=NSMaxX(rect1)) && (NSMaxY(rect0) >=NSMaxY(rect1)))?YES:NO;
176 BOOL NSIntersectsRect(NSRect rect0,NSRect rect1) {
177    if(NSMaxX(rect0)<=NSMinX(rect1) || NSMinX(rect0)>=NSMaxX(rect1) ||
178       NSMaxY(rect0)<=NSMinY(rect1) || NSMinY(rect0)>=NSMaxY(rect1))
179     return NO;
181   return YES;
185 NSString *NSStringFromRect(NSRect rect) {
186     return [NSString stringWithFormat:@"{{%g, %g}, {%g, %g}}", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height];
190 NSRect NSRectFromString(NSString *string)
192     NSRect result = NSZeroRect;
193     
194     if (string != nil) {
195         sscanf([string UTF8String], "{{" CGFLOAT_SCAN ", " CGFLOAT_SCAN "}, {" CGFLOAT_SCAN ", " CGFLOAT_SCAN "}}", &result.origin.x, &result.origin.y, &result.size.width, &result.size.height);
196     }
197     return result;
201 BOOL NSPointInRect(NSPoint point,NSRect rect) {
202    return (point.x>=NSMinX(rect) && point.x<=NSMaxX(rect)) &&
203           (point.y>=NSMinY(rect) && point.y<=NSMaxY(rect));
206 BOOL NSMouseInRect(NSPoint point,NSRect rect,BOOL flipped) {
207   if(flipped)
208     return (point.x>=NSMinX(rect) && point.x<NSMaxX(rect) &&
209             point.y>=NSMinY(rect) && point.y<NSMaxY(rect));
210   else
211     return (point.x>=NSMinX(rect) && point.x<NSMaxX(rect) &&
212             point.y>NSMinY(rect)  && point.y<=NSMaxY(rect));