ftp.nice.ch/Attic/openStep/games/Risk.0.98.m.NIS.bs.tar.gz#/Risk.0.98/src/Risk/SNUserPathOperation.m

This is SNUserPathOperation.m in view mode; [Download] [Up]

#import "Risk.h"

RCSID ("$Id: SNUserPathOperation.m,v 1.2 1997/12/15 07:44:20 nygard Exp $");

#import "SNUserPathOperation.h"

#import "NSObjectExtensions.h"
#import <Foundation/NSObjCRuntime.h>

//======================================================================
// An SNUserPathOperation represents an user path operator and its
// operands so that is can be stored in an array.
//======================================================================

#define SNUserPathOperation_VERSION 1

@implementation SNUserPathOperation

+ (void) initialize
{
    if (self == [SNUserPathOperation class])
    {
        [self setVersion:SNUserPathOperation_VERSION];
    }
}

//----------------------------------------------------------------------

+ _operation:(DPSUserPathOp)anOperator
{
    return [[[SNUserPathOperation alloc] initWithOperator:anOperator] autorelease];
}

//----------------------------------------------------------------------

+ arc:(NSPoint)aPoint:(float)aRadius:(float)anAngle1:(float)anAngle2
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_arc];
    [op setPoint1:aPoint];
    [op setRadius:aRadius];
    [op setAngle1:anAngle1];
    [op setAngle2:anAngle2];

    return op;
}

//----------------------------------------------------------------------

+ arcn:(NSPoint)aPoint:(float)aRadius:(float)anAngle1:(float)anAngle2
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_arcn];
    [op setPoint1:aPoint];
    [op setRadius:aRadius];
    [op setAngle1:anAngle1];
    [op setAngle2:anAngle2];

    return op;
}

//----------------------------------------------------------------------

+ arct:(NSPoint)aPoint1:(NSPoint)aPoint2:(float)aRadius
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_arct];
    [op setPoint1:aPoint1];
    [op setPoint2:aPoint2];
    [op setRadius:aRadius];

    return op;
}

//----------------------------------------------------------------------

+ closepath
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_closepath];

    return op;
}

//----------------------------------------------------------------------

+ curveto:(NSPoint)aPoint1:(NSPoint)aPoint2:(NSPoint)aPoint3
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_curveto];
    [op setPoint1:aPoint1];
    [op setPoint2:aPoint2];
    [op setPoint3:aPoint3];

    return op;
}

//----------------------------------------------------------------------

+ lineto:(NSPoint)aPoint
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_lineto];
    [op setPoint1:aPoint];

    return op;
}

//----------------------------------------------------------------------

+ moveto:(NSPoint)aPoint
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_moveto];
    [op setPoint1:aPoint];

    return op;
}

//----------------------------------------------------------------------

+ rcurveto:(NSPoint)delta1:(NSPoint)delta2:(NSPoint)delta3
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_rcurveto];
    [op setPoint1:delta1];
    [op setPoint2:delta2];
    [op setPoint3:delta3];

    return op;
}

//----------------------------------------------------------------------

+ rlineto:(NSPoint)delta
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_rlineto];
    [op setPoint1:delta];

    return op;
}

//----------------------------------------------------------------------

+ rmoveto:(NSPoint)delta
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_rmoveto];
    [op setPoint1:delta];

    return op;
}

//----------------------------------------------------------------------

+ setbbox:(NSPoint)lowerLeft:(NSPoint)upperRight
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_setbbox];
    [op setPoint1:lowerLeft];
    [op setPoint2:upperRight];

    return op;
}

//----------------------------------------------------------------------

+ ucache
{
    SNUserPathOperation *op;

    op = [SNUserPathOperation _operation:dps_ucache];

    return op;
}

//----------------------------------------------------------------------

- initWithOperator:(DPSUserPathOp)anOperator
{
    if ([super init] == nil)
        return nil;

    operator = anOperator;

    return self;
}

//----------------------------------------------------------------------

- (void) encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder:aCoder];

    [aCoder encodeValueOfObjCType:@encode (DPSUserPathOp) at:&operator];
    [aCoder encodePoint:point1];
    [aCoder encodePoint:point2];
    [aCoder encodePoint:point3];
    [aCoder encodeValueOfObjCType:@encode (float) at:&radius];
    [aCoder encodeValueOfObjCType:@encode (float) at:&angle1];
    [aCoder encodeValueOfObjCType:@encode (float) at:&angle2];
}

