From 2695916afbadcf2944278db07139c4781e9f6df9 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sat, 7 Jul 2018 17:07:35 +0100 Subject: [PATCH] test region_shrink just sets the option, does not verify accuracy :( --- README.md | 108 +++++++++++++------------ test/test-suite/test_foreign.py | 137 +++++++++++++++----------------- 2 files changed, 121 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 415545f1..7f2cdd6e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ https://github.com/jcupitt/libvips/releases Untar, then in the libvips directory you should just be able to do: - $ ./configure + $ ./configure Check the summary at the end of `configure` carefully. libvips must have `build-essential`, `pkg-config`, `glib2.0-dev`, `libexpat1-dev`. @@ -53,8 +53,8 @@ of the things that libvips can be configured to use. Once `configure` is looking OK, compile and install with the usual: - $ make - $ sudo make install + $ make + $ sudo make install By default this will install files to `/usr/local`. @@ -66,11 +66,15 @@ Windows](https://github.com/jcupitt/libvips/wiki/Build-for-Windows) and Do a basic test of your build with: - $ make check + $ make check Run the libvips test suite with: - $ pytest + $ pytest + +Run a specific test with: + + $ pytest test/test-suite/test_foreign.py -k test_tiff YOu will need to install a variety of Python packages for this, including pyvips, the libvips Python binding. @@ -79,78 +83,78 @@ pyvips, the libvips Python binding. Checkout the latest sources with: - $ git clone git://github.com/jcupitt/libvips.git + $ git clone git://github.com/jcupitt/libvips.git Building from git needs more packages, you'll need at least `swig`, `gtk-doc` and `gobject-introspection`, see the dependencies section below. For example: - $ brew install gtk-doc swig + $ brew install gtk-doc swig Then build the build system with: - $ ./autogen.sh + $ ./autogen.sh Debug build: - $ CFLAGS="-g -Wall" CXXFLAGS="-g -Wall" \ - ./configure --prefix=/home/john/vips --enable-debug - $ make - $ make install + $ CFLAGS="-g -Wall" CXXFLAGS="-g -Wall" \ + ./configure --prefix=/home/john/vips --enable-debug + $ make + $ make install Leak check: - $ export G_DEBUG=gc-friendly - $ valgrind --suppressions=libvips.supp \ - --leak-check=yes \ - vips ... > vips-vg.log 2>&1 + $ export G_DEBUG=gc-friendly + $ valgrind --suppressions=libvips.supp \ + --leak-check=yes \ + vips ... > vips-vg.log 2>&1 Memory error debug: - $ valgrind --vgdb=yes --vgdb-error=0 vips ... + $ valgrind --vgdb=yes --vgdb-error=0 vips ... valgrind threading check: - $ valgrind --tool=helgrind vips ... > vips-vg.log 2>&1 + $ valgrind --tool=helgrind vips ... > vips-vg.log 2>&1 Clang build: - $ CC=clang CXX=clang++ ./configure --prefix=/home/john/vips + $ CC=clang CXX=clang++ ./configure --prefix=/home/john/vips Clang static analysis: - $ scan-build ./configure --disable-introspection --disable-debug - $ scan-build -o scan -v make - $ scan-view scan/2013-11-22-2 + $ scan-build ./configure --disable-introspection --disable-debug + $ scan-build -o scan -v make + $ scan-view scan/2013-11-22-2 Clang dynamic analysis: - $ FLAGS="-O1 -g -fsanitize=address" - $ FLAGS="$FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls" - $ CC=clang CXX=clang++ LD=clang \ - CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" LDFLAGS=-fsanitize=address \ - ./configure --prefix=/home/john/vips + $ FLAGS="-O1 -g -fsanitize=address" + $ FLAGS="$FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls" + $ CC=clang CXX=clang++ LD=clang \ + CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" LDFLAGS=-fsanitize=address \ + ./configure --prefix=/home/john/vips - $ FLAGS="-O1 -g -fsanitize=thread" - $ FLAGS="$FLAGS -fPIC" - $ FLAGS="$FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls" - $ CC=clang CXX=clang++ LD=clang \ - CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" \ - LDFLAGS="-fsanitize=thread -fPIC" \ - ./configure --prefix=/home/john/vips \ - --without-magick \ - --disable-introspection - $ G_DEBUG=gc-friendly vips copy ~/pics/k2.jpg x.jpg >& log + $ FLAGS="-O1 -g -fsanitize=thread" + $ FLAGS="$FLAGS -fPIC" + $ FLAGS="$FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls" + $ CC=clang CXX=clang++ LD=clang \ + CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" \ + LDFLAGS="-fsanitize=thread -fPIC" \ + ./configure --prefix=/home/john/vips \ + --without-magick \ + --disable-introspection + $ G_DEBUG=gc-friendly vips copy ~/pics/k2.jpg x.jpg >& log Build with the GCC auto-vectorizer and diagnostics (or just -O3): - $ FLAGS="-O2 -march=native -ffast-math" - $ FLAGS="$FLAGS -ftree-vectorize -fdump-tree-vect-details" - $ CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" \ - ./configure --prefix=/home/john/vips + $ FLAGS="-O2 -march=native -ffast-math" + $ FLAGS="$FLAGS -ftree-vectorize -fdump-tree-vect-details" + $ CFLAGS="$FLAGS" CXXFLAGS="$FLAGS" \ + ./configure --prefix=/home/john/vips Static analysis with: - $ cppcheck --force --enable=style . &> cppcheck.log + $ cppcheck --force --enable=style . &> cppcheck.log # Dependencies @@ -168,19 +172,19 @@ them in the default path and in `$prefix`. If you have installed your own versions of these libraries in a different location, libvips will not see them. Use switches to libvips configure like: - ./configure --prefix=/Users/john/vips \ - --with-giflib-includes=/opt/local/include \ - --with-giflib-libraries=/opt/local/lib \ - --with-tiff-includes=/opt/local/include \ - --with-tiff-libraries=/opt/local/lib \ - --with-jpeg-includes=/opt/local/include \ - --with-jpeg-libraries=/opt/local/lib + ./configure --prefix=/Users/john/vips \ + --with-giflib-includes=/opt/local/include \ + --with-giflib-libraries=/opt/local/lib \ + --with-tiff-includes=/opt/local/include \ + --with-tiff-libraries=/opt/local/lib \ + --with-jpeg-includes=/opt/local/include \ + --with-jpeg-libraries=/opt/local/lib or perhaps: - CFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \ - CXXFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \ - ./configure --without-python --prefix=/Users/john/vips + CFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \ + CXXFLAGS="-g -Wall -I/opt/local/include -L/opt/local/lib" \ + ./configure --without-python --prefix=/Users/john/vips to get libvips to see your builds. diff --git a/test/test-suite/test_foreign.py b/test/test-suite/test_foreign.py index 501e84e4..2aa55635 100644 --- a/test/test-suite/test_foreign.py +++ b/test/test-suite/test_foreign.py @@ -320,54 +320,58 @@ class TestForeign: assert x1.height == x2.width # OME support in 8.5 - if pyvips.at_least_libvips(8, 5): - x = pyvips.Image.new_from_file(OME_FILE) - assert x.width == 439 - assert x.height == 167 - page_height = x.height + x = pyvips.Image.new_from_file(OME_FILE) + assert x.width == 439 + assert x.height == 167 + page_height = x.height - x = pyvips.Image.new_from_file(OME_FILE, n=-1) - assert x.width == 439 - assert x.height == page_height * 15 + x = pyvips.Image.new_from_file(OME_FILE, n=-1) + assert x.width == 439 + assert x.height == page_height * 15 - x = pyvips.Image.new_from_file(OME_FILE, page=1, n=-1) - assert x.width == 439 - assert x.height == page_height * 14 + x = pyvips.Image.new_from_file(OME_FILE, page=1, n=-1) + assert x.width == 439 + assert x.height == page_height * 14 - x = pyvips.Image.new_from_file(OME_FILE, page=1, n=2) - assert x.width == 439 - assert x.height == page_height * 2 + x = pyvips.Image.new_from_file(OME_FILE, page=1, n=2) + assert x.width == 439 + assert x.height == page_height * 2 - x = pyvips.Image.new_from_file(OME_FILE, n=-1) - assert x(0, 166)[0] == 96 - assert x(0, 167)[0] == 0 - assert x(0, 168)[0] == 1 + x = pyvips.Image.new_from_file(OME_FILE, n=-1) + assert x(0, 166)[0] == 96 + assert x(0, 167)[0] == 0 + assert x(0, 168)[0] == 1 - filename = temp_filename(self.tempdir, '.tif') - x.write_to_file(filename) + filename = temp_filename(self.tempdir, '.tif') + x.write_to_file(filename) - x = pyvips.Image.new_from_file(filename, n=-1) - assert x.width == 439 - assert x.height == page_height * 15 - assert x(0, 166)[0] == 96 - assert x(0, 167)[0] == 0 - assert x(0, 168)[0] == 1 + x = pyvips.Image.new_from_file(filename, n=-1) + assert x.width == 439 + assert x.height == page_height * 15 + assert x(0, 166)[0] == 96 + assert x(0, 167)[0] == 0 + assert x(0, 168)[0] == 1 # pyr save to buffer added in 8.6 - if pyvips.at_least_libvips(8, 6): - x = pyvips.Image.new_from_file(TIF_FILE) - buf = x.tiffsave_buffer(tile=True, pyramid=True) - filename = temp_filename(self.tempdir, '.tif') - x.tiffsave(filename, tile=True, pyramid=True) - with open(filename, 'rb') as f: - buf2 = f.read() - assert len(buf) == len(buf2) + x = pyvips.Image.new_from_file(TIF_FILE) + buf = x.tiffsave_buffer(tile=True, pyramid=True) + filename = temp_filename(self.tempdir, '.tif') + x.tiffsave(filename, tile=True, pyramid=True) + with open(filename, 'rb') as f: + buf2 = f.read() + assert len(buf) == len(buf2) - a = pyvips.Image.new_from_buffer(buf, "", page=2) - b = pyvips.Image.new_from_buffer(buf2, "", page=2) - assert a.width == b.width - assert a.height == b.height - assert a.avg() == b.avg() + a = pyvips.Image.new_from_buffer(buf, "", page=2) + b = pyvips.Image.new_from_buffer(buf2, "", page=2) + assert a.width == b.width + assert a.height == b.height + assert a.avg() == b.avg() + + # region-shrink added in 8.7 + x = pyvips.Image.new_from_file(TIF_FILE) + buf = x.tiffsave_buffer(tile=True, pyramid=True, region_shrink="mean") + buf = x.tiffsave_buffer(tile=True, pyramid=True, region_shrink="mode") + buf = x.tiffsave_buffer(tile=True, pyramid=True, region_shrink="median") @skip_if_no("magickload") def test_magickload(self): @@ -637,7 +641,7 @@ class TestForeign: self.save_buffer_tempfile("radsave_buffer", ".hdr", self.rad, max_diff=0) - @skip_if_no("dzsaveload") + @skip_if_no("dzsave") def test_dzsave(self): # dzsave is hard to test, there are so many options # test each option separately and hope they all function together @@ -706,16 +710,14 @@ class TestForeign: # with 511x511, it'll fit exactly into 2x2 -- we we actually generate # 3x3, since we output the overlaps - # 8.6 revised the rules on overlaps, so don't test earlier than that - if pyvips.base.at_least_libvips(8, 6): - filename = temp_filename(self.tempdir, '') - self.colour.crop(0, 0, 511, 511).dzsave(filename, layout="google", - overlap=1, depth="one") + filename = temp_filename(self.tempdir, '') + self.colour.crop(0, 0, 511, 511).dzsave(filename, layout="google", + overlap=1, depth="one") - x = pyvips.Image.new_from_file(filename + "/0/2/2.jpg") - assert x.width == 256 - assert x.height == 256 - assert not os.path.exists(filename + "/0/3/3.jpg") + x = pyvips.Image.new_from_file(filename + "/0/2/2.jpg") + assert x.width == 256 + assert x.height == 256 + assert not os.path.exists(filename + "/0/3/3.jpg") # default zoomify layout filename = temp_filename(self.tempdir, '') @@ -730,10 +732,6 @@ class TestForeign: # test zip output filename = temp_filename(self.tempdir, '.zip') self.colour.dzsave(filename) - # before 8.5.8, you needed a gc on pypy to flush small zip output to - # disc - if not pyvips.base.at_least_libvips(8, 6): - gc.collect() assert os.path.exists(filename) assert not os.path.exists(filename + "_files") assert not os.path.exists(filename + ".dzi") @@ -741,10 +739,6 @@ class TestForeign: # test compressed zip output filename2 = temp_filename(self.tempdir, '.zip') self.colour.dzsave(filename2, compression=-1) - # before 8.5.8, you needed a gc on pypy to flush small zip output to - # disc - if not pyvips.base.at_least_libvips(8, 6): - gc.collect() assert os.path.exists(filename2) assert os.path.getsize(filename2) < os.path.getsize(filename) @@ -771,24 +765,23 @@ class TestForeign: assert y.height == 513 # test save to memory buffer - if have("dzsave_buffer"): - filename = temp_filename(self.tempdir, '.zip') - base = os.path.basename(filename) - root, ext = os.path.splitext(base) + filename = temp_filename(self.tempdir, '.zip') + base = os.path.basename(filename) + root, ext = os.path.splitext(base) - self.colour.dzsave(filename) - # before 8.5.8, you needed a gc on pypy to flush small zip - # output to disc - if not pyvips.base.at_least_libvips(8, 6): - gc.collect() - with open(filename, 'rb') as f: - buf1 = f.read() - buf2 = self.colour.dzsave_buffer(basename=root) - assert len(buf1) == len(buf2) + self.colour.dzsave(filename) + with open(filename, 'rb') as f: + buf1 = f.read() + buf2 = self.colour.dzsave_buffer(basename=root) + assert len(buf1) == len(buf2) - # we can't test the bytes are exactly equal -- the timestamps will - # be different + # we can't test the bytes are exactly equal -- the timestamps will + # be different + # added in 8.7 + buf = self.colour.dzsave_buffer(region_shrink="mean") + buf = self.colour.dzsave_buffer(region_shrink="mode") + buf = self.colour.dzsave_buffer(region_shrink="median") if __name__ == '__main__': pytest.main()