This is MiscRoundedRectShape.m in view mode; [Download] [Up]
/*
Copyright (c) Uwe Hoffmann, 1995.
All Rights Reserved.
Filename: MiscRoundedRectShape.m
Author: Uwe Hoffmann
Date: Sep 07, 1995
$Id: MiscRoundedRectShape.m,v 1.0 1995/09/07 11:22:00 Uwe Hoffmann Exp $
$Log: MiscRoundedRectShape.m,v $
*/
#import <appkit/appkit.h>
#import "MiscRoundedRectShape.h"
#import "MiscUserPath.h"
#import "MiscHitPath.h"
extern BOOL straddles(NSPoint p1, NSPoint p2, NSPoint p3, NSPoint p4);
@implementation MiscRoundedRectShape
- (NSRect)innerBounds
{
return [path bounds];
}
- (MiscShapeType)shapeType
{
return MiscRoundedRectShapeType;
}
- (void)calcIntersection:(NSPoint *)ip angle:(float *)alpha toPoint:(NSPoint)aPoint
{
NSPoint middle,l1,l2,pos;
float s,width,height,*bbox;
bbox = [path bbox];
pos.x = bbox[0];
pos.y = bbox[1];
width = bbox[2] - bbox[0];
height = bbox[3] - bbox[1]; middle.x = pos.x + width / 2;
middle.y = pos.y + height / 2;
if(aPoint.y == middle.y){
*alpha = 0;
ip->y = middle.y;
if(aPoint.x > middle.x)
ip->x = pos.x + width;
else
ip->x = pos.x;
return;
}
if(aPoint.x == middle.x){
ip->x = middle.x;
if(aPoint.y > middle.y){
ip->y = pos.y + height;
*alpha = -90;
} else {
ip->y = pos.y;
*alpha = 90;
}
return;
}
s = (aPoint.y - middle.y) / (aPoint.x - middle.x);
*alpha = 57.29577951 * atan(s);
if(aPoint.y > middle.y){
if(aPoint.x > middle.x){ // 4. quadrant
l1.x = middle.x;
l1.y = l2.y = pos.y + height;
l2.x = pos.x + width;
if(straddles(l1, l2, middle, aPoint)){
ip->y = l1.y;
ip->x = middle.x + (ip->y - middle.y) / s;
} else {
ip->x = l2.x;
ip->y = middle.y + s * (ip->x - middle.x);
}
} else { // 3. quadrant
l1.x = middle.x;
l1.y = l2.y = pos.y + height;
l2.x = pos.x;
if(straddles(l1, l2, middle, aPoint)){
ip->y = l1.y;
ip->x = middle.x + (ip->y - middle.y) / s;
} else {
ip->x = l2.x;
ip->y = middle.y + s * (ip->x - middle.x);
}
}
} else {
if(aPoint.x > middle.x){ // 1. quadrant
l1.x = middle.x;
l1.y = l2.y = pos.y;
l2.x = pos.x + width;
if(straddles(l1, l2, middle, aPoint)){
ip->y = l1.y;
ip->x = middle.x + (ip->y - middle.y) / s;
} else {
ip->x = l2.x;
ip->y = middle.y + s * (ip->x - middle.x);
}
} else { // 2. quadrant
l1.x = middle.x;
l1.y = l2.y = pos.y;
l2.x = pos.x;
if(straddles(l1, l2, middle, aPoint)){
ip->y = l1.y;
ip->x = middle.x + (ip->y - middle.y) / s;
} else {
ip->x = l2.x;
ip->y = middle.y + s * (ip->x - middle.x);
}
}
}
}
- (void)makePathWithBounds:(NSRect)aRect
{
[path moveto:aRect.origin.x :aRect.origin.y];
[path rlineto:aRect.size.width :0.0];
[path rlineto:0.0 :aRect.size.height];
[path rlineto:-aRect.size.width :0.0];
[path rlineto:0.0 :-aRect.size.height];
}
- (void)fillParamsWithBounds:(NSRect)aRect
{
float *params, *bbox;
params = [path params];
bbox = [path bbox];
bbox[0] = aRect.origin.x;
bbox[1] = aRect.origin.y;
bbox[2] = aRect.origin.x + aRect.size.width;
bbox[3] = aRect.origin.y + aRect.size.height;
params[0] = aRect.origin.x;
params[1] = aRect.origin.y;
params[2] = aRect.size.width;
params[3] = 0.0;
params[4] = 0.0;
params[5] = aRect.size.height;
params[6] = -aRect.size.width;
params[7] = 0.0;
params[8] = 0.0;
params[9] = -aRect.size.height;
}
+ (NSSize)calcSizeForInnerSize:(NSSize)aSize
{
return aSize;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.