But being too fair is not good either.
This commit is contained in:
parent
6e765f6c19
commit
9fdb1e36bb
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
10
makefile
10
makefile
|
@ -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
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user