--- a/hedgewars/uLandOutline.pas Mon Nov 10 13:54:57 2014 -0500
+++ b/hedgewars/uLandOutline.pas Mon Nov 10 21:57:44 2014 +0300
@@ -144,55 +144,57 @@
tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
X, Y: LongInt;
begin
-if pa.Count >= cMaxEdgePoints-1 then exit;
-pi:= EndI;
-i:= StartI;
-ni:= Succ(StartI);
-{$HINTS OFF}
-Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
-{$HINTS ON}
-repeat
- inc(pi);
- if pi > EndI then
- pi:= StartI;
- inc(i);
- if i > EndI then
+ if pa.Count < cMaxEdgePoints - 2 then
+ begin
+ pi:= EndI;
i:= StartI;
- inc(ni);
- if ni > EndI then
- ni:= StartI;
- PVx:= NVx;
- PVy:= NVy;
- Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
+ ni:= Succ(StartI);
+ {$HINTS OFF}
+ Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
+ {$HINTS ON}
+ repeat
+ i:= ni;
+ inc(pi);
+ if pi > EndI then
+ pi:= StartI;
+ inc(ni);
+ if ni > EndI then
+ ni:= StartI;
+ PVx:= NVx;
+ PVy:= NVy;
+ Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
+
+ x1:= opa.ar[pi].x;
+ y1:= opa.ar[pi].y;
+ x2:= opa.ar[i].x;
+ y2:= opa.ar[i].y;
- x1:= opa.ar[pi].x;
- y1:= opa.ar[pi].y;
- x2:= opa.ar[i].x;
- y2:= opa.ar[i].y;
- cx1:= int2hwFloat(x1) - PVx;
- cy1:= int2hwFloat(y1) - PVy;
- cx2:= int2hwFloat(x2) + NVx;
- cy2:= int2hwFloat(y2) + NVy;
- t:= _0;
- while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
- begin
- tsq:= t * t;
- tcb:= tsq * t;
- r1:= (_1 - t*3 + tsq*3 - tcb);
- r2:= ( t*3 - tsq*6 + tcb*3);
- r3:= ( tsq*3 - tcb*3);
- X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
- Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
- t:= t + Delta;
- pa.ar[pa.Count].x:= X;
- pa.ar[pa.Count].y:= Y;
- inc(pa.Count);
- //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
+ cx1:= int2hwFloat(x1) - PVx;
+ cy1:= int2hwFloat(y1) - PVy;
+ cx2:= int2hwFloat(x2) + NVx;
+ cy2:= int2hwFloat(y2) + NVy;
+ t:= _0;
+ while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
+ begin
+ tsq:= t * t;
+ tcb:= tsq * t;
+ r1:= (_1 - t*3 + tsq*3 - tcb);
+ r2:= ( t*3 - tsq*6 + tcb*3);
+ r3:= ( tsq*3 - tcb*3);
+ X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
+ Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
+ t:= t + Delta;
+ pa.ar[pa.Count].x:= X;
+ pa.ar[pa.Count].y:= Y;
+ inc(pa.Count);
+ //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
+ end;
+ until i = StartI;
end;
-until i = StartI;
-pa.ar[pa.Count].x:= opa.ar[StartI].X;
-pa.ar[pa.Count].y:= opa.ar[StartI].Y;
-inc(pa.Count)
+
+ pa.ar[pa.Count].x:= opa.ar[StartI].X;
+ pa.ar[pa.Count].y:= opa.ar[StartI].Y;
+ inc(pa.Count)
end;
procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);