Skip to content

Commit

Permalink
CMake: MRF: fix build without PNG (fixes #5742) and JPEG (fixes #5741)
Browse files Browse the repository at this point in the history
  • Loading branch information
rouault committed May 17, 2022
1 parent e1f2b40 commit de84e0a
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 20 deletions.
25 changes: 18 additions & 7 deletions frmts/mrf/CMakeLists.txt
@@ -1,8 +1,6 @@
add_gdal_driver(
TARGET gdal_MRF
SOURCES BitMask2D.h
JPEG_band.cpp
PNG_band.cpp
marfa.h
marfa_dataset.cpp
mrf_band.cpp
Expand All @@ -11,13 +9,26 @@ add_gdal_driver(
Packer.h
Packer_RLE.cpp
Packer_RLE.h
JPNG_band.cpp
Tif_band.cpp
BUILTIN)
gdal_standard_includes(gdal_MRF)

if (GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL)
target_compile_definitions(gdal_MRF PRIVATE -DHAVE_JPEG)
target_sources(gdal_MRF PRIVATE JPEG_band.cpp)
endif()

if (GDAL_USE_PNG OR GDAL_USE_PNG_INTERNAL)
target_compile_definitions(gdal_MRF PRIVATE -DHAVE_PNG)
target_sources(gdal_MRF PRIVATE PNG_band.cpp)
endif()

if ((GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) AND (GDAL_USE_PNG OR GDAL_USE_PNG_INTERNAL))
target_sources(gdal_MRF PRIVATE JPNG_band.cpp)
endif()

# Internal libs first
if (GDAL_USE_JPEG12_INTERNAL)
if ((GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) AND GDAL_USE_JPEG12_INTERNAL)
target_sources(gdal_MRF PRIVATE JPEG12_band.cpp)
target_compile_definitions(gdal_MRF PRIVATE -DJPEG12_SUPPORTED)
target_include_directories(gdal_MRF PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
Expand Down Expand Up @@ -48,11 +59,11 @@ endif ()

# Now external libs

if (NOT GDAL_USE_JPEG_INTERNAL)
if (GDAL_USE_JPEG AND NOT GDAL_USE_JPEG_INTERNAL)
gdal_target_link_libraries(gdal_MRF PRIVATE JPEG::JPEG)
endif ()

if (NOT GDAL_USE_PNG_INTERNAL)
if (GDAL_USE_PNG AND NOT GDAL_USE_PNG_INTERNAL)
gdal_target_link_libraries(gdal_MRF PRIVATE PNG::PNG)
endif ()

Expand All @@ -72,4 +83,4 @@ endif ()
if (GDAL_USE_BRUNSLI)
target_compile_definitions(gdal_MRF PRIVATE -DBRUNSLI)
gdal_target_link_libraries(gdal_MRF PRIVATE BRUNSLI::ENCODE BRUNSLI::DECODE)
endif ()
endif ()
2 changes: 1 addition & 1 deletion frmts/mrf/GNUmakefile
Expand Up @@ -19,7 +19,7 @@ LO_O_OBJ = $(addsuffix .lo,$(basename $(O_OBJ)))
DEPENDS = marfa.h

# For GDAL < 2.1
CPPFLAGS := $(GDAL_INCLUDE) $(CPPFLAGS)
CPPFLAGS := $(GDAL_INCLUDE) $(CPPFLAGS) -DHAVE_PNG -DHAVE_JPEG

# JPEG12_ENABLED is set only with the internal jpeg library
ifeq ($(JPEG12_ENABLED),yes)
Expand Down
2 changes: 2 additions & 0 deletions frmts/mrf/makefile.vc
Expand Up @@ -16,6 +16,8 @@ GDAL_ROOT = ..\..
OBJ = Packer_RLE.obj Tif_band.obj PNG_band.obj JPEG_band.obj JPNG_band.obj\
mrf_band.obj mrf_overview.obj mrf_util.obj marfa_dataset.obj

EXTRAFLAGS = -DHAVE_PNG -DHAVE_JPEG


# Internal libraries

Expand Down
13 changes: 11 additions & 2 deletions frmts/mrf/marfa.h
Expand Up @@ -93,7 +93,16 @@ NAMESPACE_MRF_START
// These are a pain to maintain in sync. They should be replaced with
// C++11 uniform initializers. The externs reside in util.cpp
enum ILCompression {
IL_PNG = 0, IL_PPNG, IL_JPEG, IL_JPNG, IL_NONE, IL_ZLIB, IL_TIF,
#ifdef HAVE_PNG
IL_PNG, IL_PPNG,
#endif
#ifdef HAVE_JPEG
IL_JPEG,
#endif
#if defined(HAVE_PNG) && defined(HAVE_JPEG)
IL_JPNG,
#endif
IL_NONE, IL_ZLIB, IL_TIF,
#if defined(LERC)
IL_LERC,
#endif
Expand Down Expand Up @@ -677,7 +686,7 @@ class JPEG_Codec {

private:
// not implemented. but suppress MSVC warning about 'assignment operator could not be generated'
JPEG_Codec& operator= (const JPEG_Codec& src);
JPEG_Codec& operator= (const JPEG_Codec& src);
};

class JPEG_Band final: public MRFRasterBand {
Expand Down
24 changes: 20 additions & 4 deletions frmts/mrf/marfa_dataset.cpp
Expand Up @@ -739,11 +739,12 @@ static CPLErr Init_Raster(ILImage& image, MRFDataset* ds, CPLXMLNode* defimage)
}

// Page Encoding, defaults to PNG
image.comp = CompToken(CPLGetXMLValue(defimage, "Compression", "PNG"));
const char* pszCompression = CPLGetXMLValue(defimage, "Compression", "PNG");
image.comp = CompToken(pszCompression);
if (image.comp == IL_ERR_COMP) {
CPLError(CE_Failure, CPLE_IllegalArg,
"GDAL MRF: Compression %s is unknown",
CPLGetXMLValue(defimage, "Compression", nullptr));
pszCompression);
return CE_Failure;
}

Expand Down Expand Up @@ -1110,8 +1111,12 @@ CPLXMLNode* MRFDataset::BuildConfig()
XMLSetAttributeVal(raster, "Size", full.size, "%.0f");
XMLSetAttributeVal(raster, "PageSize", full.pagesize, "%.0f");

#ifdef HAVE_PNG
if (full.comp != IL_PNG)
#endif
{
CPLCreateXMLElementAndValue(raster, "Compression", CompName(full.comp));
}

if (full.dt != GDT_Byte)
CPLCreateXMLElementAndValue(raster, "DataType", GDALGetDataTypeName(full.dt));
Expand Down Expand Up @@ -1600,13 +1605,20 @@ GDALDataset* MRFDataset::CreateCopy(const char* pszFilename,
char** papszCWROptions = nullptr;
papszCWROptions = CSLAddNameValue(papszCWROptions, "COMPRESSED", "TRUE");

#ifdef HAVE_JPEG
// Use the Zen version of the CopyWholeRaster if input has a dataset mask and JPEGs are generated
if (GMF_PER_DATASET == poSrcDS->GetRasterBand(1)->GetMaskFlags() &&
(poDS->current.comp == IL_JPEG || poDS->current.comp == IL_JPNG)) {
(poDS->current.comp == IL_JPEG
#ifdef HAVE_PNG
|| poDS->current.comp == IL_JPNG
#endif
)) {
err = poDS->ZenCopy(poSrcDS, pfnProgress, pProgressData);
nCloneFlags ^= GCIF_MASK; // Turn the external mask off
}
else {
else
#endif
{
err = GDALDatasetCopyWholeRaster((GDALDatasetH)poSrcDS,
(GDALDatasetH)poDS, papszCWROptions, pfnProgress, pProgressData);
}
Expand Down Expand Up @@ -1928,7 +1940,11 @@ MRFDataset::Create(const char* pszName,
// Use the full, set some initial parameters
ILImage& img = poDS->full;
img.size = ILSize(nXSize, nYSize, 1, nBandsIn);
#ifdef HAVE_PNG
img.comp = IL_PNG;
#else
img.comp = IL_NONE;
#endif
img.order = (nBandsIn < 5) ? IL_Interleaved : IL_Separate;
img.pagesize = ILSize(512, 512, 1, 1);
img.quality = 85;
Expand Down
58 changes: 52 additions & 6 deletions frmts/mrf/mrf_util.cpp
Expand Up @@ -54,7 +54,17 @@ CPL_C_END
NAMESPACE_MRF_START

// These have to be positionally in sync with the enums in marfa.h
static const char * const ILC_N[] = { "PNG", "PPNG", "JPEG", "JPNG", "NONE", "DEFLATE", "TIF",
static const char * const ILC_N[] = {
#ifdef HAVE_PNG
"PNG", "PPNG",
#endif
#ifdef HAVE_JPEG
"JPEG",
#endif
#if defined(HAVE_PNG) && defined(HAVE_JPEG)
"JPNG",
#endif
"NONE", "DEFLATE", "TIF",
#if defined(LERC)
"LERC",
#endif
Expand All @@ -63,7 +73,17 @@ static const char * const ILC_N[] = { "PNG", "PPNG", "JPEG", "JPNG", "NONE", "DE
#endif
"Unknown" };

static const char * const ILC_E[]={ ".ppg", ".ppg", ".pjg", ".pjp", ".til", ".pzp", ".ptf",
static const char * const ILC_E[]={
#ifdef HAVE_PNG
".ppg", ".ppg",
#endif
#ifdef HAVE_JPEG
".pjg",
#endif
#if defined(HAVE_PNG) && defined(HAVE_JPEG)
".pjp",
#endif
".til", ".pzp", ".ptf",
#if defined(LERC)
".lrc",
#endif
Expand Down Expand Up @@ -192,7 +212,11 @@ ILImage::ILImage() :
size(ILSize(1, 1, 1, 1, 0)),
pagesize(ILSize(384, 384, 1, 1, 0)),
pagecount(pcount(size, pagesize)),
#ifdef HAVE_PNG
comp(IL_PNG),
#else
comp(IL_NONE),
#endif
order(IL_Interleaved),
nbo(false),
hasNoData(FALSE),
Expand Down Expand Up @@ -242,7 +266,7 @@ CPLString getFname(CPLXMLNode *node, const char *token, const CPLString &in, con
if (slashPos == 0 // Starts with slash
|| (slashPos == 2 && fn[1] == ':') // Starts with disk letter column
// Does not start with dots then slash
|| (slashPos != fn.npos && slashPos != fn.find_first_not_of('.'))
|| (slashPos != fn.npos && slashPos != fn.find_first_not_of('.'))
|| EQUALN(in,"<MRF_META>", 10) // XML string input
|| in.find_first_of("\\/") == in.npos) // We can't get a basename from 'in'
return fn;
Expand Down Expand Up @@ -286,10 +310,16 @@ MRFRasterBand *newMRFRasterBand(MRFDataset *pDS, const ILImage &image, int b, in
MRFRasterBand *bnd = nullptr;
CPLErrorReset();
switch (pDS->current.comp) {
#ifdef HAVE_PNG
case IL_PPNG: // Uses the PNG code, just has a palette in each PNG
case IL_PNG: bnd = new PNG_Band(pDS, image, b, level); break;
#endif
#ifdef HAVE_JPEG
case IL_JPEG: bnd = new JPEG_Band(pDS, image, b, level); break;
#endif
#if defined(HAVE_PNG) && defined(HAVE_JPEG)
case IL_JPNG: bnd = new JPNG_Band(pDS, image, b, level); break;
#endif
case IL_NONE: bnd = new Raw_Band(pDS, image, b, level); break;
#if defined(LERC)
case IL_LERC: bnd = new LERC_Band(pDS, image, b, level); break;
Expand Down Expand Up @@ -490,9 +520,25 @@ void GDALRegister_mrf() {
driver->SetMetadataItem(
GDAL_DMD_CREATIONOPTIONLIST,
"<CreationOptionList>"
" <Option name='COMPRESS' type='string-select' default='PNG' description='PPNG = Palette PNG; DEFLATE = zlib '>"
" <Value>JPEG</Value><Value>PNG</Value><Value>PPNG</Value><Value>JPNG</Value>"
" <Value>TIF</Value><Value>DEFLATE</Value><Value>NONE</Value>"
" <Option name='COMPRESS' type='string-select' "
#ifdef HAVE_PNG
"default='PNG' description='PPNG = Palette PNG; DEFLATE = zlib '>"
#else
"default='NONE' description='DEFLATE = zlib '>"
#endif
#ifdef HAVE_JPEG
" <Value>JPEG</Value>"
#endif
#ifdef HAVE_PNG
" <Value>PNG</Value>"
" <Value>PPNG</Value>"
#endif
#if defined(HAVE_JPEG) && defined(HAVE_PNG)
" <Value>JPNG</Value>"
#endif
" <Value>TIF</Value>"
" <Value>DEFLATE</Value>"
" <Value>NONE</Value>"
#if defined(LERC)
" <Value>LERC</Value>"
#endif
Expand Down

0 comments on commit de84e0a

Please sign in to comment.