Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Lib/axisregistry/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import logging
from glob import glob
import os
from axisregistry.greendot import green_dot


try:
from ._version import version as __version__ # type: ignore
Expand Down Expand Up @@ -98,12 +100,26 @@ def fallbacks_in_fvar(self, ttFont):
if axis not in self.keys():
log.warn(f"Axis {axis} not found in GF Axis Registry!")
continue
if axis == "opsz":
opsz_sizes = green_dot(
axes_in_font[axis]["min"], axes_in_font[axis]["max"]
)
# add min and max (Rosa request)
opsz_sizes += (
[axes_in_font[axis]["min"]]
+ opsz_sizes
+ [axes_in_font[axis]["max"]]
)
else:
opsz_sizes = []
for fallback in self[axis].fallback:
if (
fallback.value < axes_in_font[axis]["min"]
or fallback.value > axes_in_font[axis]["max"]
):
continue
if axis == "opsz" and fallback.value not in opsz_sizes:
continue
res[axis].append(fallback)
return res

Expand Down
77 changes: 77 additions & 0 deletions Lib/axisregistry/greendot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
"""
David Berlow's Green Dot algorithm:
https://docs.google.com/document/d/15652Yabs0prnocpjG1TxG6zrfFSIYqOwlSIMkdbgqfg/edit?resourcekey=0-DXNZQLV2TbSqyn9HCLfhFA
"""
from collections import OrderedDict
import sys


size_ranges = OrderedDict(
{
(6, 12): [6, 7, 8, 9, 10, 11, 12],
(12, 18): [12, 14, 18],
(18, 32): [18, 24, 28, 32],
(32, 54): [32, 36, 48, 54],
(54, 144): [54, 60, 72, 96, 120, 144],
}
)

DOC_SIZES = [6, 7, 8, 9, 10, 11, 12, 14, 18, 24, 28, 36, 48, 60, 72, 96, 120, 144]

SEGMENT_COUNT = 6


def pin(n):
return min(DOC_SIZES, key=lambda x: abs(x - n))


def mid(a, b):
return (a + b) / 2


def green_dot(min_opsz, max_opsz):
pos_1 = get_first_pos(min_opsz, max_opsz)
pos_5 = get_fifth_pos(min_opsz, max_opsz)
pos_3 = get_third_pos(min_opsz, max_opsz)
pos_2 = mid(pos_1, pos_3)
pos_4 = mid(pos_3, pos_5)
if pos_5 - pos_1 < 3:
return [pos_1, pos_5]
return sorted(set(pin(o) for o in (pos_1, pos_2, pos_3, pos_4, pos_5)))


def get_first_pos(min_opsz, max_opsz):
for smallest, largest in size_ranges:
if min_opsz <= smallest and max_opsz >= largest:
return mid(smallest, largest)
return min_opsz


def get_fifth_pos(min_opsz, max_opsz):
best_range = None
for smallest, largest in size_ranges:
if min_opsz <= smallest and max_opsz >= largest:
best_range = (smallest, largest)
if not best_range:
return max_opsz

best_range = size_ranges[best_range]
mid = best_range[int(len(best_range) / 2)]
return int((max_opsz + mid) / 2)


def get_third_pos(min_opsz, max_opsz):
segment_size = (max_opsz - min_opsz) / SEGMENT_COUNT
return min_opsz + 1.5 * segment_size


def parse_range(string):
return tuple(map(int, string.split(",")))


