From 509d01e54befd3f052afe15b6f01d3f68eae58e3 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 31 Dec 2024 02:23:31 +0100 Subject: [PATCH] GTiff mask overview: fix vertical shift in internal mask overview computation Fixes #11555 --- autotest/gcore/data/test_11555.tif | Bin 0 -> 34019 bytes autotest/gcore/tiff_ovr.py | 35 +++++++++++++++++++++++++++++ gcore/overview.cpp | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 autotest/gcore/data/test_11555.tif diff --git a/autotest/gcore/data/test_11555.tif b/autotest/gcore/data/test_11555.tif new file mode 100644 index 0000000000000000000000000000000000000000..4ae9ddecb0a66cf77d8826867388507ab0d9181e GIT binary patch literal 34019 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 literal 0 HcmV?d00001 diff --git a/autotest/gcore/tiff_ovr.py b/autotest/gcore/tiff_ovr.py index 990b3d84aa5d..38f34bb1e02d 100755 --- a/autotest/gcore/tiff_ovr.py +++ b/autotest/gcore/tiff_ovr.py @@ -2951,3 +2951,38 @@ def test_tiff_ovr_JXL_ALPHA_DISTANCE_OVERVIEW(tmp_vsimem): assert ds.GetRasterBand(4).Checksum() != cs4 del ds gdal.Unlink(tmpfilename + ".ovr") + + +############################################################################### +# Test fix for https://github.com/OSGeo/gdal/issues/11555 + + +def test_tiff_ovr_internal_mask_issue_11555(tmp_vsimem): + + if "debug build" in gdal.VersionInfo("--version") and "CI" in os.environ: + pytest.skip("test skipped on CI for debug builds (to keep things fast)") + + tmpfilename = str(tmp_vsimem / "test.tif") + gdal.FileFromMemBuffer(tmpfilename, open("data/test_11555.tif", "rb").read()) + + ds = gdal.Open(tmpfilename, gdal.GA_Update) + ds.BuildOverviews("bilinear", [2]) + del ds + + ds = gdal.Open(tmpfilename) + + # Check that we have non-zero data when mask = 255 + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 5270, 1, 1) == b"\x7F" + assert ds.GetRasterBand(2).GetOverview(0).ReadRaster(0, 5270, 1, 1) == b"\x7F" + assert ( + ds.GetRasterBand(1).GetMaskBand().GetOverview(0).ReadRaster(0, 5270, 1, 1) + == b"\xFF" + ) + + # Check that we have zero data when mask = 0 + assert ds.GetRasterBand(1).GetOverview(0).ReadRaster(0, 5271, 1, 1) == b"\x00" + assert ds.GetRasterBand(2).GetOverview(0).ReadRaster(0, 5271, 1, 1) == b"\x00" + assert ( + ds.GetRasterBand(1).GetMaskBand().GetOverview(0).ReadRaster(0, 5271, 1, 1) + == b"\x00" + ) diff --git a/gcore/overview.cpp b/gcore/overview.cpp index 5867ac11b04f..e697c8c7c065 100644 --- a/gcore/overview.cpp +++ b/gcore/overview.cpp @@ -4958,7 +4958,7 @@ CPLErr GDALRegenerateOverviewsEx(GDALRasterBandH hSrcBand, int nOverviewCount, poJob->nSrcHeight = nHeight; poJob->args.nChunkXOff = 0; poJob->args.nChunkXSize = nWidth; - poJob->args.nChunkYOff = nChunkYOff; + poJob->args.nChunkYOff = nChunkYOffQueried; poJob->args.nChunkYSize = nChunkYSizeQueried; poJob->nDstWidth = nDstWidth; poJob->args.nDstXOff = 0;