20 #include "allheaders.h"
28 #include "config_auto.h"
31 #define QSPLINE_PRECISION 16 //no of steps to draw
47 xcoords =
new int32_t[
count + 1];
50 for (index = 0; index < segments; index++) {
52 xcoords[index] = xstarts[index];
54 coeffs[index * 3 + 1],
55 coeffs[index * 3 + 2]);
58 xcoords[index] = xstarts[index];
72 int ypts[],
int pointcount,
81 xcoords =
new int32_t[segcount + 1];
82 ptcounts =
new int32_t[segcount + 1];
84 memmove (xcoords, xstarts, (segcount + 1) *
sizeof (int32_t));
86 for (segment = 0, pointindex = 0; pointindex < pointcount; pointindex++) {
87 while (segment < segcount && xpts[pointindex] >= xstarts[segment]) {
90 ptcounts[segment] = ptcounts[segment - 1];
94 while (segment < segcount) {
97 ptcounts[segment] = ptcounts[segment - 1];
100 for (segment = 0; segment < segcount; segment++) {
103 pointindex = ptcounts[segment];
105 && xpts[pointindex] != xpts[pointindex - 1]
106 && xpts[pointindex] != xstarts[segment])
107 qlsq.
add (xstarts[segment],
109 + (ypts[pointindex] - ypts[pointindex - 1])
110 * (xstarts[segment] - xpts[pointindex - 1])
111 / (xpts[pointindex] - xpts[pointindex - 1]));
112 for (; pointindex < ptcounts[segment + 1]; pointindex++) {
113 qlsq.
add (xpts[pointindex], ypts[pointindex]);
115 if (pointindex > 0 && pointindex < pointcount
116 && xpts[pointindex] != xstarts[segment + 1])
117 qlsq.
add (xstarts[segment + 1],
119 + (ypts[pointindex] - ypts[pointindex - 1])
120 * (xstarts[segment + 1] - xpts[pointindex - 1])
121 / (xpts[pointindex] - xpts[pointindex - 1]));
123 quadratics[segment].
a = qlsq.
get_a ();
124 quadratics[segment].
b = qlsq.
get_b ();
125 quadratics[segment].
c = qlsq.
get_c ();
141 quadratics =
nullptr;
169 segments = source.segments;
170 xcoords =
new int32_t[segments + 1];
172 memmove (xcoords, source.xcoords, (segments + 1) * sizeof (int32_t));
173 memmove (quadratics, source.quadratics, segments * sizeof (
QUAD_COEFFS));
190 index1 = spline_index (x1);
191 index2 = spline_index (x2);
193 while (index1 < index2) {
195 static_cast<double>(quadratics[index1 + 1].
y (static_cast<float>(xcoords[index1 + 1])));
196 total -= static_cast<double>(quadratics[index1].
y (static_cast<float>(xcoords[index1 + 1])));
214 index = spline_index (x);
215 return quadratics[index].
y (x);
225 int32_t QSPLINE::spline_index(
234 while (top - bottom > 1) {
235 index = (top + bottom) / 2;
236 if (x >= xcoords[index])
255 int16_t x_shift = vec.
x ();
257 for (segment = 0; segment < segments; segment++) {
258 xcoords[segment] += x_shift;
259 quadratics[segment].
move (vec);
261 xcoords[segment] += x_shift;
276 int leftlimit = xcoords[1];
277 int rightlimit = xcoords[segments - 1];
279 return !(spline2->segments < 3 || spline2->xcoords[1] > leftlimit + fraction * (rightlimit - leftlimit) ||
280 spline2->xcoords[spline2->segments - 1] < rightlimit - fraction * (rightlimit - leftlimit));
302 increment = xmin < xcoords[0] ? 1 : 0;
303 if (xmax > xcoords[segments])
307 xstarts =
new int32_t[segments + 1 + increment];
309 if (xmin < xcoords[0]) {
312 quads[0].
b = gradient;
313 quads[0].
c =
y (xcoords[0]) - quads[0].
b * xcoords[0];
318 for (segment = 0; segment < segments; segment++) {
319 xstarts[dest_segment] = xcoords[segment];
320 quads[dest_segment] = quadratics[segment];
323 xstarts[dest_segment] = xcoords[segment];
324 if (xmax > xcoords[segments]) {
325 quads[dest_segment].
a = 0;
326 quads[dest_segment].
b = gradient;
327 quads[dest_segment].
c =
y (xcoords[segments])
328 - quads[dest_segment].
b * xcoords[segments];
330 xstarts[dest_segment] = xmax + 1;
332 segments = dest_segment;
346 #ifndef GRAPHICS_DISABLED
357 for (segment = 0; segment < segments; segment++) {
359 static_cast<double>(xcoords[segment + 1] -
361 x = xcoords[segment];
363 if (segment == 0 &&
step == 0)
364 window->
SetCursor(x, quadratics[segment].
y (x));
366 window->
DrawTo(x, quadratics[segment].
y (x));
374 if (pix ==
nullptr) {
382 auto height = static_cast<double>(pixGetHeight(pix));
384 const int kLineWidth = 5;
386 for (segment = 0; segment < segments; segment++) {
387 increment = static_cast<double>((xcoords[segment + 1] -
389 x = xcoords[segment];
391 double y = height - quadratics[segment].
y(x);
392 ptaAddPt(points, x,
y);
397 switch (pixGetDepth(pix)) {
399 pixRenderPolyline(pix, points, kLineWidth, L_SET_PIXELS, 1);
402 pixRenderPolylineArb(pix, points, kLineWidth, 255, 0, 0, 1);
405 pixRenderPolyline(pix, points, kLineWidth, L_CLEAR_PIXELS, 1);