aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/misc/fixedTools.py
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:13:55 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:13:55 +0000
commit5821ab02e1d8da10e14944331ce14c5cac747279 (patch)
tree98d81cb66669c50af608fd8a844e22039a00f5ae /Lib/fontTools/misc/fixedTools.py
parent1c7ccb280b397bc87d7203a8863fd2e16af7439b (diff)
parent29956f91d34a6e7e114e9e04c4c22296e20b80c8 (diff)
downloadfonttools-5821ab02e1d8da10e14944331ce14c5cac747279.tar.gz
Snap for 8512216 from 29956f91d34a6e7e114e9e04c4c22296e20b80c8 to tm-frc-neuralnetworks-releaset_frc_neu_330443030t_frc_neu_330443000android13-frc-neuralnetworks-release
Change-Id: Ibdb4b0dd880fdb0090cd7205b37e969dc16945dc
Diffstat (limited to 'Lib/fontTools/misc/fixedTools.py')
-rw-r--r--Lib/fontTools/misc/fixedTools.py36
1 files changed, 9 insertions, 27 deletions
diff --git a/Lib/fontTools/misc/fixedTools.py b/Lib/fontTools/misc/fixedTools.py
index f0474abf..6ec7d06e 100644
--- a/Lib/fontTools/misc/fixedTools.py
+++ b/Lib/fontTools/misc/fixedTools.py
@@ -17,7 +17,7 @@ functions for converting between fixed-point, float and string representations.
The maximum value that can still fit in an F2Dot14. (1.99993896484375)
"""
-from .roundTools import otRound
+from .roundTools import otRound, nearestMultipleShortestRepr
import logging
log = logging.getLogger(__name__)
@@ -125,6 +125,7 @@ def fixedToStr(value, precisionBits):
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.
+ It uses nearestMultipleShortestRepr under the hood.
Args:
value (int): The fixed-point value to convert.
@@ -133,27 +134,8 @@ def fixedToStr(value, precisionBits):
Returns:
str: A string representation of the value.
"""
- if not value: return "0.0"
-
scale = 1 << precisionBits
- value /= scale
- eps = .5 / scale
- lo = value - eps
- hi = value + eps
- # If the range of valid choices spans an integer, return the integer.
- if int(lo) != int(hi):
- return str(float(round(value)))
- fmt = "%.8f"
- lo = fmt % lo
- hi = fmt % hi
- assert len(lo) == len(hi) and lo != hi
- for i in range(len(lo)):
- if lo[i] != hi[i]:
- break
- period = lo.find('.')
- assert period < i
- fmt = "%%.%df" % (i - period)
- return fmt % value
+ return nearestMultipleShortestRepr(value/scale, factor=1.0/scale)
def strToFixed(string, precisionBits):
@@ -168,9 +150,9 @@ def strToFixed(string, precisionBits):
Examples::
- >>> ## to convert a float string to a 2.14 fixed-point number:
- >>> strToFixed('-0.61884', precisionBits=14)
- -10139
+ >>> ## to convert a float string to a 2.14 fixed-point number:
+ >>> strToFixed('-0.61884', precisionBits=14)
+ -10139
"""
value = float(string)
return otRound(value * (1 << precisionBits))
@@ -214,7 +196,7 @@ def floatToFixedToStr(value, precisionBits):
This uses 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.
+ It uses nearestMultipleShortestRepr under the hood.
>>> floatToFixedToStr(-0.61883544921875, precisionBits=14)
'-0.61884'
@@ -227,8 +209,8 @@ def floatToFixedToStr(value, precisionBits):
str: A string representation of the value.
"""
- fixed = otRound(value * (1 << precisionBits))
- return fixedToStr(fixed, precisionBits)
+ scale = 1 << precisionBits
+ return nearestMultipleShortestRepr(value, factor=1.0/scale)
def ensureVersionIsLong(value):