fixedTools

fontTools.misc.fixedTools.py – tools for working with fixed numbers.

fontTools.misc.fixedTools.otRound(value)[source]

Round float value to nearest integer towards +Infinity. For fractional values of 0.5 and higher, take the next higher integer; for other fractional values, truncate.

https://docs.microsoft.com/en-us/typography/opentype/spec/otvaroverview https://github.com/fonttools/fonttools/issues/1248#issuecomment-383198166

fontTools.misc.fixedTools.fixedToFloat(value, precisionBits)[source]

Converts a fixed-point number to a float given the number of precisionBits. Ie. value / (1 << precisionBits)

>>> import math
>>> f = fixedToFloat(-10139, precisionBits=14)
>>> math.isclose(f, -0.61883544921875)
True
fontTools.misc.fixedTools.floatToFixed(value, precisionBits)[source]

Converts a float to a fixed-point number given the number of precisionBits. Ie. round(value * (1 << precisionBits)).

>>> floatToFixed(-0.61883544921875, precisionBits=14)
-10139
>>> floatToFixed(-0.61884, precisionBits=14)
-10139
fontTools.misc.fixedTools.floatToFixedToFloat(value, precisionBits)[source]

Converts a float to a fixed-point number given the number of precisionBits, round it, then convert it back to float again. Ie. round(value * (1<<precisionBits)) / (1<<precisionBits) Note: this is equivalent to fixedToFloat(floatToFixed(value)).

>>> import math
>>> f1 = -0.61884
>>> f2 = floatToFixedToFloat(-0.61884, precisionBits=14)
>>> f1 != f2
True
>>> math.isclose(f2, -0.61883544921875)
True
fontTools.misc.fixedTools.floatToFixedToStr(value, precisionBits)[source]

Convert float to string using the shortest decimal representation (ie. the least number of fractional decimal digits) to represent the equivalent fixed-point number with ‘precisionBits’ fractional binary digits. It uses fixedToStr under the hood.

>>> floatToFixedToStr(-0.61883544921875, precisionBits=14)
'-0.61884'
fontTools.misc.fixedTools.fixedToStr(value, precisionBits)[source]

Converts a fixed-point number with ‘precisionBits’ number of fractional binary digits to a string representing a decimal float, choosing the float that has the shortest decimal representation (the least number of fractional decimal digits). Eg. to convert a fixed-point number in a 2.14 format, use precisionBits=14:

>>> fixedToStr(-10139, precisionBits=14)
'-0.61884'

This is pretty slow compared to the simple division used in fixedToFloat. Use sporadically when you need to serialize or print the fixed-point number in a human-readable form.

NOTE: precisionBits is only supported up to 16.

fontTools.misc.fixedTools.strToFixed(string, precisionBits)[source]

Convert the string representation of a decimal float number to a fixed-point number with ‘precisionBits’ fractional binary digits. E.g. to convert a float string to a 2.14 fixed-point number:

>>> strToFixed('-0.61884', precisionBits=14)
-10139
fontTools.misc.fixedTools.strToFixedToFloat(string, precisionBits)[source]

Convert a string to a decimal float, by first converting the float to a fixed-point number with precisionBits fractional binary digits. This is simply a shorthand for fixedToFloat(floatToFixed(float(s))).

>>> import math
>>> s = '-0.61884'
>>> bits = 14
>>> f = strToFixedToFloat(s, precisionBits=bits)
>>> math.isclose(f, -0.61883544921875)
True
>>> f == fixedToFloat(floatToFixed(float(s), precisionBits=bits), precisionBits=bits)
True
fontTools.misc.fixedTools.ensureVersionIsLong(value)[source]

Ensure a table version is an unsigned long (unsigned short major, unsigned short minor) instead of a float.

fontTools.misc.fixedTools.versionToFixed(value)[source]

Converts a table version to a fixed