Created
February 13, 2025 05:38
-
-
Save schwehr/c3a057cf471eedf93326f81205c2dce1 to your computer and use it in GitHub Desktop.
Renamed the file for Owen's gist for the gdal mailing list.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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