Revert "Introduced libspiro-js into Iosevka."

This reverts commit 14acdd1f1e.
This commit is contained in:
be5invis 2015-08-17 08:01:37 +08:00
parent 14acdd1f1e
commit 5230201464
7 changed files with 107 additions and 284 deletions

View file

@ -2,45 +2,6 @@ define Glyph [require './support/glyph'].Glyph
define Stroke [require './support/stroke'].Stroke
define tp [require './support/transform'].transformPoint
define inverse [require './support/transform'].inverse
define unspiro : let [s2b [require 'libspiro-js'].spiroToBezierOnContext] : function [c closed pts] [s2b pts closed c]
### Spiro functions
define [PREPARE f] (.type 'prepare' .af f)
define [CLOSE f] (.type 'close' .af f)
define [SETWIDTH l r] : function [] : this.set-width l r
define [HEADS d] : function [] : this.heads-to d
define [WIDTHHEADS l r d] : function [] : begin [this.set-width l r] [this.heads-to d]
define [SAMPLES n] : lambda [] : this.set-samples n
define [VIRTUAL] : this.points.[this.points.length - 1].subdivided = true
define [reverse a] : a.reverse
define [flatpts pts] : begin {
local ans ()
foreach p [items-of pts] : piecewise {
[p <@ Array] : set ans : ans.concat [flatpts p]
true : ans.push p
}
return ans
}
define [spiro pts] : begin {
local s : new Stroke
local points : ().slice.call arguments 0
local closed false
local lastaf null
if [points.0 && points.0.type === 'prepare'] : begin {
points.0.af.call s
set points : points.slice 1
}
if [points.[points.length - 1] && points.[points.length - 1].type === 'close'] : begin {
set lastaf points.[points.length - 1].af
set points : points.slice 0 [-1]
set closed true
}
unspiro s closed [flatpts points]
if lastaf : lastaf.call s
s.set-samples 2
return s
}
### COMMON FUNCTIONS
@ -116,43 +77,6 @@ define [buildFont para recursive] : begin {
define globalTransform : Italify para.italicAngle
define ITALICCOR : 1 / [Math.sqrt [1 - globalTransform.yx * globalTransform.yx]]
define [G4 _x _y f] : begin {
local (.x x .y y) : tp globalTransform (.x _x .y _y)
return (.x x .y y .type 'g4' .af f)
}
define [G2 _x _y f] : begin {
local (.x x .y y) : tp globalTransform (.x _x .y _y)
return (.x x .y y .type 'g2' .af f)
}
define [LEFT _x _y f] : begin {
local (.x x .y y) : tp globalTransform (.x _x .y _y)
return (.x x .y y .type 'left' .af f)
}
define [RIGHT _x _y f] : begin {
local (.x x .y y) : tp globalTransform (.x _x .y _y)
return (.x x .y y .type 'right' .af f)
}
define [CAP_RTL x y _radius f] : begin {
local radius : fallback _radius [RIGHTSB - SB - STROKE]
local shift : radius * [1 - [Math.cos : Math.asin [0.25 / radius]]]
return : list {
G4 [x + 0.25] [y - shift] VIRTUAL
G4 x y f
G4 [x - 0.25] [y - shift] VIRTUAL
}
}
define [CAP_LTR x y r f] : [CAP_RTL x y r f].reverse
define [CUP_RTL x y _radius f] : begin {
local radius : fallback _radius [RIGHTSB - SB - STROKE]
local shift : radius * [1 - [Math.cos : Math.asin [0.25 / radius]]]
return : list {
G4 [x + 0.25] [y + shift] VIRTUAL
G4 x y f
G4 [x - 0.25] [y + shift] VIRTUAL
}
}
define [CUP_LTR x y r f] : [CUP_RTL x y r f].reverse
define UPWARD (.x [-ITALICCOR] .y 0)
define DOWNWARD (.x ITALICCOR .y 0)
define RIGHTWARD (.x globalTransform.yx .y 1)
@ -340,7 +264,7 @@ define [buildFont para recursive] : begin {
define [create-glyph name actions] : piecewise {
[name && actions] : begin {
if [pickHash && [not pickHash.(name)]] : return nothing
# process.stderr.write : "Building /" + name + [if recursive " (recursive)" ""] + " for " + para.family + ' ' + para.style + "\n"
process.stderr.write : "Building /" + name + [if recursive " (recursive)" ""] + " for " + para.family + ' ' + para.style + "\n"
set dependencyProfile`name ()
define glyphObject [new Glyph name]
glyphObject.set-width WIDTH

View file

@ -213,36 +213,6 @@ define [EHookLower bottom smooth hook _middle _stroke _o] : XSHookLower bottom [
define [CHookLower bottom smooth hook _middle _stroke _o] : XSHookLower bottom [RIGHTSB + TAILADJX * globalTransform.yx] _middle [SB + [fallback _o O]] smooth [hook - TAILADJY * globalTransform.yx] _stroke
define [RevEHookLower bottom smooth hook _middle _stroke _o] : XSHookLower bottom SB _middle [RIGHTSB - [fallback _o O]] smooth hook _stroke
define [SpiroGeneralHookUpper conn free smooth y hook connectType fconn ffree tension refsmooth] : begin {
set tension : fallback tension 0
set refsmooth : fallback refsmooth smooth
local dist : free - conn
local radius : dist * dist / [[2.6 + tension] * refsmooth]
return : flatpts : list {
G4 free [y - hook] ffree
[if [free > conn] CAP_RTL CAP_LTR] [[mix conn free SBALANCE] - OMIDCOR_S] y radius
[fallback connectType G4] conn [y - smooth] fconn
}
}
define [SpiroGeneralHookLower conn free smooth y hook connectType fconn ffree tension refsmooth] : begin {
set tension : fallback tension 0
set refsmooth : fallback refsmooth smooth
local dist : free - conn
local radius : dist * dist / [[2.6 + tension] * refsmooth]
return : flatpts : list {
G4 free [y + hook] ffree
[if [free > conn] CUP_RTL CUP_LTR] [[mix conn free SBALANCE] - OMIDCOR_S] y radius
[fallback connectType G4] conn [y + smooth] fconn
}
}
define [SpiroCHookUpper l r y connectType s] : begin {
return : SpiroGeneralHookUpper [l + O] r SMALLSMOOTHA [y - O] HOOK connectType nothing nothing 0 SMALLSMOOTH
}
define [SpiroCHookLower l r y connectType s] : list {
return : reverse : SpiroGeneralHookLower [l + O] r SMALLSMOOTHB [y + O] HOOK connectType nothing nothing 0 SMALLSMOOTH
}
define [smallo u d l r _width _sma _smb] : glyph-construction {
local middle : [l + r] / 2
local width : fallback _width STROKE
@ -251,50 +221,31 @@ define [smallo u d l r _width _sma _smb] : glyph-construction {
local mc : OMIDCOR * width
if [u - d > sma + smb] {
then : begin {
include : spiro {
G4 [middle - mc] [u - O] [SETWIDTH width 0]
LEFT [l + O] [u - sma]
RIGHT [l + O] [d + smb]
G4 [middle + mc] [d + O]
LEFT [r - O] [d + sma]
RIGHT [r - O] [u - smb]
CLOSE [SAMPLES 2]
}
include : create-stroke
:.set-transform globalTransform
:.start-from [middle - mc] [u - O]
:.set-width width 0
:.arc-hv-to [l + O] [u - sma]
:.line-to [l + O] [d + smb]
:.arc-vh-to [middle + mc] [d + O]
:.arc-hv-to [r - O] [d + sma]
:.line-to [r - O] [u - smb]
:.arc-vh-to [middle - mc] [u - O]
}
else : begin {
local ymiddlea : mix d u [smb / [sma + smb]]
local ymiddleb : mix d u [sma / [sma + smb]]
include : spiro {
G4 [middle - mc] [u - O] [SETWIDTH width 0]
G4 [l + O] ymiddlea
G4 [middle + mc] [d + O]
G4 [r - O] ymiddleb
CLOSE [SAMPLES 2]
}
include : create-stroke
:.set-transform globalTransform
:.start-from [middle - mc] [u - O]
:.set-width width 0
:.arc-hv-to [l + O] ymiddlea
:.arc-vh-to [middle + mc] [d + O]
:.arc-hv-to [r - O] ymiddleb
:.arc-vh-to [middle - mc] [u - O]
}
}
}
define [SmalloAlt u d l r _width _sma _smb] : glyph-construction {
local middle : [l + r] / 2
local width : fallback _width STROKE
local sma : fallback _sma SMALLSMOOTHA
local smb : fallback _smb SMALLSMOOTHB
local mc : OMIDCOR * width
local rho 0.77
local ymiddlea : mix d u [smb / [sma + smb]]
local ymiddleb : mix d u [sma / [sma + smb]]
include : spiro {
G4 [middle - mc] [u - O] [SETWIDTH width 0]
G4 [mix middle l rho] [mix ymiddlea u rho]
G4 [l + O] ymiddlea
G4 [mix middle l rho] [mix ymiddlea d rho]
G4 [middle + mc] [d + O]
G4 [mix middle r rho] [mix ymiddleb d rho]
G4 [r - O] ymiddleb
G4 [mix middle r rho] [mix ymiddleb u rho]
CLOSE [SAMPLES 2]
}
}
define [HBar xleft xright y _fine] : glyph-construction {
local fine : [fallback _fine STROKE] / 2

View file

@ -77,7 +77,7 @@ create-glyph 'g' : glyph-construction {
assign-unicode 'g'
include pMarks
include : SmalloAlt XH [XH * GBARPOS] SB [RIGHTSB - 0.3 * SB]
include : smallo XH [XH * GBARPOS - O] SB [RIGHTSB - 0.3 * SB]
local gleftx [SB * 0.8 + O]
local grightx [RIGHTSB + SB * 0.1 - O]
@ -106,29 +106,27 @@ create-glyph 'c' : glyph-construction {
set-width WIDTH
assign-unicode 'c'
include eMarks
include : spiro {
PREPARE [SETWIDTH STROKE 0]
SpiroCHookUpper SB RIGHTSB XH LEFT
SpiroCHookLower SB RIGHTSB 0 RIGHT
}
# include : CHookLower 0 SMALLSMOOTHB HOOK
# include : CHookUpper XH SMALLSMOOTHA HOOK
# include : create-stroke
# :.start-from [SB + O] [XH - SMALLSMOOTHA] :.set-width STROKE 0
# :.line-to [SB + O] SMALLSMOOTHB
include : CHookLower 0 SMALLSMOOTHB HOOK
include : CHookUpper XH SMALLSMOOTHA HOOK
include : create-stroke
:.start-from [SB + O] [XH - SMALLSMOOTHA] :.set-width STROKE 0
:.line-to [SB + O] SMALLSMOOTHB
}
define [SmallEShape top stroke barpos] : glyph-construction {
local barbottom [top * [fallback barpos EBARPOS]]
local hookx [RIGHTSB - OXHOOK + TAILADJX * globalTransform.yx]
local hookmiddle : [mix [SB + O] hookx 0.55] + OMIDCOR_S
include : spiro {
LEFT [RIGHTSB - O] barbottom [WIDTHHEADS stroke 0 UPWARD]
RIGHT [RIGHTSB - O] [top - SMALLSMOOTHB]
G4 [MIDDLE - OMIDCOR_S] [top - O]
LEFT [SB + O] [top - SMALLSMOOTHA]
SpiroCHookLower SB RIGHTSB 0 RIGHT
}
include : create-stroke
:.start-from [RIGHTSB - O] barbottom
:.heads-to UPWARD
:.set-width stroke 0
:.line-to [RIGHTSB - O] [top - SMALLSMOOTHB]
:.arc-vh-to MIDDLE [top - O]
:.arc-hv-to [SB + O] [top - SMALLSMOOTHA]
:.line-to [SB + O] SMALLSMOOTHB
include : EHookLower 0 SMALLSMOOTHB SHOOK [mix SB RIGHTSB SBALANCE] stroke
include : create-stroke
:.start-from [SB + [stroke / 2]] barbottom
:.set-width stroke 0
@ -173,14 +171,14 @@ define [SmallTShape top bot] : glyph-construction {
local hookx [center + [WIDTH - SB * 2] * 0.78 - OXHOOK + TAILADJX * globalTransform.yx]
local turn : mix center hookx [0.5 + globalTransform.yx * 0.5]
local smb : [turn - center] * 1.1
local rho 0.77
include : spiro {
LEFT center top [WIDTHHEADS STROKE 0 DOWNWARD]
RIGHT center [bot + smb]
CUP_LTR turn [bot + O] [[hookx - center] * 0.6]
G2 hookx [bot + HOOK - TAILADJY * globalTransform.yx]
}
include : create-stroke
:.start-from center top
:.set-width STROKE 0
:.heads-to DOWNWARD
:.line-to center [bot + smb]
:.arc-vh-to turn [bot + O]
:.curve-to [turn + [KAPPA_HOOK + TAILADJKAPPA * globalTransform.yx + 0.1] * [hookx - turn]] [bot + O] hookx [bot + HOOK - TAILADJY * globalTransform.yx]
include : HBarTop [center + HALFSTROKE - LONGJUT + TBALANCE2] [center + HALFSTROKE + LONGJUT + TBALANCE2] [top * XH / CAP]
}
@ -285,24 +283,22 @@ create-glyph 'm' : glyph-construction {
local m2 : m1 + [MIDDLE - sw / 2 - SB]
include : create-stroke
:.start-from [MIDDLE - sw / 2] 0
:.set-width 0 sw
:.heads-to UPWARD
:.set-width 0 sw :.heads-to UPWARD
:.line-to [MIDDLE - sw / 2] [XH - SMALLSMOOTHA]
:.arc-vh-to m1 [XO - STROKE]
:.set-width 0 STROKE
:.heads-to LEFTWARD
:.arc-hv-to [SB + sw * 0.75 * ITALICCOR] [XH - SMALLSMOOTHA]
:.arc-hv-to [SB + sw * 0.75] [XH - SMALLSMOOTHA]
:.heads-to DOWNWARD
:.set-width 0 [sw * 0.4]
include : create-stroke
:.start-from [RIGHTSB - sw - O] 0
:.set-width 0 sw
:.heads-to UPWARD
:.set-width 0 sw :.heads-to UPWARD
:.line-to [RIGHTSB - sw - O] [XH - SMALLSMOOTHA]
:.arc-vh-to m2 [XO - STROKE]
:.set-width 0 STROKE
:.heads-to LEFTWARD
:.arc-hv-to [MIDDLE + sw * 0.25 * ITALICCOR] [XH - SMALLSMOOTHA]
:.arc-hv-to [MIDDLE + sw * 0.25] [XH - SMALLSMOOTHA]
:.heads-to DOWNWARD
:.set-width 0 [sw * 0.4]
include : create-stroke

View file

@ -21,7 +21,6 @@ font.removeOverlap()
font.addExtrema()
font.simplify(2)
font.layers["Fore"].is_quadratic = False
font.addExtrema()
font.simplify(6, ("smoothcurves", "removesingletonpoints", "setstarttoextremum"), 0.2)
font.canonicalContours()
font.canonicalStart()

View file

@ -7,8 +7,7 @@ font = fontforge.open(source)
font.selection.all()
font.removeOverlap()
font.em = 1000
font.addExtrema()
font.simplify(0.1)
font.simplify(1)
font.canonicalContours()
font.canonicalStart()
font.generate(sys.argv[2], flags = ("short-post", "opentype"))

View file

@ -6,7 +6,11 @@ define utp [require './transform'].untransform
define [fallback] : for [local j 0] [j < arguments.length] [inc j] : if [arguments`j !== nothing] : return arguments`j
define [xs-array a] ([a.0 - 1] :: [a.concat ([a`[a.length - 1] + 1])])
define [xs-array low high] : begin {
local a ()
for [local j [low - 1]] [j <= high] [inc j] : a.push j
return a
}
define [ys-array a] (a.0 :: [a.concat (a`[a.length - 1])])
define SAMPLES 3
@ -29,8 +33,6 @@ define [Stroke] : begin {
.x 0
.y 0
)
this.defaultD1 = 0
this.defaultD2 = 0
return this
}
define Stroke.is : object {
@ -49,16 +51,8 @@ define [Stroke.bindParameters para] : begin {
}
define [Stroke.prototype.set-width d1 d2] : begin {
local point this.points`[this.points.length - 1]
if point {
then {
point.d1 = d1
point.d2 = d2
}
else {
this.defaultD1 = d1
this.defaultD2 = d2
}
}
point.d1 = d1
point.d2 = d2
return this
}
define [Stroke.prototype.heads-to x y] : begin {
@ -75,28 +69,18 @@ define [Stroke.prototype.start-from x y] : begin {
this.points = ([tp this.gizmo (.x x .y y .onCurve true)])
return this
}
define Stroke.prototype.moveTo Stroke.prototype.start-from
define [Stroke.prototype.line-to x y subdivided] : begin {
this.points.push [tp this.gizmo (.x x .y y .onCurve true .subdivided subdivided)]
define [Stroke.prototype.line-to x y] : begin {
this.points.push [tp this.gizmo (.x x .y y .onCurve true)]
return this
}
define Stroke.prototype.lineTo Stroke.prototype.line-to
define [Stroke.prototype.curve-to xc yc x y subdivided] : begin {
this.points.push {
tp this.gizmo (.x xc .y yc .onCurve false)
tp this.gizmo (.x x .y y .onCurve true .subdivided subdivided)
}
define [Stroke.prototype.curve-to xc yc x y] : begin {
this.points.push [tp this.gizmo (.x xc .y yc .onCurve false)] [tp this.gizmo (.x x .y y .onCurve true)]
return this
}
define [Stroke.prototype.cubic-to x1 y1 x2 y2 x y subdivided] : begin {
this.points.push {
tp this.gizmo (.x x1 .y y1 .onCurve false .cubic true)
tp this.gizmo (.x x2 .y y2 .onCurve false .cubic true)
tp this.gizmo (.x x .y y .onCurve true .subdivided subdivided)
}
define [Stroke.prototype.cubic-to x1 y1 x2 y2 x y] : begin {
this.points.push [tp this.gizmo (.x x1 .y y1 .onCurve false .cubic true)] [tp this.gizmo (.x x2 .y y2 .onCurve false .cubic true)] [tp this.gizmo (.x x .y y .onCurve true)]
return this
}
define Stroke.prototype.cubicTo Stroke.prototype.cubic-to
define [Stroke.prototype.arc-vh-to x y _kappah _kappav] : begin {
local kappah : fallback _kappah BKAPPA
local kappav : fallback _kappav _kappah CKAPPA
@ -136,74 +120,55 @@ define [near a b c] : begin {
local dist : Math.max [Math.abs [a.y - c.y]] [Math.abs [a.x - c.x]]
return : [Math.abs [b.y - my]] < dist && [Math.abs [b.x - mx]] < dist
}
define [computeOffsetPoint curve t j sl foffset fpdx fpdy] : begin {
local onpoint : curve.compute [[t - j] / sl]
local normal : curve.normal [[t - j] / sl]
define [computeOffsetPoint curve t j foffset fpdx fpdy] : begin {
local onpoint : curve.compute [t - j]
local normal : curve.normal [t - j]
return (.x onpoint.x + [foffset t] * [normal.x + [fpdx t]] .y onpoint.y + [foffset t] * [normal.y + [fpdy t]])
}
define [Stroke.prototype.to-outline d1 d2 _samples straight] : begin {
local ts (0)
local d1s ([set d1 [if [this.points.0.d1 >= 0] this.points.0.d1 this.defaultD1]])
local d2s ([set d2 [if [this.points.0.d2 >= 0] [-this.points.0.d2] this.defaultD2]])
local d1s ([set d1 [if [this.points.0.d1 >= 0] this.points.0.d1 d1]])
local d2s ([set d2 [if [this.points.0.d2 >= 0] this.points.0.d2 d2]])
local pdxs (0)
local pdys (0)
local notSubdivideds ()
local samples : fallback _samples this.samples SAMPLES
local shapes ()
local subSegments ()
local p0 this.points.0
local arclengthSofar 0
for [local j 1] [j < this.points.length] [inc j] : begin {
local p1 this.points`j
piecewise {
p1.onCurve : begin {
subSegments.push : local seg : new Bezier p0.x p0.y [[p0.x + p1.x] / 2] [[p0.y + p1.y] / 2] p1.x p1.y
arclengthSofar = arclengthSofar + [seg.length]
if [not p1.subdivided] : begin {
ts.push arclengthSofar
d1s.push : set d1 [if [p1.d1 >= 0] p1.d1 d1]
d2s.push : set d2 [if [p1.d2 >= 0] [-p1.d2] d2]
local normalpt : seg.normal 1
pdxs.push : if [p1.pdx !== nothing] [p1.pdx - normalpt.x] 0
pdys.push : if [p1.pdy !== nothing] [p1.pdy - normalpt.y] 0
set notSubdivideds.[subSegments.length - 1] true
}
d1s.push : set d1 [if [p1.d1 >= 0] p1.d1 d1]
d2s.push : set d2 [if [p1.d2 >= 0] p1.d2 d2]
local normalpt : seg.normal 1
pdxs.push : if [p1.pdx !== nothing] [p1.pdx - normalpt.x] 0
pdys.push : if [p1.pdy !== nothing] [p1.pdy - normalpt.y] 0
p0 = p1
}
p1.cubic : begin {
local p2 this.points`[j + 1]
local p3 this.points`[j + 2]
subSegments.push : local seg : new Bezier p0.x p0.y p1.x p1.y p2.x p2.y p3.x p3.y
arclengthSofar = arclengthSofar + [seg.length]
if [not p3.subdivided] : begin {
ts.push arclengthSofar
d1s.push : set d1 [if [p3.d1 >= 0] p3.d1 d1]
d2s.push : set d2 [if [p3.d2 >= 0] [-p3.d2] d2]
local normalpt : seg.normal 1
pdxs.push : if [p3.pdx !== nothing] [p3.pdx - normalpt.x] 0
pdys.push : if [p3.pdy !== nothing] [p3.pdy - normalpt.y] 0
set notSubdivideds.[subSegments.length - 1] true
}
d1s.push : set d1 [if [p3.d1 >= 0] p3.d1 d1]
d2s.push : set d2 [if [p3.d2 >= 0] p3.d2 d2]
local normalpt : seg.normal 1
pdxs.push : if [p3.pdx !== nothing] [p3.pdx - normalpt.x] 0
pdys.push : if [p3.pdy !== nothing] [p3.pdy - normalpt.y] 0
p0 = p3
j = j + 2
}
true : begin {
local p2 this.points`[j + 1]
subSegments.push : local seg : new Bezier p0.x p0.y p1.x p1.y p2.x p2.y
arclengthSofar = arclengthSofar + [seg.length]
if [not p2.subdivided] : begin {
ts.push arclengthSofar
d1s.push : set d1 [if [p2.d1 >= 0] p2.d1 d1]
d2s.push : set d2 [if [p2.d2 >= 0] [-p2.d2] d2]
local normalpt : seg.normal 1
pdxs.push : if [p2.pdx !== nothing] [p2.pdx - normalpt.x] 0
pdys.push : if [p2.pdy !== nothing] [p2.pdy - normalpt.y] 0
set notSubdivideds.[subSegments.length - 1] true
}
d1s.push : set d1 [if [p2.d1 >= 0] p2.d1 d1]
d2s.push : set d2 [if [p2.d2 >= 0] p2.d2 d2]
local normalpt : seg.normal 1
pdxs.push : if [p2.pdx !== nothing] [p2.pdx - normalpt.x] 0
pdys.push : if [p2.pdy !== nothing] [p2.pdy - normalpt.y] 0
p0 = p2
j = j + 1
}
@ -212,44 +177,43 @@ define [Stroke.prototype.to-outline d1 d2 _samples straight] : begin {
if [this.points.0.pdx !== nothing] : set pdxs.0 [this.points.0.pdx - [subSegments.0.normal 0].x]
if [this.points.0.pdy !== nothing] : set pdys.0 [this.points.0.pdy - [subSegments.0.normal 0].y]
local f1 : smooth [xs-array ts] [ys-array d1s]
local f2 : smooth [xs-array ts] [ys-array d2s]
local fpdx : smooth [xs-array ts] [ys-array pdxs]
local fpdy : smooth [xs-array ts] [ys-array pdys]
local f1 : smooth [xs-array 0 d1s.length] [ys-array d1s]
local f2 : smooth [xs-array 0 d2s.length] [ys-array [d2s.map [[x] -> [-x]]]]
local fpdx : smooth [xs-array 0 d1s.length] [ys-array pdxs]
local fpdy : smooth [xs-array 0 d2s.length] [ys-array pdys]
local left ()
local right ()
set arclengthSofar 0
for [local j 0] [j < subSegments.length] [inc j] : begin {
local curve subSegments`j
local segLength : curve.length
local arcLength : curve.length
local segLengths (0)
foreach sample [range 1 till samples] : begin {
segLengths.push : curve.split 0 [sample / samples] :.length
}
left.push [begin [local last [computeOffsetPoint curve arclengthSofar arclengthSofar segLength f1 fpdx fpdy]] (.x last.x .y last.y .onCurve true)]
right.push [begin [local last [computeOffsetPoint curve arclengthSofar arclengthSofar segLength f2 fpdx fpdy]] (.x last.x .y last.y .onCurve true)]
left.push [begin [local last [computeOffsetPoint curve j j f1 fpdx fpdy]] (.x last.x .y last.y .onCurve true)]
right.push [begin [local last [computeOffsetPoint curve j j f2 fpdx fpdy]] (.x last.x .y last.y .onCurve true)]
foreach sample [range 0 samples] : begin {
local t : arclengthSofar + segLengths.(sample)
local tn : arclengthSofar + segLengths.[sample + 1]
local t : j + segLengths.(sample) / arcLength
local tn : j + segLengths.[sample + 1] / arcLength
local lthis : computeOffsetPoint curve t arclengthSofar segLength f1 fpdx fpdy
local rthis : computeOffsetPoint curve t arclengthSofar segLength f2 fpdx fpdy
local lnext : computeOffsetPoint curve tn arclengthSofar segLength f1 fpdx fpdy
local rnext : computeOffsetPoint curve tn arclengthSofar segLength f2 fpdx fpdy
local lnthis1 : computeOffsetPoint curve [t + TINY] arclengthSofar segLength f1 fpdx fpdy
local rnthis1 : computeOffsetPoint curve [t + TINY] arclengthSofar segLength f2 fpdx fpdy
local lnnext1 : computeOffsetPoint curve [tn - TINY] arclengthSofar segLength f1 fpdx fpdy
local rnnext1 : computeOffsetPoint curve [tn - TINY] arclengthSofar segLength f2 fpdx fpdy
local lnthis2 : computeOffsetPoint curve [t + 2 * TINY] arclengthSofar segLength f1 fpdx fpdy
local rnthis2 : computeOffsetPoint curve [t + 2 * TINY] arclengthSofar segLength f2 fpdx fpdy
local lnnext2 : computeOffsetPoint curve [tn - 2 * TINY] arclengthSofar segLength f1 fpdx fpdy
local rnnext2 : computeOffsetPoint curve [tn - 2 * TINY] arclengthSofar segLength f2 fpdx fpdy
local lnthis3 : computeOffsetPoint curve [t + 3 * TINY] arclengthSofar segLength f1 fpdx fpdy
local rnthis3 : computeOffsetPoint curve [t + 3 * TINY] arclengthSofar segLength f2 fpdx fpdy
local lnnext3 : computeOffsetPoint curve [tn - 3 * TINY] arclengthSofar segLength f1 fpdx fpdy
local rnnext3 : computeOffsetPoint curve [tn - 3 * TINY] arclengthSofar segLength f2 fpdx fpdy
local lthis : computeOffsetPoint curve t j f1 fpdx fpdy
local rthis : computeOffsetPoint curve t j f2 fpdx fpdy
local lnext : computeOffsetPoint curve tn j f1 fpdx fpdy
local rnext : computeOffsetPoint curve tn j f2 fpdx fpdy
local lnthis1 : computeOffsetPoint curve [t + TINY] j f1 fpdx fpdy
local rnthis1 : computeOffsetPoint curve [t + TINY] j f2 fpdx fpdy
local lnnext1 : computeOffsetPoint curve [tn - TINY] j f1 fpdx fpdy
local rnnext1 : computeOffsetPoint curve [tn - TINY] j f2 fpdx fpdy
local lnthis2 : computeOffsetPoint curve [t + 2 * TINY] j f1 fpdx fpdy
local rnthis2 : computeOffsetPoint curve [t + 2 * TINY] j f2 fpdx fpdy
local lnnext2 : computeOffsetPoint curve [tn - 2 * TINY] j f1 fpdx fpdy
local rnnext2 : computeOffsetPoint curve [tn - 2 * TINY] j f2 fpdx fpdy
local lnthis3 : computeOffsetPoint curve [t + 3 * TINY] j f1 fpdx fpdy
local rnthis3 : computeOffsetPoint curve [t + 3 * TINY] j f2 fpdx fpdy
local lnnext3 : computeOffsetPoint curve [tn - 3 * TINY] j f1 fpdx fpdy
local rnnext3 : computeOffsetPoint curve [tn - 3 * TINY] j f2 fpdx fpdy
local dlthis [dforward lthis lnthis1 lnthis2 lnthis3]
local drthis [dforward rthis rnthis1 rnthis2 rnthis3]
@ -270,14 +234,6 @@ define [Stroke.prototype.to-outline d1 d2 _samples straight] : begin {
right.push (.x rnext.x .y rnext.y .onCurve true)
}]
}
arclengthSofar = arclengthSofar + segLength
if notSubdivideds.(j) : begin {
shapes.push : left.concat [right.reverse]
set left ()
set right ()
}
}
if [left.length + right.length > 2] : begin {
shapes.push : left.concat [right.reverse]
set left ()
set right ()

View file

@ -3,8 +3,7 @@ exports.transformPoint = function(tfm, pt){
x : pt.x * tfm.xx + pt.y * tfm.yx + tfm.x,
y : pt.x * tfm.xy + pt.y * tfm.yy + tfm.y,
onCurve: pt.onCurve,
cubic: pt.cubic,
subdivided: pt.subdivided
cubic: pt.cubic
}
}
exports.inverse = function(tfm){
@ -26,7 +25,6 @@ exports.untransform = function(tfm, pt){
x : (xx * tfm.yy - yy * tfm.yx) / denom,
y : (yy * tfm.xx - xx * tfm.xy) / denom,
onCurve: pt.onCurve,
cubic: pt.cubic,
subdivided: pt.subdivided
cubic: pt.cubic
}
}