diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 16:13:55 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-28 16:13:55 +0000 |
commit | 5821ab02e1d8da10e14944331ce14c5cac747279 (patch) | |
tree | 98d81cb66669c50af608fd8a844e22039a00f5ae /Lib/fontTools/misc/fixedTools.py | |
parent | 1c7ccb280b397bc87d7203a8863fd2e16af7439b (diff) | |
parent | 29956f91d34a6e7e114e9e04c4c22296e20b80c8 (diff) | |
download | fonttools-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.py | 36 |
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): |