if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python -m gftools.greendot 0,10")
sys.exit()
opsz_range = parse_range(sys.argv[1])
print(green_dot(*opsz_range))
Original file line number Diff line number Diff line change
Expand Up @@ -19,56 +19,56 @@
</Axis>
<Axis index="3">
<AxisTag value="GRAD"/>
<AxisNameID value="340"/> <!-- Grade -->
<AxisNameID value="328"/> <!-- Grade -->
<AxisOrdering value="3"/>
</Axis>
<Axis index="4">
<AxisTag value="slnt"/>
<AxisNameID value="341"/> <!-- Slant -->
<AxisNameID value="329"/> <!-- Slant -->
<AxisOrdering value="4"/>
</Axis>
<Axis index="5">
<AxisTag value="XTRA"/>
<AxisNameID value="343"/> <!-- Counter Width -->
<AxisNameID value="331"/> <!-- Counter Width -->
<AxisOrdering value="5"/>
</Axis>
<Axis index="6">
<AxisTag value="XOPQ"/>
<AxisNameID value="344"/> <!-- Thick Stroke -->
<AxisNameID value="332"/> <!-- Thick Stroke -->
<AxisOrdering value="6"/>
</Axis>
<Axis index="7">
<AxisTag value="YOPQ"/>
<AxisNameID value="345"/> <!-- Thin Stroke -->
<AxisNameID value="333"/> <!-- Thin Stroke -->
<AxisOrdering value="7"/>
</Axis>
<Axis index="8">
<AxisTag value="YTLC"/>
<AxisNameID value="346"/> <!-- Lowercase Height -->
<AxisNameID value="334"/> <!-- Lowercase Height -->
<AxisOrdering value="8"/>
</Axis>
<Axis index="9">
<AxisTag value="YTUC"/>
<AxisNameID value="347"/> <!-- Uppercase Height -->
<AxisNameID value="335"/> <!-- Uppercase Height -->
<AxisOrdering value="9"/>
</Axis>
<Axis index="10">
<AxisTag value="YTAS"/>
<AxisNameID value="348"/> <!-- Ascender Height -->
<AxisNameID value="336"/> <!-- Ascender Height -->
<AxisOrdering value="10"/>
</Axis>
<Axis index="11">
<AxisTag value="YTDE"/>
<AxisNameID value="349"/> <!-- Descender Depth -->
<AxisNameID value="337"/> <!-- Descender Depth -->
<AxisOrdering value="11"/>
</Axis>
<Axis index="12">
<AxisTag value="YTFI"/>
<AxisNameID value="350"/> <!-- Figure Height -->
<AxisNameID value="338"/> <!-- Figure Height -->
<AxisOrdering value="12"/>
</Axis>
</DesignAxisRecord>
<!-- AxisValueCount=47 -->
<!-- AxisValueCount=35 -->
<AxisValueArray>
<AxisValue index="0" Format="1">
<AxisIndex value="0"/>
Expand Down Expand Up @@ -186,168 +186,96 @@
<Value value="8.0"/>
</AxisValue>
<AxisValue index="19" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="322"/> <!-- 9pt -->
<Value value="9.0"/>
</AxisValue>
<AxisValue index="20" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="323"/> <!-- 10pt -->
<Value value="10.0"/>
</AxisValue>
<AxisValue index="21" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="324"/> <!-- 11pt -->
<Value value="11.0"/>
</AxisValue>
<AxisValue index="22" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="325"/> <!-- 12pt -->
<Value value="12.0"/>
</AxisValue>
<AxisValue index="23" Format="1">
<AxisIndex value="2"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="326"/> <!-- 14pt -->
<ValueNameID value="322"/> <!-- 14pt -->
<Value value="14.0"/>
</AxisValue>
<AxisValue index="24" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="327"/> <!-- 16pt -->
<Value value="16.0"/>
</AxisValue>
<AxisValue index="25" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="328"/> <!-- 17pt -->
<Value value="17.0"/>
</AxisValue>
<AxisValue index="26" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="329"/> <!-- 18pt -->
<Value value="18.0"/>
</AxisValue>
<AxisValue index="27" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="330"/> <!-- 20pt -->
<Value value="20.0"/>
</AxisValue>
<AxisValue index="28" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="331"/> <!-- 24pt -->
<Value value="24.0"/>
</AxisValue>
<AxisValue index="29" Format="1">
<AxisValue index="20" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="332"/> <!-- 28pt -->
<ValueNameID value="323"/> <!-- 28pt -->
<Value value="28.0"/>
</AxisValue>
<AxisValue index="30" Format="1">
<AxisValue index="21" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="333"/> <!-- 36pt -->
<ValueNameID value="324"/> <!-- 36pt -->
<Value value="36.0"/>
</AxisValue>
<AxisValue index="31" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="334"/> <!-- 48pt -->
<Value value="48.0"/>
</AxisValue>
<AxisValue index="32" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="335"/> <!-- 60pt -->
<Value value="60.0"/>
</AxisValue>
<AxisValue index="33" Format="1">
<AxisValue index="22" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="336"/> <!-- 72pt -->
<ValueNameID value="325"/> <!-- 72pt -->
<Value value="72.0"/>
</AxisValue>
<AxisValue index="34" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="337"/> <!-- 96pt -->
<Value value="96.0"/>
</AxisValue>
<AxisValue index="35" Format="1">
<AxisValue index="23" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="338"/> <!-- 120pt -->
<ValueNameID value="326"/> <!-- 120pt -->
<Value value="120.0"/>
</AxisValue>
<AxisValue index="36" Format="1">
<AxisValue index="24" Format="1">
<AxisIndex value="2"/>
<Flags value="0"/>
<ValueNameID value="339"/> <!-- 144pt -->
<ValueNameID value="327"/> <!-- 144pt -->
<Value value="144.0"/>
</AxisValue>
<AxisValue index="37" Format="1">
<AxisValue index="25" Format="1">
<AxisIndex value="3"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="0.0"/>
</AxisValue>
<AxisValue index="38" Format="1">
<AxisValue index="26" Format="1">
<AxisIndex value="4"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="342"/> <!-- Default -->
<ValueNameID value="330"/> <!-- Default -->
<Value value="0.0"/>
</AxisValue>
<AxisValue index="39" Format="1">
<AxisValue index="27" Format="1">
<AxisIndex value="5"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="400.0"/>
</AxisValue>
<AxisValue index="40" Format="1">
<AxisValue index="28" Format="1">
<AxisIndex value="6"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="88.0"/>
</AxisValue>
<AxisValue index="41" Format="1">
<AxisValue index="29" Format="1">
<AxisIndex value="7"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="116.0"/>
</AxisValue>
<AxisValue index="42" Format="1">
<AxisValue index="30" Format="1">
<AxisIndex value="8"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="500.0"/>
</AxisValue>
<AxisValue index="43" Format="1">
<AxisValue index="31" Format="1">
<AxisIndex value="9"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="725.0"/>
</AxisValue>
<AxisValue index="44" Format="1">
<AxisValue index="32" Format="1">
<AxisIndex value="10"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="750.0"/>
</AxisValue>
<AxisValue index="45" Format="1">
<AxisValue index="33" Format="1">
<AxisIndex value="11"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
<Value value="-250.0"/>
</AxisValue>
<AxisValue index="46" Format="1">
<AxisValue index="34" Format="1">
<AxisIndex value="12"/>
<Flags value="2"/> <!-- ElidableAxisValueName -->
<ValueNameID value="316"/> <!-- Normal -->
Expand Down
Loading