fixedTools: Tools for working with fixed-point numbers¶
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