Skip to content

Commit

Permalink
GTiff: fix retrieving mask band of overview band when the mask is ext…
Browse files Browse the repository at this point in the history
…ernal. Fixes -co COPY_SRC_OVERVIEWS=YES of such datasets (fixes #754)
  • Loading branch information
rouault committed Jul 14, 2018
1 parent 12e52bc commit fde9dea
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
35 changes: 35 additions & 0 deletions autotest/gcore/tiff_read.py
Original file line number Diff line number Diff line change
Expand Up @@ -3748,6 +3748,40 @@ def tiff_read_zstd_corrupted2():
with gdaltest.error_handler():
return ut.testOpen()


###############################################################################


def tiff_read_overview_of_external_mask():

filename = '/vsimem/tiff_read_overview_of_external_mask.tif'
gdal.Translate(filename, 'data/byte.tif', options='-b 1 -mask 1')
ds = gdal.Open(filename, gdal.GA_Update)
ds.BuildOverviews('CUBIC', overviewlist=[2])
ds = None
ds = gdal.Open(filename + '.msk', gdal.GA_Update)
ds.BuildOverviews('NEAREST', overviewlist=[2])
ds = None
ds = gdal.Open(filename)
cs1 = ds.GetRasterBand(1).GetOverview(0).GetMaskBand().Checksum()
cs2 = ds.GetRasterBand(1).GetMaskBand().GetOverview(0).Checksum()
flags1 = ds.GetRasterBand(1).GetOverview(0).GetMaskFlags()
ds = None

gdal.Unlink(filename)
gdal.Unlink(filename + '.msk')

if cs1 != cs2:
gdaltest.post_reason('fail')
print(cs1, cs2)
return 'fail'
if flags1 != gdal.GMF_PER_DATASET:
gdaltest.post_reason('fail')
print(flags1)
return 'fail'

return 'success'

###############################################################################


Expand Down Expand Up @@ -3876,6 +3910,7 @@ def tiff_read_zstd_corrupted2():
gdaltest_list.append((tiff_read_zstd))
gdaltest_list.append((tiff_read_zstd_corrupted))
gdaltest_list.append((tiff_read_zstd_corrupted2))
gdaltest_list.append((tiff_read_overview_of_external_mask))

gdaltest_list.append((tiff_read_online_1))
gdaltest_list.append((tiff_read_online_2))
Expand Down
28 changes: 28 additions & 0 deletions gdal/frmts/gtiff/geotiff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ class GTiffDataset final : public GDALPamDataset

GTiffDataset* poMaskDS;
GTiffDataset* poBaseDS;
bool bIsOverview_ = false;

CPLString osFilename;

Expand Down Expand Up @@ -5594,6 +5595,11 @@ int GTiffRasterBand::GetMaskFlags()
return 0;
}

if( poGDS->bIsOverview_ )
{
return poGDS->poBaseDS->GetRasterBand(nBand)->GetMaskFlags();
}

return GDALPamRasterBand::GetMaskFlags();
}

Expand All @@ -5613,6 +5619,26 @@ GDALRasterBand *GTiffRasterBand::GetMaskBand()
return poGDS->poMaskDS->GetRasterBand(nBand);
}

if( poGDS->bIsOverview_ )
{
GDALRasterBand* poBaseMask =
poGDS->poBaseDS->GetRasterBand(nBand)->GetMaskBand();
if( poBaseMask )
{
const int nOverviews = poBaseMask->GetOverviewCount();
for( int i = 0; i < nOverviews; i++ )
{
GDALRasterBand* poOvr = poBaseMask->GetOverview(i);
if( poOvr &&
poOvr->GetXSize() == GetXSize() &&
poOvr->GetYSize() == GetYSize() )
{
return poOvr;
}
}
}
}

return GDALPamRasterBand::GetMaskBand();
}

Expand Down Expand Up @@ -9954,6 +9980,7 @@ CPLErr GTiffDataset::RegisterNewOverviewDataset(toff_t nOverviewOffset,
nOverviewCount * (sizeof(void*))) );
papoOverviewDS[nOverviewCount-1] = poODS;
poODS->poBaseDS = this;
poODS->bIsOverview_ = true;
return CE_None;
}

Expand Down Expand Up @@ -14718,6 +14745,7 @@ void GTiffDataset::ScanDirectories()
nOverviewCount * (sizeof(void*))) );
papoOverviewDS[nOverviewCount-1] = poODS;
poODS->poBaseDS = this;
poODS->bIsOverview_ = true;
}
}
// Embedded mask of the main image.
Expand Down

0 comments on commit fde9dea

Please sign in to comment.