Skip to content

Instantly share code, notes, and snippets.

@schwehr
Created February 13, 2025 05:38
Show Gist options
  • Save schwehr/c3a057cf471eedf93326f81205c2dce1 to your computer and use it in GitHub Desktop.
Save schwehr/c3a057cf471eedf93326f81205c2dce1 to your computer and use it in GitHub Desktop.
Renamed the file for Owen's gist for the gdal mailing list.
TEST_F(GTiffTest, CreateCopyPreservesMaskForBandInterleavedCog) {
constexpr char kFilename[] = "/vsimem/create_copy_with_mask.tif";
constexpr int kWidth = 2;
constexpr int kHeight = 2;
constexpr size_t kSize = kWidth * kHeight;
constexpr int kNumBands = 1;
GDALRegister_GTiff();
GDALDriver* driver = GetGDALDriverManager()->GetDriverByName(GTiff);
{
char** options = nullptr;
options = CSLSetNameValue(options, "COPY_SRC_OVERVIEWS", "YES");
options = CSLSetNameValue(options, "INTERLEAVE", "BAND");
auto dataset = absl::WrapUnique<GDALDataset>(driver->Create(
kFilename, kWidth, kHeight, kNumBands, GDT_Byte, options));
ASSERT_TRUE(dataset != nullptr);
std::vector<unsigned char> raster_buf(kSize, 0);
ASSERT_EQ(dataset->RasterIO(GF_Write, 0, 0, kWidth, kHeight, &raster_buf[0],
kWidth, kHeight, GDT_Byte, kNumBands, nullptr,
0, 0, 0),
CE_None);
{
const CPLConfigOptionSetter internalMaskSetter("GDAL_TIFF_INTERNAL_MASK",
"YES", false);
ASSERT_EQ(dataset->CreateMaskBand(GMF_PER_DATASET), CE_None);
auto mask_band = dataset->GetRasterBand(1)->GetMaskBand();
ASSERT_TRUE(mask_band != nullptr);
std::vector<unsigned char> mask_buf = {0, 255, 255, 255};
ASSERT_EQ(
mask_band->RasterIO(GF_Write, 0, 0, kWidth, kHeight, &mask_buf[0],
kWidth, kHeight, GDT_Byte, 0, 0),
CE_None);
}
auto copy_dataset = absl::WrapUnique<GDALDataset>(driver->CreateCopy(
kFilename, dataset.get(), true, options, nullptr, nullptr));
ASSERT_TRUE(copy_dataset != nullptr);
CSLDestroy(options);
}
auto open_info = absl::make_unique<GDALOpenInfo>(filename.c_str(), GDAL_OF_READONLY, nullptr);
auto dataset = absl::WrapUnique(driver->pfnOpen(open_info.get()));
ASSERT_EQ(dataset->GetRasterCount(), kNumBands);
ASSERT_EQ(dataset->GetRasterXSize(), kWidth);
ASSERT_EQ(dataset->GetRasterYSize(), kHeight);
auto band = dataset->GetRasterBand(1);
ASSERT_NE(band->GetMaskFlags() & GMF_PER_DATASET, 0);
auto mask_band = band->GetMaskBand();
ASSERT_TRUE(mask_band != nullptr);
std::vector<unsigned char> mask_buf(kSize, 0);
ASSERT_EQ(mask_band->RasterIO(GF_Read, 0, 0, kWidth, kHeight, &mask_buf[0],
kWidth, kHeight, GDT_Byte, 0, 0),
CE_None);
EXPECT_EQ(mask_buf[0], 0);
EXPECT_EQ(mask_buf[1], 255); // This line fails.
EXPECT_EQ(mask_buf[2], 255);
EXPECT_EQ(mask_buf[3], 255);
VSIUnlink(kFilename);
}
@schwehr
Comment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment