This is UPath.m in view mode; [Download] [Up]
#import "UPath.h" #import "PSWUPath.h" @interface UPath(PrivateMethods) - growParams; - growOps; @end @implementation UPath //************************************************************************ // creating and destroying - initCountParams:(int)numParams countOps:(int)numOps { [super init]; maxParams = numParams; maxOps = numOps; bboxParams = (float *)NXZoneMalloc([self zone],sizeof(float) * (maxParams + 4)); bbox = bboxParams; params = &bboxParams[4]; bboxOps = (char *)NXZoneMalloc([self zone],maxOps + 2); ops = &bboxOps[2]; ping = NO; [self resetFill]; return self; } - init { [self initCountParams:32 countOps:16]; return self; } - free { NX_FREE(bboxParams); NX_FREE(bboxOps); return [super free]; } - copyFromZone:(NXZone *)zone { UPath *theCopy; theCopy = [super copyFromZone:zone]; theCopy->bboxParams = NXZoneMalloc(zone,sizeof(float) * (maxParams + 4)); theCopy->bboxOps = NXZoneMalloc(zone,maxOps + 2); bcopy(bboxParams,theCopy->bboxParams,(sizeParams + 4) * (sizeof(float)/sizeof(char))); bcopy(bboxOps,theCopy->bboxOps,sizeOps + 2); theCopy->bbox = theCopy->bboxParams; theCopy->params = theCopy->bboxParams + 4 * sizeof(float); theCopy->ops = theCopy->bboxOps + 2; return theCopy; } //************************************************************************ // accessing - getBounds:(NXRect *)aRect { NXSetRect(aRect,bbox[0],bbox[1],bbox[2] - bbox[0],bbox[3] - bbox[1]); return self; } //************************************************************************ // defining user path - resetFill { sizeParams = sizeOps = 0; cp.x = cp.y = 0.0; bbox[0] = bbox[1] = 1.0e6; bbox[2] = bbox[3] = -1.0e6; bboxOps[0] = dps_ucache; bboxOps[1] = dps_setbbox; return self; } - updateBBoxOnX:(float)x andY:(float)y { if(x < bbox[0]) bbox[0] = x; if(y < bbox[1]) bbox[1] = y; if(x > bbox[2]) bbox[2] = x; if(y > bbox[3]) bbox[3] = y; return self; } - moveto:(float)x :(float)y { if(sizeParams + 2 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; params[sizeParams++] = x; params[sizeParams++] = y; ops[sizeOps++] = dps_moveto; [self updateBBoxOnX:x andY:y]; cp.x = x; cp.y = y; return self; } - rmoveto:(float)x :(float)y { if(sizeParams + 2 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_rmoveto; params[sizeParams++] = x; params[sizeParams++] = y; cp.x += x; cp.y += y; [self updateBBoxOnX:cp.x andY:cp.y]; return self; } - lineto:(float)x :(float)y { if(sizeParams + 2 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_lineto; params[sizeParams++] = x; params[sizeParams++] = y; [self updateBBoxOnX:x andY:y]; cp.x = x; cp.y = y; return self; } - rlineto:(float)x :(float)y { if(sizeParams + 2 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_rlineto; params[sizeParams++] = x; params[sizeParams++] = y; cp.x += x; cp.y += y; [self updateBBoxOnX:cp.x andY:cp.y]; return self; } - curveto:(float)x1 :(float)y1 :(float)x2 :(float)y2 :(float)x3 :(float)y3 { if(sizeParams + 6 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_curveto; params[sizeParams++] = x1; params[sizeParams++] = y1; [self updateBBoxOnX:x1 andY:y1]; params[sizeParams++] = x2; params[sizeParams++] = y2; [self updateBBoxOnX:x2 andY:y2]; params[sizeParams++] = x3; params[sizeParams++] = y3; [self updateBBoxOnX:x3 andY:y3]; cp.x = x3; cp.y = y3; return self; } - rcurveto:(float)dx1 :(float)dy1 :(float)dx2 :(float)dy2 :(float)dx3 :(float)dy3 { if(sizeParams + 6 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_rcurveto; params[sizeParams++] = dx1; params[sizeParams++] = dy1; params[sizeParams++] = dx2; params[sizeParams++] = dy2; params[sizeParams++] = dx3; params[sizeParams++] = dy3; [self updateBBoxOnX:cp.x + dx1 andY:cp.y + dx1]; [self updateBBoxOnX:cp.x + dx2 andY:cp.y + dx2]; [self updateBBoxOnX:cp.x + dx3 andY:cp.y + dx3]; cp.x += dx3; cp.y += dy3; return self; } - arc:(float)x :(float)y :(float)r :(float)ang1 :(float)ang2 { if(sizeParams + 5 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps] = dps_arc; sizeOps = sizeOps + 1; params[sizeParams++] = x; params[sizeParams++] = y; params[sizeParams++] = r; params[sizeParams++] = ang1; params[sizeParams++] = ang2; [self updateBBoxOnX:x + r andY:y + r]; [self updateBBoxOnX:x - r andY:y - r]; cp.x = x + cos(ang2 / 57.3) * r; cp.y = y + sin(ang2 / 57.3) * r; return self; } - arcn:(float)x :(float)y :(float)r :(float)ang1 :(float)ang2 { if(sizeParams + 5 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_arcn; params[sizeParams++] = x; params[sizeParams++] = y; params[sizeParams++] = r; params[sizeParams++] = ang1; params[sizeParams++] = ang2; [self updateBBoxOnX:x + r andY:y + r]; [self updateBBoxOnX:x - r andY:y - r]; cp.x = x + cos(ang2 / 57.3) * r; cp.y = y + sin(ang2 / 57.3) * r; return self; } - arct:(float)x1 :(float)y1 :(float)x2 :(float)y2 :(float)r { if(sizeParams + 5 > maxParams) if(![self growParams]) return nil; if(sizeOps + 1 > maxOps) if(![self growOps]) return nil; ops[sizeOps++] = dps_arct; params[sizeParams++] = x1; params[sizeParams++] = y1; params[sizeParams++] = x2; params[sizeParams++] = y2; params[sizeParams++] = r; [self updateBBoxOnX:x1 andY:y1]; [self updateBBoxOnX:x2 andY:y2]; cp.x = x2; cp.y = y2; return self; } - closepath { ops[sizeOps++] = dps_closepath; return self; } //************************************************************************ // sending - debugSend:(int)op cached:(BOOL)cache { ping = YES; return [self send:op cached:cache]; } - send:(int)op cached:(BOOL)cache { NXHandler exception; exception.code = 0; NX_DURING if(cache) DPSDoUserPath(params, sizeParams, dps_float, bboxOps, sizeOps + 2, bbox, op); else DPSDoUserPath(params, sizeParams, dps_float, bboxOps + 1, sizeOps + 1, bbox, op); if(ping) NXPing(); NX_HANDLER exception = NXLocalHandler; NX_ENDHANDLER if(exception.code){ NXReportError(&exception); return nil; } else return self; } //************************************************************************ // archiving - write:(NXTypedStream *)stream { [super write:stream]; NXWriteTypes(stream,"iiii",&sizeParams,&sizeOps,&maxParams,&maxOps); NXWritePoint(stream,&cp); NXWriteArray(stream,"f",sizeParams + 4,bboxParams); NXWriteArray(stream,"c",sizeOps + 2,bboxOps); return self; } - read:(NXTypedStream *)stream { [super read:stream]; NXReadTypes(stream,"iiii",&sizeParams,&sizeOps,&maxParams,&maxOps); NXReadPoint(stream,&cp); bboxParams = NXZoneMalloc([self zone],sizeof(float) * (maxParams + 4)); bboxOps = NXZoneMalloc([self zone],maxOps + 2); NXReadArray(stream,"f",sizeParams + 4,bboxParams); NXReadArray(stream,"c",sizeOps + 2,bboxOps); return self; } - awake { [super awake]; ping = NO; bbox = bboxParams; params = &bboxParams[4]; ops = &bboxOps[2]; return self; } @end @implementation UPath(PrivateMethods) - growParams { maxParams *= 2; bbox = bboxParams = (float *)NXZoneRealloc([self zone], bboxParams,sizeof(float) * (maxParams + 4)); params = &bboxParams[4]; return self; } - growOps { maxOps *= 2; bboxOps = (char *)NXZoneRealloc([self zone], bboxOps,maxOps + 2); ops = &bboxOps[2]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.