//----------------------------------------------------------------------

- initWithCoder:(NSCoder *)aDecoder
{
    if ([super initWithCoder:aDecoder] == nil)
        return nil;

    [aDecoder decodeValueOfObjCType:@encode (DPSUserPathOp) at:&operator];
    point1 = [aDecoder decodePoint];
    point2 = [aDecoder decodePoint];
    point3 = [aDecoder decodePoint];
    [aDecoder decodeValueOfObjCType:@encode (float) at:&radius];
    [aDecoder decodeValueOfObjCType:@encode (float) at:&angle1];
    [aDecoder decodeValueOfObjCType:@encode (float) at:&angle2];

    return self;
}

//----------------------------------------------------------------------

- (int) operandCount
{
    int count;
    
    switch (operator)
    {
      case dps_arc:
      case dps_arcn:
      case dps_arct:
          count = 5;
          break;

      case dps_curveto:
      case dps_rcurveto:
          count = 6;
          break;
          
      case dps_lineto:
      case dps_moveto:
      case dps_rlineto:
      case dps_rmoveto:
          count = 2;
          break;

      case dps_setbbox:
          count = 4;
          break;

      case dps_closepath:
      case dps_ucache:
      default:
          count = 0;
    }

    return count;
}

//----------------------------------------------------------------------

- (DPSUserPathOp) operator
{
    return operator;
}

//----------------------------------------------------------------------

- (void) operands:(float *)operands
{
    switch (operator)
    {
      case dps_arc:
      case dps_arcn:
          *operands++ = point1.x;
          *operands++ = point1.y;
          *operands++ = radius;
          *operands++ = angle1;
          *operands++ = angle2;
          break;

      case dps_arct:
          *operands++ = point1.x;
          *operands++ = point1.y;
          *operands++ = point2.x;
          *operands++ = point2.y;
          *operands++ = radius;
          break;

      case dps_closepath:
          break;

      case dps_curveto:
      case dps_rcurveto:
          *operands++ = point1.x;
          *operands++ = point1.y;
          *operands++ = point2.x;
          *operands++ = point2.y;
          *operands++ = point3.x;
          *operands++ = point3.y;
          break;

      case dps_lineto:
      case dps_moveto:
      case dps_rlineto:
      case dps_rmoveto:
          *operands++ = point1.x;
          *operands++ = point1.y;
          break;

      case dps_setbbox:
          *operands++ = point1.x;
          *operands++ = point1.y;
          *operands++ = point2.x;
          *operands++ = point2.y;
          *operands++ = radius;
          break;

      case dps_ucache:
          break;

      default:
          break;
    }
}

//----------------------------------------------------------------------

- (NSPoint) lowerLeft
{
    NSPoint ll;

    ll = NSMakePoint (10000, 10000);

    switch (operator)
    {
      case dps_arc:
      case dps_arcn:
          ll.x = MIN (ll.x, point1.x);
          ll.y = MIN (ll.y, point1.y);
          break;

      case dps_arct:
          ll.x = MIN (ll.x, point1.x);
          ll.y = MIN (ll.y, point1.y);
          ll.x = MIN (ll.x, point2.x);
          ll.y = MIN (ll.y, point2.y);
          break;

      case dps_closepath:
          break;

      case dps_curveto:
      case dps_rcurveto:
          ll.x = MIN (ll.x, point1.x);
          ll.y = MIN (ll.y, point1.y);
          ll.x = MIN (ll.x, point2.x);
          ll.y = MIN (ll.y, point2.y);
          ll.x = MIN (ll.x, point3.x);
          ll.y = MIN (ll.y, point3.y);
          break;

      case dps_lineto:
      case dps_moveto:
      case dps_rlineto:
      case dps_rmoveto:
          //NSLog (@"ll: (%f,%f), point: (%f,%f)", ll.x, ll.y, point1.x, point1.y);
          ll.x = MIN (ll.x, point1.x);
          ll.y = MIN (ll.y, point1.y);
          //NSLog (@"new ll: (%f,%f)", ll.x, ll.y);
          break;

      case dps_setbbox: // n/a?
          //NSLog (@"-- ll: (%f,%f), point1: (%f,%f), point2: (%f,%f)", ll.x, ll.y, point1.x, point1.y, point2.x, point2.y);
          ll.x = MIN (ll.x, point1.x);
          ll.y = MIN (ll.y, point1.y);
          ll.x = MIN (ll.x, point2.x);
          ll.y = MIN (ll.y, point2.y);
          //NSLog (@"-- new ll: (%f,%f)", ll.x, ll.y);
          break;

      case dps_ucache:
          break;

      default:
          break;
    }

    return ll;
}

