Hi Francois,

François Chaplais-3 wrote

I used these 3 different Bezier drawing handlers in this stack:

http://andregarzia.on-rev.com/alejandro/stacks/Eps_Import_V04.zipOne handler is based in Don Lancaster's code,

other handler uses Matrices and another

handler uses the very first code that

I published many, many years ago...

Could you guess which is faster? :-)

Although I have not looked in detail, the stack

SVGL must have different handlers to draw

Quadratic and Bezier curves.

http://revonline2.runrev.com/stack/112/SVGLNOTE:

global varBezierSegment contains

a series of coordinates points

that draw the graphic on the card.

for example:

145,234

146,236

148,239

149,241

150,244

etc...

global variables named a,b,c,d

contains four coordinates points

of the bezier segment

for example:

A segment of an Adobe illustrator file:

96 62 m

96 69 101 1555 107 1555 C

a = 96,62

b = 96,69

c = 101,1555

d = 107,1555

The field named fld "BezierResolution" and

the variable named "cde" should contain

a number from 16 to 800.

This is the number of rectilinear segments

in a bezier segment...

on bezier1

global varBezierSegment,a,b,c,d

put the first item of a into x1

put the first item of d into x2

put the first item of b into xa

put the first item of c into xb

put the second item of a into y1

put the second item of d into y2

put the second item of b into ya

put the second item of c into yb

put 0 into v1

if there is a fld "BezierResolution" then put fld "BezierResolution" into cde

if cde is not a number then put "32" into cde

Repeat with i = 1 to cde -- a number from 16 to 800

put i * ( 1 / cde ) into v1

put 1 - v1 into v2

put (x1 * (v2 ^ 3) + (3 * xa * v1 * v2 * v2) + (3 * xb * v1 * v1 * v2) + (x2 * (v1 ^ 3))) into x

put (y1 * (v2 ^ 3) + (3 * ya * v1 * v2 * v2) + (3 * yb * v1 * v1 * v2) + (y2 * (v1 ^ 3))) into y

if varBezierSegment is not empty then put last line of varBezierSegment into varTemp

if x div 1,y div 1 <> varTemp then put x div 1,y div 1 & return after varBezierSegment

end repeat

end bezier1

----------------------------------------------------------------

on bezier2

/* this is the custom property bm1

1,1 -1

1,2 3

1,3 -3

1,4 1

2,1 3

2,2 -6

2,3 3

2,4 0

3,1 -3

3,2 3

3,3 0

3,4 0

4,1 1

4,2 0

4,3 0

4,4 0

*/

/* this is the custom property bm2

[p0]

[p1]

[p2]

[p3]

1,1 0

1,2 0

1,3 0

1,4 0

*/

/* this is the custom property bm3

1,1 0

2,1 0

3,1 0

4,1 0

*/

global varBezierSegment,a,b,c,d

put the first item of a into x1

put the second item of a into y1

put the first item of b into xa

put the second item of b into ya

put the first item of c into xb

put the second item of c into yb

put the first item of d into x2

put the second item of d into y2

put 0 into v1

put the bm1 of me into qwe12

split qwe12 by return and space

put the bm2 of me into qwy12

put the bm2 of me into qwx12

put x2 into word 2 of line 1 of qwx12

put xb into word 2 of line 2 of qwx12

put xa into word 2 of line 3 of qwx12

put x1 into word 2 of line 4 of qwx12

put y2 into word 2 of line 1 of qwy12

put yb into word 2 of line 2 of qwy12

put ya into word 2 of line 3 of qwy12

put y1 into word 2 of line 4 of qwy12

split qwx12 by return and space

split qwy12 by return and space

if there is a fld "BezierResolution" then put fld "BezierResolution" into cde

if cde is not a number then put "32" into cde

Repeat with i = 1 TO cde

put i * (1/cde) into v1

put 1 - v1 into v2

put the bm3 of me into qws12

put v2^3 into word 2 of line 1 of qws12

put v2^2 into word 2 of line 2 of qws12

put v2 into word 2 of line 3 of qws12

put 1 into word 2 of line 4 of qws12

split qws12 by return and space

put matrixMultiply(qwe12,qws12) into qwz12

put matrixMultiply(qwx12,qwz12) into pX

put matrixMultiply(qwy12,qwz12) into pY

combine pX using space

combine pY using space

if varBezierSegment is not empty then put last line of varBezierSegment into varTemp

if pX div 1,pY div 1 <> varTemp then put pX div 1,pY div 1 & return after varBezierSegment

end repeat

end bezier2

----------------------------------------------------------------

on bezier3

global varBezierSegment,a,b,c,d

put the first item of a into x3

put the second item of a into y3

put the first item of b into x2

put the second item of b into y2

put the first item of c into x1

put the second item of c into y1

put the first item of d into x0

put the second item of d into y0

put 0 into v1

put (x3 - 3 * x2 + 3 * x1 - x0) into A

put (3 * x2 - 6 * x1 + 3 * x0) into B

put (3 * x1 - 3 * x0) into C

put (x0) into D

put (y3 - 3 * y2 + 3 * y1 - y0) into E

put (3*y2 - 6 * y1 + 3 * y0) into F

put (3 * y1 - 3 * y0) into G

put (y0) into H

if there is a fld "BezierResolution" then put fld "BezierResolution" into cde

if cde is not a number then put "32" into cde

Repeat with i = 1 to cde -- a number from 16 to 800

put i * ( 1 / cde ) into v1

put 1 - v1 into t

put ((((A * t) + B)* t) + C) * t + D into x

put ((((E* t) + F)* t) + G) * t + H into y

if varBezierSegment is not empty then put last line of varBezierSegment into varTemp

if x div 1,y div 1 <> varTemp then put x div 1,y div 1 & return after varBezierSegment

end repeat

end bezier3

Have a nice weekend!

Al