├── .gitignore ├── AUTHORS.txt ├── CONTRIBUTORS.txt ├── FONTLOG.txt ├── OFL.txt ├── README.md ├── docs ├── 2018-10-22-evaluation │ ├── README.md │ └── assets │ │ ├── A.png │ │ ├── axen.png │ │ ├── brackets.png │ │ ├── caslon-arabic.png │ │ ├── caslon-greek.png │ │ ├── caslon-hebrew.png │ │ ├── falafel.png │ │ ├── incompatible-glyphs.png │ │ ├── italics.png │ │ ├── libre-caslon-relative_sizing.png │ │ ├── libre_caslon-og_caslon.png │ │ ├── libre_caslon-spectral.png │ │ ├── libre_caslon-times_new_roman.png │ │ ├── ogonek.png │ │ ├── relative-size-analysis.png │ │ ├── smooth_and_sharp.png │ │ ├── smooth_and_sharp2.png │ │ ├── specimen-1.png │ │ └── x.png ├── 2018-10-22-experiments │ ├── README.md │ └── assets │ │ ├── blazeface-opsz.gif │ │ ├── bradley-djr-opsz.gif │ │ ├── g-skews.png │ │ ├── libre-caslon-display-scaled.png │ │ ├── libre-caslon-opsz-scaled-test.png │ │ ├── libre-caslon-opsz-scaling-instance-test.gif │ │ ├── libre-caslon-opsz-scaling.png │ │ ├── libre-caslon-scaled.png │ │ ├── libre_caslon-size_matching.png │ │ ├── minion-opsz.gif │ │ ├── scaled-lc-display.png │ │ ├── tnr_tinos-relative_sizing.png │ │ └── zeitung-opsz.gif ├── 2018-10-26-making-romans-compatible │ ├── README.md │ └── assets │ │ ├── W-anchors.png │ │ ├── broken-5.png │ │ ├── fix-ligatures.gif │ │ ├── fixed-5.png │ │ ├── fontinfo-problem.png │ │ ├── incompatible-glyphs-new.png │ │ ├── incompatible-glyphs.png │ │ ├── logical-5.png │ │ ├── no-incompatible-masters.png │ │ ├── vf-fontview.gif │ │ ├── vf-generate-fail.gif │ │ └── vf-generate-success.gif ├── 2018-10-29-fixing-fontbakery-errors │ ├── README.md │ └── assets │ │ ├── 2018-10-31-16-11-30.png │ │ ├── 2018-11-05-11-47-06.png │ │ ├── 2018-11-05-12-06-01.png │ │ ├── 2018-11-05-12-48-01.png │ │ ├── 2018-11-05-12-48-09.png │ │ ├── 2018-11-05-14-01-30.png │ │ ├── 2018-11-07-14-38-15.png │ │ ├── 2018-11-08-11-19-01.png │ │ ├── 2018-11-08-12-01-13.png │ │ ├── 2018-11-08-16-12-11.png │ │ ├── 2018-11-08-16-12-32.png │ │ ├── axis-error.gif │ │ ├── axis-fixed.gif │ │ ├── braceleft-contour.png │ │ ├── glyphsapp-instance.png │ │ └── parenleft-contour.png ├── 2018-11-09-italic-qa │ ├── README.md │ ├── assets │ │ ├── 2018-11-08-18-43-40.png │ │ ├── 2018-11-21-12-21-46.png │ │ ├── 2018-11-21-12-24-35.png │ │ ├── 2018-11-21-12-26-39.png │ │ ├── 2018-11-21-12-27-00.png │ │ ├── 2018-11-21-12-28-28.png │ │ ├── 2018-11-21-12-32-56.png │ │ └── italic-style-linking.gif │ ├── charset-italic.txt │ └── charset-roman.txt ├── 2018-11-19-finding-a-regular-weight │ ├── README.md │ ├── assets │ │ ├── 2018-11-20-22-50-46.png │ │ ├── 2018-11-21-11-40-42.png │ │ ├── libre-caslon-finding_reg_wght.gif │ │ ├── libre-caslon-reg_wght-test-01.png │ │ ├── libre-caslon-reg_wght-test-02.png │ │ ├── libre-caslon-reg_wght-test-03.png │ │ ├── libre-caslon-reg_wght-test-04.png │ │ ├── libre-caslon-reg_wght-test-05.png │ │ ├── weight-test-111918.png │ │ ├── weight-test-book_text-111918.png │ │ ├── weight-test-book_text-450og-111918.png │ │ ├── weight-test-one_page-pangram-roman_italic-112018.pdf │ │ ├── weight-test-one_page-printed-112018.jpg │ │ ├── weight-test-one_page-roman_italic-112018.pdf │ │ ├── weight-test-roman_italic-111918.gif │ │ ├── weight-test-roman_italic-111918.mp4 │ │ ├── weight-test-roman_italic-450og-111918.png │ │ ├── weight-test-roman_italic-noblur-111918.mp4 │ │ ├── weight-test-roman_italic-noblur-big-111918.gif │ │ ├── weight-test-roman_italic-noblur-big-111918.mp4 │ │ ├── weight-test-spacing_string-111918.png │ │ ├── weight-test-spacing_string-450og-111918.png │ │ └── weight-test-spacing_string_2-111918.png │ └── weight-test │ │ ├── LibreCaslonText-Italic.ttf │ │ ├── LibreCaslonText-VF.ttf │ │ ├── libre-caslon-weight-test-multiple_scales-roman_italic-111918.py │ │ └── libre-caslon-weight-test-simple-111918.py ├── 2018-11-19-spacing-improvements │ ├── README.md │ └── assets │ │ ├── 2018-11-07-14-38-15.png │ │ ├── 2018-11-08-16-12-11.png │ │ ├── 2018-11-08-16-12-32.png │ │ ├── 2019-01-23-13-19-31.png │ │ ├── 2019-01-23-13-19-38.png │ │ ├── 2019-01-23-13-19-44.png │ │ ├── 2019-01-23-15-33-42.png │ │ ├── 2019-01-23-19-00-30.png │ │ ├── README.md │ │ ├── n-width-2.gif │ │ ├── n-width.gif │ │ └── new-l.gif ├── 2018-12-09-additional-qa │ ├── README.md │ └── assets │ │ ├── 2018-12-10-20-40-27.png │ │ ├── 2018-12-10-20-50-24.png │ │ ├── 2019-01-07-12-19-51.png │ │ ├── 2019-01-07-12-21-40.png │ │ ├── 2019-01-07-12-27-47.png │ │ ├── 2019-01-07-12-28-50.png │ │ ├── 2019-01-07-12-30-56.png │ │ ├── 2019-01-07-12-31-36.png │ │ ├── 2019-01-07-12-34-39.png │ │ ├── 2019-01-07-12-37-02.png │ │ ├── 2019-01-07-12-57-22.png │ │ ├── 2019-01-07-13-05-56.png │ │ ├── 2019-01-07-14-08-51.png │ │ ├── 2019-01-07-14-37-35.png │ │ ├── 2019-01-07-14-39-28.png │ │ ├── 2019-01-07-14-40-13.png │ │ ├── 2019-01-07-14-57-50.png │ │ ├── 2019-01-07-14-59-04.png │ │ ├── 2019-01-07-15-03-59.png │ │ ├── 2019-01-07-15-04-22.png │ │ ├── 2019-01-07-15-05-03.png │ │ ├── 2019-01-07-15-10-50.png │ │ ├── 2019-01-07-15-11-43.png │ │ ├── 2019-01-07-15-11-52.png │ │ ├── 2019-01-07-15-56-08.png │ │ ├── 2019-01-07-18-04-29.png │ │ ├── 2019-01-07-18-04-56.png │ │ ├── 2019-01-07-18-15-13.png │ │ ├── 2019-01-07-18-19-42.png │ │ ├── 2019-01-07-18-21-21.png │ │ ├── 2019-01-07-18-27-18.png │ │ ├── 2019-01-07-18-29-10.png │ │ ├── 2019-01-07-18-31-08.png │ │ ├── 2019-01-07-18-40-01.png │ │ ├── 2019-01-08-11-04-57.png │ │ ├── 2019-01-08-11-05-08.png │ │ ├── 2019-01-08-11-13-36.png │ │ ├── 2019-01-08-11-13-49.png │ │ ├── 2019-01-08-11-25-06.png │ │ ├── 2019-01-08-11-29-47.png │ │ ├── 2019-01-08-11-30-04.png │ │ ├── 2019-01-08-11-33-48.png │ │ ├── 2019-01-08-11-42-18.png │ │ ├── 2019-01-08-14-56-06.png │ │ ├── 2019-01-08-15-03-30.png │ │ ├── 2019-01-08-15-11-18.png │ │ ├── 2019-01-08-15-13-52.png │ │ ├── 2019-01-08-15-29-43.png │ │ ├── 2019-01-08-15-36-38.png │ │ ├── 2019-01-08-16-13-38.png │ │ ├── 2019-01-08-16-15-31.png │ │ ├── 2019-01-08-16-39-00.png │ │ ├── 2019-01-08-16-50-05.png │ │ ├── 2019-01-08-16-51-47.png │ │ ├── 2019-01-09-10-03-37.png │ │ ├── 2019-01-09-10-08-34.png │ │ ├── 2019-01-09-10-41-45.png │ │ ├── 2019-01-09-11-51-08.png │ │ ├── 2019-01-09-13-13-10.png │ │ ├── 2019-01-09-13-13-50.png │ │ ├── 2019-01-09-13-14-25.png │ │ ├── 2019-01-09-13-21-08.png │ │ ├── 2019-01-09-13-43-21.png │ │ ├── 2019-01-09-13-44-41.png │ │ ├── 2019-01-09-13-45-59.png │ │ ├── 2019-01-09-13-48-27.png │ │ ├── 2019-01-09-13-50-10.png │ │ ├── 2019-01-09-13-56-21.png │ │ ├── 2019-01-09-13-59-21.png │ │ ├── 2019-01-09-14-01-33.png │ │ ├── 2019-01-09-14-04-13.png │ │ ├── 2019-01-09-14-04-49.png │ │ ├── 2019-01-09-14-06-05.png │ │ ├── 2019-01-09-14-11-17.png │ │ ├── 2019-01-09-14-43-35.png │ │ ├── 2019-01-09-14-52-32.png │ │ ├── 2019-01-09-14-55-49.png │ │ ├── 2019-01-10-09-43-49.png │ │ ├── 2019-01-10-09-49-37.png │ │ ├── 2019-01-10-09-51-08.png │ │ ├── 2019-01-15-15-38-24.png │ │ ├── 2019-01-23-15-47-34.png │ │ ├── 2019-01-23-18-51-04.png │ │ ├── 2019-01-23-18-51-15.png │ │ ├── Q.gif │ │ ├── bracket.gif │ │ ├── cent.gif │ │ ├── cent2.gif │ │ ├── charset-tall3.png │ │ ├── curve-point.gif │ │ ├── inktrap-u.gif │ │ ├── round-t.gif │ │ ├── s-inflections.gif │ │ ├── s-shapes.gif │ │ ├── tabular.gif │ │ ├── tabular2.gif │ │ └── x.gif ├── 2018-12-10-opening-a-pull-request │ ├── README.md │ └── assets │ │ └── 2018-12-10-12-41-54.png └── 2020-04-22-finishing │ ├── README.md │ ├── assets │ ├── 2020-04-30-23-02-22.png │ ├── 2020-04-30-23-34-31.png │ ├── 2020-05-04-10-29-11.png │ └── 2020-05-04-10-29-30.png │ └── vf-build.gif ├── fonts ├── LibreCaslonText-Italic[wght].ttf ├── LibreCaslonText[wght].ttf └── static │ ├── LibreCaslonText-Bold.ttf │ ├── LibreCaslonText-BoldItalic.ttf │ ├── LibreCaslonText-Italic.ttf │ ├── LibreCaslonText-Medium.ttf │ ├── LibreCaslonText-MediumItalic.ttf │ ├── LibreCaslonText-Regular.ttf │ ├── LibreCaslonText-SemiBold.ttf │ └── LibreCaslonText-SemiBoldItalic.ttf ├── gfonts-description.html ├── proofs ├── 191214_LibreCaslon_BoldItalic.pdf ├── 191214_LibreCaslon_Italic_forcomparrison.pdf ├── 191220_LibreCaslon_punctuation_diacritics_symbols.pdf ├── 191221_LibreCaslon_BoldItalic.pdf ├── 191221_LibreCaslon_RegularItalic_forcomparrison.pdf ├── 200103_LibreCaslon_BoldItalic.pdf ├── 200103_LibreCaslon_RegularItalic_withcomments.pdf ├── 200107_LibreCaslon_RegularItalic.pdf ├── 200130_LibreCaslon_Bold_Italic_spacing.pdf ├── 200130_LibreCaslon_Italic_spacing.pdf ├── 200222_LibreCaslon_Italic_kerning_uc2uc.pdf ├── 200224_LibreCaslon_Italic_kerning_lc2lc.pdf ├── 200229_LibreCaslon_Italic_kerning_uc2lc.pdf ├── 200328_kerning_proof_LibreCaslon_BoldItalic.pdf └── 200328_kerning_proof_LibreCaslon_Italic.pdf ├── requirements.freeze.txt ├── requirements.txt ├── sample.jpg └── sources ├── LibreCaslonText-Italic.glyphs ├── LibreCaslonText.glyphs ├── build.sh ├── deprecated └── scripts │ ├── build-full.sh │ ├── build-statics.sh │ ├── helpers │ ├── NAMEpatch.xml │ ├── STATpatch.xml │ ├── check-tnum-widths.py │ ├── distdate-and-fontbake.py │ ├── distdate.py │ ├── edit-master-weight.py │ ├── fontbake.py │ ├── get-font-name.py │ ├── get-italic-name.py │ └── remote-glyphs-test.py │ └── requirements.txt ├── scripts ├── check-line-length.glyphs.py ├── set-metrics.py └── set-stat-table.py ├── specimen ├── charset-dark.png ├── charset-light.jpg ├── charset-tall3.png ├── drawbot-librecaslon.py └── glyphNames.py └── update-gfonts-repo.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *(Autosaved)* 3 | .vscode 4 | .vscode/* 5 | dist/*.* 6 | master_ufo 7 | instance_ufo 8 | instance_ttf 9 | instance_otf 10 | autohinted/*.* 11 | virtual_env/* 12 | venv 13 | -------------------------------------------------------------------------------- /AUTHORS.txt: -------------------------------------------------------------------------------- 1 | # This is the official list of project authors for copyright purposes. 2 | # This file is distinct from the CONTRIBUTORS.txt file. 3 | # See the latter for an explanation. 4 | # 5 | # Names should be added to this file as: 6 | # Name or Organization 7 | 8 | Pablo Impallari 9 | Rodrigo Fuenzalida -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | # This is the list of people who have contributed to this project, 2 | # and includes those not listed in AUTHORS.txt because they are not 3 | # copyright authors. For example, company employees may be listed 4 | # here because their company holds the copyright and is listed there. 5 | # 6 | # When adding J Random Contributor's name to this file, either J's 7 | # name or J's organization's name should be added to AUTHORS.txt 8 | # 9 | # Names should be added to this file as: 10 | # Name 11 | 12 | Pablo Impallari 13 | Rodrigo Fuenzalida 14 | Stephen Nixon 15 | Katja Schimmel 16 | -------------------------------------------------------------------------------- /FONTLOG.txt: -------------------------------------------------------------------------------- 1 | FONTLOG for the Libre Caslon fonts 2 | 3 | This file provides detailed information on the Libre Caslon Font Software. 4 | 5 | This information should be distributed along with the Libre Caslon fonts and any derivative works. 6 | 7 | Basic Font Information 8 | 9 | The Libre Caslon fonts are unique Caslons. They are different to all other Caslons out there. 10 | 11 | When we were faced with the challenge of making a new Caslon, we asked ourselves: How can we make them different, to bring something new to the table? 12 | We realized that most Caslon revivals were based on 18-Century specimens and that there was a whole genre of Caslons that has been so far ignored: The alluring hand-lettered American Caslons of 1960s. 13 | 14 | This was a captivating subject to investigate. Caslon was the very first alphabet that lettering artists learned to draw, so they all were very familiar with it. Our wonder led us to find countless examples of beautifully crafted and elegant vintage ads and hand lettering books. Among those many books, there were two that outshine the rest: One is "Lettering for Advertising" by Mortimer Leach, and the other one is "How to Render Roman Letter Forms" by Tommy Thompson. Both of these books are excellent, highly recommended for all those who want to learn lettering. 15 | 16 | So, instead of making just another revival of the types of William Caslon, we preferred to pay homage to 60's lettering artist's Caslon interpretations. And that's how Libre Caslon become different to all other Caslons. (Not better or worse, just different.) 17 | 18 | We also decided to make two size-specific subfamilies: 19 | - [Libre Caslon Display](https://github.com/impallari/Libre-Caslon-Display/), a high-contrast Caslon for big headlines. 20 | - [Libre Caslon Text](https://github.com/impallari/Libre-Caslon-Text/), specifically optimized for web body text. 21 | 22 | Libre Caslon Text also includes some nice, extra Open Type features: 23 | - 17 ligatures on the regular styles, and 20 ligatures on the italic styles 24 | - Lining Proportional Numbers (Default style). 25 | - Lining Tabular Numbers and punctuation. 26 | - Old Style Proportional Numbers. 27 | - Inferiors, Superiors, Numerators, Denominators. 28 | - Fractions. 29 | - Ordinals. 30 | - The italic style includes an alternate Ampersand (ss01) 31 | 32 | The Libre Caslon Fonts covers all 104 Latin Languages: Afar, Afrikaans, Albanian, Azerbaijani, Basque, Belarusian, Bislama, Bosnian, Breton, Catalan, Chamorro, Chichewa, Comorian, Croatian, Czech, Danish, Dutch, English, Esperanto, Estonian, Faroese, Fijian, Filipino/Tagalog, Finnish, Flemish, French, Gaelic (Irish / Manx / Scottish), Gagauz, German, Gikuyu, Gilbertese/Kiribati, Greenlandic, Guarani, Haitian_Creole, Hawaiian, Hungarian, Icelandic, Igo/Igbo, Indonesian, Irish, Italian, Javanese, Kashubian, Kinyarwanda, Kirundi, Latin, Latvian, Lithuanian, Luba/Ciluba/Kasai, Luxembourgish, Malagasy, Malay, Maltese, Maori, Marquesan, Marshallese, Moldovan/Moldovian/Romanian, Montenegrin, Nauruan, Ndebele, Norwegian, Oromo, Palauan/Belauan, Polish, Portuguese, Quechua, Romanian, Romansh, Sami, Samoan, Sango, Serbian, Sesotho, Setswana/Sitswana/Tswana, Seychellois_Creole, SiSwati/Swati/Swazi, Silesian, Slovak, Slovenian, Somali, Sorbian, Sotho, Spanish, Swahili, Swedish, Tahitian, Tetum, Tok_Pisin, Tongan, Tsonga, Tswana, Tuareg/Berber, Turkish, Turkmen, Tuvaluan, Uzbek/Usbek, Wallisian, Walloon, Welsh, Xhosa, Yoruba, Zulu. 33 | 34 | Documentation can be found at https://web.archive.org/web/20171123191201/http://www.impallari.com:80/projects/overview/libre-caslon-display-and-text 35 | 36 | Join the project at: 37 | https://github.com/thundernixon/libre-caslon 38 | 39 | ChangeLog 40 | 41 | 10 Dec 2018 (Stephen Nixon) Libre Caslon Text v2.000 42 | - Rescale against UPM to be closer in sizing to default serif fonts (e.g. Times, Times New Roman, & Tinos) 43 | - Slightly increase Roman Regular master weight to better match Italic 44 | - Generate variable font from Roman masters, with beta of TTFautohint for variable fonts (v1.8.1.43-b0c9) 45 | - Rebuild Italic static TTF with latest TTFautohint (v1.8.2) 46 | 47 | 25 Jul 2016 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon Text v1.002 48 | - Fixing Naming and Metadata bugs 49 | 50 | 27 Jul 2015 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon Text v1.001 51 | - Removed RFN 52 | - Rehinted using latest ttfautohint version (v1.3) 53 | 54 | 14 Mar 2013 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon Text v1.00 55 | - Ikerned and TTF Hinted 56 | - Added Tabular Numbers 57 | 58 | 07 Mar 2013 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon v0.34 59 | - Completed charset on the Text styles 60 | - Normalized Vertical Metrics 61 | - Lots of bugs fixed 62 | - Text Styles (Regular, Italic and Bold) are ready for iKern 63 | 64 | 06 Dec 2012 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon Text Italic v0.03 65 | - First draft of the Text Italic version. 66 | 67 | 19 Nov 2012 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon v 0.22 68 | - Lower and Uppercase 69 | - Text Bold Style added 70 | - Some tentative kerning in the Display version 71 | - OT features calt and ss01 72 | 73 | 08 Nov 2012 (Pablo Impallari, Rodrigo Fuenzalida) Libre Caslon v0.03 74 | - Initial release 75 | - a-z lowercase only 76 | - Display and Text styles 77 | 78 | Acknowledgements 79 | 80 | If you make modifications be sure to add your name (N), 81 | email (E), web-address (if you have one) (W) and 82 | description (D). This list is in alphabetical order. 83 | 84 | N: Pablo Impallari 85 | E: impallari@gmail.com 86 | W: http://www.impallari.com 87 | D: Designer 88 | 89 | N: Rodrigo Fuenzalida 90 | E: hello@rfuenzalida.com 91 | W: http://www.rfuenzalida.com 92 | D: Designer 93 | 94 | N: Stephen Nixon 95 | E: stephen@thundernixon.com 96 | W: http://www.thundernixon.com 97 | D: Variable Font Mastering 98 | -------------------------------------------------------------------------------- /OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2018 The Libre Caslon Text Project Authors (https://github.com/thundernixon/Libre-Caslon) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Libre Caslon Text Fonts 2 | ====================== 3 | 4 |
5 | Background Information 6 | 7 | # Description 8 | 9 | The original description of these fonts, borrowed from the Impalari repo, is: 10 | 11 | > The Libre Caslon fonts are unique Caslons. They are different to all other Caslons out there. 12 | > 13 | > When we were faced with the challenge of making a new Caslon, we asked ourselves: How can we make them different, to bring something new to the table? 14 | > > 15 | > We realized that most Caslon revivals were based on 18-Century specimens and that there was a whole genre of Caslons that has been so far ignored: The alluring hand-lettered American Caslons of 1960s. 16 | > 17 | > This was a captivating subject to investigate. Caslon was the very first alphabet that lettering artists learned to draw, so they all were very familiar with it. Our wonder led us to find countless examples of beautifully crafted and elegant vintage ads and hand lettering books. Among those many books, there were two that outshine the rest: One is "Lettering for Advertising" by Mortimer Leach, and the other one is "How to Render Roman Letter Forms" by Tommy Thompson. Both of these books are excellent, highly recommended for all those who want to learn lettering. 18 | > 19 | > So, instead of making just another revival of the types of William Caslon, we preferred to pay homage to 60's lettering artist's Caslon interpretations. And that's how Libre Caslon become different to all other Caslons. (Not better or worse, just different). 20 | > 21 | > We also decided to make two size-specific subfamilies: 22 | > - [Libre Caslon Display](https://github.com/impallari/Libre-Caslon-Display/), a high-contrast Caslon for big headlines. 23 | > - [Libre Caslon Text](https://github.com/impallari/Libre-Caslon-Text/), specifically optimized for web body text. 24 | > 25 | > ## Libre Caslon Text OpenType Features 26 | > 27 | > Libre Caslon Text also include some nice, extra Open Type features: 28 | > - 17 ligatures on the regular styles, and 20 ligatures on the italic styles 29 | > - Lining Proportional Numbers (Default style). 30 | > - Lining Tabular Numbers and punctuation. 31 | > - Old Style Proportional Numbers. 32 | > - Inferiors, Superiors, Numerators, Denominators. 33 | > - Fractions. 34 | > - Ordinals. 35 | > - The italic style includes an alternate Ampersand (ss01) 36 | > 37 | > ## License 38 | > 39 | > - Libre Caslon is licensed under the SIL Open Font License v1.1 () 40 | > - To view the copyright and specific terms and conditions please refer to [OFL.txt](https://github.com/impallari/Libre-Caslon-Text/blob/master/OFL.txt) 41 | > 42 | > ## Language Coverage 43 | > 44 | > The Libre Caslon Fonts covers all 104 Latin Languages: Afar, Afrikaans, Albanian, Azerbaijani, Basque, Belarusian, Bislama, Bosnian, Breton, Catalan, Chamorro, Chichewa, Comorian, Croatian, Czech, Danish, Dutch, English, Esperanto, Estonian, Faroese, Fijian, Filipino/Tagalog, Finnish, Flemish, French, Gaelic (Irish / Manx / Scottish), Gagauz, German, Gikuyu, Gilbertese/Kiribati, Greenlandic, Guarani, Haitian_Creole, Hawaiian, Hungarian, Icelandic, Igo/Igbo, Indonesian, Irish, Italian, Javanese, Kashubian, Kinyarwanda, Kirundi, Latin, Latvian, Lithuanian, Luba/Ciluba/Kasai, Luxembourgish, Malagasy, Malay, Maltese, Maori, Marquesan, Marshallese, Moldovan/Moldovian/Romanian, Montenegrin, Nauruan, Ndebele, Norwegian, Oromo, Palauan/Belauan, Polish, Portuguese, Quechua, Romanian, Romansh, Sami, Samoan, Sango, Serbian, Sesotho, Setswana/Sitswana/Tswana, Seychellois_Creole, SiSwati/Swati/Swazi, Silesian, Slovak, Slovenian, Somali, Sorbian, Sotho, Spanish, Swahili, Swedish, Tahitian, Tetum, Tok_Pisin, Tongan, Tsonga, Tswana, Tuareg/Berber, Turkish, Turkmen, Tuvaluan, Uzbek/Usbek, Wallisian, Walloon, Welsh, Xhosa, Yoruba, Zulu. 45 | > 46 | > ## Authors 47 | > 48 | > [Pablo Impallari](http://www.impallari.com) and [Rodrigo Fuenzalida](http://www.rfuenzalida.com) 49 | 50 | This project was unchanged for some time, and Stephen Nixon was later contracted to master it as a Variable Font. 51 | 52 | Impallari's website is no longer available at its normal domain, but it can be seen in its most recent active form via Archive.org's Wayback Machine: [Libre Caslon Display and Text, Impallari.com, 26 Dec 2017](https://web.archive.org/web/20171226183904/http://www.impallari.com:80/projects/overview/libre-caslon-dis 53 |
54 | 55 |
56 | Variable font upgrade notes 57 | 58 | # Project notes 59 | 60 | Notes were taken throughout the variable font upgrade project and added to the [docs](/docs) directory. I tend to take notes while working anyway, in order to think through problems and record solutions for later reference. In this project, I have included these in the repo so that others might find references to solve similar problems, especially because variable font-making processes are relatively new, and there is a general scarcity of online knowledge on font mastering. Because they were often made alongside work, the notes can at times be a bit disjointed. Hopefully they are still helpful to others! 61 | 62 | If you have any questions about the project or the notes, feel free to [file an issue](https://github.com/thundernixon/Libre-Caslon/issues) or to reach out to Stephen Nixon via Twitter ([@thundernixon](https://twitter.com/thundernixon)) or other social media (typically also @thundernixon). 63 | 64 |
65 | 66 |
67 | Build Instructions 68 | 69 | # Build Process 70 | 71 | The sources can be built with FontMake, but I've put together some specific build scripts to pass the fonts through some steps that fix metadata issues. 72 | 73 | The build process requires you to open up a terminal and navigate to this project's directory. 74 | 75 | NOTE: the build scripts are written to be run on macOS. If you are building on another platform, they may require some adjustment. 76 | 77 | ## Step 1: Install Requirements 78 | 79 | I suggest using a Python virtual environment to build this project. If you've never set up a virtual environment before, it's worthwhile because it will save you time in the future. [Read more about virtual environments in this guide](https://towardsdatascience.com/virtual-environments-104c62d48c54). 80 | 81 | First, set up a virtual environment with: 82 | 83 | ``` 84 | python3 -m venv venv 85 | ``` 86 | 87 | Here, `venv` will be the name of the virtual environment and of the folder holding its dependencies. You need to activate it with: 88 | 89 | ``` 90 | source venv/bin/activate 91 | ``` 92 | 93 | To operate the scripts within this repo, install requirements by pointing pip to the `requirements.txt` file: 94 | 95 | ``` 96 | pip install -r requirements.txt 97 | ``` 98 | 99 | (If you wish to use similar dependencies on another project, you can just copy the same `requirements.txt` file.) 100 | 101 | To exit out of the virtual environment, you can use the command `deactivate`, or simply close out of that terminal session (just remember to start it up again when you come back). 102 | 103 | ## Step 2: Give permissions to build scripts 104 | 105 | The first time you run the build, you will need to give run permissions to the build scripts. 106 | 107 | On the command line, navigate to the project folder (`cd Encode-Sans`), and then give permissions to the shell scripts with: 108 | 109 | ``` 110 | chmod -R +x sources 111 | ``` 112 | 113 | The `-R` applies your permission to each of the shell scripts in the directory, and the `+x` adds execute permissions. Before you do this for shell scripts, you should probably take a look through their contents, to be sure they aren't doing anything bad. The ones in this repo simply build from the GlyphsApp sources and apply various fixes to the results. 114 | 115 | ## Step 3: Run the build scripts! 116 | 117 | You can then build sources by running shell scripts in `sources/scripts/`. 118 | 119 | Build the variable & static fonts by running the following command while at the root of the directory: 120 | 121 | ``` 122 | sources/build.sh 123 | ``` 124 | 125 |
126 | 127 | --- 128 | 129 | ![](sample.jpg) 130 | -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/README.md: -------------------------------------------------------------------------------- 1 | # General Evaluation of Libre Caslon, as of October 2018 2 | 3 | As of Oct 2018, Libre Caslon Text has relatively-complete character sets in Regular, Bold, and Regular Italic masters. These fonts have been converted from `.vfb` (FontLab) files into `.ufo`, then `.glyphs`. 4 | 5 | I am now proofing them to judge roughly how much effort it would be to complete the family and publish them. 6 | 7 | It’s an inviting basis for a typeface. It’s crisp and looks relatively modern, and it some three styles already drawn: Regular to Bold basis in the romans, and has an italic with a very heavy slant and cursive forms. However, like any work, it has some issues that could be improved. I'll go through the ones I notice first, as a basis for potential improvment work. 8 | 9 | Without knowing exactly the sources Pablo Impallari used for the work so far, I am basing some of my critique on this Caslon specimen: [Archive.org: A specimen of printing types by Caslon, William, 1754-1833](https://archive.org/details/specimenofprinti00caslrich/page/n5) 10 | 11 | --- 12 | 13 | UPDATE, Oct 29: I should have read the original README. :| As it says: 14 | 15 | > When we were faced with the challenge of making a new Caslon, we asked ourselves: How can we make them different, to bring something new to the table? We realized that most Caslon revivals were based on 18 Century's specimens, and that there was a whole genre of Caslons that has been so far ignored: The alluring hand-lettered American Caslons of 1960's. 16 | 17 | > This was a captivating subject to investigate. Caslon was the very first alphabet that lettering artists learned to draw, so they all were very familiar with it. Our wonder led us to find countless examples of beautifully crafted and elegant vintage ads and hand lettering books. Among those many books, there were two that outshine the rest: One is "Lettering for Advertising" by Mortimer Leach, and the other one is "How to Render Roman Letter Forms" by Tommy Thompson. Both of these books are excellent, highly recommended for all those who want to learn lettering. 18 | 19 | So ... I will search for copies of these books (they aren't easily found online), and reserve most of my design judgments or visual changes for when I am able to better understand the source material. 20 | 21 | --- 22 | 23 | ## Technical Issues 24 | 25 | ### Uneven widths 26 | 27 | The `n` in the roman appears overly-narrow, in comparison to other letters. This means, by extension, that the spacing is called into question (because spacing tends to be based on the width of the `n` and `o`). 28 | 29 | ### Inconsistent letterforms 30 | 31 | Most of the serifs are "wedge-style" serifs, with sharp angles connecting serifs to stems. However, most of the diagonal letters, `A, K, V, W, X, Y` in regular, Italic, and Bold and the `v, w, x, y` in regular and Bold have smooth serif brackets. 32 | 33 | ![inconsistent serif brackets](assets/brackets.png) 34 | 35 | ![Letters with smooth vs sharp brackets](assets/smooth_and_sharp2.png) 36 | 37 | The design could also be thought of as a collection of smooth and sharp connections with more details taken in mind, such as the ball terminals of letters. If the scope is broadened like this, the design is slightly more balanced, though still, I would argue, could benefit from a more consistent approach to details. However, the consistency of serif brackets is an obvious detail to be harmonized, whereas terminals are separate enough visually, they can probably be safe to leave as-is. 38 | 39 | ![Letters with smooth vs sharp details](assets/smooth_and_sharp.png) 40 | 41 | There's no rule saying a typeface _can't_ have different forms of serif brackets, but the inconsistency seems arbitrary. If a typeface is going to be a modern spin on a classic style by sharpening brackets, it makes more sense to be consistent, as [Spectral](https://fonts.google.com/specimen/Spectral) is to the original model of Plantin type. 42 | 43 | ![libre caslon vs spectral](assets/libre_caslon-spectral.png) 44 | 45 | ### Some drawings need revision 46 | 47 | The `A` has an odd top notch which doesn't meet up. Additionally, this is much more accentuated than Caslon `A` notches that I have seen in historical references. 48 | 49 | ![](assets/axen.png) 50 | 51 | ![The thin legs are lined up in the wrong way – they should be offset in the opposite direction](assets/x.png) 52 | 53 | _The thin legs are lined up in the wrong way – they should be offset in the opposite direction]_ 54 | 55 | ![Why doesn’t the top of the A align? This could be decomposed to work better.](assets/A.png) 56 | 57 | _Why doesn’t the top of the A align? This could be two contours in order to work better._ 58 | 59 | ![These ogoneks should be less “stuck on”](assets/ogonek.png) 60 | 61 | The `X` and `x` have misaligned thin legs. 62 | 63 | ### Uneven slopes in Italic 64 | 65 | The `*f*` is too visually sloped overall, because at its minimum slope, it matches the slope of straight stems in letters like `*l*`, whereas in historical sources, the midpoint is at a more gradual slope so that the overall shape matches the flow of surrounding letters. 66 | 67 | ![These fs are overly slanted](assets/falafel.png) 68 | 69 | ### The Regular & Italic styles seems overly light and thin for a "Text" typeface 70 | 71 | When compared to an original specimen of text type from Caslon, Libre Caslon is _much_ lighter and higher-contrast. 72 | 73 | ![libre caslon vs original](assets/libre_caslon-og_caslon.png) 74 | 75 | There is also a regular weight of Libre Caslon Display, so it may be possible to extrapolate a roman with lower contrast. However, a quick test of this shows that the extrapolated "caption" style gets a _massive_ x-height, revealing that one of the biggest differences in the original Text and Dispaly was a different x-height. 76 | 77 | However, there is no Libre Caslon Display Italic, so this font would have to be corrected entirely by hand if we wish to adjust the contrast. 78 | 79 | I was curious about the narrow `n`s and the sharp contrast of Libre Caslon Text, and wondered how it might compare against something like Times New Roman. A comparison shows: 80 | 81 | - The "regular" of Libre Caslon is a bit lighter 82 | - Overall, the letter shapes are noticeably more condensed. 83 | - The contrast in Libre Caslon is higher – thin strokes and serifs are more thin/delicate. 84 | 85 | ![Libre Caslon vs Times New Roman](assets/libre_caslon-times_new_roman.png) 86 | 87 | ### Is the italic overly sterilized? 88 | 89 | Compared to the original Caslon, the existing Libre Caslon Italic has too symmetrical of stroke contrast from top to bottom. It's closer to "expansion" models of contrast, from fonts like Didot or Century Old Style, whereas Caslon was closer to a flat-pen, transitional-contrast model. 90 | 91 | In addition, Libre Caslon Italic is very smooth, and lacks the sharp turns from the corners of the original, especially visible in the shoulders and bowls of letters like `t, n, e, b`. 92 | 93 | Finally, Libre Caslon Italic is missing many of the warm details of the original cuts. Not only are swash caps `J, Q, T` missing, but other things have been lost, as well, such as the rotation of the `o`, the turning-in of the `h`, the elegant leaning-back curve of the `f`, and the hard angle of the `A` (pictured above). Finally, this may be partly a result of the overly-light contrast in Libre Caslon, but the joints / ink traps of letters like `n, u, r, d` appear to be much more aggressive in the original. 94 | 95 | ![Italics](assets/italics.png) 96 | 97 | ### Odd font metrics 98 | 99 | When compared to other fonts, including Libre Caslon Display, Libre Caslon Text has a much larger overall body size. This would be helpful to normalize before publication as a web font, in order to make font loading smoother from system fonts, as well as to make this an easier and more-predictable font to design with. 100 | 101 | One positive thing shown when cap heights are matched: the stroke contrast of the Libre Caslon Text isn't quite as problematically high as I first thought. It's close to being the same as TNR and Times, and if the regular is interpolated to be just slightly bolder, the color of it might work decently well in text sizes. 102 | 103 | This image compares the current Libre Caslon Regular against default "serif" fonts across several OSes and browsers, as they are according to [this resource](https://www.granneman.com/webdev/coding/css/fonts-and-formatting/web-browser-font-defaults). It also compares LC Display for a look at the relative metrics. It shows things at the same point size to show how LC is abnormal, then at a "normalized" size, to better compare actual font sizing for x-height and overall weight. 104 | 105 | ![relative-size-analysis.png](assets/libre-caslon-relative_sizing.png) 106 | 107 | ### Some glyphs incompatible 108 | 109 | Some glyphs are incompatible and currently preventing a variable font export. However, in most glyphs this seems to be only due to the bold master lacking anchors for diacritics, which will be relatively quick to solve. 110 | 111 | ![incompatible-glyphs](assets/incompatible-glyphs.png) 112 | 113 | # Work needed 114 | 115 | **To make it good and useful:** 116 | 117 | - Font metrics should be adjusted so that the text style is closer in body size to common fallback fonts 118 | - The regular weight instance should have a little more weight so that the text style is closer in body size to common fallback fonts 119 | - The character set will probably need to be expanded somewhat in order to meet Adobe Latin 3 or 4 (need to find current gfonts expectation). 120 | - A Bold Italic will need to be added, with care taken to make the weight properly match the upright Bold. 121 | - Letters will need to be given overlaps and made compatible for interpolation where they aren’t yet. 122 | - Anchors will need to be added to the bold in order to properly compose diacritics and allow interpolation. 123 | 124 | **To make it _even better_:** 125 | 126 | - Ideally, I would be able to see the historical resources used by Pablo Impallari in the existing design. 127 | - Some of the letterforms will need to be optically corrected (e.g. `x`, italic `f`). 128 | - A full check should happen to determine all the spots that should be corrected. 129 | - We could experiment with how the font might look with sharper details in the ball terminals, and whether serif brackets should be all sharp or all smooth. 130 | 131 | **To make it _really good_, we might eventually do a few more things:** 132 | 133 | - The weight range could be expanded (Light to Bold, or even Thin to Heavy) 134 | - Libre Caslon Display could be built out with Bold, Italic, and Bold Italic, to create a 3-axis variable font 135 | - Swash italics could be added 136 | - Greek, Hebrew, and Arabic letters from fonts by Caslon could eventually be added 137 | 138 | ![Greek](assets/caslon-greek.png) 139 | ![Hebrew](assets/caslon-hebrew.png) 140 | ![Arabic](assets/caslon-arabic.png) 141 | 142 | # Similar fonts in the Gfonts library 143 | 144 | The Google Fonts library has a number of similar fonts, if we take into account a few criteria: 145 | 146 | - Serif, primarily Latin script 147 | - Sharp details (e.g. brackets and angles) 148 | - Multiple font styles 149 | 150 | In my opinion, this includes: 151 | 152 | - [Merriweather](https://fonts.google.com/specimen/Merriweather) 153 | - [PT Serif](https://fonts.google.com/specimen/PT+Serif) 154 | - [Tinos](https://fonts.google.com/specimen/Tinos) 155 | - [IBM Plex Serif](https://fonts.google.com/specimen/IBM+Plex+Serif) 156 | - [Faustina](https://fonts.google.com/specimen/Faustina) 157 | - [Manuale](https://fonts.google.com/specimen/Manuale) 158 | 159 | If we include typefaces with only romans (no italics), it also includes: 160 | 161 | - [Source Serif](https://fonts.google.com/specimen/Source+Serif+Pro) 162 | - [Martel](https://fonts.google.com/specimen/Martel) 163 | - [Yrsa](https://fonts.google.com/specimen/Yrsa) 164 | - [Rasa](https://fonts.google.com/specimen/Rasa) 165 | - [Kadwa](https://fonts.google.com/specimen/Kadwa) 166 | 167 | Is the "Caslon" name so well-known that Libre Caslon would be a valuable addition to the library, or would it be more valuable to explore other opportunities? 168 | 169 | - After talking with Dave Crossland, I have come to the conclusion that, yes, it is a priority to have classic type styles in the library, so it will be worthwhile pushing this project further ahead. Cool! 170 | -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/A.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/axen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/axen.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/brackets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/brackets.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/caslon-arabic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/caslon-arabic.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/caslon-greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/caslon-greek.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/caslon-hebrew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/caslon-hebrew.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/falafel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/falafel.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/incompatible-glyphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/incompatible-glyphs.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/italics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/italics.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/libre-caslon-relative_sizing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/libre-caslon-relative_sizing.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/libre_caslon-og_caslon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/libre_caslon-og_caslon.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/libre_caslon-spectral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/libre_caslon-spectral.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/libre_caslon-times_new_roman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/libre_caslon-times_new_roman.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/ogonek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/ogonek.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/relative-size-analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/relative-size-analysis.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/smooth_and_sharp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/smooth_and_sharp.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/smooth_and_sharp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/smooth_and_sharp2.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/specimen-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/specimen-1.png -------------------------------------------------------------------------------- /docs/2018-10-22-evaluation/assets/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-evaluation/assets/x.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/blazeface-opsz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/blazeface-opsz.gif -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/bradley-djr-opsz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/bradley-djr-opsz.gif -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/g-skews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/g-skews.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre-caslon-display-scaled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre-caslon-display-scaled.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaled-test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaled-test.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaling-instance-test.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaling-instance-test.gif -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre-caslon-opsz-scaling.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre-caslon-scaled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre-caslon-scaled.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/libre_caslon-size_matching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/libre_caslon-size_matching.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/minion-opsz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/minion-opsz.gif -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/scaled-lc-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/scaled-lc-display.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/tnr_tinos-relative_sizing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/tnr_tinos-relative_sizing.png -------------------------------------------------------------------------------- /docs/2018-10-22-experiments/assets/zeitung-opsz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-22-experiments/assets/zeitung-opsz.gif -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/README.md: -------------------------------------------------------------------------------- 1 | # Making Romans Compatible 2 | 3 | As is documented in the Evaluation log, there are several incompatible glyphs to make compatible. 4 | 5 | ![](assets/incompatible-glyphs.png) 6 | 7 | Because most of these seem to be about anchor points missing in the bold, I will first write a script to copy over the anchor points between masters, and then I will go through an adjust their positions in the bold master. 8 | 9 | I'm starting by checking which glyphs have different amounts of anchors: 10 | 11 | ``` 12 | font = Glyphs.font 13 | 14 | # help(font.masters[0]) 15 | 16 | for glyph in font.glyphs: 17 | if len(glyph.layers[0].anchors) != len(glyph.layers[1].anchors): 18 | print glyph.name, "\n" 19 | for layer in glyph.layers: 20 | if len(layer.anchors) > 0: 21 | print layer.name, "\n", layer.anchors,"\n", "\n" 22 | ``` 23 | 24 | Comparing just the amount of anchors, I get this: 25 | 26 | ``` 27 | A D E G H I J K L N O R S T U W Y Z c d dotlessi dotlessj h i k l o s w y z 28 | ``` 29 | 30 | I now need to find how to insert anchors into the glyphs that are missing them. 31 | 32 | `anchors` is a "list, dict" within GSLayer. Glyphs says this can be done with: 33 | 34 | ``` 35 | # add a new anchor 36 | layer.anchors['top'] = GSAnchor() 37 | ``` 38 | 39 | ...and then I can probably set the x, y coordinates. 40 | 41 | But actually, I had to use a `copy` method, like so: 42 | 43 | ``` 44 | import copy 45 | 46 | font = Glyphs.font 47 | 48 | for glyph in font.glyphs: 49 | if len(glyph.layers[0].anchors) != len(glyph.layers[1].anchors): 50 | print glyph.name 51 | # go through anchors 52 | for anchor in glyph.layers[0].anchors: 53 | # check if anchor exists in the anchors of next master 54 | if anchor.name not in glyph.layers[1].anchors.values(): 55 | print anchor.name, anchor.x, anchor.y 56 | glyph.layers[1].anchors = copy.copy(glyph.layers[0].anchors) 57 | print "copied!" 58 | print "------", "\n" # separate anchors copied 59 | print "======", "\n" # separate glyphs 60 | ``` 61 | 62 | This copied all anchors that were missing in the Bold. These will require nudging to the correct placement, but it fixes most of the incompatible glyphs: 63 | 64 | ![](assets/incompatible-glyphs-new.png) 65 | 66 | They require nudging because they are now like this: 67 | ![](assets/W-anchors.png) 68 | 69 | Many of the anchors need to be centered optically, but many must be centered exactly horizontally, such as in the letter /H. I have quite a few anchors to center. To make this faster and more accurate, I'll use this script: 70 | 71 | ``` 72 | layer = Glyphs.font.selectedLayers[0] # current layer 73 | 74 | for anchor in layer.anchors: 75 | if anchor.selected == True: 76 | centerXpos = layer.width/2 77 | anchor.x = centerXpos 78 | print(anchor.name, " moved to ", str(centerXpos)) 79 | ``` 80 | 81 | ### Fixing Ligatures 82 | 83 | There are several ligatures which are incompatible. Their issue is very small, however: 84 | 85 | ![](assets/fix-ligatures.gif) 86 | 87 | ### Fixing numerals 88 | 89 | There are several incompatible numerals. However, these are relatively simple fixes. 90 | 91 | Regular `/fiveinferior`, with a smooth bracket which is illogical in this typeface (where most brackets are sharp, especially coming from non-diagonal stems). 92 | 93 | ![](assets/broken-5.gif) 94 | 95 | The Bold `/fiveinferior` is more logical. 96 | 97 | ![](assets/logical-5.gif) 98 | 99 | With the off-point (curve) handles deleted in the Regular, the `/fiveinferior` is compatible. 100 | 101 | ![](assets/fixed-5.gif) 102 | 103 | This is similar in the `/seveninferior` and `seven.oldstyle`, so I will provide a similar solution. 104 | 105 | The `/threeeights` fraction was simply in an inconsistent order, which was easily fixed by cutting and pasting the `/eightinerior`. 106 | 107 | ### Et voila! No incompatible glyphs. 108 | 109 | ![](assets/no-incompatible-masters.png) 110 | 111 | This _should_ mean that a variable font can be generated. Let's see... 112 | 113 | ## Generating the variable font, v. 1 114 | 115 | In a terminal, in my python virtual environment which is setup with [FontMake](https://github.com/googlei18n/fontmake), I run: 116 | 117 | ``` 118 | fontmake -o variable -g source/LibreCaslonText-2048.glyphs 119 | ``` 120 | 121 | And see what happens. It's close! But it needs some metadata cleanup. 122 | 123 | ![](assets/vf-generate-fail.gif) 124 | 125 | Oops, looks like the master weight values are out of sorts. In the generated `.designspace` file, I can see this: 126 | 127 | ``` 128 | 129 | 130 | 131 | ``` 132 | 133 | This shows that a range of values is not yet coming in from my Glyphs source. Let's fix that... 134 | 135 | Looking in Font Info, I see that my masters have weight values of `400` and `700`, which I want. 136 | 137 | However the "Bold" instance has a "Regular" weight value selected. This may be the problem: 138 | 139 | ![](assets/fontinfo-problem.png) 140 | 141 | Let's try it again: 142 | 143 | ![](assets/vf-generate-success.gif) 144 | 145 | It works! 146 | 147 | ![](assets/vf-fontview.gif) 148 | 149 | Now, I can put this through FontBakery to find and fix any remaining metadata issues. 150 | -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/W-anchors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/W-anchors.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/broken-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/broken-5.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/fix-ligatures.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/fix-ligatures.gif -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/fixed-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/fixed-5.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/fontinfo-problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/fontinfo-problem.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/incompatible-glyphs-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/incompatible-glyphs-new.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/incompatible-glyphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/incompatible-glyphs.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/logical-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/logical-5.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/no-incompatible-masters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/no-incompatible-masters.png -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/vf-fontview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/vf-fontview.gif -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/vf-generate-fail.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/vf-generate-fail.gif -------------------------------------------------------------------------------- /docs/2018-10-26-making-romans-compatible/assets/vf-generate-success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-26-making-romans-compatible/assets/vf-generate-success.gif -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-10-31-16-11-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-10-31-16-11-30.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-11-47-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-11-47-06.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-06-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-06-01.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-48-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-48-01.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-48-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-12-48-09.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-14-01-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-05-14-01-30.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-07-14-38-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-07-14-38-15.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-11-19-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-11-19-01.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-12-01-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-12-01-13.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-16-12-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-16-12-11.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-16-12-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/2018-11-08-16-12-32.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/axis-error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/axis-error.gif -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/axis-fixed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/axis-fixed.gif -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/braceleft-contour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/braceleft-contour.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/glyphsapp-instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/glyphsapp-instance.png -------------------------------------------------------------------------------- /docs/2018-10-29-fixing-fontbakery-errors/assets/parenleft-contour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-10-29-fixing-fontbakery-errors/assets/parenleft-contour.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/README.md: -------------------------------------------------------------------------------- 1 | # Italic QA 2 | 3 | **Italic items to close out** 4 | - [x] make sure all glyphs are compatible (irrelevant for now – it's only a single weight) 5 | - [x] check that charset matches between Regular and Italic 6 | - [ ] repeat QA steps for Italic 7 | - [x] match vertical metrics to Roman 8 | - [ ] create build script tailored to Italic 9 | - [x] Make sure there is style linking between upright Regular and Regular Italic 10 | - [x] Set weight of Regular to better match other fonts 11 | - [x] *but also* check that the Italic isn't too light when you do this. 12 | - [x] Fix spacing/kerning of `/g/f` – it's massive 13 | 14 | ## Charset 15 | 16 | **Unique to Italic** 17 | - ampersand.ss01 18 | - c_p 19 | - e_t 20 | - s_p 21 | 22 | I may not have to make the charsets entirely compatible because 23 | - These are only ligatures and an alternate ampersand 24 | - I'm not planning to put the Roman and Italic into the same variable font file (in which case everything would have to be compatible) 25 | 26 | ![](assets/2018-11-08-18-43-40.png) 27 | 28 | 29 | ## Create build script for italic 30 | 31 | This will take a bit of figuring-out. It's only one weight, so ... do I try to build it as a variable font? Or will it style-link in a reasonable way if it's just a static font? 32 | 33 | ...to be continued. 34 | 35 | 36 | ## Style linking 37 | 38 | I made sure that the Family Names were the same in both Glyphs sources. 39 | 40 | I also verified the `nameID 1` was "Libre Caslon Text" in both the Roman VF and the Italic Regular static instance. 41 | 42 | The style linking works! 43 | 44 | ![](assets/italic-style-linking.gif) 45 | 46 | There is the current obvious caveat that the family does not yet include a Bold Italic weight, so style linking doesn't work quite as fully as it eventually ought to. 47 | 48 | ## Setting Slope 49 | 50 | 🔥 FAIL The value of post.italicAngle must be changed from -25.0 to -20. [code: >20 degrees] 51 | 52 | The slope was previously set to `-25`, which was steeper than the letters themselves. I measured the slope of the stem of the cap `I`, and determined that the italic angle is about `-22.583`. 53 | 54 | ## Fixing critical kerning issues 55 | 56 | I'm not fixing much about the spacing and kerning of this font, but some issues are pretty critical, such as this `/g/f` combination (the `/f/i` is also pretty bad, but at least it has a ligature which should replace it most of the time): 57 | 58 | ![](assets/2018-11-21-12-27-00.png) 59 | ![](assets/2018-11-21-12-26-39.png) 60 | 61 | It is a tricky combination to get right – if the `/f` swoops down and to the left, what should it do when following a descender? I was curious what other serif italic fonts do about. Of the sample I looked at, many just let the letters clash – some more gracefully than others. Some have `/f` shapes that prevent the clash. Somewhat surprisingly, none of the fonts I've looked at (admittedly, a small sample) substitute the form of `/f` to prevent the clash. 62 | 63 | ![](assets/2018-11-21-12-24-35.png) 64 | 65 | If I simply turn off kerning, here's how the combination looks: 66 | 67 | ![](assets/2018-11-21-12-28-28.png) 68 | 69 | That's a bit tight, so I've adjusted it to keep just a bit of kerning: 70 | 71 | ![](assets/2018-11-21-12-32-56.png) -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-08-18-43-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-08-18-43-40.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-21-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-21-46.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-24-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-24-35.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-26-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-26-39.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-27-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-27-00.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-28-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-28-28.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/2018-11-21-12-32-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/2018-11-21-12-32-56.png -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/assets/italic-style-linking.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-09-italic-qa/assets/italic-style-linking.gif -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/charset-italic.txt: -------------------------------------------------------------------------------- 1 | # libre caslon text 2 | # charset italic 3 | 4 | A 5 | Aacute 6 | Abreve 7 | Acircumflex 8 | Adieresis 9 | Agrave 10 | Amacron 11 | Aogonek 12 | Aring 13 | Aringacute 14 | Atilde 15 | AE 16 | AEacute 17 | B 18 | C 19 | Cacute 20 | Ccaron 21 | Ccedilla 22 | Ccircumflex 23 | Cdotaccent 24 | D 25 | Eth 26 | Dcaron 27 | Dcroat 28 | Ddotbelow 29 | E 30 | Eacute 31 | Ebreve 32 | Ecaron 33 | Ecircumflex 34 | Edieresis 35 | Edotaccent 36 | Edotbelow 37 | Egrave 38 | Emacron 39 | Eogonek 40 | Etilde 41 | F 42 | G 43 | Gbreve 44 | Gcircumflex 45 | Gcommaaccent 46 | Gdotaccent 47 | H 48 | Hbar 49 | Hcircumflex 50 | Hdotbelow 51 | I 52 | IJ 53 | Iacute 54 | Ibreve 55 | Icircumflex 56 | Idieresis 57 | Idotaccent 58 | Idotbelow 59 | Igrave 60 | Imacron 61 | Iogonek 62 | Itilde 63 | J 64 | Jcircumflex 65 | K 66 | Kcommaaccent 67 | L 68 | Lacute 69 | Lcaron 70 | Lcommaaccent 71 | Ldot 72 | Lslash 73 | M 74 | N 75 | Nacute 76 | Ncaron 77 | Ncommaaccent 78 | Ndotaccent 79 | Eng 80 | Ntilde 81 | O 82 | Oacute 83 | Obreve 84 | Ocircumflex 85 | Odieresis 86 | Odotbelow 87 | Ograve 88 | Ohungarumlaut 89 | Omacron 90 | Oogonek 91 | Oslash 92 | Oslashacute 93 | Otilde 94 | OE 95 | P 96 | Thorn 97 | Q 98 | R 99 | Racute 100 | Rcaron 101 | Rcommaaccent 102 | Rdotbelow 103 | S 104 | Sacute 105 | Scaron 106 | Scircumflex 107 | Sdotbelow 108 | Schwa 109 | T 110 | Tbar 111 | Tcaron 112 | Tdotbelow 113 | U 114 | Uacute 115 | Ubreve 116 | Ucircumflex 117 | Udieresis 118 | Udotbelow 119 | Ugrave 120 | Uhungarumlaut 121 | Umacron 122 | Uogonek 123 | Uring 124 | Utilde 125 | V 126 | W 127 | Wacute 128 | Wcircumflex 129 | Wdieresis 130 | Wgrave 131 | X 132 | Y 133 | Yacute 134 | Ycircumflex 135 | Ydieresis 136 | Ygrave 137 | Ytilde 138 | Z 139 | Zacute 140 | Zcaron 141 | Zdotaccent 142 | Zdotbelow 143 | uni015E 144 | uni0162 145 | uni01C4 146 | uni01C5 147 | uni01C7 148 | uni01C8 149 | uni01CA 150 | uni01CB 151 | uni01F1 152 | uni01F2 153 | uni0218 154 | uni021A 155 | a 156 | aacute 157 | abreve 158 | acircumflex 159 | adieresis 160 | agrave 161 | amacron 162 | aogonek 163 | aring 164 | aringacute 165 | atilde 166 | ae 167 | aeacute 168 | b 169 | c 170 | cacute 171 | ccaron 172 | ccedilla 173 | ccircumflex 174 | cdotaccent 175 | d 176 | eth 177 | dcaron 178 | dcroat 179 | ddotbelow 180 | e 181 | eacute 182 | ebreve 183 | ecaron 184 | ecircumflex 185 | edieresis 186 | edotaccent 187 | edotbelow 188 | egrave 189 | emacron 190 | eogonek 191 | etilde 192 | schwa 193 | f 194 | g 195 | gbreve 196 | gcircumflex 197 | gcommaaccent 198 | gdotaccent 199 | h 200 | hbar 201 | hcircumflex 202 | hdotbelow 203 | i 204 | dotlessi 205 | iacute 206 | ibreve 207 | icircumflex 208 | idieresis 209 | idotbelow 210 | igrave 211 | ij 212 | imacron 213 | iogonek 214 | itilde 215 | j 216 | dotlessj 217 | jcircumflex 218 | k 219 | kcommaaccent 220 | kgreenlandic 221 | l 222 | lacute 223 | lcaron 224 | lcommaaccent 225 | ldot 226 | lslash 227 | m 228 | n 229 | nacute 230 | napostrophe 231 | ncaron 232 | ncommaaccent 233 | ndotaccent 234 | eng 235 | ntilde 236 | o 237 | oacute 238 | obreve 239 | ocircumflex 240 | odieresis 241 | odotbelow 242 | ograve 243 | ohungarumlaut 244 | omacron 245 | oogonek 246 | oslash 247 | oslashacute 248 | otilde 249 | oe 250 | p 251 | thorn 252 | q 253 | r 254 | racute 255 | rcaron 256 | rcommaaccent 257 | rdotbelow 258 | s 259 | sacute 260 | scaron 261 | scircumflex 262 | sdotbelow 263 | germandbls 264 | t 265 | tbar 266 | tcaron 267 | tdotbelow 268 | u 269 | uacute 270 | ubreve 271 | ucircumflex 272 | udieresis 273 | udotbelow 274 | ugrave 275 | uhungarumlaut 276 | umacron 277 | uni015F 278 | uni0163 279 | uni01C6 280 | uni01C9 281 | uni01CC 282 | uni01F3 283 | uni0219 284 | uni021B 285 | uogonek 286 | uring 287 | utilde 288 | v 289 | w 290 | wacute 291 | wcircumflex 292 | wdieresis 293 | wgrave 294 | x 295 | y 296 | yacute 297 | ycircumflex 298 | ydieresis 299 | ygrave 300 | ytilde 301 | z 302 | zacute 303 | zcaron 304 | zdotaccent 305 | zdotbelow 306 | c_p 307 | c_t 308 | e_t 309 | f_b 310 | f_f 311 | f_f_b 312 | f_f_h 313 | f_f_i 314 | f_f_j 315 | f_f_k 316 | f_f_l 317 | f_f_t 318 | f_h 319 | f_i 320 | f_j 321 | f_k 322 | f_l 323 | f_t 324 | s_p 325 | s_t 326 | ordfeminine 327 | ordmasculine 328 | uni03BC 329 | zero 330 | one 331 | two 332 | three 333 | four 334 | five 335 | six 336 | seven 337 | eight 338 | nine 339 | zero.denominator 340 | one.denominator 341 | two.denominator 342 | three.denominator 343 | four.denominator 344 | five.denominator 345 | six.denominator 346 | seven.denominator 347 | eight.denominator 348 | nine.denominator 349 | zero.numerator 350 | one.numerator 351 | two.numerator 352 | three.numerator 353 | four.numerator 354 | five.numerator 355 | six.numerator 356 | seven.numerator 357 | eight.numerator 358 | nine.numerator 359 | zero.oldstyle 360 | one.oldstyle 361 | two.oldstyle 362 | three.oldstyle 363 | four.oldstyle 364 | five.oldstyle 365 | six.oldstyle 366 | seven.oldstyle 367 | eight.oldstyle 368 | nine.oldstyle 369 | zero.tnum 370 | one.tnum 371 | two.tnum 372 | three.tnum 373 | four.tnum 374 | five.tnum 375 | six.tnum 376 | seven.tnum 377 | eight.tnum 378 | nine.tnum 379 | zeroinferior 380 | oneinferior 381 | twoinferior 382 | threeinferior 383 | fourinferior 384 | fiveinferior 385 | sixinferior 386 | seveninferior 387 | eightinferior 388 | nineinferior 389 | zerosuperior 390 | onesuperior 391 | twosuperior 392 | threesuperior 393 | foursuperior 394 | fivesuperior 395 | sixsuperior 396 | sevensuperior 397 | eightsuperior 398 | ninesuperior 399 | fraction 400 | onehalf 401 | onethird 402 | twothirds 403 | onequarter 404 | threequarters 405 | oneeighth 406 | threeeighths 407 | fiveeighths 408 | seveneighths 409 | period 410 | comma 411 | colon 412 | semicolon 413 | ellipsis 414 | exclam 415 | exclamdown 416 | question 417 | questiondown 418 | periodcentered 419 | bullet 420 | asterisk 421 | numbersign 422 | slash 423 | backslash 424 | period.tnum 425 | comma.tnum 426 | colon.tnum 427 | semicolon.tnum 428 | periodcentered.tnum 429 | numbersign.tnum 430 | slash.tnum 431 | parenleft 432 | parenright 433 | braceleft 434 | braceright 435 | bracketleft 436 | bracketright 437 | hyphen 438 | uni00AD 439 | endash 440 | emdash 441 | underscore 442 | underscore.tnum 443 | quotesinglbase 444 | quotedblbase 445 | quotedblleft 446 | quotedblright 447 | quoteleft 448 | apostrophe 449 | quoteright 450 | guillemotleft 451 | guillemotright 452 | guilsinglleft 453 | guilsinglright 454 | quotedbl 455 | quotesingle 456 | quotedbl.tnum 457 | quotesingle.tnum 458 | space 459 | nbspace 460 | CR 461 | .notdef 462 | Euro 463 | cent 464 | currency 465 | dollar 466 | florin 467 | sterling 468 | yen 469 | cent.tnum 470 | dollar.tnum 471 | Euro.tnum 472 | sterling.tnum 473 | yen.tnum 474 | plus 475 | minus 476 | multiply 477 | divide 478 | equal 479 | greater 480 | less 481 | plusminus 482 | asciitilde 483 | logicalnot 484 | asciicircum 485 | mu 486 | percent 487 | perthousand 488 | uni2215 489 | uni2219 490 | plus.tnum 491 | minus.tnum 492 | multiply.tnum 493 | divide.tnum 494 | equal.tnum 495 | greater.tnum 496 | less.tnum 497 | plusminus.tnum 498 | percent.tnum 499 | at 500 | ampersand 501 | paragraph 502 | section 503 | copyright 504 | registered 505 | trademark 506 | degree 507 | bar 508 | brokenbar 509 | dagger 510 | daggerdbl 511 | servicemark 512 | ampersand.ss01 513 | paragraph.tnum 514 | section.tnum 515 | degree.tnum 516 | bar.tnum 517 | commaaccent 518 | acute 519 | breve 520 | caron 521 | cedilla 522 | circumflex 523 | dieresis 524 | dotaccent 525 | grave 526 | hungarumlaut 527 | macron 528 | ogonek 529 | ring 530 | tilde 531 | caron.alt 532 | acute.cap 533 | breve.cap 534 | caron.cap 535 | circumflex.cap 536 | dieresis.cap 537 | dotaccent.cap 538 | grave.cap 539 | hungarumlaut.cap 540 | macron.cap 541 | ring.cap 542 | tilde.cap 543 | NULL 544 | dotbelow 545 | -------------------------------------------------------------------------------- /docs/2018-11-09-italic-qa/charset-roman.txt: -------------------------------------------------------------------------------- 1 | # libre caslon text 2 | # charset roman 3 | 4 | A 5 | Aacute 6 | Abreve 7 | Acircumflex 8 | Adieresis 9 | Agrave 10 | Amacron 11 | Aogonek 12 | Aring 13 | Aringacute 14 | Atilde 15 | AE 16 | AEacute 17 | B 18 | C 19 | Cacute 20 | Ccaron 21 | Ccedilla 22 | Ccircumflex 23 | Cdotaccent 24 | D 25 | Eth 26 | Dcaron 27 | Dcroat 28 | Ddotbelow 29 | E 30 | Eacute 31 | Ebreve 32 | Ecaron 33 | Ecircumflex 34 | Edieresis 35 | Edotaccent 36 | Edotbelow 37 | Egrave 38 | Emacron 39 | Eogonek 40 | Etilde 41 | F 42 | G 43 | Gbreve 44 | Gcircumflex 45 | Gcommaaccent 46 | Gdotaccent 47 | H 48 | Hbar 49 | Hcircumflex 50 | Hdotbelow 51 | I 52 | IJ 53 | Iacute 54 | Ibreve 55 | Icircumflex 56 | Idieresis 57 | Idotaccent 58 | Idotbelow 59 | Igrave 60 | Imacron 61 | Iogonek 62 | Itilde 63 | J 64 | Jcircumflex 65 | K 66 | Kcommaaccent 67 | L 68 | Lacute 69 | Lcaron 70 | Lcommaaccent 71 | Ldot 72 | Lslash 73 | M 74 | N 75 | Nacute 76 | Ncaron 77 | Ncommaaccent 78 | Ndotaccent 79 | Eng 80 | Ntilde 81 | O 82 | Oacute 83 | Obreve 84 | Ocircumflex 85 | Odieresis 86 | Odotbelow 87 | Ograve 88 | Ohungarumlaut 89 | Omacron 90 | Oogonek 91 | Oslash 92 | Oslashacute 93 | Otilde 94 | OE 95 | P 96 | Thorn 97 | Q 98 | R 99 | Racute 100 | Rcaron 101 | Rcommaaccent 102 | Rdotbelow 103 | S 104 | Sacute 105 | Scaron 106 | Scircumflex 107 | Sdotbelow 108 | Schwa 109 | T 110 | Tbar 111 | Tcaron 112 | Tdotbelow 113 | U 114 | Uacute 115 | Ubreve 116 | Ucircumflex 117 | Udieresis 118 | Udotbelow 119 | Ugrave 120 | Uhungarumlaut 121 | Umacron 122 | Uogonek 123 | Uring 124 | Utilde 125 | V 126 | W 127 | Wacute 128 | Wcircumflex 129 | Wdieresis 130 | Wgrave 131 | X 132 | Y 133 | Yacute 134 | Ycircumflex 135 | Ydieresis 136 | Ygrave 137 | Ytilde 138 | Z 139 | Zacute 140 | Zcaron 141 | Zdotaccent 142 | Zdotbelow 143 | uni015E 144 | uni0162 145 | uni01C4 146 | uni01C5 147 | uni01C7 148 | uni01C8 149 | uni01CA 150 | uni01CB 151 | uni01F1 152 | uni01F2 153 | uni0218 154 | uni021A 155 | a 156 | aacute 157 | abreve 158 | acircumflex 159 | adieresis 160 | agrave 161 | amacron 162 | aogonek 163 | aring 164 | aringacute 165 | atilde 166 | ae 167 | aeacute 168 | b 169 | c 170 | cacute 171 | ccaron 172 | ccedilla 173 | ccircumflex 174 | cdotaccent 175 | d 176 | eth 177 | dcaron 178 | dcroat 179 | ddotbelow 180 | e 181 | eacute 182 | ebreve 183 | ecaron 184 | ecircumflex 185 | edieresis 186 | edotaccent 187 | edotbelow 188 | egrave 189 | emacron 190 | eogonek 191 | etilde 192 | schwa 193 | f 194 | g 195 | gbreve 196 | gcircumflex 197 | gcommaaccent 198 | gdotaccent 199 | h 200 | hbar 201 | hcircumflex 202 | hdotbelow 203 | i 204 | dotlessi 205 | iacute 206 | ibreve 207 | icircumflex 208 | idieresis 209 | idotbelow 210 | igrave 211 | ij 212 | imacron 213 | iogonek 214 | itilde 215 | j 216 | dotlessj 217 | jcircumflex 218 | k 219 | kcommaaccent 220 | kgreenlandic 221 | l 222 | lacute 223 | lcaron 224 | lcommaaccent 225 | ldot 226 | lslash 227 | m 228 | n 229 | nacute 230 | napostrophe 231 | ncaron 232 | ncommaaccent 233 | ndotaccent 234 | eng 235 | ntilde 236 | o 237 | oacute 238 | obreve 239 | ocircumflex 240 | odieresis 241 | odotbelow 242 | ograve 243 | ohungarumlaut 244 | omacron 245 | oogonek 246 | oslash 247 | oslashacute 248 | otilde 249 | oe 250 | p 251 | thorn 252 | q 253 | r 254 | racute 255 | rcaron 256 | rcommaaccent 257 | rdotbelow 258 | s 259 | sacute 260 | scaron 261 | scircumflex 262 | sdotbelow 263 | germandbls 264 | t 265 | tbar 266 | tcaron 267 | tdotbelow 268 | u 269 | uacute 270 | ubreve 271 | ucircumflex 272 | udieresis 273 | udotbelow 274 | ugrave 275 | uhungarumlaut 276 | umacron 277 | uni015F 278 | uni0163 279 | uni01C6 280 | uni01C9 281 | uni01CC 282 | uni01F3 283 | uni0219 284 | uni021B 285 | uogonek 286 | uring 287 | utilde 288 | v 289 | w 290 | wacute 291 | wcircumflex 292 | wdieresis 293 | wgrave 294 | x 295 | y 296 | yacute 297 | ycircumflex 298 | ydieresis 299 | ygrave 300 | ytilde 301 | z 302 | zacute 303 | zcaron 304 | zdotaccent 305 | zdotbelow 306 | c_t 307 | f_b 308 | f_f 309 | f_f_b 310 | f_f_h 311 | f_f_i 312 | f_f_j 313 | f_f_k 314 | f_f_l 315 | f_f_t 316 | f_h 317 | f_i 318 | f_j 319 | f_k 320 | f_l 321 | f_t 322 | s_t 323 | ordfeminine 324 | ordmasculine 325 | uni03BC 326 | zero 327 | one 328 | two 329 | three 330 | four 331 | five 332 | six 333 | seven 334 | eight 335 | nine 336 | zero.denominator 337 | one.denominator 338 | two.denominator 339 | three.denominator 340 | four.denominator 341 | five.denominator 342 | six.denominator 343 | seven.denominator 344 | eight.denominator 345 | nine.denominator 346 | zero.numerator 347 | one.numerator 348 | two.numerator 349 | three.numerator 350 | four.numerator 351 | five.numerator 352 | six.numerator 353 | seven.numerator 354 | eight.numerator 355 | nine.numerator 356 | zero.oldstyle 357 | one.oldstyle 358 | two.oldstyle 359 | three.oldstyle 360 | four.oldstyle 361 | five.oldstyle 362 | six.oldstyle 363 | seven.oldstyle 364 | eight.oldstyle 365 | nine.oldstyle 366 | zero.tnum 367 | one.tnum 368 | two.tnum 369 | three.tnum 370 | four.tnum 371 | five.tnum 372 | six.tnum 373 | seven.tnum 374 | eight.tnum 375 | nine.tnum 376 | zeroinferior 377 | oneinferior 378 | twoinferior 379 | threeinferior 380 | fourinferior 381 | fiveinferior 382 | sixinferior 383 | seveninferior 384 | eightinferior 385 | nineinferior 386 | zerosuperior 387 | onesuperior 388 | twosuperior 389 | threesuperior 390 | foursuperior 391 | fivesuperior 392 | sixsuperior 393 | sevensuperior 394 | eightsuperior 395 | ninesuperior 396 | fraction 397 | onehalf 398 | onethird 399 | twothirds 400 | onequarter 401 | threequarters 402 | oneeighth 403 | threeeighths 404 | fiveeighths 405 | seveneighths 406 | period 407 | comma 408 | colon 409 | semicolon 410 | ellipsis 411 | exclam 412 | exclamdown 413 | question 414 | questiondown 415 | periodcentered 416 | bullet 417 | asterisk 418 | numbersign 419 | slash 420 | backslash 421 | period.tnum 422 | comma.tnum 423 | colon.tnum 424 | semicolon.tnum 425 | periodcentered.tnum 426 | numbersign.tnum 427 | slash.tnum 428 | parenleft 429 | parenright 430 | braceleft 431 | braceright 432 | bracketleft 433 | bracketright 434 | hyphen 435 | uni00AD 436 | endash 437 | emdash 438 | underscore 439 | underscore.tnum 440 | quotesinglbase 441 | quotedblbase 442 | quotedblleft 443 | quotedblright 444 | quoteleft 445 | apostrophe 446 | quoteright 447 | guillemotleft 448 | guillemotright 449 | guilsinglleft 450 | guilsinglright 451 | quotedbl 452 | quotesingle 453 | quotedbl.tnum 454 | quotesingle.tnum 455 | space 456 | nbspace 457 | CR 458 | .notdef 459 | Euro 460 | cent 461 | currency 462 | dollar 463 | florin 464 | sterling 465 | yen 466 | cent.tnum 467 | dollar.tnum 468 | Euro.tnum 469 | sterling.tnum 470 | yen.tnum 471 | plus 472 | minus 473 | multiply 474 | divide 475 | equal 476 | greater 477 | less 478 | plusminus 479 | asciitilde 480 | logicalnot 481 | asciicircum 482 | mu 483 | percent 484 | perthousand 485 | uni2215 486 | uni2219 487 | plus.tnum 488 | minus.tnum 489 | multiply.tnum 490 | divide.tnum 491 | equal.tnum 492 | greater.tnum 493 | less.tnum 494 | plusminus.tnum 495 | percent.tnum 496 | at 497 | ampersand 498 | paragraph 499 | section 500 | copyright 501 | registered 502 | trademark 503 | degree 504 | bar 505 | brokenbar 506 | dagger 507 | daggerdbl 508 | servicemark 509 | paragraph.tnum 510 | section.tnum 511 | degree.tnum 512 | bar.tnum 513 | commaaccent 514 | acute 515 | breve 516 | caron 517 | cedilla 518 | circumflex 519 | dieresis 520 | dotaccent 521 | grave 522 | hungarumlaut 523 | macron 524 | ogonek 525 | ring 526 | tilde 527 | caron.alt 528 | acute.cap 529 | breve.cap 530 | caron.cap 531 | circumflex.cap 532 | dieresis.cap 533 | dotaccent.cap 534 | grave.cap 535 | hungarumlaut.cap 536 | macron.cap 537 | ring.cap 538 | tilde.cap 539 | NULL 540 | dotbelow 541 | -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/README.md: -------------------------------------------------------------------------------- 1 | # Finding a "Regular" weight for Text Roman 2 | 3 | ### Current issue: 4 | 5 | Libre Caslon Text "Regular" is significantly lighter in weight than comparable typefaces. It is also slightly lighter in appearance than Libre Caslon Text Italic (in part because the italic keeps roughly the same stroke width, but has a steep slope and slightly-narrow proportions). 6 | 7 | ## Testing 8 | 9 | I spent some time trying to set tests in Drawbot. This was helpful, because it allows for a lot of variations of `wght` values to be tested, quickly. 10 | 11 | This led me to belief that a `wght` value of about `440` better matched the Italic style. 12 | 13 | However, Drawbot testing had the flaw that different fonts were given different line heights, rather than keeping the same line height as other "Regular" fonts, so it was hard to properly compare to other families. 14 | 15 | To keep similar line heights between fonts, I also set some simple tests in Adobe Illustrator. Through this method, the sweet spot appears to be around `wght = 430`. 16 | 17 | ![](assets/libre-caslon-reg_wght-test-01.png) 18 | ![](assets/libre-caslon-reg_wght-test-03.png) 19 | ![](assets/libre-caslon-reg_wght-test-04.png) 20 | 21 | However, after trying different fonts, I'm seeing that there is some level of variance in the color of different "regular" fonts. With that in mind, I'm going to actually seek to match the Regular to the Italic color, so these can work well together in text. 22 | 23 | It's taken some experimentation to find the right way to visualize this in Drawbot. I've found that setting multiple, alternating lines seems to be a helpful way to match the colors of these fonts. The text has to be at a large enough size to actually show the shapes of letters and to avoid the effect being overly impacted by pixelation of small text, but small enough to avoid this being an irrelevant comparison for text. I've found that 32pt seems to be the most useful size to view the comparison. Probably, it would also be useful to do a static comparison with a sheet printed from a laser printer, at actual text sizes (10pt–16pt). When viewed in a video, the time slider can be scrubbed back and forth to control the Roman weight axis (with extra time, this might form the basis of a useful interactive weight-matching tool). Through this method, the sweet spot appears to be around `wght = 445`. 24 | 25 | ![](assets/weight-test-roman_italic-noblur-big-111918.gif) 26 | 27 | ![](assets/libre-caslon-finding_reg_wght.gif) 28 | 29 | Because these tests were giving me conflicting results, I also made a printable PDF to test a range of weights, across a range of sizes. This test makes me fairly certain that `wght = 440` is the best weight to move forward with. I also asked a couple of friends in type design (without first expressing my opinion), and they too concluded that `440` was the best match. `440` it is! 30 | 31 | ![](assets/weight-test-one_page-printed-112018.jpg) 32 | 33 | 34 | Because the matching font weight seems to change based on the medium and size tested, I'll do two things: 35 | 36 | ~~1. Keep things flexible by making my build script keep the original source, and allow a build-time selection of Roman weight~~ 37 | 1. Test making the current Regular master a lighter weight (calculating necessary `weight` value), making a new "Regular" master at 400, and keep instances at 400–700 38 | 2. Start with the assumption that the correct Regular weight is somewhere between the test results – I'll choose the current `440` point as the value to export at, for now. 39 | 40 | ### Making old regular the right weight 41 | 42 | As a sketch of what needs to happen: 43 | 44 | ``` 45 | 700----------440--400 46 | 700---------------440----(?) 47 | ``` 48 | 49 | The actual math is... 50 | ``` 51 | (700–440) * x = 300 52 | ...which is... 53 | 260 * x = 300 54 | ...which is... 55 | x = 300/260 56 | ...which is... 57 | x = 1.153846154 58 | ``` 59 | 60 | So, the current designspace must stretch by `1.153846154`. In order to make the new Regular `400`, The new value of Bold to Old Regular should be `346.1538462`, making the old regular `354`. 61 | 62 | For now, I'm doing this manually. I would like to be able to do this with a script to keep things flexible, but it's unclear to me how to add and control values. I've asked in the [GlyphsApp Forum](https://forum.glyphsapp.com/t/how-might-i-trigger-instance-as-master-from-the-api/9976). 63 | 64 | It's subtle, but this weight shift helps the default Regular to better match the italic. 65 | ![](assets/2018-11-20-22-50-46.png) 66 | 67 | It was important to not *overdo*. As a comparison of the total change, here's an overlapped version of the letter `/i`: 68 | 69 | ![](assets/2018-11-21-11-40-42.png) 70 | 71 | ### Using a script to shift the weights 72 | 73 | I've learned how to [make a GlyphsApp script to automatically shift the weight of a specified master](https://github.com/thundernixon/glyphs_scripts/blob/10a7f17fe88c250c8c5871493990a03b55e5329a/add-new-master-at-interp-weight.py). However, it doesn't work in glyphsLib because it relies on `instance.interpolatedFont`, which is not currently supported by glyphsLib. As a result, I can't use it in my build process, so I'll *still* keep the prior master for now, in case I circle back to change the weight in a slightly different way. Later, I'll delete the old source, and rely on Git to dig up old versions. 74 | 75 | For now, I'm calling the edited version `LibreCaslonText-wght_adjust.glyphs`, and the old source `LibreCaslonText-deprecated.glyphs`. 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/2018-11-20-22-50-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/2018-11-20-22-50-46.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/2018-11-21-11-40-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/2018-11-21-11-40-42.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-finding_reg_wght.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-finding_reg_wght.gif -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-01.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-02.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-03.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-04.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/libre-caslon-reg_wght-test-05.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-book_text-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-book_text-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-book_text-450og-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-book_text-450og-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-pangram-roman_italic-112018.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-pangram-roman_italic-112018.pdf -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-printed-112018.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-printed-112018.jpg -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-roman_italic-112018.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-one_page-roman_italic-112018.pdf -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-111918.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-111918.gif -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-111918.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-111918.mp4 -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-450og-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-450og-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-111918.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-111918.mp4 -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-big-111918.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-big-111918.gif -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-big-111918.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-roman_italic-noblur-big-111918.mp4 -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string-450og-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string-450og-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string_2-111918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/assets/weight-test-spacing_string_2-111918.png -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/weight-test/LibreCaslonText-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/weight-test/LibreCaslonText-Italic.ttf -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/weight-test/LibreCaslonText-VF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-finding-a-regular-weight/weight-test/LibreCaslonText-VF.ttf -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/weight-test/libre-caslon-weight-test-multiple_scales-roman_italic-111918.py: -------------------------------------------------------------------------------- 1 | # RENDER WITH: http://www.drawbot.com/ 2 | # If run from the command line, this assumes you are in this script's directory 3 | 4 | from drawBot import * 5 | import math 6 | 7 | shortSample = "anbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynzanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynznanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynzanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynz" 8 | 9 | pangrams = "přílišžluťoučkýkůňúpělďábelskéódyngodstilmåførstogfremstværeklardenmåværepassendearistotelesskrzyń" 10 | 11 | for page in range(6): 12 | newPage('Letter') 13 | # size('Letter') 14 | W, H = width(), height() 15 | 16 | # print(W, H) 17 | 18 | 19 | 20 | # fontSize = 16 21 | fontSize = 12 + page*4 22 | 23 | pageMargin = 32 24 | 25 | def round_to_even(f): 26 | return math.floor(f / 2.) * 2 27 | 28 | lines = int(floor(H / fontSize / 2.8)) 29 | 30 | 31 | 32 | 33 | def placeText(fontName,margin, topMargin, line, weight=0): 34 | # if fontName > "./LibreCaslonText-VF.ttf": 35 | # fontVariations(wght=weight) 36 | 37 | font(fontName,fontSize) 38 | textBoxSize = (pageMargin*2, H-topMargin, W-pageMargin*3, boxHeight) 39 | textBox(pangrams, textBoxSize) 40 | 41 | if weight > 1: 42 | 43 | fontVariations(wght=weight) 44 | 45 | font("IBM Plex Mono", 8) 46 | captionBoxSize = (pageMargin, H-topMargin, W-margin*2, boxHeight) 47 | textBox(str(floor(weight)), captionBoxSize) 48 | 49 | if line == 0: 50 | 51 | # titleBox = (16, H-24, W-margin*2, boxHeight) 52 | 53 | left, top, width, height = pageMargin, H-pageMargin-fontSize/2, W-margin*2, boxHeight 54 | 55 | textBox("wght", (left, top, width, height)) 56 | textBox("Libre Caslon Text Roman & Italic, " + str(fontSize) +"pt", (pageMargin*2, top, width, height )) 57 | 58 | dateWidth = 240 59 | textBox("Nov 20, 2018", (W-dateWidth-left, top, dateWidth, height ), align="right") 60 | 61 | 62 | # fill(.95,.95,.95) 63 | # rect(0,0,W, H) 64 | 65 | 66 | for line in range(lines): 67 | 68 | caslonWeight = round_to_even(400 + (120/lines)*line) 69 | 70 | lineHeight(fontSize*1) 71 | fill(0) 72 | 73 | margin = fontSize*1.2 74 | boxHeight = fontSize 75 | # topMargin = margin * line*2 + margin*3 - fontSize 76 | 77 | topMargin = pageMargin*2 + margin * line*2 + fontSize 78 | 79 | placeText("./LibreCaslonText-VF.ttf",margin,topMargin, line, weight=caslonWeight) 80 | placeText("./LibreCaslonText-Italic.ttf",margin,topMargin+boxHeight, line) 81 | 82 | 83 | # margin= fontSize 84 | margin= fontSize*1.2 85 | boxHeight= fontSize 86 | lineHeight(fontSize*1) 87 | 88 | 89 | fill(0) 90 | font("IBM Plex Mono", 8) 91 | # lineHeight(fontSize*1) 92 | 93 | # textBox("wght", (fontSize, H-fontSize*2, 100, 16)) 94 | # textBox("Libre Caslon Text Roman & Italic, " + str(fontSize) +"pt", (margin*3,H-fontSize*2,400,16)) 95 | 96 | # textBox("wght", (fontSize, H-32, 100, 16)) 97 | # textBox("Libre Caslon Text Roman & Italic, " + str(fontSize) +"pt", (margin*3,H-32,400,16)) 98 | 99 | 100 | # imgPath = "../assets/weight-test-roman_italic-noblur-big-111918.mp4" # do 50 frames with a wght increase rate of 2 101 | imgPath = "../assets/weight-test-one_page-pangram-roman_italic-112018.pdf" # do 20 frames with a wght increase rate of 5 102 | saveImage(imgPath) 103 | # saveImage(imgPath, imageResolution=300) 104 | # os.system('open %s' % imgPath) -------------------------------------------------------------------------------- /docs/2018-11-19-finding-a-regular-weight/weight-test/libre-caslon-weight-test-simple-111918.py: -------------------------------------------------------------------------------- 1 | # RENDER WITH: http://www.drawbot.com/ 2 | # assumes you are running via a Drawbot module from the command line, while in this script's directory 3 | 4 | from drawBot import * 5 | import math 6 | import os 7 | 8 | # weight test for Libre Caslon Text Regular vs comparable typefaces 9 | 10 | sample = """\ 11 | One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections. The bedding was hardly able to cover it and seemed ready to slide off any moment. His many legs, pitifully thin compared with the size of the rest of him, waved about helplessly as he looked. "What's happened to me?" he thought. It wasn't a dream. His room, a proper human room although a little too small, lay peacefully between its four familiar walls. A collection of textile samples lay spread out on the table - Samsa was a travelling salesman - and above it there hung a picture that he had recently cut out of an illustrated magazine and housed in a nice, gilded frame. It showed a lady fitted out with a fur hat and fur boa who sat upright, raising a heavy fur muff that covered the whole of her lower arm towards the viewer. Gregor then turned to look out the window at the dull weather. Drops of rain could be heard hitting the pane, which made him feel quite sad. "How about if I sleep a little bit longer and forget all this nonsense", he thought, but that was something he was unable to do because he was used to sleeping on his right, and in his present state couldn't get into that position. However hard he threw himself onto his right, he always rolled back to where he was. He must have tried it a hundred times, shut his eyes so that he wouldn't have to look at the floundering legs, and only stopped when he began to feel a mild, dull pain there that he had never felt before. "Oh, God", he thought, "what a strenuous career it is that I've chosen! Travelling day in and day out. Doing business like this takes much more effort than doing your own business at home, and on top of that there's the curse of travelling, worries about making train connections, bad and irregular food, contact with different people all the time so that you can never get to know anyone or become friendly with them. It can all go to Hell!" He felt a slight itch up on his belly; pushed himself slowly up on his back towards the headboard so that he could lift his head better; found where the itch was, and saw that it was covered with lots of little white spots which he didn't know what to make of; and when he tried to feel the place with one of his legs he drew it quickly back because as soon as he touched it he was overcome by a cold shudder. He slid back into his former position. "Getting up early all the time", he thought, "it makes you stupid. You've got to get enough sleep. Other travelling salesmen live a life of luxury. For instance, whenever I go back to the guest house during the morning to copy out the contract, these gentlemen are always still sitting there eating their breakfasts. I ought to just try that with my boss; I'd get kicked out on the spot. But who knows, maybe that would be the best thing for me. If I didn't have my parents to think about I'd have given in my notice a long time ago, I'd have gone up to the boss and told him just what I think, tell him everything I would, let him know just what I feel. He'd fall right off his desk! And it's a funny sort of business to be sitting up there at your desk, talking down at your subordinates from up there, especially when you have to go right up close because the boss is hard of hearing. Well, there's still some hope; once I've got the money together to pay off my parents' debt to him - another five or six years I suppose - that's definitely what I'll do. That's when I'll make the big change. First of all though, I've got to get up, my train leaves at five." 12 | """ 13 | # sample = """\ 14 | # nnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnnnnlalnnlblnnlclnnldlnnlelnnlflnnlglnnlhlnnlilnnljlnnlklnnlllnnlmlnnlnlnnlolnnlplnnlqlnnlrlnnlslnnltlnnlulnnlvlnnlwlnnlxlnnlylnnlzlnn 15 | # """ 16 | # sample = """\ 17 | # nnnoooiiillliiiooonnn 18 | # """ 19 | 20 | 21 | # size('Letter') 22 | # size(612, 612) 23 | # W, H = width(), height() 24 | 25 | W, H= 1000,1000 26 | size(W,H) 27 | 28 | print(W, H) 29 | 30 | margin= 50 31 | boxHeight= H/5.7 32 | 33 | 34 | # background 35 | fill(.95,.95,.95) 36 | rect(0,0,W, H) 37 | 38 | fontSize = 12 39 | lineHeight(fontSize*1) 40 | fill(0) 41 | 42 | caslonWeight = 450 43 | 44 | 45 | def placeText(fontName, index, weight=0): 46 | if weight > 0: 47 | fontVariations(wght=weight) 48 | font(fontName,fontSize) 49 | topMargin = (boxHeight * (index +1) + margin + (10 * index)) 50 | textBoxSize = (margin, H-topMargin, W-margin*2, boxHeight) 51 | textBox(sample, textBoxSize) 52 | 53 | # with savedState(): 54 | # fill(0,0,0,0) 55 | # stroke(1,0,0) 56 | # rect(textBoxSize[0],textBoxSize[1],textBoxSize[2],textBoxSize[3]) 57 | 58 | # add captions of font names 59 | with savedState(): 60 | fill(0.2,0.2,1) 61 | rotate(90) 62 | captionWidth = boxHeight 63 | font("IBM Plex Sans",7) 64 | textBoxSize = (H-topMargin-fontSize/4, 0-margin*1.4, captionWidth, 40) 65 | if weight > 0: 66 | textBox(fontName + " (" + str(weight) + ")", textBoxSize, align="right") 67 | else: 68 | textBox(fontName, textBoxSize, align="right") 69 | fill(1,0,0) 70 | rect(0,0,100,100) 71 | 72 | # placeText("Times New Roman", 0) 73 | placeText("Times New Roman", 0) 74 | placeText("Times", 1) 75 | 76 | # fontVariations(wght=450) 77 | placeText("LibreCaslonText-VF.ttf", 2,weight=caslonWeight) 78 | placeText("LibreCaslonText-Italic.ttf", 3) 79 | placeText("Georgia", 4) 80 | 81 | # imgPath = "../assets/weight-test-book_text-111918.png" 82 | imgPath = "../assets/weight-test-book_text-"+ str(caslonWeight) +"og-111918.png" 83 | # saveImage(imgPath) 84 | saveImage(imgPath, imageResolution=300) 85 | # os.system('open %s' % imgPath) -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/README.md: -------------------------------------------------------------------------------- 1 | # Spacing Improvements 2 | 3 | This font has quite a few issues with proportions and spacing. 4 | 5 | I am avoiding changing it too much, because Dave has specifically asked me to keep a narrow focus on production as a variable font, for now, and stick to the original designs closely. 6 | 7 | However, a few things need to be fixed to prevent this from being a really awkward-to-use font. 8 | 9 | ## Adding kerning to "non-ligated sequences" 10 | 11 | Overall, `k` was too-open on the right side. I reduced its right sidebearing, and kerned it a bit more tightly against glyphs `/a /f /t`. 12 | 13 | Before: 14 | ![](assets/2018-11-07-14-38-15.png) 15 | 16 | After (kerned in different lowercase combinations, mostly based on "nn" and "oo" spacing): 17 | ![](assets/2018-11-08-16-12-11.png) 18 | ![](assets/2018-11-08-16-12-32.png) 19 | 20 | I also reduced sidebearings in diagonals: `/y/v/w`, as these were all quite loosely-spaced. 21 | 22 | This font could probably benefit from a more-methodical overall spacing upgrade, but that goes beyond the scope of this "just get it published" project, as it might also call into question the overall widths of some letters. 23 | 24 | ## Matching `/l` shape with other lowercase letters 25 | 26 | Previously, the Text Roman `/l` had a thinner stem and smaller serifs that other lowercase letters, like `/i` and `/h`. To better match sizing and spacing, I duplicated the main contour of the `/i` and matched its spacing. This brings the `/l` more in line with other ascenders, and increases its overly-tight spacing somewhat. 27 | 28 | Before and after: 29 | 30 | ![](assets/new-l.gif) 31 | 32 | 33 | ## Bringing spacing updates to component glyphs 34 | 35 | By default, the spacing updates in foundation glyphs are not being automatically pulled into accented variants. Probably a script would work well to update spacing of these glyphs (skipping the `i`-based letters). 36 | 37 | Relevant for: `/l /k /y /v /w` 38 | 39 | - [x] ~~check on this~~ it was necessary to turn on "automatic alignment" to bring in spacing updates 40 | 41 | ![](assets/2019-01-23-19-00-30.png) 42 | 43 | ## Adjusting the widths of several lowercase letters to improve overall consistency of counters in text 44 | 45 | _(This is a post-[PR](https://github.com/google/fonts/pull/1787)-approval update)._ 46 | 47 | There's a lingering issue of spacing – so just before we merge it and publish it to be used in a bunch of websites, I want to adjust it slightly. It's a small set of changes, but they will/would reflow text significantly. 48 | 49 | Specifically, my early proofs showed that there was some inconsistency in the interior spaces of letters, most noticeably with n, u, m, & h being somewhat more condensed that round letters (thanks to Spencer Charles for helping to point this out in those proofs). 50 | 51 | It is generally considered best practice (especially in fonts meant for text) for there to be a visually-consistent amount of volume between the counterforms of letters, especially in the lowercase. Below, LC is compared against several other fonts to illustrate this. 52 | 53 | I avoided this before because I didn't want to override the original design decisions without a deeper design research and expansion project, as was the initial plan for me in Q1. However, even though Q1 priorities have shifted for me, I want to make a few adjustments in the existing Roman masters or it will be much harder to update later and it will bother me every time I see Libre Caslon. 54 | 55 | I'll stay restrained, but tweak the following, and then update the in the PR: 56 | 57 | - `n, u, m, & h` slightly wider 58 | - `c` slightly narrower 59 | - `g` slightly larger, mostly in the top bowl, to approximately match bowls of `e` and `a` 60 | 61 | **String of text, compared against several other text fonts:** 62 | 63 | ![](assets/2019-01-23-13-19-31.png) 64 | 65 | ![](assets/2019-01-23-13-19-38.png) 66 | 67 | **Up-close illustration of how counter areas are visually inconsistent in Libre Caslon, but approximately equal in well-made text fonts:** 68 | 69 | ![](assets/2019-01-23-13-19-44.png) 70 | 71 | ### Fixing it 72 | 73 | Changing the width of the `n` by just 20 units matches it up much better. It's a small change, but it's the difference between something that looks wrong and something that looks right. 74 | 75 | ![](assets/n-width.gif) 76 | 77 | Just with the `n` changed: 78 | 79 | ![](assets/n-width-2.gif) 80 | 81 | A smaller change is need in the bold `n`, because the counter spaces are smaller there and less noticeably different. 82 | 83 | I've also carried similar (but slightly modified) adjustments into the `u, m, & h`, and made small updates to the `c` and `g`. 84 | 85 | ![](assets/2019-01-23-15-33-42.png) 86 | 87 | - [x] ~~make sure updates are carried into component glyphs~~ → they are 88 | 89 | ## Ogonek fixes 90 | 91 | Gah! I've come across an errant ogonek to fix. 92 | 93 | I'm adding this to the ["additional QA" doc](../2018-12-09-additional-qa). -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2018-11-07-14-38-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2018-11-07-14-38-15.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2018-11-08-16-12-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2018-11-08-16-12-11.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2018-11-08-16-12-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2018-11-08-16-12-32.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-31.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-38.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2019-01-23-13-19-44.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2019-01-23-15-33-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2019-01-23-15-33-42.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/2019-01-23-19-00-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/2019-01-23-19-00-30.png -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/README.md -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/n-width-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/n-width-2.gif -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/n-width.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/n-width.gif -------------------------------------------------------------------------------- /docs/2018-11-19-spacing-improvements/assets/new-l.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-11-19-spacing-improvements/assets/new-l.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2018-12-10-20-40-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2018-12-10-20-40-27.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2018-12-10-20-50-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2018-12-10-20-50-24.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-19-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-19-51.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-21-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-21-40.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-27-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-27-47.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-28-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-28-50.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-30-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-30-56.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-31-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-31-36.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-34-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-34-39.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-37-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-37-02.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-12-57-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-12-57-22.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-13-05-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-13-05-56.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-08-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-08-51.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-37-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-37-35.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-39-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-39-28.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-40-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-40-13.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-57-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-57-50.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-14-59-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-14-59-04.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-03-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-03-59.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-04-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-04-22.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-05-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-05-03.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-10-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-10-50.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-11-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-11-43.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-11-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-11-52.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-15-56-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-15-56-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-04-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-04-29.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-04-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-04-56.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-15-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-15-13.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-19-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-19-42.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-21-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-21-21.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-27-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-27-18.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-29-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-29-10.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-31-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-31-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-07-18-40-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-07-18-40-01.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-04-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-04-57.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-05-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-05-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-13-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-13-36.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-13-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-13-49.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-25-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-25-06.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-29-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-29-47.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-30-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-30-04.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-33-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-33-48.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-11-42-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-11-42-18.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-14-56-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-14-56-06.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-15-03-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-15-03-30.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-15-11-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-15-11-18.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-15-13-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-15-13-52.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-15-29-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-15-29-43.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-15-36-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-15-36-38.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-16-13-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-16-13-38.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-16-15-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-16-15-31.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-16-39-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-16-39-00.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-16-50-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-16-50-05.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-08-16-51-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-08-16-51-47.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-10-03-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-10-03-37.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-10-08-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-10-08-34.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-10-41-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-10-41-45.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-11-51-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-11-51-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-13-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-13-10.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-13-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-13-50.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-14-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-14-25.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-21-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-21-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-43-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-43-21.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-44-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-44-41.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-45-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-45-59.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-48-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-48-27.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-50-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-50-10.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-56-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-56-21.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-13-59-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-13-59-21.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-01-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-01-33.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-04-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-04-13.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-04-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-04-49.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-06-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-06-05.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-11-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-11-17.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-43-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-43-35.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-52-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-52-32.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-09-14-55-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-09-14-55-49.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-10-09-43-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-10-09-43-49.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-10-09-49-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-10-09-49-37.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-10-09-51-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-10-09-51-08.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-15-15-38-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-15-15-38-24.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-23-15-47-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-23-15-47-34.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-23-18-51-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-23-18-51-04.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/2019-01-23-18-51-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/2019-01-23-18-51-15.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/Q.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/Q.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/bracket.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/bracket.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/cent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/cent.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/cent2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/cent2.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/charset-tall3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/charset-tall3.png -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/curve-point.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/curve-point.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/inktrap-u.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/inktrap-u.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/round-t.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/round-t.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/s-inflections.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/s-inflections.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/s-shapes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/s-shapes.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/tabular.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/tabular.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/tabular2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/tabular2.gif -------------------------------------------------------------------------------- /docs/2018-12-09-additional-qa/assets/x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-09-additional-qa/assets/x.gif -------------------------------------------------------------------------------- /docs/2018-12-10-opening-a-pull-request/README.md: -------------------------------------------------------------------------------- 1 | # Opening a Pull Request to the main Google Fonts repo 2 | 3 | - [x] Make UPM 2000 to align with Dave's stated preference for VFs ([FontBakery Issue 2185](https://github.com/googlefonts/fontbakery/issues/2185)) 4 | - [x] round kerns again with JAF freemix script 5 | - [x] check that font fits similarly to Times New Roman, as it was earlier 6 | - [x] repeat for italic 7 | 8 | *It's not a perfect match, but they **are** different fonts, and they're quite close:* 9 | 10 | ![](assets/2018-12-10-12-41-54.png) 11 | 12 | - [x] Clean repo structure 13 | - [x] Use `git mv` to move relevant files; delete others 14 | - [x] add more-comprehensive `.gitignore` 15 | - [x] ~~? maybe make a `wip` branch? Probably not necessary...~~ Just clean up master. `google/fonts` is already a "prod" repo, and this project doesn't really benefit from a `dist/` folder of time-stamped builds 16 | 17 | - [x] Update build scripts to use new workflows from Encode Sans, in order to place fonts in appropriate `fonts/` folder 18 | - [x] =~~Upgrade NAMEpatch & STATpatch~~ *or* delete files if not needed (as far as I know, not needed in a one-axis font) 19 | 20 | - [x] Add metadata files 21 | - [x] `METADATA.pb` for statics – This took some figuring out, but my current hack is [documented on issue #89 of gftools](https://github.com/googlefonts/gftools/issues/89#issuecomment-446033132) 22 | - [x] `METADATA.pb` for VF – I've copied and edited the static metadata file in a way that seems logical 23 | - [x] `FONTLOG.txt` – I've cleaned up some typos in the original, and added a concise statement of my latest updates 24 | - [x] Update `CONTRIBUTORS.txt` and `AUTHORS.txt` 25 | - [x] Add build info to `README.md` 26 | 27 | - [x] Make sample image with Drawbot 28 | 29 | - [x] Add new fonts to google/fonts/ofl repo directory 30 | 31 | - [x] open PR, add known remaining issues 32 | 33 | - [ ] Do Red Arrows / FontAudit check of outlines -------------------------------------------------------------------------------- /docs/2018-12-10-opening-a-pull-request/assets/2018-12-10-12-41-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2018-12-10-opening-a-pull-request/assets/2018-12-10-12-41-54.png -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/README.md: -------------------------------------------------------------------------------- 1 | # Finishing the VF upgrade project 2 | 3 | This variable font upgrade was started in Q4 2018, and now it is Q2 2020. Largely, this is because I was working on other projects, especially Recursive Mono & Sans. Partially, this delay was due to the font previously having Regular–Bold Romans, but only a Regular Italic (but no a Bold Italic), making it a "non-rectangular" family. Recently, however, @KatjaSchimmel has drawn a Bold Italic and greatly improved the spacing of the Regular Italic. So, it's back to mastering! 4 | 5 | ## Build 6 | 7 | I've added a fontmake line for `sources/LibreCaslonText-Italic.glyphs` to `build.sh`, and after fixing an errant point in the glyph `Z` plus copying arrows from the Regular to the 8 | 9 | ![roman & italic variable font build](vf-build.gif) 10 | 11 | ## Fixing 12 | 13 | ### Ligature Carets 14 | 15 | Earlier, I had added ligature carets, but then turned them off by changing their names. 16 | 17 | So, I changed their names back with the following macro: 18 | 19 | ``` 20 | font = Glyphs.font 21 | 22 | def fixCarets(layer): 23 | for anchor in layer.anchors: 24 | anchor.name = anchor.name.replace("lig_","").replace("carrot","caret").replace("_temp_off","") 25 | 26 | 27 | for glyph in font.glyphs: 28 | if "_" in glyph.name: 29 | print(glyph.name) 30 | for layer in glyph.layers: 31 | print(" ", layer.name) 32 | fixCarets(layer) 33 | ``` 34 | 35 | ## Sizing 36 | 37 | Back in the earliest work on upgrading this family, I found that it was much larger in body size and line length than typical fallback fonts (see [2018-10-22-experiments](2018-10-22-experiments/README.md) for details. 38 | 39 | However, this scaling may actually be a blocker for merging the font into Google Fonts. According to the Google Fonts site, Libre Caslon Text was served 3.97M times over the last week, and is featured in more than 11,000 websites. The size change is fairly dramatic, so that might disrupt a lot of users. 40 | 41 | If I were to scale it back, here is how I could do so: 42 | 43 | When both are scaled to a UPM of 2000: 44 | 45 | | | old | newer | change | 46 | | ---------- | ----- | ----- | ----------- | 47 | | cap height | 1540 | 1323 | 1.164021164 | 48 | 49 | I could scale the current font by 1.164021164, scaling the UPM to 2000 * 1.164021164, or `2328.042328` (rounded to `2328`), then changing it back to 2000 without scaling. Then, I can fix vertical metrics to make them similar as well. To make current "normal" metrics easily accessible in the future (if needed), I have made a local branch of `normal-metrics` and I've pushed that to my remote. 50 | 51 | After my first adjustment, it's actually slightly bigger than the original: 52 | 53 | ![](assets/2020-04-30-23-02-22.png) 54 | 55 | This is because I slightly adjusted the overall weight of the previous "Regular" as well, to better match the color of the Italics ([2018-11-19-finding-a-regular-weight](2018-11-19-finding-a-regular-weight)). It would be good to match the old "Regular" as closely as possible, however, because that is very likely the most-used part of the existing family. 56 | 57 | ### Trying again, scaling by overall width 58 | 59 | ```python 60 | """ 61 | Script to check combined width of ASCII uppercase + lowercase. 62 | """ 63 | 64 | import string 65 | 66 | alphabet = " ".join(string.ascii_letters).split(" ") 67 | 68 | font = Glyphs.font 69 | 70 | totalWidth = 0 71 | 72 | 73 | for name in alphabet: 74 | totalWidth += font.glyphs[name].layers[0].width 75 | 76 | print(totalWidth) 77 | ``` 78 | 79 | | | old | newer | change by | 80 | | ---------- | ----- | ------- | ----------- | 81 | | alphabet width | 66456 | 57712 | 1.151510951 | 82 | 83 | `2000 * 1.151510951 = 2303.021902`, so I'll scale to `2303` then change back to 2000. 84 | 85 | ![old libre caslon text compared to newest experiment](assets/2020-04-30-23-34-31.png) 86 | 87 | Much closer! Not 100% the same, but probably close enough to cause extremely little noticeable difference. The remaining differences are largely due to shifting the weight of the Regular, as mentioned above. 88 | 89 | 90 | ## Fixing missing glyphs 91 | 92 | Some glyphs have gone “missing” from this font, according to Diffenator. 93 | 94 | ![libre caslon missing glyphs, before](assets/2020-05-04-10-29-11.png) 95 | 96 | ![libre caslon missing glyphs, after](assets/2020-05-04-10-29-30.png) 97 | 98 | ``` 99 | f_f=ff # FB00 100 | f_i=fi # FB01 101 | f_l=fl # FB02 102 | f_f_i=ffi # FB03 103 | f_f_l=ffl # FB04 104 | s_t=st # FB06 105 | ``` 106 | -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/assets/2020-04-30-23-02-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2020-04-22-finishing/assets/2020-04-30-23-02-22.png -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/assets/2020-04-30-23-34-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2020-04-22-finishing/assets/2020-04-30-23-34-31.png -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/assets/2020-05-04-10-29-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2020-04-22-finishing/assets/2020-05-04-10-29-11.png -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/assets/2020-05-04-10-29-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2020-04-22-finishing/assets/2020-05-04-10-29-30.png -------------------------------------------------------------------------------- /docs/2020-04-22-finishing/vf-build.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/docs/2020-04-22-finishing/vf-build.gif -------------------------------------------------------------------------------- /fonts/LibreCaslonText-Italic[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/LibreCaslonText-Italic[wght].ttf -------------------------------------------------------------------------------- /fonts/LibreCaslonText[wght].ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/LibreCaslonText[wght].ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-Bold.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-Italic.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-Medium.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-MediumItalic.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-Regular.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/static/LibreCaslonText-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/fonts/static/LibreCaslonText-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /gfonts-description.html: -------------------------------------------------------------------------------- 1 |

2 | Libre Caslon Text is optimized for web body text (typically set at 16px), whilst the companion family 3 | Libre Caslon Display is optimized for web headlines. 4 |

5 | 6 |

7 | Libre Caslon Text was specifically tailored to be used for web body text (typically set at 16px). It can be used at very small sizes and will still be readable on your website. 8 |

9 | 10 |

11 | Another big difference is that pretty much all other digital Caslons revivals are based on 18th Century specimens by William Caslon I and William Caslon II. Libre Caslon, instead, is based on hand lettering artist Caslon interpretations typical of 1950s advertising. 12 |

13 | 14 |

15 | This font was upgraded in early 2020 and is now available as a variable font. 16 |

17 | 18 |

19 | To contribute, see github.com/thundernixon/Libre-Caslon 20 |

21 | -------------------------------------------------------------------------------- /proofs/191214_LibreCaslon_BoldItalic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/191214_LibreCaslon_BoldItalic.pdf -------------------------------------------------------------------------------- /proofs/191214_LibreCaslon_Italic_forcomparrison.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/191214_LibreCaslon_Italic_forcomparrison.pdf -------------------------------------------------------------------------------- /proofs/191220_LibreCaslon_punctuation_diacritics_symbols.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/191220_LibreCaslon_punctuation_diacritics_symbols.pdf -------------------------------------------------------------------------------- /proofs/191221_LibreCaslon_BoldItalic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/191221_LibreCaslon_BoldItalic.pdf -------------------------------------------------------------------------------- /proofs/191221_LibreCaslon_RegularItalic_forcomparrison.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/191221_LibreCaslon_RegularItalic_forcomparrison.pdf -------------------------------------------------------------------------------- /proofs/200103_LibreCaslon_BoldItalic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200103_LibreCaslon_BoldItalic.pdf -------------------------------------------------------------------------------- /proofs/200103_LibreCaslon_RegularItalic_withcomments.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200103_LibreCaslon_RegularItalic_withcomments.pdf -------------------------------------------------------------------------------- /proofs/200107_LibreCaslon_RegularItalic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200107_LibreCaslon_RegularItalic.pdf -------------------------------------------------------------------------------- /proofs/200130_LibreCaslon_Bold_Italic_spacing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200130_LibreCaslon_Bold_Italic_spacing.pdf -------------------------------------------------------------------------------- /proofs/200130_LibreCaslon_Italic_spacing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200130_LibreCaslon_Italic_spacing.pdf -------------------------------------------------------------------------------- /proofs/200222_LibreCaslon_Italic_kerning_uc2uc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200222_LibreCaslon_Italic_kerning_uc2uc.pdf -------------------------------------------------------------------------------- /proofs/200224_LibreCaslon_Italic_kerning_lc2lc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200224_LibreCaslon_Italic_kerning_lc2lc.pdf -------------------------------------------------------------------------------- /proofs/200229_LibreCaslon_Italic_kerning_uc2lc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200229_LibreCaslon_Italic_kerning_uc2lc.pdf -------------------------------------------------------------------------------- /proofs/200328_kerning_proof_LibreCaslon_BoldItalic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200328_kerning_proof_LibreCaslon_BoldItalic.pdf -------------------------------------------------------------------------------- /proofs/200328_kerning_proof_LibreCaslon_Italic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/proofs/200328_kerning_proof_LibreCaslon_Italic.pdf -------------------------------------------------------------------------------- /requirements.freeze.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.9.0 2 | appdirs==1.4.3 3 | attrs==19.3.0 4 | beautifulsoup4==4.9.0 5 | booleanOperations==0.9.0 6 | cattrs==1.0.0 7 | certifi==2020.4.5.1 8 | cffsubr==0.2.6 9 | chardet==3.0.4 10 | click==7.1.1 11 | commandlines==0.4.1 12 | compreffor==0.5.0 13 | cu2qu==1.6.7 14 | defcon==0.6.0 15 | Deprecated==1.2.9 16 | entrypoints==0.3 17 | fbdiff==0.8.4 18 | flake8==3.7.9 19 | Flask==1.1.2 20 | font-v==1.0.2 21 | fontbakery==0.7.24 22 | fontmake==2.1.0 23 | fontMath==0.5.2 24 | fonttools==4.12.0 25 | fs==2.4.11 26 | gftools==0.3.7 27 | gitdb==4.0.4 28 | GitPython==3.1.1 29 | glyphsLib==5.1.9 30 | idna==2.9 31 | importlib-metadata==1.6.1 32 | itsdangerous==1.1.0 33 | Jinja2==2.11.2 34 | lxml==4.5.0 35 | MarkupSafe==1.1.1 36 | mccabe==0.6.1 37 | opentype-sanitizer==8.0.0.post2 38 | Pillow==7.0.0 39 | protobuf==3.11.3 40 | pyclipper==1.1.0.post3 41 | pycodestyle==2.5.0 42 | pyflakes==2.1.1 43 | PyGithub==1.47 44 | PyJWT==1.7.1 45 | pyparsing==2.4.7 46 | pytz==2019.3 47 | requests==2.23.0 48 | six==1.14.0 49 | smmap==3.0.2 50 | soupsieve==2.0 51 | statmake==0.3.0 52 | tabulate==0.8.7 53 | ttfautohint-py==0.4.3 54 | typing-extensions==3.7.4.2 55 | ufo2ft==2.13.0 56 | ufoLib2==0.6.2 57 | ufolint==1.0.0 58 | unicodedata2==13.0.0.post2 59 | Unidecode==1.1.1 60 | urllib3==1.25.9 61 | vttLib==0.9.0 62 | Werkzeug==1.0.1 63 | wrapt==1.12.1 64 | zipp==3.1.0 65 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | fontmake 2 | git+https://github.com/googlefonts/gftools 3 | fontbakery 4 | gftools 5 | statmake>=0.2.2 6 | -------------------------------------------------------------------------------- /sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/sample.jpg -------------------------------------------------------------------------------- /sources/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | source venv/bin/activate 4 | 5 | # ------------------------------------------------------ 6 | # static fonts 7 | 8 | echo "Generating Static fonts" 9 | mkdir -p ../fonts 10 | fontmake -g sources/LibreCaslonText.glyphs -i -o ttf --output-dir fonts/static 11 | fontmake -g sources/LibreCaslonText-Italic.glyphs -i -o ttf --output-dir fonts/static 12 | 13 | echo "Post processing statics" 14 | ttfs=$(ls fonts/**/*.ttf) 15 | for ttf in $ttfs 16 | do 17 | gftools fix-dsig -f $ttf 18 | gftools fix-gasp --autofix $ttf 19 | mv ${ttf/".ttf"/".ttf.fix"} $ttf 20 | gftools fix-nonhinting $ttf $ttf.fix 21 | mv $ttf.fix $ttf 22 | rm ${ttf/".ttf"/"-backup-fonttools-prep-gasp.ttf"} 23 | done 24 | 25 | 26 | # ------------------------------------------------------ 27 | # variable fonts 28 | 29 | echo "Generating VFs" 30 | fontmake -g sources/LibreCaslonText.glyphs -o variable --output-path fonts/LibreCaslonText-Roman-VF.ttf 31 | fontmake -g sources/LibreCaslonText-Italic.glyphs -o variable --output-path fonts/LibreCaslonText-Italic-VF.ttf 32 | 33 | rm -rf master_ufo/ instance_ufo/ 34 | 35 | 36 | echo "Fixing VF Metadata" 37 | vfs=$(ls fonts/*-VF.ttf) 38 | for vf in $vfs; do 39 | # use statmake to set STAT table 40 | python sources/scripts/set-stat-table.py $vf 41 | 42 | # other table fixes 43 | gftools fix-dsig -f $vf 44 | gftools fix-gasp --autofix $vf 45 | mv ${vf/".ttf"/".ttf.fix"} $vf 46 | gftools fix-nonhinting $vf $vf.fix 47 | mv $vf.fix $vf 48 | rm ${vf/".ttf"/"-backup-fonttools-prep-gasp.ttf"} 49 | 50 | ttx -x MVAR $vf # drop mvar table using fonttools/ttx 51 | ttx ${vf/'.ttf'/'.ttx'} # convert back to TTF 52 | rm ${vf/'.ttf'/'.ttx'} # erase temp TTX 53 | mv ${vf/'.ttf'/'#1.ttf'} $vf # overwrite original TTF with edited copy 54 | done 55 | 56 | # update names 57 | mv "fonts/LibreCaslonText-Roman-VF.ttf" "fonts/LibreCaslonText[wght].ttf" 58 | mv "fonts/LibreCaslonText-Italic-VF.ttf" "fonts/LibreCaslonText-Italic[wght].ttf" -------------------------------------------------------------------------------- /sources/deprecated/scripts/build-full.sh: -------------------------------------------------------------------------------- 1 | ### WIP macOS build script for Encode Sans VF, based on a build script by Mike LaGuttuta 2 | ### Run in the terminal by entering this file path 3 | ### requires a python 3 environment, for now 4 | 5 | ################################################## 6 | ################# set vars below ################# 7 | 8 | glyphsSource="sources/LibreCaslonText.glyphs" 9 | 10 | ## move VF into new folder of dist/ with timestamp and fontbake; otherwise, add fresh file to fonts/ folder 11 | ## advice: make this 'true' while you're working, and 'false' while you're working to publish the final fonts 12 | timestampAndFontbakeInDist=false 13 | 14 | ## keep designspace file if you want to check values later 15 | keepDesignspace=false 16 | 17 | ################# set vars above ################# 18 | ################################################## 19 | 20 | 21 | 22 | # =========================================================================== 23 | # Set up names ============================================================== 24 | 25 | # get font name from glyphs source 26 | VFname=`python sources/scripts/helpers/get-font-name.py ${glyphsSource}` 27 | # checking that the name has been pulled out of the source file 28 | echo "VF Name: ${VFname}" 29 | 30 | ## make temp glyphs filename with "-build" suffix 31 | tempGlyphsSource=${glyphsSource/".glyphs"/"-Build.glyphs"} 32 | 33 | ## copy Glyphs file with temp filename 34 | cp $glyphsSource $tempGlyphsSource 35 | 36 | # =========================================================================== 37 | # Generate Variable Font ==================================================== 38 | 39 | ## call fontmake to make a varfont 40 | fontmake -o variable -g $tempGlyphsSource 41 | 42 | if [ $keepDesignspace == true ] 43 | then 44 | echo "designspace in master_ufo folder" 45 | else 46 | rm -rf master_ufo 47 | fi 48 | 49 | ## clean up temp glyphs file 50 | rm -rf $tempGlyphsSource 51 | 52 | # =========================================================================== 53 | # OpenType table fixes ====================================================== 54 | 55 | # cd variable_ttf 56 | 57 | ## fix file metadata with gftools 58 | echo "fix DSIG in " ${VFname} 59 | gftools fix-dsig --autofix variable_ttf/${VFname}.ttf 60 | rm -rf ${VFname}-backup-fonttools-prep-gasp.ttf 61 | 62 | 63 | # =========================================================================== 64 | # Autohinting =============================================================== 65 | 66 | ttfPath=variable_ttf/${VFname}.ttf 67 | hintedPath=${ttfPath/".ttf"/"-hinted.ttf"} 68 | 69 | # Hint with TTFautohint-VF 70 | # currently janky – I need to find how to properly add this dependency 71 | # https://groups.google.com/forum/#!searchin/googlefonts-discuss/ttfautohint%7Csort:date/googlefonts-discuss/WJX1lrzcwVs/SIzaEvntAgAJ 72 | # ./Users/stephennixon/Environments/gfonts3/bin/ttfautohint-vf ${ttfPath} ${ttfPath/"-unhinted.ttf"/"-hinted.ttf"} 73 | echo "================================================" 74 | echo ttfautohint-vf -I $ttfPath $hintedPath 75 | echo "================================================" 76 | ttfautohint-vf -I $ttfPath $hintedPath 77 | 78 | finalHintedFont=${hintedPath/"-hinted"/""} 79 | cp $hintedPath $finalHintedFont 80 | 81 | 82 | # =========================================================================== 83 | # Sort into final folder ==================================================== 84 | 85 | # open VF in default program; hopefully you have FontView 86 | open ${finalHintedFont} 87 | 88 | # set this to true/false at top of script 89 | if [ $timestampAndFontbakeInDist == true ] 90 | then 91 | newFontLocation=`python sources/scripts/helpers/distdate.py variable_ttf/${VFname}.ttf` 92 | 93 | fontbakery check-googlefonts ${newFontLocation}/${VFname}.ttf --ghmarkdown ${newFontLocation}/${VFname}-fontbakery-report.md 94 | 95 | echo "new VF location is " ${newFontLocation} 96 | else 97 | ## move font into fonts/, then fontbake 98 | finalFontLocation=fonts/${VFname}.ttf 99 | cp $finalHintedFont $finalFontLocation 100 | echo "new VF location is " ${finalFontLocation} 101 | 102 | fontbakery check-googlefonts ${finalFontLocation} --ghmarkdown ${finalFontLocation/".ttf"/"-fontbakery-report.md"} 103 | fi 104 | 105 | rm -rf variable_ttf 106 | -------------------------------------------------------------------------------- /sources/deprecated/scripts/build-statics.sh: -------------------------------------------------------------------------------- 1 | ############################################ 2 | ################# set vars ################# 3 | 4 | glyphsSourceRoman="sources/LibreCaslonText.glyphs" 5 | 6 | glyphsSourceItalic="sources/LibreCaslonText-Italic.glyphs" 7 | 8 | ################# set vars ################# 9 | ############################################ 10 | 11 | # =========================================================================== 12 | # functions ================================================================= 13 | 14 | fixDsig() 15 | { 16 | FILEPATH=$1 17 | echo "fix DSIG in " ${FILEPATH} 18 | gftools fix-dsig --autofix ${FILEPATH} 19 | } 20 | 21 | AutohintFont() 22 | { 23 | FILEPATH=$1 24 | echo "TTFautohint " ${FILEPATH} 25 | hintedFile=${FILEPATH/".ttf"/"-hinted.ttf"} 26 | # autohint with detailed info 27 | ttfautohint -I ${FILEPATH} ${hintedFile} 28 | cp ${hintedFile} ${FILEPATH} 29 | rm -rf ${hintedFile} 30 | } 31 | 32 | sortAndFontbakeFile() 33 | { 34 | FILEPATH=$1 35 | 36 | fileName=$(basename $FILEPATH) 37 | newPath=fonts/librecaslontext/${fileName} 38 | cp ${FILEPATH} ${newPath} 39 | 40 | fontbakery check-googlefonts ${newPath} --ghmarkdown ${newPath/".ttf"/"-fontbakery-report.md"} 41 | } 42 | 43 | # =========================================================================== 44 | # Roman Instances =========================================================== 45 | 46 | fontmake -g ${glyphsSourceRoman} --output ttf --interpolate --overlaps-backend booleanOperations 47 | 48 | for file in instance_ttf/*; do 49 | if [ -f "$file" ]; then 50 | fixDsig ${file} 51 | AutohintFont ${file} 52 | sortAndFontbakeFile ${file} 53 | fi 54 | done 55 | 56 | rm -rf instance_ttf 57 | 58 | # =========================================================================== 59 | # Italic Instances ========================================================== 60 | 61 | fontmake -g ${glyphsSourceItalic} --output ttf --overlaps-backend booleanOperations 62 | 63 | for file in master_ttf/*; do 64 | if [ -f "$file" ]; then 65 | if [[ $file == *"-Italic"* ]]; then 66 | fixDsig ${file} 67 | AutohintFont ${file} 68 | sortAndFontbakeFile ${file} 69 | fi 70 | fi 71 | done 72 | 73 | # =========================================================================== 74 | # clean up build files ====================================================== 75 | 76 | rm -rf instance_ttf 77 | rm -rf instance_ufo 78 | rm -rf master_ttf 79 | rm -rf master_ufo -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/STATpatch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/check-tnum-widths.py: -------------------------------------------------------------------------------- 1 | font = Glyphs.font 2 | 3 | tnumWidth = 1031 4 | 5 | tnumProblems = {} 6 | masterIDs = [] 7 | 8 | # get layer id 9 | for master in font.masters: 10 | masterIDs.append(master.id) 11 | 12 | for glyph in font.glyphs: 13 | if "tnum" in glyph.name: 14 | for layerID in masterIDs: 15 | if glyph.layers[layerID].width != tnumWidth: 16 | tnumProblems[glyph.name] = glyph.layers[layerID].width 17 | 18 | for key in tnumProblems: 19 | # format for a simple markdown table 20 | print('| ' + str(key) + ' | ' + str(tnumProblems[key]) + ' |') 21 | ## if you're just using the print() panel, use this instead 22 | # print(str(tnumProblems[key]) + '\t' + str(key)) 23 | # print('') 24 | 25 | for key in tnumProblems: 26 | for layerID in masterIDs: 27 | layerGlyph = font[key].layers[layerID] 28 | startWidth = layerGlyph.width 29 | # shapeWidth = get width of glyph shape 30 | shapeWidth = startWidth - layerGlyph.LSB - layerGlyph.RSB 31 | 32 | # update layerGlyph width to make it equal correct width 33 | layerGlyph.width = tnumWidth 34 | 35 | # get new margin, and divide it into both sides to center the shape 36 | newMargin = tnumWidth - shapeWidth 37 | layerGlyph.LSB = newMargin/2 38 | layerGlyph.RSB = newMargin/2 39 | 40 | # just to be sure that it's really correct, repeat this (margin may not exactly divide evenly) 41 | layerGlyph.width = tnumWidth -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/distdate-and-fontbake.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import shutil 4 | from datetime import datetime 5 | 6 | arg = sys.argv[-1] 7 | fontFile = arg.split("/")[1] 8 | fontName = fontFile.split(".")[0] 9 | 10 | # make timestamped folder in dist, like `SampleFont_2015-10-21-017_03` 11 | currentDatetime = datetime.now().strftime('%Y-%m-%d-%H_%M') 12 | 13 | # outputFolder = f'dist/{fontName}-{currentDatetime}' 14 | outputFolder = f'dist/{currentDatetime}' 15 | 16 | 17 | if not os.path.exists(outputFolder): 18 | os.makedirs(outputFolder) 19 | 20 | defaultFontPath = arg 21 | newFontPath = f'{outputFolder}/{fontFile}' 22 | shutil.move(defaultFontPath, newFontPath) 23 | 24 | # run fontbakery check on new font 25 | fontbakeryCommand = f'fontbakery check-googlefonts {newFontPath} --ghmarkdown {outputFolder}/fontbakery-report.md' 26 | print("fontbakeryCommand is " + fontbakeryCommand) 27 | 28 | print(os.system(fontbakeryCommand)) -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/distdate.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import shutil 4 | from datetime import datetime 5 | 6 | arg = sys.argv[-1] 7 | 8 | if "/" in arg: 9 | fontFile = arg.split("/")[1] 10 | else: 11 | fontFile = arg 12 | 13 | fontName = fontFile.split(".")[0] 14 | 15 | # make timestamped folder in dist, like `SampleFont_2015-10-21-017_03` 16 | currentDatetime = datetime.now().strftime('%Y-%m-%d-%H_%M') 17 | 18 | # outputFolder = f'dist/{fontName}-{currentDatetime}' 19 | outputFolder = f'dist/{currentDatetime}' 20 | 21 | 22 | if not os.path.exists(outputFolder): 23 | os.makedirs(outputFolder) 24 | 25 | defaultFontPath = arg 26 | newFontPath = f'{outputFolder}/{fontFile}' 27 | shutil.move(defaultFontPath, newFontPath) 28 | 29 | print(outputFolder) 30 | 31 | sys.exit(0) 32 | -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/edit-master-weight.py: -------------------------------------------------------------------------------- 1 | __doc__= """ 2 | Work in progress. 3 | 4 | Attempts to add new master at interpolated position, then delete existing master. 5 | """ 6 | 7 | 8 | import sys 9 | import os 10 | from Glyphs import * 11 | 12 | def main(): 13 | 14 | oldMasterWeightValue = float(sys.argv[-2]) 15 | newMasterWeightValue = float(sys.argv[-1]) 16 | 17 | filename = sys.argv[-3] 18 | directory = os.getcwd() 19 | document = Glyphs.open((str(directory + "/" + filename)), False) 20 | 21 | font = document.font() 22 | 23 | # create new instance 24 | newInstance = Glyphs.objectWithClassName_("GSInstance") 25 | 26 | 27 | 28 | # set new instance weight value to variable from above 29 | # newInstance.weightValue = newMasterWeightValue 30 | newInstance.setInterpolationWeight_(newMasterWeightValue) 31 | font.instances().append(newInstance) 32 | 33 | print(newInstance) 34 | print(font.instances()[-1]) 35 | 36 | for instance in font.instances(): 37 | print(instance, instance.interpolationWeight()) 38 | 39 | # make an interpolated font of the new instance 40 | instanceFont = Glyphs.objectWithClassName_("GSFont") 41 | instanceFont = newInstance.interpolatedFont 42 | # instanceFont = font.instances()[-1].Instance_FontObject() 43 | 44 | # prints: 45 | # : Regular (650, 100, 0)> 46 | print(instanceFont) 47 | 48 | # I expect this to only print 1 master, but it prints: 49 | # AttributeError: 'objc.native_selector' object has no attribute 'fontMasters' 50 | print(instanceFont.fontMasters()) 51 | 52 | # add the master of the interpolated font to the masters 53 | font.fontMasters().append(instanceFont.fontMasters()[0]) 54 | # get the id from the master of the interpolated font 55 | newMasterID = instanceFont.fontMasters()[0].id 56 | 57 | 58 | # for i, master in enumerate(font.fontMasters()): 59 | # print(master) 60 | 61 | # for glyph in font.glyphs(): 62 | # print(glyph.name()) 63 | 64 | for glyph in font.glyphs(): 65 | # make variable for glyph of interpolated font 66 | instanceGlyph = instanceFont.glyphs()[glyph.name()] 67 | # bring glyph data into glyph of new master 68 | glyph.layers[newMasterID] = instanceGlyph.layers[newMasterID] 69 | 70 | # bring kerning in from interpolated font 71 | font.kerning[newMasterID] = instanceFont.kerning[newMasterID] 72 | 73 | for i, instance in enumerate(font.instances()): 74 | # delete generated instance 75 | if instance.weightValue == newMasterWeightValue: 76 | print("delete " + str(instance)) 77 | del font.instances()[i] 78 | 79 | for i, master in enumerate(font.fontMasters()): 80 | # delete old master 81 | if master.weightValue == oldMasterWeightValue: 82 | print("delete " + str(master)) 83 | del font.fontMasters()[i] 84 | # set new master value as old master value (round to nearest integer to match) 85 | if round(master.weightValue) == round(newMasterWeightValue): 86 | print("update weight value of " + str(master)) 87 | font.fontMasters()[i].weightValue = oldMasterWeightValue 88 | 89 | font.close(False) 90 | 91 | if __name__ == '__main__': 92 | main() -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/fontbake.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | 4 | 5 | arg = sys.argv[-1] 6 | 7 | if "/" in arg: 8 | fontFile = arg.split("/")[1] 9 | else: 10 | fontFile = arg 11 | 12 | fontName = fontFile.split(".")[0] 13 | 14 | defaultFontPath = arg 15 | 16 | 17 | # run fontbakery check on new font 18 | fontbakeryCommand = f'fontbakery check-googlefonts {fontFile} --ghmarkdown fontbakery-report.md' 19 | print("fontbakeryCommand is " + fontbakeryCommand) 20 | 21 | print(os.system(fontbakeryCommand)) -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/get-font-name.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from glyphsLib import GSFont 3 | 4 | filename = sys.argv[-1] 5 | font = GSFont(filename) 6 | 7 | # get font name, remove spaces 8 | varFontName = font.familyName.replace(' ','') + '-VF' 9 | 10 | print(varFontName) 11 | 12 | sys.exit(0) -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/get-italic-name.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from glyphsLib import GSFont 3 | 4 | filename = sys.argv[-1] 5 | font = GSFont(filename) 6 | 7 | # get font name, remove spaces 8 | italicFontName = font.familyName.replace(' ','') + '-Italic' 9 | 10 | print(italicFontName) 11 | 12 | sys.exit(0) -------------------------------------------------------------------------------- /sources/deprecated/scripts/helpers/remote-glyphs-test.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | from Glyphs import * 4 | 5 | def main(): 6 | 7 | filename = sys.argv[-1] 8 | directory = os.getcwd() 9 | document = Glyphs.open((str(directory + "/" + filename)), False) 10 | 11 | font = document.font() 12 | 13 | print(font) # GSFont <0x7f865b814b70>: Libre Caslon Text (537) 14 | 15 | # Goal: access objects in font, such as masters and instances, plus their methods, such as instance.interpolatedFont 16 | 17 | for instance in font.instances(): 18 | print(instance) 19 | print(instance.interpolatedFont) 20 | # for glyph in font.glyphs(): 21 | # print(glyph) 22 | 23 | for i, master in enumerate(font.fontMasters()): 24 | print(i, master) 25 | 26 | # doesn't work :/ 27 | # AttributeError: 'NSDistantObject' object has no attribute 'masters' 28 | # for master in font.masters(): 29 | # print(master) 30 | 31 | font.close(False) 32 | 33 | if __name__ == '__main__': 34 | main() -------------------------------------------------------------------------------- /sources/deprecated/scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.3 2 | beautifulsoup4==4.6.3 3 | booleanOperations==0.8.1 4 | bs4==0.0.1 5 | certifi==2018.10.15 6 | chardet==3.0.4 7 | Click==7.0 8 | commandlines==0.4.1 9 | compreffor==0.4.6.post1 10 | cu2qu==1.6.5 11 | defcon==0.6.0 12 | defusedxml==0.5.0 13 | docutils==0.14 14 | drawBot==3.117 15 | Flask==1.0.2 16 | font-v==0.7.1 17 | -e git+git@github.com:thundernixon/fontbakery.git@e37a63d81360e893b624e8f1928b3c52ab144e5c#egg=fontbakery 18 | fontdiffenator==0.4.7 19 | -e git+https://github.com/googlei18n/fontmake.git@6b46de29ceb1e7515ef57aabd5d26582874c62c4#egg=fontmake 20 | fontMath==0.4.9 21 | fontParts==0.8.1 22 | fontPens==0.1.0 23 | -e git+https://github.com/fonttools/fonttools.git@0c4f11f5ffca711624ffd2f55c841857ced47b7c#egg=fonttools 24 | fs==2.1.2 25 | -e git+https://github.com/googlefonts/gftools.git@c2f80a7ed18b455f301af90db0d253a8d2d60329#egg=gftools 26 | gitdb2==2.0.4 27 | GitPython==2.1.11 28 | glyphsLib==3.1.4 29 | google-apputils==0.4.2 30 | idna==2.7 31 | itsdangerous==1.1.0 32 | Jinja2==2.10 33 | lxml==4.2.5 34 | MarkupSafe==1.1.0 35 | MutatorMath==2.1.2 36 | opentype-sanitizer==7.1.8 37 | Pillow==5.3.0 38 | protobuf==3.6.1 39 | pyclipper==1.1.0.post1 40 | pyobjc==5.0 41 | pyobjc-core==5.0 42 | pyobjc-framework-Accounts==5.0 43 | pyobjc-framework-AddressBook==5.0 44 | pyobjc-framework-AdSupport==5.0 45 | pyobjc-framework-AppleScriptKit==5.0 46 | pyobjc-framework-AppleScriptObjC==5.0 47 | pyobjc-framework-ApplicationServices==5.0 48 | pyobjc-framework-Automator==5.0 49 | pyobjc-framework-AVFoundation==5.0 50 | pyobjc-framework-AVKit==5.0 51 | pyobjc-framework-BusinessChat==5.0 52 | pyobjc-framework-CalendarStore==5.0 53 | pyobjc-framework-CFNetwork==5.0 54 | pyobjc-framework-CloudKit==5.0 55 | pyobjc-framework-Cocoa==5.0 56 | pyobjc-framework-Collaboration==5.0 57 | pyobjc-framework-ColorSync==5.0 58 | pyobjc-framework-Contacts==5.0 59 | pyobjc-framework-ContactsUI==5.0 60 | pyobjc-framework-CoreAudio==5.0 61 | pyobjc-framework-CoreAudioKit==5.0 62 | pyobjc-framework-CoreBluetooth==5.0 63 | pyobjc-framework-CoreData==5.0 64 | pyobjc-framework-CoreLocation==5.0 65 | pyobjc-framework-CoreMedia==5.0 66 | pyobjc-framework-CoreMediaIO==5.0 67 | pyobjc-framework-CoreML==5.0 68 | pyobjc-framework-CoreServices==5.0 69 | pyobjc-framework-CoreSpotlight==5.0 70 | pyobjc-framework-CoreText==5.0 71 | pyobjc-framework-CoreWLAN==5.0 72 | pyobjc-framework-CryptoTokenKit==5.0 73 | pyobjc-framework-DictionaryServices==5.0 74 | pyobjc-framework-DiscRecording==5.0 75 | pyobjc-framework-DiscRecordingUI==5.0 76 | pyobjc-framework-DiskArbitration==5.0 77 | pyobjc-framework-DVDPlayback==5.0 78 | pyobjc-framework-EventKit==5.0 79 | pyobjc-framework-ExceptionHandling==5.0 80 | pyobjc-framework-ExternalAccessory==5.0 81 | pyobjc-framework-FinderSync==5.0 82 | pyobjc-framework-FSEvents==5.0 83 | pyobjc-framework-GameCenter==5.0 84 | pyobjc-framework-GameController==5.0 85 | pyobjc-framework-GameKit==5.0 86 | pyobjc-framework-GameplayKit==5.0 87 | pyobjc-framework-ImageCaptureCore==5.0 88 | pyobjc-framework-IMServicePlugIn==5.0 89 | pyobjc-framework-InputMethodKit==5.0 90 | pyobjc-framework-InstallerPlugins==5.0 91 | pyobjc-framework-InstantMessage==5.0 92 | pyobjc-framework-Intents==5.0 93 | pyobjc-framework-IOSurface==5.0 94 | pyobjc-framework-iTunesLibrary==5.0 95 | pyobjc-framework-LatentSemanticMapping==5.0 96 | pyobjc-framework-LaunchServices==5.0 97 | pyobjc-framework-libdispatch==5.0 98 | pyobjc-framework-LocalAuthentication==5.0 99 | pyobjc-framework-MapKit==5.0 100 | pyobjc-framework-MediaAccessibility==5.0 101 | pyobjc-framework-MediaLibrary==5.0 102 | pyobjc-framework-MediaPlayer==5.0 103 | pyobjc-framework-MediaToolbox==5.0 104 | pyobjc-framework-ModelIO==5.0 105 | pyobjc-framework-MultipeerConnectivity==5.0 106 | pyobjc-framework-NaturalLanguage==5.0 107 | pyobjc-framework-NetFS==5.0 108 | pyobjc-framework-Network==5.0 109 | pyobjc-framework-NetworkExtension==5.0 110 | pyobjc-framework-NotificationCenter==5.0 111 | pyobjc-framework-OpenDirectory==5.0 112 | pyobjc-framework-OSAKit==5.0 113 | pyobjc-framework-Photos==5.0 114 | pyobjc-framework-PhotosUI==5.0 115 | pyobjc-framework-PreferencePanes==5.0 116 | pyobjc-framework-PubSub==5.0 117 | pyobjc-framework-QTKit==5.0 118 | pyobjc-framework-Quartz==5.0 119 | pyobjc-framework-SafariServices==5.0 120 | pyobjc-framework-SceneKit==5.0 121 | pyobjc-framework-ScreenSaver==5.0 122 | pyobjc-framework-ScriptingBridge==5.0 123 | pyobjc-framework-SearchKit==5.0 124 | pyobjc-framework-Security==5.0 125 | pyobjc-framework-SecurityFoundation==5.0 126 | pyobjc-framework-SecurityInterface==5.0 127 | pyobjc-framework-ServiceManagement==5.0 128 | pyobjc-framework-Social==5.0 129 | pyobjc-framework-SpriteKit==5.0 130 | pyobjc-framework-StoreKit==5.0 131 | pyobjc-framework-SyncServices==5.0 132 | pyobjc-framework-SystemConfiguration==5.0 133 | pyobjc-framework-UserNotifications==5.0 134 | pyobjc-framework-VideoSubscriberAccount==5.0 135 | pyobjc-framework-VideoToolbox==5.0 136 | pyobjc-framework-Vision==5.0 137 | pyobjc-framework-WebKit==5.0 138 | python-dateutil==2.7.5 139 | python-gflags==3.1.2 140 | pytz==2018.7 141 | requests==2.20.1 142 | rethinkdb==2.3.0.post6 143 | six==1.11.0 144 | smmap2==2.0.4 145 | tabulate==0.8.2 146 | ttfautohint-py==0.4.2 147 | ufo2ft==2.5.0 148 | ufoLib==2.3.2 149 | ufolint==0.3.3 150 | unicodedata2==11.0.0 151 | Unidecode==1.0.22 152 | urllib3==1.24.1 153 | Werkzeug==0.14.1 154 | -------------------------------------------------------------------------------- /sources/scripts/check-line-length.glyphs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Script to check combined width of ASCII uppercase + lowercase. 3 | """ 4 | 5 | import string 6 | 7 | alphabet = " ".join(string.ascii_letters).split() 8 | 9 | font = Glyphs.font 10 | 11 | totalWidth = 0 12 | 13 | for name in alphabet: 14 | for layer in font.glyphs[name]: 15 | totalWidth += layer.width 16 | 17 | print(totalWidth) -------------------------------------------------------------------------------- /sources/scripts/set-metrics.py: -------------------------------------------------------------------------------- 1 | """ 2 | Set metrics in all masters of a Glyphs source to easily adjust metrics with 3 | a minimum of clicking and typing. Update values, then run once. 4 | 5 | USAGE: 6 | 7 | You must have glyphsLib installed, for instance via `pip install glyphsLib`. 8 | 9 | Then, run this via the terminal, adding the path to a Glyphs source: 10 | 11 | python3 sources/scripts/set-metrics.py sources/LibreCaslonText.glyphs 12 | """ 13 | 14 | from glyphsLib import GSFont 15 | import sys 16 | 17 | filepath = sys.argv[1] 18 | 19 | font = GSFont(filepath) 20 | 21 | for master in font.masters: 22 | master.customParameters["hheaAscender"] = 1940 23 | master.customParameters["hheaDescender"] = -520 24 | master.customParameters["hheaLineGap"] = 0 25 | master.customParameters["typoAscender"] = 1940 26 | master.customParameters["typoDescender"] = -520 27 | master.customParameters["typoLineGap"] = 0 28 | master.customParameters["winAscent"] = 1696 29 | master.customParameters["winDescent"] = 531 30 | 31 | font.save(filepath) -------------------------------------------------------------------------------- /sources/scripts/set-stat-table.py: -------------------------------------------------------------------------------- 1 | """ 2 | Script to use statmake to add STAT table to Libre Caslon 3 | """ 4 | 5 | import sys 6 | import statmake.classes 7 | import statmake.lib 8 | from fontTools.ttLib import TTFont 9 | 10 | font_path = sys.argv[1] 11 | 12 | STAT = { 13 | "axes": [ 14 | { 15 | "name": "Weight", 16 | "tag": "wght", 17 | "locations": [ 18 | { 19 | "name": "Regular", 20 | "value": 400, 21 | "linked_value": 700, 22 | "flags": ["ElidableAxisValueName"] 23 | }, 24 | { 25 | "name": "Medium", 26 | "value": 500 27 | }, 28 | { 29 | "name": "SemiBold", 30 | "value": 600 31 | }, 32 | { 33 | "name": "Bold", 34 | "value": 700 35 | } 36 | ] 37 | }, 38 | { 39 | "name": "Italic", 40 | "tag": "ital", 41 | "locations": [ 42 | { 43 | "name": "Roman", 44 | "value": 0, 45 | "linked_value": 1, 46 | "flags": ["ElidableAxisValueName"] 47 | }, 48 | { 49 | "name": "Italic", 50 | "value": 1 51 | } 52 | ] 53 | } 54 | ] 55 | } 56 | 57 | 58 | def makeStylespace(font_path): 59 | 60 | stylespace = statmake.classes.Stylespace.from_dict(STAT) 61 | 62 | font = TTFont(font_path) 63 | 64 | if "Italic" in font_path: 65 | addedLocs = {"Italic": 1} 66 | else: 67 | addedLocs = {"Italic": 0} 68 | 69 | statmake.lib.apply_stylespace_to_variable_font( 70 | stylespace=stylespace, 71 | varfont=font, 72 | additional_locations=addedLocs 73 | ) 74 | font.save(font_path) 75 | 76 | 77 | makeStylespace(font_path) 78 | -------------------------------------------------------------------------------- /sources/specimen/charset-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/sources/specimen/charset-dark.png -------------------------------------------------------------------------------- /sources/specimen/charset-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/sources/specimen/charset-light.jpg -------------------------------------------------------------------------------- /sources/specimen/charset-tall3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thundernixon/Libre-Caslon/52200a76d723e4a8cb9a566686ed1f56a794f39a/sources/specimen/charset-tall3.png -------------------------------------------------------------------------------- /sources/specimen/drawbot-librecaslon.py: -------------------------------------------------------------------------------- 1 | """ 2 | Copy this list from font editor (in GlyphsApp, select glyphs, right click > copy > Python List) 3 | """ 4 | 5 | glyphNames = ["A", "Aacute", "Abreve", "Acircumflex", "Adieresis", "Agrave", "Amacron", "Aogonek", "Aring", "Aringacute", "Atilde", "AE", "AEacute", "B", "C", "Cacute", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "D", "Eth", "Dcaron", "Dcroat", "uni1E0C", "E", "Eacute", "Ebreve", "Ecaron", "Ecircumflex", "Edieresis", "Edotaccent", "uni1EB8", "Egrave", "Emacron", "Eogonek", "uni1EBC", "F", "G", "Gbreve", "Gcircumflex", "uni0122", "Gdotaccent", "H", "Hbar", "Hcircumflex", "uni1E24", "I", "IJ", "Iacute", "Ibreve", "Icircumflex", "Idieresis", "Idotaccent", "uni1ECA", "Igrave", "Imacron", "Iogonek", "Itilde", "J", "Jcircumflex", "K", "uni0136", "L", "Lacute", "Lcaron", "uni013B", "Ldot", "Lslash", "M", "N", "Nacute", "Ncaron", "uni0145", "uni1E44", "Eng", "Ntilde", "O", "Oacute", "Obreve", "Ocircumflex", "Odieresis", "uni1ECC", "Ograve", "Ohungarumlaut", "Omacron", "uni01EA", "Oslash", "Oslashacute", "Otilde", "OE", "P", "Thorn", "Q", "R", "Racute", "Rcaron", "uni0156", "uni1E5A", "S", "Sacute", "Scaron", "Scircumflex", "uni1E62", "uni018F", "T", "Tbar", "Tcaron", "uni1E6C", "U", "Uacute", "Ubreve", "Ucircumflex", "Udieresis", "uni1EE4", "Ugrave", "Uhungarumlaut", "Umacron", "Uogonek", "Uring", "Utilde", "V", "W", "Wacute", "Wcircumflex", "Wdieresis", "Wgrave", "X", "Y", "Yacute", "Ycircumflex", "Ydieresis", "Ygrave", "uni1EF8", "Z", "Zacute", "Zcaron", "Zdotaccent", "uni1E92", "uni015E", "uni0162", "uni01C4", "uni01C5", "uni01C7", "uni01C8", "uni01CA", "uni01CB", "uni01F1", "uni01F2", "uni0218", "uni021A", "a", "aacute", "abreve", "acircumflex", "adieresis", "agrave", "amacron", "aogonek", "aring", "aringacute", "atilde", "ae", "aeacute", "b", "c", "cacute", "ccaron", "ccedilla", "ccircumflex", "cdotaccent", "d", "eth", "dcaron", "dcroat", "uni1E0D", "e", "eacute", "ebreve", "ecaron", "ecircumflex", "edieresis", "edotaccent", "uni1EB9", "egrave", "emacron", "eogonek", "uni1EBD", "uni0259", "f", "g", "gbreve", "gcircumflex", "uni0123", "gdotaccent", "h", "hbar", "hcircumflex", "uni1E25", "i", "dotlessi", "iacute", "ibreve", "icircumflex", "idieresis", "uni1ECB", "igrave", "ij", "imacron", "iogonek", "itilde", "j", "uni0237", "jcircumflex", "k", "uni0137", "kgreenlandic", "l", "lacute", "lcaron", "uni013C", "ldot", "lslash", "m", "n", "nacute", "napostrophe", "ncaron", "uni0146", "uni1E45", "eng", "ntilde", "o", "oacute", "obreve", "ocircumflex", "odieresis", "uni1ECD", "ograve", "ohungarumlaut", "omacron", "uni01EB", "oslash", "oslashacute", "otilde", "oe", "p", "thorn", "q", "r", "racute", "rcaron", "uni0157", "uni1E5B", "s", "sacute", "scaron", "scircumflex", "uni1E63", "germandbls", "t", "tbar", "tcaron", "uni1E6D", "u", "uacute", "ubreve", "ucircumflex", "udieresis", "uni1EE5", "ugrave", "uhungarumlaut", "umacron", "uni015F", "uni0163", "uni01C6", "uni01C9", "uni01CC", "uni01F3", "uni0219", "uni021B", "uogonek", "uring", "utilde", "v", "w", "wacute", "wcircumflex", "wdieresis", "wgrave", "x", "y", "yacute", "ycircumflex", "ydieresis", "ygrave", "uni1EF9", "z", "zacute", "zcaron", "zdotaccent", "uni1E93", "c_t", "f_b", "f_f", "f_f_b", "f_f_h", "f_f_i", "f_f_j", "f_f_k", "f_f_l", "f_f_t", "f_h", "f_i", "f_j", "f_k", "f_l", "f_t", "s_t", "ordfeminine", "ordmasculine", "uni03BC", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero.denominator", "one.denominator", "two.denominator", "three.denominator", "four.denominator", "five.denominator", "six.denominator", "seven.denominator", "eight.denominator", "nine.denominator", "zero.numerator", "one.numerator", "two.numerator", "three.numerator", "four.numerator", "five.numerator", "six.numerator", "seven.numerator", "eight.numerator", "nine.numerator", "zero.oldstyle", "one.oldstyle", "two.oldstyle", "three.oldstyle", "four.oldstyle", "five.oldstyle", "six.oldstyle", "seven.oldstyle", "eight.oldstyle", "nine.oldstyle", "zero.tnum", "one.tnum", "two.tnum", "three.tnum", "four.tnum", "five.tnum", "six.tnum", "seven.tnum", "eight.tnum", "nine.tnum", "uni2080", "uni2081", "uni2082", "uni2083", "uni2084", "uni2085", "uni2086", "uni2087", "uni2088", "uni2089", "uni2070", "uni00B9", "uni00B2", "uni00B3", "uni2074", "uni2075", "uni2076", "uni2077", "uni2078", "uni2079", "fraction", "onehalf", "uni2153", "uni2154", "onequarter", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "period", "comma", "colon", "semicolon", "ellipsis", "exclam", "exclamdown", "question", "questiondown", "periodcentered", "bullet", "asterisk", "numbersign", "slash", "backslash", "period.tnum", "comma.tnum", "colon.tnum", "semicolon.tnum", "periodcentered.tnum", "numbersign.tnum", "slash.tnum", "parenleft", "parenright", "braceleft", "braceright", "bracketleft", "bracketright", "hyphen", "uni00AD", "endash", "emdash", "underscore", "underscore.tnum", "quotesinglbase", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "apostrophe", "quoteright", "guillemotleft", "guillemotright", "guilsinglleft", "guilsinglright", "quotedbl", "quotesingle", "quotedbl.tnum", "quotesingle.tnum", "Euro", "cent", "currency", "dollar", "florin", "sterling", "yen", "cent.tnum", "dollar.tnum", "Euro.tnum", "sterling.tnum", "yen.tnum", "plus", "minus", "multiply", "divide", "equal", "greater", "less", "plusminus", "asciitilde", "logicalnot", "asciicircum", "uni03BC.1", "percent", "perthousand", "uni2215", "uni2219", "plus.tnum", "minus.tnum", "multiply.tnum", "divide.tnum", "equal.tnum", "greater.tnum", "less.tnum", "plusminus.tnum", "percent.tnum", "at", "ampersand", "paragraph", "section", "copyright", "registered", "trademark", "degree", "bar", "brokenbar", "dagger", "daggerdbl", "uni2120", "paragraph.tnum", "section.tnum", "degree.tnum", "bar.tnum", ] 6 | 7 | 8 | # ======================================================================= 9 | 10 | W, H = 800, 1200 11 | 12 | newPage(W,H) 13 | 14 | # fill(0.1) 15 | fill(0.95,0.95,1) 16 | # fill(0.2,0.2,0.25) 17 | rect(0,0,W,H) 18 | 19 | padding = 20 20 | 21 | # ======================================================================= 22 | 23 | def drawName(yShift, colorShift): 24 | fontName= FormattedString() 25 | fontName.font("../../fonts/librecaslontext/LibreCaslonText-Italic.ttf") 26 | fontSizing = 270 27 | 28 | # fontName.fill(0,0,0,0.25) 29 | fontName.fill(1,0+(colorShift*0.00075),0.25,0.75) 30 | fontName.fontSize(fontSizing) 31 | fontName.tracking(0) 32 | 33 | fontName.lineHeight(fontSizing*.85) 34 | fontName.align("left") 35 | fontName += "Libre\n" 36 | fontName.align("center") 37 | fontName += "Caslon\n" 38 | fontName.align("right") 39 | fontName += "Text" 40 | 41 | textBox(fontName, (padding, -H*0.5-50, W-padding*2, (H*0.5)+padding+yShift)) 42 | 43 | nameRepeats=120 44 | 45 | for i in range(0,nameRepeats): 46 | drawName(i*10,i*10) 47 | 48 | if i == nameRepeats-1: 49 | drawName(i*10,0) 50 | 51 | 52 | # ======================================================================= 53 | 54 | charSet = FormattedString() 55 | 56 | # charSet.font("./EncodeSans-VF.ttf") 57 | charSet.font("../../fonts/librecaslontext/LibreCaslonText-Regular.ttf") 58 | # charSet.fontVariations(wght=400.0,wdth=100.0) 59 | 60 | # fontSizing = 30 61 | fontSizing = 20 62 | 63 | fontTracking = 1.8 64 | trackingIncrease = 0.2 65 | 66 | charSet.fontSize(fontSizing) 67 | charSet.align("justified") 68 | charSet.lineHeight(fontSizing*1.78) 69 | charSet.tracking(fontTracking) 70 | charSet.fill(0,0,0,.8) 71 | # charSet.fill(1,1,10.75) 72 | 73 | for index, glyph in enumerate(glyphNames): 74 | charSet.appendGlyph(glyph) 75 | 76 | 77 | charSet.font("../../fonts/librecaslontext/LibreCaslonText-Medium.ttf") 78 | 79 | fontTracking -= trackingIncrease 80 | charSet.tracking(fontTracking) 81 | 82 | for glyph in glyphNames: 83 | charSet.appendGlyph(glyph) 84 | 85 | charSet.font("../../fonts/librecaslontext/LibreCaslonText-SemiBold.ttf") 86 | 87 | fontTracking -= trackingIncrease 88 | charSet.tracking(fontTracking) 89 | 90 | for glyph in glyphNames: 91 | charSet.appendGlyph(glyph) 92 | 93 | charSet.font("../../fonts/librecaslontext/LibreCaslonText-Bold.ttf") 94 | 95 | fontTracking -= trackingIncrease 96 | charSet.tracking(fontTracking) 97 | 98 | for index, glyph in enumerate(glyphNames): 99 | charSet.appendGlyph(glyph) 100 | 101 | textBox(charSet, (padding, -8, W-padding*2, H-padding/2)) 102 | 103 | # ======================================================================= 104 | 105 | saveImage("charset-light.jpg", imageResolution=144) 106 | -------------------------------------------------------------------------------- /sources/specimen/glyphNames.py: -------------------------------------------------------------------------------- 1 | # glyphNames = ["A", "Aacute", "Abreve", "Acircumflex", "Adieresis", "Agrave", "Amacron", "Aogonek", "Aring", "Aringacute", "Atilde", "AE", "AEacute", "B", "C", "Cacute", "Ccaron", "Ccedilla", "Ccircumflex", "Cdotaccent", "D", "Eth", "Dcaron", "Dcroat", "uni1E0C", "E", "Eacute", "Ebreve", "Ecaron", "Ecircumflex", "Edieresis", "Edotaccent", "uni1EB8", "Egrave", "Emacron", "Eogonek", "uni1EBC", "F", "G", "Gbreve", "Gcircumflex", "uni0122", "Gdotaccent", "H", "Hbar", "Hcircumflex", "uni1E24", "I", "IJ", "Iacute", "Ibreve", "Icircumflex", "Idieresis", "Idotaccent", "uni1ECA", "Igrave", "Imacron", "Iogonek", "Itilde", "J", "Jcircumflex", "K", "uni0136", "L", "Lacute", "Lcaron", "uni013B", "Ldot", "Lslash", "M", "N", "Nacute", "Ncaron", "uni0145", "uni1E44", "Eng", "Ntilde", "O", "Oacute", "Obreve", "Ocircumflex", "Odieresis", "uni1ECC", "Ograve", "Ohungarumlaut", "Omacron", "uni01EA", "Oslash", "Oslashacute", "Otilde", "OE", "P", "Thorn", "Q", "R", "Racute", "Rcaron", "uni0156", "uni1E5A", "S", "Sacute", "Scaron", "Scircumflex", "uni1E62", "uni018F", "T", "Tbar", "Tcaron", "uni1E6C", "U", "Uacute", "Ubreve", "Ucircumflex", "Udieresis", "uni1EE4", "Ugrave", "Uhungarumlaut", "Umacron", "Uogonek", "Uring", "Utilde", "V", "W", "Wacute", "Wcircumflex", "Wdieresis", "Wgrave", "X", "Y", "Yacute", "Ycircumflex", "Ydieresis", "Ygrave", "uni1EF8", "Z", "Zacute", "Zcaron", "Zdotaccent", "uni1E92", "uni015E", "uni0162", "uni01C4", "uni01C5", "uni01C7", "uni01C8", "uni01CA", "uni01CB", "uni01F1", "uni01F2", "uni0218", "uni021A", "a", "aacute", "abreve", "acircumflex", "adieresis", "agrave", "amacron", "aogonek", "aring", "aringacute", "atilde", "ae", "aeacute", "b", "c", "cacute", "ccaron", "ccedilla", "ccircumflex", "cdotaccent", "d", "eth", "dcaron", "dcroat", "uni1E0D", "e", "eacute", "ebreve", "ecaron", "ecircumflex", "edieresis", "edotaccent", "uni1EB9", "egrave", "emacron", "eogonek", "uni1EBD", "uni0259", "f", "g", "gbreve", "gcircumflex", "uni0123", "gdotaccent", "h", "hbar", "hcircumflex", "uni1E25", "i", "dotlessi", "iacute", "ibreve", "icircumflex", "idieresis", "uni1ECB", "igrave", "ij", "imacron", "iogonek", "itilde", "j", "uni0237", "jcircumflex", "k", "uni0137", "kgreenlandic", "l", "lacute", "lcaron", "uni013C", "ldot", "lslash", "m", "n", "nacute", "napostrophe", "ncaron", "uni0146", "uni1E45", "eng", "ntilde", "o", "oacute", "obreve", "ocircumflex", "odieresis", "uni1ECD", "ograve", "ohungarumlaut", "omacron", "uni01EB", "oslash", "oslashacute", "otilde", "oe", "p", "thorn", "q", "r", "racute", "rcaron", "uni0157", "uni1E5B", "s", "sacute", "scaron", "scircumflex", "uni1E63", "germandbls", "t", "tbar", "tcaron", "uni1E6D", "u", "uacute", "ubreve", "ucircumflex", "udieresis", "uni1EE5", "ugrave", "uhungarumlaut", "umacron", "uni015F", "uni0163", "uni01C6", "uni01C9", "uni01CC", "uni01F3", "uni0219", "uni021B", "uogonek", "uring", "utilde", "v", "w", "wacute", "wcircumflex", "wdieresis", "wgrave", "x", "y", "yacute", "ycircumflex", "ydieresis", "ygrave", "uni1EF9", "z", "zacute", "zcaron", "zdotaccent", "uni1E93", "c_t", "f_b", "f_f", "f_f_b", "f_f_h", "f_f_i", "f_f_j", "f_f_k", "f_f_l", "f_f_t", "f_h", "f_i", "f_j", "f_k", "f_l", "f_t", "s_t", "ordfeminine", "ordmasculine", "uni03BC", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero.denominator", "one.denominator", "two.denominator", "three.denominator", "four.denominator", "five.denominator", "six.denominator", "seven.denominator", "eight.denominator", "nine.denominator", "zero.numerator", "one.numerator", "two.numerator", "three.numerator", "four.numerator", "five.numerator", "six.numerator", "seven.numerator", "eight.numerator", "nine.numerator", "zero.oldstyle", "one.oldstyle", "two.oldstyle", "three.oldstyle", "four.oldstyle", "five.oldstyle", "six.oldstyle", "seven.oldstyle", "eight.oldstyle", "nine.oldstyle", "zero.tnum", "one.tnum", "two.tnum", "three.tnum", "four.tnum", "five.tnum", "six.tnum", "seven.tnum", "eight.tnum", "nine.tnum", "uni2080", "uni2081", "uni2082", "uni2083", "uni2084", "uni2085", "uni2086", "uni2087", "uni2088", "uni2089", "uni2070", "uni00B9", "uni00B2", "uni00B3", "uni2074", "uni2075", "uni2076", "uni2077", "uni2078", "uni2079", "fraction", "onehalf", "uni2153", "uni2154", "onequarter", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "period", "comma", "colon", "semicolon", "ellipsis", "exclam", "exclamdown", "question", "questiondown", "periodcentered", "bullet", "asterisk", "numbersign", "slash", "backslash", "period.tnum", "comma.tnum", "colon.tnum", "semicolon.tnum", "periodcentered.tnum", "numbersign.tnum", "slash.tnum", "parenleft", "parenright", "braceleft", "braceright", "bracketleft", "bracketright", "hyphen", "uni00AD", "endash", "emdash", "underscore", "underscore.tnum", "quotesinglbase", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "apostrophe", "quoteright", "guillemotleft", "guillemotright", "guilsinglleft", "guilsinglright", "quotedbl", "quotesingle", "quotedbl.tnum", "quotesingle.tnum", "Euro", "cent", "currency", "dollar", "florin", "sterling", "yen", "cent.tnum", "dollar.tnum", "Euro.tnum", "sterling.tnum", "yen.tnum", "plus", "minus", "multiply", "divide", "equal", "greater", "less", "plusminus", "asciitilde", "logicalnot", "asciicircum", "uni03BC.1", "percent", "perthousand", "uni2215", "uni2219", "plus.tnum", "minus.tnum", "multiply.tnum", "divide.tnum", "equal.tnum", "greater.tnum", "less.tnum", "plusminus.tnum", "percent.tnum", "at", "ampersand", "paragraph", "section", "copyright", "registered", "trademark", "degree", "bar", "brokenbar", "dagger", "daggerdbl", "uni2120", "paragraph.tnum", "section.tnum", "degree.tnum", "bar.tnum", ] -------------------------------------------------------------------------------- /sources/update-gfonts-repo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script copies the latest builds to the google fonts dir in order to run QA checks and prep for a PR 4 | # 5 | # USAGE: 6 | # Install requirements with `pip install -U -r misc/googlefonts-qa/requirements.txt` 7 | # 8 | # after `misc/googlefonts-qa/build.sh` 9 | # call this script from the root of your inter repo, with the absolute path your your google/fonts repo 10 | # `misc/googlefonts-qa/fix-move-check.sh //fonts` 11 | # 12 | # add `push` to the end if you wish to push the result to GitHub 13 | 14 | # ------------------------------------------------------------------- 15 | # UPDATE VARIABLES ABOVE AS NEEDED 16 | 17 | gFontsDir="/Users/stephennixon/type-repos/google-font-repos/fonts" # absolute path to your google/fonts repo directory 18 | gFontsSubDir="librecaslontext" # name for this directory within google/fonts/ofl 19 | 20 | libreCaslonDir=$(pwd) 21 | libreCaslonRomanVF=$libreCaslonDir/fonts/LibreCaslonText\[wght\].ttf 22 | libreCaslonItalicVF=$libreCaslonDir/fonts/LibreCaslonText-Italic\[wght\].ttf 23 | 24 | # UPDATE VARIABLES ABOVE AS NEEDED 25 | # ------------------------------------------------------------------- 26 | 27 | set -e 28 | source venv/bin/activate 29 | 30 | # option to push to GitHub. Without this, it will do a dry run. 31 | pushToGitHub=$1 32 | if [[ "$pushToGitHub" = "-h" || $pushToGitHub = "--help" ]] ; then 33 | echo 'Add absolute path to your Google Fonts Git directory, like:' 34 | echo 'sources/update-gfonts-repo.sh /Users/username/type-repos/google-font-repos/fonts' 35 | exit 2 36 | fi 37 | 38 | # ------------------------------------------------------------------- 39 | # get latest font version to use in PR commit message 40 | set +e 41 | 42 | ttx -t head $libreCaslonRomanVF 43 | fontVersion=v$(xml sel -t --match "//*/fontRevision" -v "@value" ${libreCaslonRomanVF/".ttf"/".ttx"}) 44 | 45 | echo $fontVersion 46 | 47 | rm ${libreCaslonRomanVF/".ttf"/".ttx"} 48 | 49 | set -e 50 | 51 | # ------------------------------------------------------------------- 52 | # navigate to google/fonts repo, get latest, then clear branch & font subdirectory 53 | 54 | cd $gFontsDir 55 | git checkout master 56 | git pull upstream master 57 | git reset --hard 58 | git checkout -B $gFontsSubDir 59 | git clean -f -d 60 | rm -r ofl/$gFontsSubDir 61 | 62 | # ------------------------------------------------------------------- 63 | # copy fonts 64 | 65 | mkdir -p ofl/$gFontsSubDir 66 | 67 | cp $libreCaslonRomanVF ofl/$gFontsSubDir/$(basename $libreCaslonRomanVF) 68 | cp $libreCaslonItalicVF ofl/$gFontsSubDir/$(basename $libreCaslonItalicVF) 69 | 70 | # ------------------------------------------------------------------- 71 | # make or move basic metadata 72 | 73 | gftools add-font ofl/$gFontsSubDir # do this the first time, then edit as needed 74 | 75 | category="SERIF" 76 | designer="Pablo Impallari" 77 | 78 | # update these to be accurate if needed 79 | sed -i "" "s/SANS_SERIF/$category/g" ofl/$gFontsSubDir/METADATA.pb 80 | sed -i "" "s/UNKNOWN/$designer/g" ofl/$gFontsSubDir/METADATA.pb 81 | 82 | cp $libreCaslonDir/OFL.txt ofl/$gFontsSubDir/OFL.txt 83 | 84 | cp $libreCaslonDir/gfonts-description.html ofl/$gFontsSubDir/DESCRIPTION.en_us.html 85 | 86 | # ------------------------------------------------------------------- 87 | # copy static fonts 88 | 89 | cp -r $libreCaslonDir/fonts/static ofl/$gFontsSubDir/static 90 | 91 | # ------------------------------------------------------------------- 92 | # adds and commits new changes, then force pushes 93 | 94 | if [[ $pushToGitHub = "push" ]] ; then 95 | git add . 96 | git commit -m "$gFontsSubDir: $fontVersion added." 97 | 98 | # push to upstream branch (you must manually go to GitHub to make PR from there) 99 | # this is set to push to my upstream (google/fonts) rather than origin so that TravisCI can run 100 | git push --force upstream $gFontsSubDir 101 | fi --------------------------------------------------------------------------------