//----------------------------------------------------------------------

- (NSPoint) upperRight
{
    NSPoint ur;

    ur = NSMakePoint (-10000, -10000);

    switch (operator)
    {
      case dps_arc:
      case dps_arcn:
          ur.x = MAX (ur.x, point1.x);
          ur.y = MAX (ur.y, point1.y);
          break;

      case dps_arct:
          ur.x = MAX (ur.x, point1.x);
          ur.y = MAX (ur.y, point1.y);
          ur.x = MAX (ur.x, point2.x);
          ur.y = MAX (ur.y, point2.y);
          break;

      case dps_closepath:
          break;

      case dps_curveto:
      case dps_rcurveto:
          ur.x = MAX (ur.x, point1.x);
          ur.y = MAX (ur.y, point1.y);
          ur.x = MAX (ur.x, point2.x);
          ur.y = MAX (ur.y, point2.y);
          ur.x = MAX (ur.x, point3.x);
          ur.y = MAX (ur.y, point3.y);
          break;

      case dps_lineto:
      case dps_moveto:
      case dps_rlineto:
      case dps_rmoveto:
          ur.x = MAX (ur.x, point1.x);
          ur.y = MAX (ur.y, point1.y);
          break;

      case dps_setbbox: // n/a?
          ur.x = MAX (ur.x, point1.x);
          ur.y = MAX (ur.y, point1.y);
          ur.x = MAX (ur.x, point2.x);
          ur.y = MAX (ur.y, point2.y);
          break;

      case dps_ucache:
          break;

      default:
          break;
    }

    return ur;
}

//----------------------------------------------------------------------

// Private
- (void) setPoint1:(NSPoint)aPoint
{
    point1 = aPoint;
}

//----------------------------------------------------------------------

- (void) setPoint2:(NSPoint)aPoint
{
    point2 = aPoint;
}

//----------------------------------------------------------------------

- (void) setPoint3:(NSPoint)aPoint
{
    point3 = aPoint;
}

//----------------------------------------------------------------------

- (void) setRadius:(float)newRadius
{
    radius = newRadius;
}

//----------------------------------------------------------------------

- (void) setAngle1:(float)anAngle
{
    angle1 = anAngle;
}

//----------------------------------------------------------------------

- (void) setAngle2:(float)anAngle
{
    angle2 = anAngle;
}

//----------------------------------------------------------------------

- (NSString *) description
{
    NSString *str;

    switch (operator)
    {
      case dps_arc:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: arc p1:%f,%f r:%f a1:%f a2:%f>",
                          point1.x, point1.y, radius, angle1, angle2];
          break;

      case dps_arcn:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: arcn p1:%f,%f r:%f a1:%f a2:%f>",
                          point1.x, point1.y, radius, angle1, angle2];
          break;

      case dps_arct:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: arct p1:%f,%f p2:%f,%f r:%f>",
                          point1.x, point1.y, point2.x, point2.y, radius];
          break;

      case dps_closepath:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: closepath>"];
          break;

      case dps_curveto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: curveto p1:%f,%f p2:%f,%f p3:%f,%f>",
                          point1.x, point1.y, point2.x, point2.y, point3.x, point3.y];
          break;

      case dps_lineto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: lineto p1:%f,%f>",
                          point1.x, point1.y];
          break;

      case dps_moveto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: moveto p1:%f,%f>",
                          point1.x, point1.y];
          break;

      case dps_rcurveto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: rcurveto p1:%f,%f p2:%f,%f p3:%f,%f>",
                          point1.x, point1.y, point2.x, point2.y, point3.x, point3.y];
          break;

      case dps_rlineto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: rlineto p1:%f,%f>",
                          point1.x, point1.y];
          break;

      case dps_rmoveto:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: rmoveto p1:%f,%f>",
                          point1.x, point1.y];
          break;

      case dps_setbbox:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: setbbox p1:%f,%f p2:%f,%f>",
                          point1.x, point1.y, point2.x, point2.y];
          break;

      case dps_ucache:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: ucache>"];
          break;

      default:
          str = [NSString stringWithFormat:@"<SNUserPathOperation: UNKNOWN>"];
    }

    return str;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.