diff --git a/generate.js b/generate.js index 0268790..22a0032 100644 --- a/generate.js +++ b/generate.js @@ -30,7 +30,6 @@ ttfFont.glyf = [ttfFont.glyf[0]].concat(ttfFont.glyf.slice(1).sort(function(a, b else return (a.name > b.name ? 1 : a.name === b.name ? 0 : -1) })); -if(outputPath) fs.writeFileSync(outputPath, toBuffer(new TTFWriter(options).write(ttfFont))); if(argv.dumpmap) { fs.writeFileSync(argv.dumpmap, JSON.stringify(ttfFont.glyf.map(function(glyph){ return [glyph.name, glyph.unicode, glyph.advanceWidth === 0 && glyph.anchors && Object.keys(glyph.anchors).length > 0]})), 'utf8') }; @@ -58,4 +57,6 @@ if(argv.dumpfeature) { featurefile += '@GDEF_Simple = [' + gdef.simple.join(' \n') + '];\n@GDEF_Ligature =[' + gdef.ligature.join(' \n') + '];\n@GDEF_Mark = [' + gdef.mark.join(' \n') + '];\ntable GDEF { GlyphClassDef @GDEF_Simple, @GDEF_Ligature, @GDEF_Mark, ;} GDEF;' fs.writeFileSync(argv.dumpfeature, featurefile, 'utf8'); -}; \ No newline at end of file +}; + +if(outputPath) fs.writeFileSync(outputPath, toBuffer(new TTFWriter(options).write(ttfFont))); \ No newline at end of file diff --git a/glyphs/latin-basic-capital.patel b/glyphs/latin-basic-capital.patel index 011cda0..4a73c60 100644 --- a/glyphs/latin-basic-capital.patel +++ b/glyphs/latin-basic-capital.patel @@ -331,10 +331,10 @@ create-glyph 'Q' : glyph-construction include glyphs.O AS_BASE start-from MIDDLE 0 - line-to (MIDDLE + STROKE / 2) (-CAP * 0.2) - line-to (MIDDLE + STROKE / 2 + STROKE) (-CAP * 0.2) - line-to (MIDDLE + STROKE) 0 - line-to (MIDDLE + STROKE * (1 - 0.5 / 3)) (STROKE * 0.5) + line-to (MIDDLE + STROKE / 2 * CORRECTION_HX) (-CAP * 0.2) + line-to (MIDDLE + STROKE * 1.5 * CORRECTION_HX) (-CAP * 0.2) + line-to (MIDDLE + STROKE * CORRECTION_HX) 0 + line-to (MIDDLE + STROKE * (1 - 0.5 / 3) * CORRECTION_HX) (STROKE * 0.5) reverse-last define [UShape top bottom stroke] : glyph-construction diff --git a/glyphs/latin-basic-lower.patel b/glyphs/latin-basic-lower.patel index 0bba445..5108645 100644 --- a/glyphs/latin-basic-lower.patel +++ b/glyphs/latin-basic-lower.patel @@ -357,26 +357,24 @@ create-glyph 'i' : glyph-construction create-glyph 'dotlessj.straight' : glyph-construction dont-export include pMarks - set-anchor 'above' BASE (MIDDLE + JBALANCE - HALFSTROKE * CORRECTION_HX) XH - set-anchor 'overlay' BASE (MIDDLE + JBALANCE - HALFSTROKE * CORRECTION_HX) (XH / 2) - local center : MIDDLE + JBALANCE - local hookx : center - (WIDTH * 0.7) + OXHOOK - TAILADJX * globalTransform.yx + set-anchor 'above' BASE (MIDDLE + JBALANCE) XH + set-anchor 'overlay' BASE (MIDDLE + JBALANCE) (XH / 2) + local center : MIDDLE + JBALANCE + HALFSTROKE * CORRECTION_HX + local hookx : center - (WIDTH * 0.5) - STROKE * CORRECTION_HX + OXHOOK local turn : [mix center hookx 0.5] + CORRECTION_OMIDS local smb : (center - turn) * 1.2 include : spiro widths.rhs flat center XH [heading DOWNWARD] curl center (DESCENDER + smb) - arcvh 6 - g4 turn (DESCENDER + O) - quadcontrols (KAPPA_HOOK + 0.75 * globalTransform.yx + 0.1) 0 + hookend (DESCENDER + O) g4 hookx (DESCENDER + JHOOK) create-glyph 'dotlessj.serifed' : glyph-construction dont-export include pMarks include glyphs.'dotlessj.straight' AS_BASE - include : leftwardTopSerif (MIDDLE + JBALANCE - HALFSTROKE * CORRECTION_HX) XH LONGJUT + include : leftwardTopSerif (MIDDLE + JBALANCE) XH LONGJUT select-variant 'dotlessj' 0x237 'serifed' @@ -650,6 +648,8 @@ define [fBar left right y] : glyph-construction :.line-to [fallback right (MIDDLE + LONGJUT)] [fallback y XH] :.heads-to RIGHTWARD + +define fovershoot : O * 5 create-glyph 'longs.upright' : glyph-construction set-width WIDTH dont-export @@ -658,12 +658,12 @@ create-glyph 'longs.upright' : glyph-construction widths.center flat (MIDDLE - FBALANCE) 0 [heading UPWARD] curl (MIDDLE - FBALANCE) (CAP - FHOOK) - flat (MIDDLE - FBALANCE + HOOKX - 0.01) (CAP - HALFSTROKE - O * 6) [heading RIGHTWARD] - curl (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - O * 6) [heading RIGHTWARD] + flat (MIDDLE - FBALANCE + HOOKX - 0.01) (CAP - HALFSTROKE - fovershoot) [heading RIGHTWARD] + curl (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - fovershoot) [heading RIGHTWARD] define [eshHook attach] : glyph-construction include : create-stroke - :.start-from (attach.x - SHOOK * 2) (attach.y + HALFSTROKE + O * 6 - SHOOK) + :.start-from (attach.x - SHOOK * 2) (attach.y + HALFSTROKE + fovershoot - SHOOK) :.heads-to RIGHTWARD :.set-width HALFSTROKE HALFSTROKE :.arc-hv-to attach.x attach.y @@ -673,12 +673,12 @@ define [LongSShape top bottom hookx hooky fine] : glyph-construction local w [fallback fine STROKE] include : spiro widths.center w - flat (MIDDLE - hookx) (bottom + w + O * 6) [heading RIGHTWARD] - curl (MIDDLE - hookx + 0.01) (bottom + w + O * 6) [heading RIGHTWARD] + flat (MIDDLE - hookx) (bottom + w / 2 + fovershoot) [heading RIGHTWARD] + curl (MIDDLE - hookx + 0.01) (bottom + w / 2 + fovershoot) [heading RIGHTWARD] flat MIDDLE (bottom + hooky) curl MIDDLE (top - hooky) - flat (MIDDLE + hookx - 0.01) (top - w - O * 6) [heading RIGHTWARD] - curl (MIDDLE + hookx) (top - w - O * 6) [heading RIGHTWARD] + flat (MIDDLE + hookx - 0.01) (top - w / 2 - fovershoot) [heading RIGHTWARD] + curl (MIDDLE + hookx) (top - w / 2 - fovershoot) [heading RIGHTWARD] create-glyph 'longs.italic' : glyph-construction set-width WIDTH diff --git a/makefile b/makefile index 47faaa4..9dde9bc 100644 --- a/makefile +++ b/makefile @@ -24,23 +24,32 @@ FILES = $(SUPPORT_FILES) buildglyphs.js fonts : update $(TARGETS) +RMTARGETS = -@rm $@ $(subst $(OBJDIR)/.pass0-,$(OBJDIR)/,$(subst .ttf,.charmap,$@)) $(subst .ttf,.ab.fea,$@) PASS0C = -o $@ --dumpmap $(subst $(OBJDIR)/.pass0-,$(OBJDIR)/,$(subst .ttf,.charmap,$@)) --dumpfeature $(subst .ttf,.ab.fea,$@) # Pass 0 : file construction $(OBJDIR)/.pass0-iosevka-regular.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka w-book s-upright x-regular $(OBJDIR)/.pass0-iosevka-bold.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka w-bold s-upright x-bold $(OBJDIR)/.pass0-iosevka-italic.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka w-book s-italic x-italic $(OBJDIR)/.pass0-iosevka-bolditalic.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka w-bold s-italic x-bolditalic $(OBJDIR)/.pass0-iosevkacc-regular.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka cc w-book s-upright x-regular $(OBJDIR)/.pass0-iosevkacc-bold.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka cc w-bold s-upright x-bold $(OBJDIR)/.pass0-iosevkacc-italic.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka cc w-book s-italic x-italic $(OBJDIR)/.pass0-iosevkacc-bolditalic.ttf : $(FILES) | $(OBJDIR) + $(RMTARGETS) node generate $(PASS0C) iosevka cc w-bold s-italic x-bolditalic $(ABFEAT) : $(OBJDIR)/.pass0-%.ab.fea : $(OBJDIR)/.pass0-%.ttf diff --git a/parameters.toml b/parameters.toml index 00c7b85..4c5df24 100644 --- a/parameters.toml +++ b/parameters.toml @@ -47,7 +47,7 @@ tbalance2 = 30 rbalance = 30 sbalance = 0.51 kappa_hook = 0.7 -jbalance = 120 +jbalance = 50 fbalance = 6 onebalance = 30 @@ -81,7 +81,7 @@ sb = 50 stroke = 108 dotsize = 160 periodsize = 180 -essx = 1.12 +essx = 1.14 barpos = 0.51 ebarpos = 0.4 @@ -110,6 +110,7 @@ italicangle = 10 rhook = 80 tbalance = 50 ebarpos = 0.41 +jhook = 90 # Combinations [x-regular] diff --git a/pass1-cleanup.py b/pass1-cleanup.py index 7580b6b..2162550 100644 --- a/pass1-cleanup.py +++ b/pass1-cleanup.py @@ -29,8 +29,8 @@ for i in font: if len(sys.argv) <= 3: font.selection.all() font.replaceWithReference(2) - font.selection.select(("ranges", "unicode", None), 0x20, 0x7e) - font.unlinkReferences() + #font.selection.select(("ranges", "unicode", None), 0x20, 0x7e) + #font.unlinkReferences() # Outline simplify print "Simplify, pass 1: ", font.fontname diff --git a/testdrive/index.html b/testdrive/index.html index 806f7e7..8cffc59 100644 --- a/testdrive/index.html +++ b/testdrive/index.html @@ -159,6 +159,10 @@ border-top: 1px solid rgba(255, 0, 0, 0.1); border-bottom: 1px solid rgba(255, 0, 0, 0.1); } + .show .smp { + font-size: 1rem; + margin: 1rem 0; + } .show samp { display: flex; font-size: 1rem; @@ -227,7 +231,10 @@ {name: 'iosevkacc-italic', cls:'cc italic', display: 'CC-Italic'}, {name: 'iosevkacc-bolditalic', cls:'cc bold italic', display: 'CC-Bolditalic'} ]; - + var lipsum = ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur semper ipsum quam, at molestie libero euismod vitae. Etiam vehicula felis mi, et ultricies libero consequat at. Donec consequat, nunc id elementum tempor, lectus orci vulputate leo, eget lobortis lectus nulla sed orci. Donec in dolor non orci aliquet gravida. Nulla volutpat magna et nulla pretium, quis consequat nibh euismod. Suspendisse eget metus enim. Fusce vulputate scelerisque eros et consequat. Quisque dapibus accumsan augue, et semper lectus vehicula sit amet. Ut ornare venenatis tortor, non gravida tellus mattis interdum. In hac habitasse platea dictumst. Donec interdum commodo ex eu tincidunt. Curabitur non fermentum enim. Proin luctus orci ut commodo auctor. Pellentesque accumsan id sem eu semper. Sed non pharetra nibh. Vivamus mattis luctus arcu, a rutrum dui venenatis sit amet. aja ojo ojoined', + 'Troh tper es sos, bo slisxil spôrtjư uzx, cxital posteluf hrvatzem ili bi. Tenis lubôvijm roksăfnâvơi da din. Bo cxtir dajte lubim onă, dev ti silăju môrkva vecxer. Din om leto glfădju problêm. Sâm slơzxju răzumim vnimanie na, vsê ăzia kưdrju prôgram nô. Slôzxju zavoduf nơ den, hcê licơ sxkol toplju so. Vi knigis sidili polozxij bil, ne polnfju ovơcxjư dla, es ônâ mamâ pisajut mălôstis.', + 'Жят эним либриз аюдиам ад. Мыа ан одео нонумй опортэры, но дуо вэре эчжынт ыпикурэи. Ан вим алёквюам пыртенакж. Эжт но оратио факэтэ, дольорэ индоктум дыфинитеоным эжт ты.', + 'Κυεμ ορατιο δολορες υσυ εα, θε φιξ βωνορυμ σωνσεπθαμ, αδχυς δεφινιθιονεμ ιν εσθ. Υθ εσε ινιμισυς περ, περ ποσθυλανθ ινστρυσθιορ εα. Ναμ μυνδι θαθιων φερθερεμ νο, εσε ινερμις περφεσθο ετ μεα. Θε νες θωτα ρεφορμιδανς, ινερμις φασιλισις ετ σεα. Μελ λυδυς ταντας δελενιτι υθ, φις λιβερ σονγυε ηομερω ατ. Σεδ θριθανι συαφιθαθε γυβεργρεν ευ, ινθελλεγαμ συσιπιαντυρ δεφινιθιονεμ εα υσυ, ει κυο θαλε φερι ινθελλεγαμ. Φερο ασεντιορ θε μει, μαιορυμ γυβεργρεν αδ φιξ.']; var sampleSentences = [ {code: 'en', lang: 'English', sample: 'Shaw, those twelve beige hooks are joined if I patch a young, gooey mouth.'}, {lang: 'Powerline', sample: ' NORMAL \uE0B0 \uE0A0 master \uE0B1 glyphs/powerline.patel \uE0B0 dos \uE0B3 utf-8 \uE0B3 PatEL \uE0B2 2% \uE0B2 \uE0A1 1:1 '}, @@ -256,56 +263,56 @@ {code: 'uk', lang: 'Ukranian', sample: 'Чуєш їх, доцю, га? Кумедна ж ти, прощайся без ґольфів!'} ] - var divs = []; var links = []; - function Click(j){ + function Click(j, c){ return function(){ - for(var k = 0; k < divs.length; k++) if(k === j) { - divs[k].show() + for(var k = 0; k < links.length; k++) if(k === j) { links[k].addClass('active') } else { - divs[k].hide() links[k].removeClass('active') } + div[0].className = 'show ' + c; return false; } } - fonts.forEach(function(font, fontindex){ - var div = $('
').addClass('smp').html(s))
+ });
+ sampleSentences.forEach(function(record){
+ var sample = $('').attr('lang', record.code || '').attr('xml:lang', record.code || '').append('' + record.lang + '' + record.sample + '');
+ div.append(sample);
+ });
+ $.getJSON(fonts[0].name + '.charmap', function(data){
+ var uhash = [];
+ var whash = [];
+ for(var j = 0; j < data.length; j++) {
+ var unicodes = data[j][1];
+ if(unicodes && unicodes.length) for(var k = 0; k < unicodes.length; k++){
+ uhash[unicodes[k]] = data[j][0].trim()
+ whash[unicodes[k]] = data[j][2]
}
- for(var block = 0; block < (65536 / BLOCKSIZE); block++) {
- var blockdiv = $('' + (whash[j] ? '')
}
- if(hasGlyphInThisBlock) {
- for(j = block * BLOCKSIZE; j < (block + 1) * BLOCKSIZE; j++) {
- if(j % 16 === 0) blockdiv.append('' + padzero(j.toString(16).toUpperCase(), 4) + '')
- blockdiv.append('' + (whash[j] ? '')
- }
- div.append(blockdiv)
- }
- };
- });
- divs.push(div);
- $('body').append(div);
-
+ div.append(blockdiv)
+ }
+ };
+ });
+
+ $('body').append(div);
+ fonts.forEach(function(font, fontindex){
var a = $('').attr('href', '#').append(font.display);
- a.on('click', Click(fontindex));
+ a.on('click', Click(fontindex, font.cls));
links.push(a)
$('#links').append(a);
});