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