/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ struct DefaultImageFormats { static ImageFileFormat** get() { static DefaultImageFormats formats; return formats.formats; } private: DefaultImageFormats() noexcept { formats[0] = &png; formats[1] = &jpg; formats[2] = &gif; formats[3] = nullptr; } PNGImageFormat png; JPEGImageFormat jpg; GIFImageFormat gif; ImageFileFormat* formats[4]; }; ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) { const int64 streamPos = input.getPosition(); for (ImageFileFormat** i = DefaultImageFormats::get(); *i != nullptr; ++i) { const bool found = (*i)->canUnderstand (input); input.setPosition (streamPos); if (found) return *i; } return nullptr; } ImageFileFormat* ImageFileFormat::findImageFormatForFileExtension (const File& file) { for (ImageFileFormat** i = DefaultImageFormats::get(); *i != nullptr; ++i) if ((*i)->usesFileExtension (file)) return *i; return nullptr; } //============================================================================== Image ImageFileFormat::loadFrom (InputStream& input) { ImageFileFormat* const format = findImageFormatForStream (input); if (format != nullptr) return format->decodeImage (input); return Image::null; } Image ImageFileFormat::loadFrom (const File& file) { FileInputStream stream (file); if (stream.openedOk()) { BufferedInputStream b (stream, 8192); return loadFrom (b); } return Image::null; } Image ImageFileFormat::loadFrom (const void* rawData, const size_t numBytes) { if (rawData != nullptr && numBytes > 4) { MemoryInputStream stream (rawData, numBytes, false); return loadFrom (stream); } return Image::null; }