diff --git a/python/test_arithmetic.py b/python/test_arithmetic.py index 7e6df0e9..ee480922 100755 --- a/python/test_arithmetic.py +++ b/python/test_arithmetic.py @@ -481,5 +481,73 @@ class TestArithmetic(unittest.TestCase): self.run_unary(self.all_images, my_exp10, fmt = noncomplex_formats) + def test_max(self): + test = Vips.Image.black(100, 100).draw_rect(100, 40, 50, 1, 1) + + for fmt in all_formats: + v = test.cast(fmt).max() + + self.assertAlmostEqual(v, 100) + v, x, y = test.cast(fmt).maxpos() + self.assertAlmostEqual(v, 100) + self.assertAlmostEqual(x, 40) + self.assertAlmostEqual(y, 50) + + def test_min(self): + test = (Vips.Image.black(100, 100) + 100).draw_rect(0, 40, 50, 1, 1) + + for fmt in all_formats: + v = test.cast(fmt).min() + + self.assertAlmostEqual(v, 0) + v, x, y = test.cast(fmt).minpos() + self.assertAlmostEqual(v, 0) + self.assertAlmostEqual(x, 40) + self.assertAlmostEqual(y, 50) + + def test_measure(self): + im = Vips.Image.black(50, 50) + test = im.insert(im + 10, 50, 0, expand = True) + + for x in noncomplex_formats: + a = test.cast(x) + matrix = a.measure(2, 1) + [p1] = matrix.getpoint(0, 0) + [p2] = matrix.getpoint(0, 1) + + self.assertAlmostEqual(p1, 0) + self.assertAlmostEqual(p2, 10) + + def test_profile(self): + test = Vips.Image.black(100, 100).draw_rect(100, 40, 50, 1, 1) + + for fmt in noncomplex_formats: + columns, rows = test.cast(fmt).profile() + + v, x, y = columns.minpos() + self.assertAlmostEqual(v, 50) + self.assertAlmostEqual(x, 40) + self.assertAlmostEqual(y, 0) + + v, x, y = rows.minpos() + self.assertAlmostEqual(v, 40) + self.assertAlmostEqual(x, 0) + self.assertAlmostEqual(y, 50) + + def test_project(self): + im = Vips.Image.black(50, 50) + test = im.insert(im + 10, 50, 0, expand = True) + + for fmt in noncomplex_formats: + columns, rows = test.cast(fmt).project() + + self.assertAlmostEqualObjects(columns.getpoint(10,0), [0]) + self.assertAlmostEqualObjects(columns.getpoint(70,0), [50 * 10]) + + self.assertAlmostEqualObjects(rows.getpoint(0,10), [50 * 10]) + + + + if __name__ == '__main__': unittest.main() diff --git a/python/vips8/vips.py b/python/vips8/vips.py index 167f7442..e187a6b0 100644 --- a/python/vips8/vips.py +++ b/python/vips8/vips.py @@ -159,7 +159,7 @@ def _call_base(name, required, optional, self = None, option_string = None): not x.flags & enm.REQUIRED and not x.isset} - # and the names of all optional output args ... we use "x = True" + # find all optional output args ... we use "x = True" # in args to mean add that to output optional_output = {x.name: x for x in args if x.flags & enm.OUTPUT and not x.flags & enm.REQUIRED} @@ -182,9 +182,12 @@ def _call_base(name, required, optional, self = None, option_string = None): if op2 == None: raise Error('Error calling operator %s.' % name) - # rescan args, op2 has changed - args = [Argument(op2, x) for x in op2.props] - args.sort(lambda a, b: a.priority - b.priority) + # rescan args if op2 is different from op + if op2 != op: + args = [Argument(op2, x) for x in op2.props] + args.sort(lambda a, b: a.priority - b.priority) + optional_output = {x.name: x for x in args if x.flags & enm.OUTPUT and + not x.flags & enm.REQUIRED} # gather output args out = [] @@ -415,6 +418,12 @@ def vips_xor(self, other): else: return self.boolean_const(other, Vips.OperationBoolean.EOR) +def vips_more(self, other): + if isinstance(other, Vips.Image): + return self.relational(other, Vips.OperationRelational.MORE) + else: + return self.relational_const(Vips.OperationRelational.MORE, other) + def vips_neg(self): return -1 * self @@ -556,8 +565,11 @@ Vips.Image.__rdiv__ = vips_rdiv Vips.Image.__floordiv__ = vips_floordiv Vips.Image.__rfloordiv__ = vips_rfloordiv Vips.Image.__mod__ = vips_mod + Vips.Image.__pow__ = vips_pow Vips.Image.__rpow__ = vips_rpow +Vips.Image.__abs__ = vips_abs + Vips.Image.__lshift__ = vips_lshift Vips.Image.__rshift__ = vips_rshift Vips.Image.__and__ = vips_and @@ -566,11 +578,18 @@ Vips.Image.__or__ = vips_or Vips.Image.__ror__ = vips_or Vips.Image.__xor__ = vips_xor Vips.Image.__rxor__ = vips_xor + Vips.Image.__neg__ = vips_neg Vips.Image.__pos__ = vips_pos -Vips.Image.__abs__ = vips_abs Vips.Image.__invert__ = vips_invert +Vips.Image.__lt__ = vips_less +Vips.Image.__le__ = vips_lesseq +Vips.Image.__gt__ = vips_more +Vips.Image.__ge__ = vips_moreeq +Vips.Image.__eq__ = vips_equal +Vips.Image.__ne__ = vips_notequal + # the cast operators int(), long() and float() must return numeric types, so we # can't define them for images