Files
2026-06-14 19:09:18 +01:00

119 lines
3.5 KiB
C++

// -*- tab-width: 4; -*-
// vi: set sw=2 ts=4 expandtab:
// Copyright 2022 The Khronos Group Inc.
// SPDX-License-Identifier: Apache-2.0
//!
//! @internal
//! @~English
//! @file
//!
//! @brief Create plugin maps.
//!
#include "imageio.h"
#include <algorithm>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
#include <sstream>
#include <stdexcept>
#include <vector>
#include <stdarg.h>
#define PLUGENTRY(name) \
ImageInput* name##InputCreate(); \
ImageOutput* name##OutputCreate(); \
extern const char* name##InputExtensions[]; \
extern const char* name##OutputExtensions[];
#define PLUGENTRY_RO(name) \
ImageInput* name##InputCreate(); \
extern const char* name##InputExtensions[];
#define PLUGENTRY_WO(name) \
ImageOutput* name##OutputCreate(); \
extern const char* name##OutputExtensions[];
PLUGENTRY_RO(exr);
PLUGENTRY_RO(jpeg);
PLUGENTRY_RO(npbm);
PLUGENTRY(png)
namespace Imageio {
// These combine extensions and format names into a single map.
InputPluginMap inputFormats;
OutputPluginMap outputFormats;
void
declareImageioFormat(const std::string& formatname,
ImageInput::Creator inputCreator,
const char** inputExtensions,
ImageOutput::Creator outputCreator,
const char** outputExtensions)
{
if (inputCreator) {
for (const char** e = inputExtensions; e && *e; ++e) {
string ext(*e);
ext.tolower();
if (inputFormats.find(ext) == inputFormats.end()) {
inputFormats[ext] = inputCreator;
}
}
if (inputFormats.find(formatname) == inputFormats.end())
inputFormats[formatname] = inputCreator;
}
if (outputCreator) {
for (const char** e = outputExtensions; e && *e; ++e) {
string ext(*e);
ext.tolower();
if (outputFormats.find(ext) == outputFormats.end()) {
outputFormats[ext] = outputCreator;
}
}
if (outputFormats.find(formatname) == outputFormats.end())
outputFormats[formatname] = outputCreator;
}
}
void
catalogBuiltinPlugins()
{
#define DECLAREPLUG(name) \
declareImageioFormat( \
#name, (ImageInput::Creator)name##InputCreate, \
name##InputExtensions, \
(ImageOutput::Creator)name##OutputCreate, \
name##OutputExtensions)
#define DECLAREPLUG_RO(name) \
declareImageioFormat( \
#name, (ImageInput::Creator)name##InputCreate, \
name##InputExtensions, \
nullptr, nullptr)
#define DECLAREPLUG_WO(name) \
declareImageioFormat( \
nullptr, nullptr, \
#name, (ImageOutput::Creator)name##OutputCreate, \
name##OutputExtensions)
#if !defined(DISABLE_OPENEXR)
DECLAREPLUG_RO (exr);
#endif
#if !defined(DISABLE_JPEG)
DECLAREPLUG_RO(jpeg);
#endif
#if !defined(DISABLE_NPBM)
DECLAREPLUG_RO (npbm);
#endif
#if !defined(DISABLE_PNG)
DECLAREPLUG (png);
#endif
// 'Raw' format is not in the catalog as an explicit API is a better fit
}
} // namespace Imageio