#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tk.h>
#include <tkInt.h>
#ifndef CONST84
#define CONST84
#endif
static int SplineCurve _ANSI_ARGS_((Tk_Canvas canvas,
double *pointPtr, int numPoints, int numSteps,
XPoint xPoints[], double dblPoints[]));
static void SplineCurvePostscript _ANSI_ARGS_((Tcl_Interp *interp,
Tk_Canvas canvas, double *pointPtr,
int numPoints, int numSteps));
#if TARGET_OS_MAC
# pragma export on
int Tkspline_Init( Tcl_Interp *interp );
int Tkspline_SafeInit( Tcl_Interp *interp );
# pragma export reset
# define VERSION "0.4"
#endif
int Tkspline_Init _ANSI_ARGS_((Tcl_Interp *interp));
int Tkspline_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));
static Tk_SmoothMethod splineSmoothMethod = {
"spline",
SplineCurve,
SplineCurvePostscript,
};
static int
SplineCurve(canvas, pointPtr, numPoints, numSteps, xPoints, dblPoints)
Tk_Canvas canvas;
double *pointPtr;
int numPoints;
int numSteps;
XPoint xPoints[];
double dblPoints[];
{
int outputPoints, i;
if ((numPoints < 4) || (numPoints % 3 != 1)) {
return TkMakeBezierCurve(canvas, pointPtr, numPoints, numSteps,
xPoints, dblPoints);
}
if (!pointPtr) {
return (1 + (numPoints/3)*numSteps);
}
outputPoints = 0;
if (xPoints != NULL) {
Tk_CanvasDrawableCoords(canvas, pointPtr[0], pointPtr[1],
&xPoints->x, &xPoints->y);
xPoints += 1;
}
if (dblPoints != NULL) {
dblPoints[0] = pointPtr[0];
dblPoints[1] = pointPtr[1];
dblPoints += 2;
}
outputPoints += 1;
for (i = 2; i < numPoints; i += 3, pointPtr += 6) {
if (xPoints != NULL) {
TkBezierScreenPoints(canvas, pointPtr, numSteps, xPoints);
xPoints += numSteps;
}
if (dblPoints != NULL) {
TkBezierPoints(pointPtr, numSteps, dblPoints);
dblPoints += 2*numSteps;
}
outputPoints += numSteps;
}
return outputPoints;
}
static void
SplineCurvePostscript(interp, canvas, pointPtr, numPoints, numSteps)
Tcl_Interp *interp;
Tk_Canvas canvas;
double *pointPtr;
int numPoints;
#if (TK_MAJOR_VERSION < 8) || ((TK_MAJOR_VERSION == 8) && (TK_MAJOR_VERSION < 3))
int numSteps;
#endif
{
int i;
char buffer[200];
if ((numPoints < 4) || (numPoints % 3 != 1)) {
#if (TK_MAJOR_VERSION < 8) || ((TK_MAJOR_VERSION == 8) && (TK_MAJOR_VERSION < 3))
TkMakeBezierPostscript(interp, canvas, pointPtr, numPoints, numSteps);
#else
TkMakeBezierPostscript(interp, canvas, pointPtr, numPoints);
#endif
return;
}
sprintf(buffer, "%.15g %.15g moveto\n",
pointPtr[0], Tk_CanvasPsY(canvas, pointPtr[1]));
Tcl_AppendResult(interp, buffer, (char *) NULL);
for (i = numPoints-2, pointPtr += 2; i > 0; i -= 3, pointPtr += 6) {
sprintf(buffer, "%.15g %.15g %.15g %.15g %.15g %.15g curveto\n",
pointPtr[0], Tk_CanvasPsY(canvas, pointPtr[1]),
pointPtr[2], Tk_CanvasPsY(canvas, pointPtr[3]),
pointPtr[4], Tk_CanvasPsY(canvas, pointPtr[5]));
Tcl_AppendResult(interp, buffer, (char *) NULL);
}
}
int Tkspline_Init(interp)
Tcl_Interp *interp;
{
#ifdef USE_TCL_STUBS
if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) {
return TCL_ERROR;
}
if (Tk_InitStubs(interp, TK_VERSION, 0) == NULL) {
return TCL_ERROR;
}
#else
if (Tcl_PkgRequire(interp, "Tcl", TCL_VERSION, 0) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_PkgRequire(interp, "Tk", TK_VERSION, 0) != TCL_OK) {
return TCL_ERROR;
}
#endif
Tk_CreateSmoothMethod(interp, &splineSmoothMethod);
return Tcl_PkgProvide(interp, "Tkspline", VERSION);
}
int Tkspline_SafeInit(Tcl_Interp * interp)
{
return Tkspline_Init(interp);
}