#include #include #include "curves.h" #define POLYBEGIN 160 #define POLYEND 161 #define POLYIGNORE 163 #define POLYSMOOTH 164 #define PICPOLYCLO 165 #define kPolyClose 4 #define kPolyFill 2 #define kPolyFrame 1 void AddSegmentToPict( curve* cur, point* delta, int isLine ) { Handle verbHdl = NewHandle( 1 ); RgnHandle origClip = NewRgn(); Rect emptyRect = { 0, 0, 0, 0 }; **verbHdl = kPolyFrame; GetClip( origClip ); PicComment( POLYBEGIN, 0, 0 ); ClipRect(&emptyRect); /* this turns drawing off */ PicComment( POLYSMOOTH, 2, verbHdl ); /* * Record the endpoints for Postscript */ fmoveto( cur->start.x + delta->x, cur->start.y + delta->y ); if (isLine) flineto( cur->end.x + delta->x, cur->end.y + delta->y ); else flineto( cur->control.x + delta->x, cur->control.y + delta->y ); flineto( cur->end.x + delta->x, cur->end.y + delta->y ); PicComment( POLYIGNORE, 0, 0 ); SetClip( origClip ); /* this turns drawing back on */ /* * Record the lines for QuickDraw */ fmoveto( cur->start.x, cur->start.y ); if (isLine) flineto( cur->end.x, cur->end.y ); else FrameCurve(cur, kCurveLimit); PicComment( POLYEND, 0, 0 ); DisposeRgn( origClip ); DisposHandle( verbHdl ); } AddPathsToPict( paths* myPaths ) { point penDelta; long i; path* cont; /* Compute 1/2 the pen's thickness as a delta, * since PostScript's pen is centered, and QuickDraw's hangs to the * right and down. */ penDelta.x = ff(qd.thePort->pnSize.h) / 2; penDelta.y = ff(qd.thePort->pnSize.v) / 2; /* Record the curve data. */ cont = myPaths->contour; for (i = 0; i < myPaths->contours; i++) { pathWalker walker; /* * This loop looks just like FramePath */ InitPathWalker(&walker, cont); while (NextPathSegment(&walker)) AddSegmentToPict(&walker.c, &penDelta, walker.isLine); cont = NextPath(cont); } }