Changed _limit_signed_rational

This commit is contained in:
Andrew Murray 2019-12-31 19:12:33 +11:00
parent 69fc041399
commit 8924054dd9
2 changed files with 12 additions and 14 deletions

View File

@ -277,7 +277,7 @@ class TestFileTiffMetadata(PillowTestCase):
self.assertEqual(denominator, reloaded.tag_v2[37380].denominator)
# out of bounds of 4 byte signed long
numerator = -2 ** 31 - 1
numerator = -(2 ** 31) - 1
denominator = 1
info[37380] = TiffImagePlugin.IFDRational(numerator, denominator)
@ -286,8 +286,8 @@ class TestFileTiffMetadata(PillowTestCase):
im.save(out, tiffinfo=info, compression="raw")
reloaded = Image.open(out)
self.assertEqual(- 2 ** 31, reloaded.tag_v2[37380].numerator)
self.assertEqual(1, reloaded.tag_v2[37380].denominator)
self.assertEqual(2 ** 31 - 1, reloaded.tag_v2[37380].numerator)
self.assertEqual(-1, reloaded.tag_v2[37380].denominator)
def test_ifd_signed_long(self):
im = hopper()

View File

@ -263,20 +263,18 @@ def _limit_rational(val, max_val):
return n_d[::-1] if inv else n_d
def _limit_signed_rational(frac, max_val, min_val):
if frac >= 0:
return _limit_rational(frac, max_val)
def _limit_signed_rational(val, max_val, min_val):
frac = Fraction(val)
n_d = frac.numerator, frac.denominator
max_abs = max(max_val, abs(min_val))
if min(n_d) < min_val:
n_d = _limit_rational(val, abs(min_val))
num, denom = _limit_rational(frac, max_abs)
if denom == max_abs or num == max_abs:
if (num < 0 or denom < 0) and num != denom:
num, denom = num * -1, denom * -1
else:
num, denom = _limit_rational(frac, max_val)
if max(n_d) > max_val:
val = Fraction(*n_d)
n_d = _limit_rational(val, max_val)
return num, denom
return n_d
##