142 NVx, NVy, PVx, PVy: hwFloat; |
142 NVx, NVy, PVx, PVy: hwFloat; |
143 x1, x2, y1, y2: LongInt; |
143 x1, x2, y1, y2: LongInt; |
144 tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat; |
144 tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat; |
145 X, Y: LongInt; |
145 X, Y: LongInt; |
146 begin |
146 begin |
147 if pa.Count >= cMaxEdgePoints-1 then exit; |
147 if pa.Count < cMaxEdgePoints - 2 then |
148 pi:= EndI; |
148 begin |
149 i:= StartI; |
149 pi:= EndI; |
150 ni:= Succ(StartI); |
|
151 {$HINTS OFF} |
|
152 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
|
153 {$HINTS ON} |
|
154 repeat |
|
155 inc(pi); |
|
156 if pi > EndI then |
|
157 pi:= StartI; |
|
158 inc(i); |
|
159 if i > EndI then |
|
160 i:= StartI; |
150 i:= StartI; |
161 inc(ni); |
151 ni:= Succ(StartI); |
162 if ni > EndI then |
152 {$HINTS OFF} |
163 ni:= StartI; |
153 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
164 PVx:= NVx; |
154 {$HINTS ON} |
165 PVy:= NVy; |
155 repeat |
166 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
156 i:= ni; |
167 |
157 inc(pi); |
168 x1:= opa.ar[pi].x; |
158 if pi > EndI then |
169 y1:= opa.ar[pi].y; |
159 pi:= StartI; |
170 x2:= opa.ar[i].x; |
160 inc(ni); |
171 y2:= opa.ar[i].y; |
161 if ni > EndI then |
172 cx1:= int2hwFloat(x1) - PVx; |
162 ni:= StartI; |
173 cy1:= int2hwFloat(y1) - PVy; |
163 PVx:= NVx; |
174 cx2:= int2hwFloat(x2) + NVx; |
164 PVy:= NVy; |
175 cy2:= int2hwFloat(y2) + NVy; |
165 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
176 t:= _0; |
166 |
177 while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do |
167 x1:= opa.ar[pi].x; |
178 begin |
168 y1:= opa.ar[pi].y; |
179 tsq:= t * t; |
169 x2:= opa.ar[i].x; |
180 tcb:= tsq * t; |
170 y2:= opa.ar[i].y; |
181 r1:= (_1 - t*3 + tsq*3 - tcb); |
171 |
182 r2:= ( t*3 - tsq*6 + tcb*3); |
172 cx1:= int2hwFloat(x1) - PVx; |
183 r3:= ( tsq*3 - tcb*3); |
173 cy1:= int2hwFloat(y1) - PVy; |
184 X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2); |
174 cx2:= int2hwFloat(x2) + NVx; |
185 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
175 cy2:= int2hwFloat(y2) + NVy; |
186 t:= t + Delta; |
176 t:= _0; |
187 pa.ar[pa.Count].x:= X; |
177 while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do |
188 pa.ar[pa.Count].y:= Y; |
178 begin |
189 inc(pa.Count); |
179 tsq:= t * t; |
190 //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
180 tcb:= tsq * t; |
|
181 r1:= (_1 - t*3 + tsq*3 - tcb); |
|
182 r2:= ( t*3 - tsq*6 + tcb*3); |
|
183 r3:= ( tsq*3 - tcb*3); |
|
184 X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2); |
|
185 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
|
186 t:= t + Delta; |
|
187 pa.ar[pa.Count].x:= X; |
|
188 pa.ar[pa.Count].y:= Y; |
|
189 inc(pa.Count); |
|
190 //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
|
191 end; |
|
192 until i = StartI; |
191 end; |
193 end; |
192 until i = StartI; |
194 |
193 pa.ar[pa.Count].x:= opa.ar[StartI].X; |
195 pa.ar[pa.Count].x:= opa.ar[StartI].X; |
194 pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
196 pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
195 inc(pa.Count) |
197 inc(pa.Count) |
196 end; |
198 end; |
197 |
199 |
198 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat); |
200 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat); |
199 var i, StartLoop: LongInt; |
201 var i, StartLoop: LongInt; |
200 opa: TPixAr; |
202 opa: TPixAr; |