But being too fair is not good either.

This commit is contained in:
be5invis 2015-12-20 08:50:44 +08:00
parent 6e765f6c19
commit 9fdb1e36bb
7 changed files with 103 additions and 51 deletions

View File

@ -284,9 +284,10 @@ define [halfXStrand _leftx lefty rightx righty turn straight tension _fine] : gl
widths.center widths.center
flat leftx lefty [heading [if (lefty < righty) UPWARD DOWNWARD]] flat leftx lefty [heading [if (lefty < righty) UPWARD DOWNWARD]]
curl leftx turnyleft [heading [if (lefty < righty) UPWARD DOWNWARD]] curl leftx turnyleft [heading [if (lefty < righty) UPWARD DOWNWARD]]
quadcontrols 0 ((cyleft - turnyleft) / (straightyleft - turnyleft)) 4 unimportant quadcontrols 0 ((cyleft - turnyleft) / (straightyleft - turnyleft)) 4
flat straightxleft straightyleft flat straightxleft straightyleft
curl rightx righty curl rightx righty
end [function : set this.unfair true]
define [xStrand _leftx lefty _rightx righty turn straight tension] : glyph-construction define [xStrand _leftx lefty _rightx righty turn straight tension] : glyph-construction

View File

@ -568,14 +568,14 @@ symbol-block 'W'
include : dispiro include : dispiro
widths.rhs WShape.fine widths.rhs WShape.fine
straight.down.start (MIDDLE + WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD] flat (MIDDLE + WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
quadcontrols 0 0.1 6 unimportant #quadcontrols 0 0.1 6 unimportant
g4 (WShape.m1 + WShape.fine / 2 * HVCONTRAST) 0 [widths.rhs WShape.fine] g4 (WShape.m1 + WShape.fine / 2 * HVCONTRAST) 0 [widths.rhs WShape.fine]
include : dispiro include : dispiro
widths.lhs WShape.fine widths.lhs WShape.fine
straight.down.start (MIDDLE - WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD] flat (MIDDLE - WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
quadcontrols 0 0.1 6 unimportant #quadcontrols 0 0.1 6 unimportant
g4 (WShape.m2 - WShape.fine / 2 * HVCONTRAST) 0 [widths.lhs WShape.fine] curl (WShape.m2 - WShape.fine / 2 * HVCONTRAST) 0 [widths.lhs WShape.fine]
# bottom cap 2 # bottom cap 2
start-from (WShape.m2 + WShape.fine / 2 * HVCONTRAST) 0 start-from (WShape.m2 + WShape.fine / 2 * HVCONTRAST) 0
@ -650,8 +650,8 @@ symbol-block 'X'
assign-unicode 'X' assign-unicode 'X'
include capitalMarks include capitalMarks
include : xStrand SB 0 RIGHTSB CAP 0.1 0.4 0.28 include : xStrand SB 0 RIGHTSB CAP 0.1 0.4 0.3
include : xStrand SB CAP RIGHTSB 0 0.1 0.4 0.28 include : xStrand SB CAP RIGHTSB 0 0.1 0.4 0.3
include : AIHSerifs CAP include : AIHSerifs CAP
alias 'Chi' 0x3A7 'X' alias 'Chi' 0x3A7 'X'
alias 'cyrHa' 0x425 'X' alias 'cyrHa' 0x425 'X'
@ -661,8 +661,8 @@ symbol-block 'X'
assign-unicode 'x' assign-unicode 'x'
local TURN (XH * 0.1) local TURN (XH * 0.1)
include : xStrand SB 0 RIGHTSB XH 0.02 0.4 0.14 include : xStrand SB 0 RIGHTSB XH 0.02 0.45 0.15
include : xStrand SB XH RIGHTSB 0 0.02 0.4 0.14 include : xStrand SB XH RIGHTSB 0 0.02 0.45 0.15
include : AIHSerifs XH include : AIHSerifs XH
create-glyph 'chi' : glyph-construction create-glyph 'chi' : glyph-construction
@ -670,12 +670,12 @@ symbol-block 'X'
assign-unicode 0x3C7 assign-unicode 0x3C7
include pMarks include pMarks
include : xStrand SB DESCENDER RIGHTSB XH 0.05 0.4 0.1 include : xStrand SB DESCENDER RIGHTSB XH 0.05 0.45 0.15
include : xStrand SB XH RIGHTSB DESCENDER 0.05 0.4 0.1 include : xStrand SB XH RIGHTSB DESCENDER 0.05 0.45 0.15
alias 'cyrha' 0x445 'x' alias 'cyrha' 0x445 'x'
composite nothing glyphs.cyrHa [CyrDescender RIGHTSB] [into-unicode 0x4B2] composite 'cyrHadescender' glyphs.cyrHa [CyrDescender RIGHTSB] [into-unicode 0x4B2]
composite nothing glyphs.cyrha [CyrDescender RIGHTSB] [into-unicode 0x4B3] composite 'cyrhadescender' glyphs.cyrha [CyrDescender RIGHTSB] [into-unicode 0x4B3]
### Y ### Y
symbol-block 'Y' symbol-block 'Y'
@ -758,6 +758,7 @@ symbol-block 'y'
curl yrstroker (top - ds) [heading DOWNWARD] curl yrstroker (top - ds) [heading DOWNWARD]
quadcontrols 0 dpy1 16 quadcontrols 0 dpy1 16
yBaseKnots top bottom yBaseKnots top bottom
end [function : set this.unfair true]
include : dispiro include : dispiro
widths.center widths.center
flat (WIDTH - yrstroker) top [heading DOWNWARD] flat (WIDTH - yrstroker) top [heading DOWNWARD]
@ -765,6 +766,7 @@ symbol-block 'y'
quadcontrols 0 dpy1 16 quadcontrols 0 dpy1 16
flat [mix (WIDTH - yrstrokel) (WIDTH - yrstroker) px1] [mix (bottom + ds) (top - ds) py1] flat [mix (WIDTH - yrstrokel) (WIDTH - yrstroker) px1] [mix (bottom + ds) (top - ds) py1]
curl MIDDLE [mix (bottom + ds2) (top - ds) [linreg (1 - px2) (1 - py2) px1 py1 ((MIDDLE - yrstrokel) / (yrstroker - yrstrokel))]] [widths.center (STROKE * yshrink)] curl MIDDLE [mix (bottom + ds2) (top - ds) [linreg (1 - px2) (1 - py2) px1 py1 ((MIDDLE - yrstrokel) / (yrstroker - yrstrokel))]] [widths.center (STROKE * yshrink)]
end [function : set this.unfair true]
if SLAB : begin if SLAB : begin
include : AIVSerifs top include : AIVSerifs top
create-glyph 'y.upright' : glyph-construction create-glyph 'y.upright' : glyph-construction
@ -803,6 +805,7 @@ symbol-block 'y'
widths.center widths.center
straight.left.start ([mix yrstrokel yrstroker px1] + HOOKX) (XH - HALFSTROKE) straight.left.start ([mix yrstrokel yrstroker px1] + HOOKX) (XH - HALFSTROKE)
yBaseKnots XH DESCENDER yBaseKnots XH DESCENDER
end [function : set this.unfair true]
create-glyph 'cyrU' : glyph-construction create-glyph 'cyrU' : glyph-construction
assign-unicode 0x423 assign-unicode 0x423
@ -1559,12 +1562,13 @@ define {CShape} : symbol-block 'C'
hookstart XH hookstart XH
flat.ai (SB + OX) (XH - SMALLSMOOTHA) flat.ai (SB + OX) (XH - SMALLSMOOTHA)
curl.ai (SB + OX) SMALLSMOOTHB curl.ai (SB + OX) SMALLSMOOTHB
alsothru 0.4 0.8
g4 MIDDLE 0
alsothru 0.5 0.135
g4.down.mid (RIGHTSB - STROKE * HVCONTRAST + OX) [mix DESCENDER STROKE 0.5] [heading DOWNWARD]
arcvh arcvh
straight.left.end (RIGHTSB - HOOKX + OX) (DESCENDER + STROKE) [heading LEFTWARD] g4 (MIDDLE + CORRECTION_OMIDS) 0
alsothru 0.5 0.1353
g4.down.mid (RIGHTSB - STROKE * HVCONTRAST + OX) [mix DESCENDER STROKE [linreg 18 0.5 126 0.49 STROKE]] [heading DOWNWARD]
arcvh
flat (RIGHTSB - HOOKX + OX) (DESCENDER + STROKE) [heading LEFTWARD]
curl [Math.min (RIGHTSB - STROKE * HVCONTRAST * 1.5) (RIGHTSB - HOOKX + OX - 1)] (DESCENDER + STROKE) [heading LEFTWARD]
list CShape list CShape
### G ### G
@ -2297,6 +2301,7 @@ define {LongSShape} : symbol-block 'f'
widths.center widths.center
flat (MIDDLE - FBALANCE) 0 [heading UPWARD] flat (MIDDLE - FBALANCE) 0 [heading UPWARD]
curl (MIDDLE - FBALANCE) (CAP - FHOOK) curl (MIDDLE - FBALANCE) (CAP - FHOOK)
arcvh
straight.right.end (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - fovershoot) straight.right.end (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - fovershoot)
if SLAB : begin if SLAB : begin
include : CenterBottomSerif (MIDDLE - FBALANCE) 0 JUT include : CenterBottomSerif (MIDDLE - FBALANCE) 0 JUT
@ -2417,7 +2422,7 @@ define {LongSShape} : symbol-block 'f'
symbol-block 'compatibility ligatures' symbol-block 'compatibility ligatures'
local shift (-(WIDTH * 0.055 + SB * 0.5)) local shift (-(WIDTH * 0.055 + SB * 0.5))
local barr RIGHTSB local barr RIGHTSB
local hbarleft (SB + shift + STROKE * [if para.isItalic 0.5 0.25]) local hbarleft (SB + shift + STROKE * [if para.slantAngle 0.5 0.25])
create-glyph 'f_i' : glyph-construction create-glyph 'f_i' : glyph-construction
assign-unicode 0xFB01 assign-unicode 0xFB01
@ -2436,12 +2441,15 @@ define {LongSShape} : symbol-block 'f'
local m : MIDDLE - JBALANCE - HALFSTROKE * HVCONTRAST + shift local m : MIDDLE - JBALANCE - HALFSTROKE * HVCONTRAST + shift
include : dispiro include : dispiro
widths.rhs widths.rhs
flat m 0 flat m 0 [heading UPWARD]
curl m (CAP - SMOOTHA) curl m (CAP - SMOOTHA)
hookend (CAP - O) hookend (CAP - O)
g4 (barr + OXHOOK) (CAP - HOOK) g4 (barr + OXHOOK) (CAP - HOOK)
include : VBarRight barr 0 (CAP - HOOK) include : VBarRight barr 0 (CAP - HOOK)
include : HBarTop hbarleft [mix SB barr 0.6] fbar include : dispiro
widths.rhs
flat ([Math.min (m - STROKE * 0.3) hbarleft] - TANSLANT * HALFSTROKE) fbar
curl ([mix SB barr 0.6] - TANSLANT * HALFSTROKE) fbar
if SLAB : begin if SLAB : begin
include : tagged 'serifLB' : CenterBottomSerif (m + HALFSTROKE * HVCONTRAST + RBALANCE * 0.35) 0 (JUT + RBALANCE * 0.65) include : tagged 'serifLB' : CenterBottomSerif (m + HALFSTROKE * HVCONTRAST + RBALANCE * 0.35) 0 (JUT + RBALANCE * 0.65)
include : tagged 'serifRB' : CenterBottomSerif (barr - HALFSTROKE * HVCONTRAST) 0 JUT include : tagged 'serifRB' : CenterBottomSerif (barr - HALFSTROKE * HVCONTRAST) 0 JUT

View File

@ -287,10 +287,10 @@ symbol-block 'zeta and xi'
bezcontrols 0.7 0.35 1 0.64 12 bezcontrols 0.7 0.35 1 0.64 12
g4.down.mid (SB + STROKE * HVCONTRAST) [mix 0 CAP 0.27] g4.down.mid (SB + STROKE * HVCONTRAST) [mix 0 CAP 0.27]
arcvh arcvh
g4 [mix SB RIGHTSB 0.55] STROKE g4 [mix SB RIGHTSB 0.55] STROKE [heading RIGHTWARD]
archv archv 12
g4.down.mid RIGHTSB [mix DESCENDER STROKE 0.525] [heading DOWNWARD] g4.down.mid RIGHTSB [mix DESCENDER STROKE 0.5] [heading DOWNWARD]
arcvh arcvh 12
flat (RIGHTSB - (STROKE - [mix DESCENDER STROKE 0.5]) * 1.1) DESCENDER flat (RIGHTSB - (STROKE - [mix DESCENDER STROKE 0.5]) * 1.1) DESCENDER
curl [mix SB RIGHTSB 0.5] DESCENDER [heading LEFTWARD] curl [mix SB RIGHTSB 0.5] DESCENDER [heading LEFTWARD]
@ -307,12 +307,12 @@ symbol-block 'zeta and xi'
archv archv
g4 (SB - O * 2 + STROKE * HVCONTRAST) [mix (CAP - STROKE) ybar 0.6] g4 (SB - O * 2 + STROKE * HVCONTRAST) [mix (CAP - STROKE) ybar 0.6]
arcvh arcvh
g4.right.end xbar ybar g4.right.end (xbar - HALFSTROKE * TANSLANT) ybar [widths.rhs (STROKE * [mix CTHIN 1 0.5])]
include : dispiro include : dispiro
widths.rhs widths.rhs (STROKE * [mix CTHIN 1 0.5])
g4.left.start xbar (ybar - STROKE) g4.left.start (xbar + HALFSTROKE * TANSLANT) (ybar - STROKE)
bezcontrols 0.7 0 1 0.63 bezcontrols 0.7 0 1 0.6
g4 (SB + STROKE * HVCONTRAST) [mix 0 ybar 0.45] g4 (SB + STROKE * HVCONTRAST) [mix 0 ybar 0.45] [widths.rhs]
arcvh arcvh
g4 [mix SB RIGHTSB 0.5] STROKE g4 [mix SB RIGHTSB 0.5] STROKE
archv archv

View File

@ -68,7 +68,11 @@ archives-slab : fonts-slab
# Variant releases # Variant releases
releasepack-default : $(SCRIPTS) | $(OBJDIR) releasepack-default : $(SCRIPTS) | $(OBJDIR)
$(MAKE) pages release VERSION=$(VERSION) $(MAKE) pages release VERSION=$(VERSION)
releasepack-cjk : $(SCRIPTS) | $(OBJDIR) fonts-fw : $(SCRIPTS) | $(OBJDIR)
$(MAKE) fonts-default fonts-slab VERSION=$(VERSION) STYLE_COMMON='cjk' VARIANTNAME='wfw-' ARCPREFIX='withfw-'
fonts-cc : $(SCRIPTS) | $(OBJDIR)
$(MAKE) fonts-default fonts-slab VERSION=$(VERSION) STYLE_COMMON='cjk cc' VARIANTNAME='wcc-' ARCPREFIX='withfw-cc-'
releasepack-fw : $(SCRIPTS) | $(OBJDIR)
$(MAKE) archives-default archives-slab VERSION=$(VERSION) STYLE_COMMON='cjk' VARIANTNAME='wfw-' ARCPREFIX='withfw-' $(MAKE) archives-default archives-slab VERSION=$(VERSION) STYLE_COMMON='cjk' VARIANTNAME='wfw-' ARCPREFIX='withfw-'
releasepack-cc : $(SCRIPTS) | $(OBJDIR) releasepack-cc : $(SCRIPTS) | $(OBJDIR)
$(MAKE) archives-default archives-slab VERSION=$(VERSION) STYLE_COMMON='cjk cc' VARIANTNAME='wcc-' ARCPREFIX='withfw-cc-' $(MAKE) archives-default archives-slab VERSION=$(VERSION) STYLE_COMMON='cjk cc' VARIANTNAME='wcc-' ARCPREFIX='withfw-cc-'
@ -76,5 +80,5 @@ releasepack-hooky : $(SCRIPTS) | $(OBJDIR)
$(MAKE) archives-default VERSION=$(VERSION) VARIANTNAME='hooky-' STYLE_UPRIGHT='v-l-hooky v-i-hooky' ARCPREFIX='variant-hooky-' $(MAKE) archives-default VERSION=$(VERSION) VARIANTNAME='hooky-' STYLE_UPRIGHT='v-l-hooky v-i-hooky' ARCPREFIX='variant-hooky-'
releasepack-zshaped : $(SCRIPTS) | $(OBJDIR) releasepack-zshaped : $(SCRIPTS) | $(OBJDIR)
$(MAKE) archives-default VERSION=$(VERSION) VARIANTNAME='zshaped-' STYLE_UPRIGHT='v-l-zshaped v-i-zshaped' ARCPREFIX='variant-zshaped-' $(MAKE) archives-default VERSION=$(VERSION) VARIANTNAME='zshaped-' STYLE_UPRIGHT='v-l-zshaped v-i-zshaped' ARCPREFIX='variant-zshaped-'
release-all : releasepack-default releasepack-cjk releasepack-cc releasepack-hooky releasepack-zshaped release-all : releasepack-default releasepack-fw releasepack-cc releasepack-hooky releasepack-zshaped
cjk-all : releasepack-cjk releasepack-cc fw : fonts-fw fonts-cc

View File

@ -28,8 +28,11 @@ for i in font:
#font.replaceWithReference() #font.replaceWithReference()
print " Simplify: ", font.fontname print " Simplify: ", font.fontname
font.selection.select("X", "x", "chi", "cyrHadescender", "cyrhadescender", "supx", "supchi", "subx", "subchi", "circlex", "circleinnerx", "circleX", "circleinnerX", "combx",
"Y", "y", "y.upright", "yhooktop", "Yhooktop", "turny.upright", "cyrU", "cyrue", "lambda", "lambdaslash", "circley", "circleinnery", "circleY", "circleinnerY")
font.simplify(1, ("smoothcurves", "choosehv"), 0.2)
font.selection.all() font.selection.all()
font.simplify(0.05, ("smoothcurves", "choosehv"), 0.1) font.simplify(0.075, ("smoothcurves", "choosehv"), 0.1)
#font.em = 2000 #font.em = 2000
font.selection.all() font.selection.all()

View File

@ -1,6 +1,8 @@
var Transform = require('./transform.js'); var Transform = require('./transform.js');
var ANGLES = 6; var ANGLES = 12;
var CROWD = 4;
var LOOSE = 6;
var SMALL = 1e-4 var SMALL = 1e-4
function cross(z1, z2, z3){ function cross(z1, z2, z3){
return (z2.x - z1.x) * (z3.y - z1.y) - (z3.x - z1.x) * (z2.y - z1.y) return (z2.x - z1.x) * (z3.y - z1.y) - (z3.x - z1.x) * (z2.y - z1.y)
@ -157,6 +159,9 @@ function fitpts(p1, c1, c2, p2){
} }
return [mix(mid, p1, 1/3), mix(mid, p2, 1/3)] return [mix(mid, p1, 1/3), mix(mid, p2, 1/3)]
}; };
function close(z1, z2){
return (z1.x - z2.x) * (z1.x - z2.x) + (z1.y - z2.y) * (z1.y - z2.y) <= SMALL
}
function fairify(scurve, gizmo, angles){ function fairify(scurve, gizmo, angles){
angles = angles || ANGLES angles = angles || ANGLES
for(var j = 0; j < scurve.length; j++){ for(var j = 0; j < scurve.length; j++){
@ -168,19 +173,24 @@ function fairify(scurve, gizmo, angles){
if(scurve[j].onCurve){ if(scurve[j].onCurve){
splitpoints.push(last = scurve[j]) splitpoints.push(last = scurve[j])
} else if(scurve[j].cubic) { } else if(scurve[j].cubic) {
var z1 = last, z2 = scurve[j], z3 = scurve[j + 1], z4 = scurve[j + 2] var z1 = last, z2 = scurve[j], z3 = scurve[j + 1], z4 = scurve[j + 2];
splitSegment(z1, z2, z3, z4, angles, splitpoints); if(!(close(z1, z2) && close(z2, z3) && close(z3, z4))) {
last = z4; splitSegment(z1, z2, z3, z4, ANGLES, splitpoints);
last = z4;
}
j += 2; j += 2;
} else { } else {
var z1 = last, zm = scurve[j], z4 = scurve[j + 1] var z1 = last, zm = scurve[j], z4 = scurve[j + 1]
var z2 = mix(zm, z1, 1/3); if(!(close(z1, zm) && close(zm, z4))) {
var z3 = mix(zm, z4, 1/3); var z2 = mix(zm, z1, 1/3);
splitSegment(z1, z2, z3, z4, angles, splitpoints); var z3 = mix(zm, z4, 1/3);
last = z4; splitSegment(z1, z2, z3, z4, ANGLES, splitpoints);
last = z4;
}
j += 1; j += 1;
} }
}; };
// Mark infections and extremae
for(var j = 1; j < splitpoints.length - 1; j++) { for(var j = 1; j < splitpoints.length - 1; j++) {
if(splitpoints[j].onCurve && !splitpoints[j - 1].onCurve && !splitpoints[j + 1].onCurve){ if(splitpoints[j].onCurve && !splitpoints[j - 1].onCurve && !splitpoints[j + 1].onCurve){
var z1 = splitpoints[j], z0 = splitpoints[j - 1], z2 = splitpoints[j + 1] var z1 = splitpoints[j], z0 = splitpoints[j - 1], z2 = splitpoints[j + 1]
@ -194,15 +204,41 @@ function fairify(scurve, gizmo, angles){
}; };
if(!(z1.inflect || isInflection)) { if(!(z1.inflect || isInflection)) {
var angle0 = Math.atan2(z2.y - z0.y, z2.x - z0.x); var angle0 = Math.atan2(z2.y - z0.y, z2.x - z0.x);
var angle = Math.abs(angle0 / Math.PI * angles % 1); var angle = Math.abs(angle0 / Math.PI * 2 % 1);
if(Math.abs(Math.abs(angle0) - Math.PI / 2) > SMALL && angle > SMALL && angle < 1 - SMALL){ if(Math.abs(Math.abs(angle0) - Math.PI / 2) <= SMALL || angle <= SMALL || angle >= 1 - SMALL){
z0.remove = z1.remove = z2.remove = true; z1.mark = true;
} }
} else {
z1.mark = true;
} }
} else {
z1.mark = true;
}
} else if(splitpoints[j].onCurve) {
splitpoints[j].mark = true // corner
}
};
splitpoints[0].mark = splitpoints[splitpoints.length - 1].mark = true;
// Mark diagonals
var lastmark = splitpoints[0];
for(var j = 1; j < splitpoints.length - 1; j++) {
if(splitpoints[j].mark){
lastmark = splitpoints[j];
for(var k = j + 1; k < splitpoints.length && !splitpoints[k].mark; k++);
nextmark = splitpoints[k];
var hspan = Math.abs(lastmark.x - nextmark.x);
var vspan = Math.abs(lastmark.y - nextmark.y);
}
if(splitpoints[j].onCurve && !splitpoints[j].mark){
var z1 = splitpoints[j], z0 = splitpoints[j - 1], z2 = splitpoints[j + 1];
var angle0 = Math.atan2(z2.y - z0.y, z2.x - z0.x);
var angle = Math.abs(angle0 / Math.PI * (hspan <= 10 * LOOSE || vspan <= 10 * LOOSE ? CROWD : LOOSE) % 1);
if(!(Math.abs(Math.abs(angle0) - Math.PI / 2) <= SMALL || angle <= SMALL || angle >= 1 - SMALL)){
z1.remove = z0.remove = z2.remove = true;
} }
} }
} };
for(var j = 0; j < splitpoints.length; j++) if(splitpoints[j].onCurve && !splitpoints[j].remove && splitpoints[j + 1] && !splitpoints[j + 1].onCurve){ for(var j = 0; j < splitpoints.length; j++) if(splitpoints[j].onCurve && !splitpoints[j].remove && splitpoints[j + 1] && !splitpoints[j + 1].onCurve){
for(var k = j + 2; k < splitpoints.length && splitpoints[k].remove; k++); for(var k = j + 2; k < splitpoints.length && splitpoints[k].remove; k++);
if(k - j > 2){ if(k - j > 2){
@ -217,7 +253,7 @@ function fairify(scurve, gizmo, angles){
j = k; j = k;
}; };
var ans = [] var ans = []
for(var j = 0; j < splitpoints.length; j++) if(!splitpoints[j].remove) { for(var j = 0; j < splitpoints.length; j++) if(splitpoints[j] && !splitpoints[j].remove) {
ans.push(Transform.transformPoint(gizmo, splitpoints[j])) ans.push(Transform.transformPoint(gizmo, splitpoints[j]))
} }
return ans return ans

View File

@ -164,8 +164,8 @@ export : define [SetupBuilders args] : begin
local g : new Glyph local g : new Glyph
lhs.0.type = rhs.0.type = lhs.(lhs.length - 1).type = rhs.(rhs.length - 1).type = 'corner' lhs.0.type = rhs.0.type = lhs.(lhs.length - 1).type = rhs.(rhs.length - 1).type = 'corner'
libspiro.spiroToBezierOnContext [lhs.concat : rhs.reverse] true g QUAD PRECISION libspiro.spiroToBezierOnContext [lhs.concat : rhs.reverse] true g QUAD PRECISION
foreach [j : range 0 g.contours.length] : begin if [not s.unfair] : foreach [j : range 0 g.contours.length] : begin
set g.contours.(j) : fairify g.contours.(j) globalTransform s.angles set g.contours.(j) : fairify g.contours.(j) globalTransform s.angles
set g.knots knots set g.knots knots
set g.lhsknots lhs set g.lhsknots lhs
set g.rhsknots rhs set g.rhsknots rhs