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

98 lines
2.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 ImageOutput class implementation
//!
#include "imageio.h"
#include <algorithm>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
#include <sstream>
#include <stdexcept>
#include <vector>
#include <stdarg.h>
std::unique_ptr<ImageOutput>
ImageOutput::create(const std::string& filename)
{
std::unique_ptr<ImageOutput> out;
if (filename.empty()) { // Can't even guess if no name given
throw std::runtime_error(
"ImageOutput::create() called with no filename"
);
}
// Populate outputFormats.
if (Imageio::outputFormats.empty()) {
Imageio::catalogBuiltinPlugins();
assert(!Imageio::outputFormats.empty()
&& "No image output plugins compiled in.");
}
// Extract the file extension from the filename (without the leading dot)
Imageio::string format = filename.substr(filename.find_last_of('.')+1);
if (format.empty()) {
// If the file had no extension, maybe it was itself the format name
format = filename;
}
format.tolower();
ImageOutput::Creator createFunction = nullptr;
// See if it's already in the table. If not, scan all plugins we can
// find to populate the table.
Imageio::OutputPluginMap::const_iterator found
= Imageio::outputFormats.find(format);
if (found != Imageio::outputFormats.end()) {
createFunction = found->second;
} else {
throw std::runtime_error(
fmt::format("Could not find a format writer for \"{}\". "
"Is it a file format that we don't know about?",
filename));
}
assert(createFunction != nullptr);
out = std::unique_ptr<ImageOutput>(createFunction());
return out;
}
void
ImageOutput::writeScanline(int /*y*/, int /*z*/,
const FormatDescriptor& /*format*/,
const void* /*data*/, stride_t /*xstride*/)
{
}
void
ImageOutput::writeImage(const FormatDescriptor& /*format*/,
const void* /*data*/,
stride_t /*xstride*/,
stride_t /*ystride*/,
stride_t /*zstride*/,
ProgressCallback /*progress_callback*/,
void* /*progress_callback_data*/)
{
}
void
ImageOutput::copyImage(ImageInput* /*in*/)
{
}