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
flat leftx lefty [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
curl rightx righty
end [function : set this.unfair true]
define [xStrand _leftx lefty _rightx righty turn straight tension] : glyph-construction

View File

@ -568,14 +568,14 @@ symbol-block 'W'
include : dispiro
widths.rhs WShape.fine
straight.down.start (MIDDLE + WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
quadcontrols 0 0.1 6 unimportant
flat (MIDDLE + WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
#quadcontrols 0 0.1 6 unimportant
g4 (WShape.m1 + WShape.fine / 2 * HVCONTRAST) 0 [widths.rhs WShape.fine]
include : dispiro
widths.lhs WShape.fine
straight.down.start (MIDDLE - WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
quadcontrols 0 0.1 6 unimportant
g4 (WShape.m2 - WShape.fine / 2 * HVCONTRAST) 0 [widths.lhs WShape.fine]
flat (MIDDLE - WShape.fine / 2 * HVCONTRAST) wheight [heading DOWNWARD]
#quadcontrols 0 0.1 6 unimportant
curl (WShape.m2 - WShape.fine / 2 * HVCONTRAST) 0 [widths.lhs WShape.fine]
# bottom cap 2
start-from (WShape.m2 + WShape.fine / 2 * HVCONTRAST) 0
@ -650,8 +650,8 @@ symbol-block 'X'
assign-unicode 'X'
include capitalMarks
include : xStrand SB 0 RIGHTSB CAP 0.1 0.4 0.28
include : xStrand SB CAP RIGHTSB 0 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.3
include : AIHSerifs CAP
alias 'Chi' 0x3A7 'X'
alias 'cyrHa' 0x425 'X'
@ -661,8 +661,8 @@ symbol-block 'X'
assign-unicode 'x'
local TURN (XH * 0.1)
include : xStrand SB 0 RIGHTSB XH 0.02 0.4 0.14
include : xStrand SB XH RIGHTSB 0 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.45 0.15
include : AIHSerifs XH
create-glyph 'chi' : glyph-construction
@ -670,12 +670,12 @@ symbol-block 'X'
assign-unicode 0x3C7
include pMarks
include : xStrand SB DESCENDER RIGHTSB XH 0.05 0.4 0.1
include : xStrand SB XH RIGHTSB DESCENDER 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.45 0.15
alias 'cyrha' 0x445 'x'
composite nothing glyphs.cyrHa [CyrDescender RIGHTSB] [into-unicode 0x4B2]
composite nothing glyphs.cyrha [CyrDescender RIGHTSB] [into-unicode 0x4B3]
composite 'cyrHadescender' glyphs.cyrHa [CyrDescender RIGHTSB] [into-unicode 0x4B2]
composite 'cyrhadescender' glyphs.cyrha [CyrDescender RIGHTSB] [into-unicode 0x4B3]
### Y
symbol-block 'Y'
@ -758,6 +758,7 @@ symbol-block 'y'
curl yrstroker (top - ds) [heading DOWNWARD]
quadcontrols 0 dpy1 16
yBaseKnots top bottom
end [function : set this.unfair true]
include : dispiro
widths.center
flat (WIDTH - yrstroker) top [heading DOWNWARD]
@ -765,6 +766,7 @@ symbol-block 'y'
quadcontrols 0 dpy1 16
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)]
end [function : set this.unfair true]
if SLAB : begin
include : AIVSerifs top
create-glyph 'y.upright' : glyph-construction
@ -803,6 +805,7 @@ symbol-block 'y'
widths.center
straight.left.start ([mix yrstrokel yrstroker px1] + HOOKX) (XH - HALFSTROKE)
yBaseKnots XH DESCENDER
end [function : set this.unfair true]
create-glyph 'cyrU' : glyph-construction
assign-unicode 0x423
@ -1559,12 +1562,13 @@ define {CShape} : symbol-block 'C'
hookstart XH
flat.ai (SB + OX) (XH - SMALLSMOOTHA)
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
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
### G
@ -2297,6 +2301,7 @@ define {LongSShape} : symbol-block 'f'
widths.center
flat (MIDDLE - FBALANCE) 0 [heading UPWARD]
curl (MIDDLE - FBALANCE) (CAP - FHOOK)
arcvh
straight.right.end (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - fovershoot)
if SLAB : begin
include : CenterBottomSerif (MIDDLE - FBALANCE) 0 JUT
@ -2417,7 +2422,7 @@ define {LongSShape} : symbol-block 'f'
symbol-block 'compatibility ligatures'
local shift (-(WIDTH * 0.055 + SB * 0.5))
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
assign-unicode 0xFB01
@ -2436,12 +2441,15 @@ define {LongSShape} : symbol-block 'f'
local m : MIDDLE - JBALANCE - HALFSTROKE * HVCONTRAST + shift
include : dispiro
widths.rhs
flat m 0
flat m 0 [heading UPWARD]
curl m (CAP - SMOOTHA)
hookend (CAP - O)
g4 (barr + OXHOOK) (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
include : tagged 'serifLB' : CenterBottomSerif (m + HALFSTROKE * HVCONTRAST + RBALANCE * 0.35) 0 (JUT + RBALANCE * 0.65)
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
g4.down.mid (SB + STROKE * HVCONTRAST) [mix 0 CAP 0.27]
arcvh
g4 [mix SB RIGHTSB 0.55] STROKE
archv
g4.down.mid RIGHTSB [mix DESCENDER STROKE 0.525] [heading DOWNWARD]
arcvh
g4 [mix SB RIGHTSB 0.55] STROKE [heading RIGHTWARD]
archv 12
g4.down.mid RIGHTSB [mix DESCENDER STROKE 0.5] [heading DOWNWARD]
arcvh 12
flat (RIGHTSB - (STROKE - [mix DESCENDER STROKE 0.5]) * 1.1) DESCENDER
curl [mix SB RIGHTSB 0.5] DESCENDER [heading LEFTWARD]
@ -307,12 +307,12 @@ symbol-block 'zeta and xi'
archv
g4 (SB - O * 2 + STROKE * HVCONTRAST) [mix (CAP - STROKE) ybar 0.6]
arcvh
g4.right.end xbar ybar
g4.right.end (xbar - HALFSTROKE * TANSLANT) ybar [widths.rhs (STROKE * [mix CTHIN 1 0.5])]
include : dispiro
widths.rhs
g4.left.start xbar (ybar - STROKE)
bezcontrols 0.7 0 1 0.63
g4 (SB + STROKE * HVCONTRAST) [mix 0 ybar 0.45]
widths.rhs (STROKE * [mix CTHIN 1 0.5])
g4.left.start (xbar + HALFSTROKE * TANSLANT) (ybar - STROKE)
bezcontrols 0.7 0 1 0.6
g4 (SB + STROKE * HVCONTRAST) [mix 0 ybar 0.45] [widths.rhs]
arcvh
g4 [mix SB RIGHTSB 0.5] STROKE
archv

View File

@ -68,7 +68,11 @@ archives-slab : fonts-slab
# Variant releases
releasepack-default : $(SCRIPTS) | $(OBJDIR)
$(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-'
releasepack-cc : $(SCRIPTS) | $(OBJDIR)
$(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-'
releasepack-zshaped : $(SCRIPTS) | $(OBJDIR)
$(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
cjk-all : releasepack-cjk releasepack-cc
release-all : releasepack-default releasepack-fw releasepack-cc releasepack-hooky releasepack-zshaped
fw : fonts-fw fonts-cc

View File

@ -28,8 +28,11 @@ for i in font:
#font.replaceWithReference()
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.simplify(0.05, ("smoothcurves", "choosehv"), 0.1)
font.simplify(0.075, ("smoothcurves", "choosehv"), 0.1)
#font.em = 2000
font.selection.all()

View File

@ -1,6 +1,8 @@
var Transform = require('./transform.js');
var ANGLES = 6;
var ANGLES = 12;
var CROWD = 4;
var LOOSE = 6;
var SMALL = 1e-4
function cross(z1, z2, z3){
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)]
};
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){
angles = angles || ANGLES
for(var j = 0; j < scurve.length; j++){
@ -168,19 +173,24 @@ function fairify(scurve, gizmo, angles){
if(scurve[j].onCurve){
splitpoints.push(last = scurve[j])
} else if(scurve[j].cubic) {
var z1 = last, z2 = scurve[j], z3 = scurve[j + 1], z4 = scurve[j + 2]
splitSegment(z1, z2, z3, z4, angles, splitpoints);
var z1 = last, z2 = scurve[j], z3 = scurve[j + 1], z4 = scurve[j + 2];
if(!(close(z1, z2) && close(z2, z3) && close(z3, z4))) {
splitSegment(z1, z2, z3, z4, ANGLES, splitpoints);
last = z4;
}
j += 2;
} else {
var z1 = last, zm = scurve[j], z4 = scurve[j + 1]
if(!(close(z1, zm) && close(zm, z4))) {
var z2 = mix(zm, z1, 1/3);
var z3 = mix(zm, z4, 1/3);
splitSegment(z1, z2, z3, z4, angles, splitpoints);
splitSegment(z1, z2, z3, z4, ANGLES, splitpoints);
last = z4;
}
j += 1;
}
};
// Mark infections and extremae
for(var j = 1; j < splitpoints.length - 1; j++) {
if(splitpoints[j].onCurve && !splitpoints[j - 1].onCurve && !splitpoints[j + 1].onCurve){
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)) {
var angle0 = Math.atan2(z2.y - z0.y, z2.x - z0.x);
var angle = Math.abs(angle0 / Math.PI * angles % 1);
if(Math.abs(Math.abs(angle0) - Math.PI / 2) > SMALL && angle > SMALL && angle < 1 - SMALL){
z0.remove = z1.remove = z2.remove = true;
}
var angle = Math.abs(angle0 / Math.PI * 2 % 1);
if(Math.abs(Math.abs(angle0) - Math.PI / 2) <= SMALL || angle <= SMALL || angle >= 1 - SMALL){
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 k = j + 2; k < splitpoints.length && splitpoints[k].remove; k++);
if(k - j > 2){
@ -217,7 +253,7 @@ function fairify(scurve, gizmo, angles){
j = k;
};
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]))
}
return ans

View File

@ -164,7 +164,7 @@ export : define [SetupBuilders args] : begin
local g : new Glyph
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
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.knots knots
set g.lhsknots lhs