Updated sources

- Added BUILD.txt detailing build process
- Added hinting files
- Added font generating script
This commit is contained in:
Wei Huang 2015-03-11 19:15:29 +01:00
parent 57e3e6abe4
commit 3449c400bf
13 changed files with 396 additions and 3 deletions

View File

@ -13,8 +13,6 @@ Basic Font Information
*Note: There are no UFOs as UFOs exported from Glyphs App will currently not generate in Robofont and so on due to using '[Bracket trick](http://www.glyphsapp.com/tutorials/alternating-glyph-shapes)' and '[Brace trick](http://www.glyphsapp.com/tutorials/additional-masters-for-individual-glyphs-the-brace-trick)' to solve interpolation bumps. Glyphs marked orange are bracket layers and glyphs marked yellow are using brace layers.*
The project started in June 2014 and the brief was to have a [minimum viable product](http://en.wikipedia.org/wiki/Minimum_viable_product) (alpha release with 9 weights) by December 2014.
There is a Telugu glyph set (Work Sans-Telugu.glyphs) that comes from [Ramabhadra](http://teluguvijayam.org/fonts.html) by Silicon Andhra. Glyphs marked red in the file are those that have been manually cleaned up, the rest are automatically cleaned up with FontForge from Ramabhadra. The Latin glyphs in Work Sans-Telugu.glyphs are out of date.

View File

@ -2,7 +2,7 @@
A SIL Open Font project titled 'Work Sans' (former working title 'Alice') for Latin.
Work Sans is a superfamily based loosely on early Grotesques — i.e. [Stephenson Blake](https://www.flickr.com/photos/stewf/14444337254/), [Miller & Richard](https://archive.org/stream/printingtypespec00millrich#page/226/mode/2up/) and [Bauerschen Giesserei](https://archive.org/stream/hauptprobeingedr00baue#page/109/mode/1up). There will be 9 weights across 5 widths. The core of the fonts are optimised for on-screen medium-sized text usage (14px-48px) but still very usable in print. The fonts closer to the extreme widths and weights are designed more for display use. Overall, features are simplified and optimised for screen resolutions for example, diacritic marks are larger than how they would be in print.
Work Sans is a superfamily based loosely on early Grotesques — i.e. [Stephenson Blake](https://www.flickr.com/photos/stewf/14444337254/), [Miller & Richard](https://archive.org/stream/printingtypespec00millrich#page/226/mode/2up/) and [Bauerschen Giesserei](https://archive.org/stream/hauptprobeingedr00baue#page/109/mode/1up). The core of the fonts are optimised for on-screen medium-sized text usage (14px-48px) but still very usable in print. The fonts closer to the extreme widths and weights are designed more for display use. Overall, features are simplified and optimised for screen resolutions for example, diacritic marks are larger than how they would be in print.
## [Download v1.20 (OTF, TTF, WOFF, EOT)](https://github.com/weiweihuanghuang/Work-Sans/archive/v1.20.zip)

View File

@ -0,0 +1,39 @@
Introduction
------------
I use Glyphs App to work on Work Sans. As stated in README.md I am not offering UFOs since the UFOs generated from Glyphs App will not interpolate properly due to using Glyphs App only features. If there is demand, in the future I may upload a compatible UFO set for interpolation.
Generating Fonts
----------------
There are three sets of instances in Glyphs app, two that are named with font weights, the third named using its stem weights. The first set (10 weights from Hairline to Black) are for generating OTFs and follow Microsoft's recommendations for setting vertical metrics[1]. The second set are for generating TTFs for webfonts and follows Google Font's webfont recommendations[2]. The third were for testing.
The OTFs generated with Glyphs App (Remove Overlap, Autohint) will be usable immediately in desktop applications.
The TTFs (Remove Overlap) will need to be processed and hinted with ttfautohint.
[1] http://www.glyphsapp.com/tutorials/vertical-metrics
[2] https://code.google.com/p/googlefontdirectory/wiki/HowToGenerateWebNativeFonts
Generating hinted TTFs
----------------------
You will need:
- ttfautohint
http://www.freetype.org/ttfautohint/
- Fonttools/TTX
https://github.com/behdad/fonttools/
- sfnt2woff
https://people.mozilla.org/~jkew/woff/
- woff2
https://github.com/google/woff2
Once the TTFs have been generated, they need to processed with the generatefamily.sh script. To run this script, make sure the exported TTFs are in the same folder as the script. Open Terminal at the folder and enter:
sh generatefamily.sh
This script will:
1. Dumps the `GLYF` table of each TTF in the folder.
2. Performs a find and replace using Python to set the ROUND_XY_TO_GRID[3] bit in composite glyphs in each generated TTX file.
3. Recompiles TTFs from the edited TTX file.
4. Runs ttfautohint and creates autohinted TTFs (with control-files for some weights that define custom hinting to correct autohinting mistakes when rendered in ClearType GDI).
[3] Setting the ROUND_XY_TO_GRID bit in composite glyphs causes components to be shifted by an integer pixel amount which preserves the hinted shape. This reduces file size so that ttfautohint does not need to rehint composite glyphs to create consistent rendering especially important for glyphs such as super-/sub-script numerals and fractions which use components that are shifted.

39
sources/generatefamily.sh Normal file
View File

@ -0,0 +1,39 @@
for i in *.ttf; do
ttx -t glyf "$i"
done
for i in *.ttx; do
python setflag.py "$i"
done
for i in *.ttx; do
name=$(basename "$i" .ttx)
path=$(dirname "$i")
ttx -m "$path/$name.ttf" "$i"
rm "$i"
rm "$path/$name.ttf"
# mv "$path/$name#1.ttf" "$path/$name.ttf"
done
ttfautohint -n -w G -x 0 -f latn WorkSans-Hairline#1.ttf WorkSans-Hairline.ttf
echo "WorkSans-Hairline.ttf hinted"
ttfautohint -n -w G -x 0 -f latn WorkSans-Thin#1.ttf WorkSans-Thin.ttf
echo "WorkSans-Thin.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-ExtraLight.ctrl WorkSans-ExtraLight#1.ttf WorkSans-ExtraLight.ttf
echo "WorkSans-ExtraLight.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-Light.ctrl WorkSans-Light#1.ttf WorkSans-Light.ttf
echo "WorkSans-Light.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-Regular.ctrl WorkSans-Regular#1.ttf WorkSans-Regular.ttf
echo "WorkSans-Regular.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-Medium.ctrl WorkSans-Medium#1.ttf WorkSans-Medium.ttf
echo "WorkSans-Medium.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-SemiBold.ctrl WorkSans-SemiBold#1.ttf WorkSans-SemiBold.ttf
echo "WorkSans-SemiBold.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-Bold.ctrl WorkSans-Bold#1.ttf WorkSans-Bold.ttf
echo "WorkSans-Bold.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-ExtraBold.ctrl WorkSans-ExtraBold#1.ttf WorkSans-ExtraBold.ttf
echo "WorkSans-ExtraBold.ttf hinted"
ttfautohint -n -w G -x 0 -f latn --control-file=hinting/WorkSans-Black.ctrl WorkSans-Black#1.ttf WorkSans-Black.ttf
echo "WorkSans-Black.ttf hinted"
for i in *#1.ttf; do
rm "$i"
done

View File

@ -0,0 +1,42 @@
Q left 25 (-75, 10)
Ccedilla left 17 (-50, 10)
ccedilla left 22 (-50, 10)
# Middle of g too thick
g touch 36 yshift 0.375 @23,24 #bot of bot of top bowl
g touch 40-43 yshift -0.375 @23,24 #top of mid-stroke
g touch 59-64 yshift 0.25 @23,24 #bot of mid-stroke
g touch 56,57,66,67 yshift -0.5 @23,24 #top of bot-stroke
g touch 68 yshift -0.75 @23,24 #mid-point of top of bot-stroke
gbreve touch 37 yshift 0.375 @23,24 #bot of bot of top bowl
gbreve touch 51-54 yshift -0.375 @23,24 #top of mid-stroke
gbreve touch 70-75 yshift 0.25 @23,24 #bot of mid-stroke
gbreve touch 67,68,77,78 yshift -0.5 @23,24 #top of bot-stroke
gbreve touch 79 yshift -0.75 @23,24 #mid-point of top of bot-stroke
uni0123 touch 40 yshift 0.375 @23,24 #bot of bot of top bowl
uni0123 touch 44-47 yshift -0.375 @23,24 #top of mid-stroke
uni0123 touch 63-68 yshift 0.25 @23,24 #bot of mid-stroke
uni0123 touch 60,61,70,71 yshift -0.5 @23,24 #top of bot-stroke
uni0123 touch 72 yshift -0.75 @23,24 #mid-point of top of bot-stroke
g touch 35-38 yshift 0.25 @21,22 #bot of bot of top bowl
g touch 40-43 yshift -0.625 @21,22 #top of mid-stroke
g touch 60-63 yshift -0.375 @21,22 #bot of mid-stroke
g touch 56-59,64-68 yshift -0.5 @21,22 #top of bot-stroke
gbreve touch 46-48 yshift 0.25 @21,22 #bot of bot of top bowl
gbreve touch 51-54 yshift -0.625 @21,22 #top of mid-stroke
gbreve touch 71-74 yshift -0.375 @21,22 #bot of mid-stroke
gbreve touch 67-70,75-79 yshift -0.5 @21,22 #top of bot-stroke
uni0123 touch 39-42 yshift 0.25 @21,22 #bot of bot of top bowl
uni0123 touch 44-47 yshift -0.625 @21,22 #top of mid-stroke
uni0123 touch 64-67 yshift -0.375 @21,22 #bot of mid-stroke
uni0123 touch 60-63,68-72 yshift -0.5 @21,22 #top of bot-stroke
# breve too short
breve touch 5,6,10,11 yshift 1 @23,24
gbreve touch 2,3,7,8 yshift 1 @23,24
# accents too low
breve touch 0-11 yshift 1 @21,22
gbreve touch 0-11 yshift 1 @21,22
uni0123 touch 0,1 yshift 1 @21,22
uni0123 touch 0,1 yshift 1 @21,22

View File

@ -0,0 +1,45 @@
Q left 25 (-75, 10)
Ccedilla left 18 (-50, 10)
ccedilla left 19 (-50, 10)
a touch 15 yshift 0.25 @22
aogonek touch 22 yshift 0.25 @22
ae touch 51,59,60 yshift 0.625 @22
e touch 23,24 yshift -0.675 @14
e touch 26 yshift 0.375 @14
ae touch 46,47 yshift -0.675 @14
ae touch 50 yshift 0.375 @14
g touch 37-38 yshift 0.375 @14
g touch 0,44,45 yshift -0.75 @14
g touch 63,64 yshift 0.5 @14
gbreve touch 20-21 yshift 0.375 @14
gbreve touch 27-29 yshift -0.75 @14
gbreve touch 69,80 yshift 0.5 @14
g touch 37-38 yshift 0.375 @21-22 # bot of bot of top bowl
g touch 0,44,45 yshift -0.75 @21-22 # top of mid stroke
g touch 62-65 yshift -0.75 @21-22 # bot of mid stroke
g touch 58,68,69 yshift -0.5 @21-22 # top of bot stroke
gbreve touch 20-21 yshift 0.375 @21-22
gbreve touch 26-29 yshift -0.75 @21-22
gbreve touch 69,70,79,80 yshift -0.75 @21-22
gbreve touch 73-75 yshift -0.5 @21-22
uni0123 touch 41,42 yshift 0.375 @21-22
uni0123 touch 4,47-49 yshift -0.75 @21-22
uni0123 touch 66-69 yshift -0.75 @21-22
uni0123 touch 62,72,73 yshift -0.5 @21-22
g_j.liga touch 50-51 yshift 0.375 @21-22
g_j.liga touch 12,57,58 yshift -0.75 @21-22
g_j.liga touch 89-92 yshift -0.75 @21-22
g_j.liga touch 85,95,96 yshift -0.5 @21-22
gbreve touch 0-13 yshift 1 @14-16
breve touch 0-13 yshift 1 @14-16
macron touch 0-3 yshift 1 @14-16,21,22
#Euro touch 13,14,31,32 yshift 0.75 @17,18
#Euro touch 15,16,29,30 yshift -0.125 @17,18
#Euro touch 8,9,35,36 yshift -0.75 @17,18
#Euro touch 6,7,37,38 yshift 0.125 @17,18

View File

@ -0,0 +1,40 @@
# bottom of Q too thick
Q left 25 (-100, 100)
# bottom of C- c- cedilla too thick
Ccedilla left 18 (-50, 10)
ccedilla left 21 (-50, 10)
# Middle of g too thick
g touch 37-38 yshift 0.375 @17,18
g touch 0,44,45 yshift -0.75 @17,18
g touch 60-63 yshift -0.5 @17,18
gbreve touch 50-52 yshift 0.375 @17,18
gbreve touch 14,57,58 yshift -0.75 @17,18
gbreve touch 73-76 yshift -0.5 @17,18
# Middle of g too thick
g touch 38 yshift 0.375 @21,22
g touch 0,44,45 yshift -1 @21,22
g touch 60-63 yshift -1 @21,22
g touch 58,67,68 yshift -0.125 @21,22
gbreve touch 51 yshift 0.375 @21,22
gbreve touch 14,57,58 yshift -1 @21,22
gbreve touch 73-76 yshift -1 @21,22
gbreve touch 71,80,81 yshift -0.125 @21,22
uni0123 touch 42 yshift 0.375 @21,22
uni0123 touch 4,48,49 yshift -1 @21,22
uni0123 touch 64-67 yshift -1 @21,22
uni0123 touch 62,71,72 yshift -0.125 @21,22
# breve too short
breve touch 5,6,12,13 yshift 1 @17,18,21,22
gbreve touch 2,3,9,10 yshift 1 @17,18,21,22
# accents too low
circumflex touch 0-6 yshift 1 @15-18,21,22
breve touch 0-13 yshift 1 @15,16,21,22
gbreve touch 0-13 yshift 1 @15,16,21,22
macron touch 0-3 yshift 1 @15,16,19-22,25,26
uni0123 touch 0,1 yshift 1 @21,22
uni0123 touch 0,1 yshift 1 @21,22

View File

@ -0,0 +1,42 @@
# bottom of C- c- cedilla
Ccedilla left 19 (-50, 10)
ccedilla left 19 (-50, 10)
# middle of S s too bold
S touch 13 yshift -0.125 @33-41 #top
S touch 34 yshift 0.125 @33-41 #bot
Scaron touch 20 yshift -0.125 @33-41 #top
Scaron touch 41 yshift 0.125 @33-41 #bot
Sacute touch 17 yshift -0.125 @33-41 #top
Sacute touch 38 yshift 0.125 @33-41 #bot
uni015E touch 54 yshift -0.125 @33-41 #top
uni015E touch 32 yshift 0.125 @33-41 #bot
s touch 32 yshift -0.125 @33-41 #top
s touch 12 yshift 0.125 @33-41 #bot
uni015F touch 52 yshift -0.125 @33-41 #top
uni015F touch 32 yshift 0.125 @33-41 #bot
# middle of S s too light
S touch 13 yshift 0.125 @42-49 #top
S touch 34 yshift -0.125 @42-49 #bot
S touch 12 yshift 0.125 @42-49 #top
S touch 32 yshift -0.125 @42-49 #bot
Scaron touch 20 yshift 0.125 @42-49 #top
Scaron touch 41 yshift -0.125 @42-49 #bot
Sacute touch 17 yshift 0.125 @42-49 #top
Sacute touch 38 yshift -0.125 @42-49 #bot
uni015E touch 54 yshift 0.125 @42-49 #top
uni015E touch 32 yshift -0.125 @42-49 #bot
s touch 32 yshift 0.125 @42-49 #top
s touch 12 yshift -0.125 @42-49 #bot
uni015F touch 52 yshift 0.125 @42-49 #top
uni015F touch 32 yshift -0.125 @42-49 #bot
# middle of a too light
a touch 40 yshift -0.25 @42-47
aogonek touch 53 yshift -0.25 @42-47
a touch 40 yshift -0.125 @48-50
aogonek touch 53 yshift -0.125 @48-50

View File

@ -0,0 +1,45 @@
# bottom of C- c- cedilla
Ccedilla left 19 (-50, 10)
ccedilla left 19 (-50, 10)
# middle of S s too bold
S touch 12 yshift -0.125 @23-30 #top
S touch 32 yshift 0.125 @23-30 #bot
Scaron touch 19 yshift -0.125 @23-30 #top
Scaron touch 39 yshift 0.125 @23-30 #bot
Sacute touch 16 yshift -0.125 @23-30 #top
Sacute touch 36 yshift 0.125 @23-30 #bot
uni015E touch 53 yshift -0.125 @23-30 #top
uni015E touch 32 yshift 0.125 @23-30 #bot
s touch 34 yshift -0.125 @23-30 #top
s touch 12 yshift 0.125 @23-30 #bot
uni015F touch 54 yshift -0.125 @23-30 #top
uni015F touch 32 yshift 0.125 @23-30 #bot
# middle of S s too light
S touch 12 yshift 0.125 @31-36 #top
S touch 32 yshift -0.125 @31-36 #bot
S touch 12 yshift 0.125 @31-36 #top
S touch 32 yshift -0.125 @31-36 #bot
Scaron touch 19 yshift 0.125 @31-36 #top
Scaron touch 39 yshift -0.125 @31-36 #bot
Sacute touch 16 yshift 0.125 @31-36 #top
Sacute touch 36 yshift -0.125 @31-36 #bot
uni015E touch 53 yshift 0.125 @31-36 #top
uni015E touch 32 yshift -0.125 @31-36 #bot
s touch 34 yshift 0.125 @31-36 #top
s touch 12 yshift -0.125 @31-36 #bot
uni015F touch 54 yshift 0.125 @31-36 #top
uni015F touch 32 yshift -0.125 @31-36 #bot
# middle of a too bold
a touch 17 yshift -0.125 @29,30
aogonek touch 23 yshift -0.125 @29,30
# middle of a too light
a touch 38 yshift -0.25 @31,32,35,36
a touch 39 yshift -0.125 @33,34
aogonek touch 54 yshift -0.25 @31,32,35,36
aogonek touch 55 yshift -0.125 @33,34

View File

@ -0,0 +1,22 @@
Q left 25 (-75, 10)
a touch 16 yshift 0.375 @18-21
a touch 17 yshift 0.125 @18-21
aogonek touch 21 yshift 0.375 @18-21
aogonek touch 22 yshift 0.125 @18-21
s touch 12 yshift -0.125 @18-21
s touch 33 yshift 0.125 @18-21
S touch 12 yshift 0.125 @18-21
S touch 32 yshift -0.125 @18-21
s touch 12 yshift 0.125 @15-17
s touch 33 yshift -0.125 @15-17
S touch 12 yshift -0.125 @15-17
S touch 32 yshift 0.125 @15-17
g touch 39-40,53-55 yshift 0.125 @18 # top and bot of bot of top bowl
g touch 0,47-48 yshift -0.875 @18 # top of mid stroke
g touch 65-68 yshift -0.5 @18 # bot of mid stroke
gbreve touch 20-22,62,72-73 yshift 0.125 @18
gbreve touch 29-31 yshift -0.875 @18
gbreve touch 74,75,85,86 yshift -0.5 @18
g_j.liga touch 18-20,70,80,81 yshift 0.125 @18
g_j.liga touch 25-27 yshift -0.875 @18
g_j.liga touch 82,83,93,94 yshift -0.5 @18

View File

@ -0,0 +1,40 @@
#OE touch 33-touch 35 yshift 0.375 @21
Ccedilla left 20 (-50, 10)
ccedilla left 20 (-50, 10)
Q left 25 (-75, 10)
a touch 16 yshift 0.375 @22-26
a touch 17 yshift 0.125 @22-26
aogonek touch 21 yshift 0.375 @22-26
aogonek touch 22 yshift 0.125 @22-26
S touch 12 yshift 0.125 @22-26
S touch 32 yshift -0.125 @22-26
S touch 12 yshift -0.125 @17-21
S touch 32 yshift 0.125 @17-21
Scaron touch 19 yshift 0.125 @22-26
Scaron touch 39 yshift -0.125 @22-26
Scaron touch 19 yshift -0.125 @17-21
Scaron touch 39 yshift 0.125 @17-21
Sacute touch 16 yshift 0.125 @22-26
Sacute touch 36 yshift -0.125 @22-26
Sacute touch 16 yshift -0.125 @17-21
Sacute touch 36 yshift 0.125 @17-21
uni015E touch 53 yshift 0.125 @22-26
uni015E touch 33 yshift -0.125 @22-26
uni015E touch 53 yshift -0.125 @17-21
uni015E touch 33 yshift 0.125 @17-21
s touch 33 yshift 0.125 @22-26
s touch 12 yshift -0.125 @22-26
s touch 33 yshift -0.125 @17-21
s touch 12 yshift 0.125 @17-21
uni015F touch 54 yshift 0.125 @22-26
uni015F touch 33 yshift -0.125 @22-26
uni015F touch 54 yshift -0.125 @17-21
uni015F touch 33 yshift 0.125 @17-21
sterling touch 14 yshift 0.5 @22-24
sterling touch 62 yshift 1 @22-24
sterling touch 11, 64 yshift 0.625 @22-24
sterling touch 67 yshift -1 @22-24

View File

@ -0,0 +1,14 @@
Q left 25 (-75, 10)
Ccedilla left 20 (-50, 10)
ccedilla left 20 (-50, 10)
gbreve touch 0-13 yshift 1 @15,16
breve touch 0-13 yshift 1 @15,16
macron touch 0-3 yshift 1 @15,16
a touch 16 yshift 0.25 @25,26
a touch 37 yshift -0.25 @25,26 # bot of mid stroke
a touch 44 yshift -0.125 @25,26 # top of bot storke
aogonek touch 21 yshift 0.25 @25,26
aogonek touch 51 yshift -0.25 @25,26 # bot of mid stroke
aogonek touch 58 yshift -0.125 @25,26 # top of bot storke

27
sources/setflag.py Normal file
View File

@ -0,0 +1,27 @@
# This python script finds and replaces the flags="0x0" with flags="0x4" to set the ROUND_XY_TO_GRID bit in a TTX.
# I'm sure this could be done in a much more efficient way, i.e. actually calling fontTools directly instead of dumping and recompiling the GLYF table with TTX
# ... but I don't know how to do that
# import the modules that we need. (re is for regex)
import os, re, sys
eachTTX = sys.argv[1]
# set the working directory for a shortcut
# os.chdir('/Users/weihuang/Google Drive/Type Design/Google/Outputs/Test/Hinting')
# open the source file and read it
fh = file(eachTTX, 'r')
subject = fh.read()
fh.close()
# create the pattern object. Note the "r". In case you're unfamiliar with Python
# this is to set the string as raw so we don't have to escape our escape characters
pattern = re.compile(r'<component (.+)flags="(0x0)"(.+)')
# do the replace
result = pattern.sub(r'<component \1flags="0x4"\3', subject)
# write the file
f_out = file(eachTTX, 'w')
f_out.write(result)
f_out.close()