// Copyright 2023 Google LLC // SPDX-License-Identifier: BSD-2-Clause #ifndef AVIF_AVIF_CXX_H #define AVIF_AVIF_CXX_H #if !defined(__cplusplus) #error "This a C++ only header. Use avif/avif.h for C." #endif #include #include "avif/avif.h" namespace avif { // Struct to call the destroy functions in a unique_ptr. struct UniquePtrDeleter { void operator()(avifDecoder * decoder) const { avifDecoderDestroy(decoder); } void operator()(avifEncoder * encoder) const { avifEncoderDestroy(encoder); } void operator()(avifGainMap * gainMap) const { avifGainMapDestroy(gainMap); } void operator()(avifImage * image) const { avifImageDestroy(image); } }; // Use these unique_ptr to ensure the structs are automatically destroyed. using DecoderPtr = std::unique_ptr; using EncoderPtr = std::unique_ptr; using GainMapPtr = std::unique_ptr; using ImagePtr = std::unique_ptr; // Automatically cleans the resources of the avifRGBImage. // To use when RGBImage actually owns the pixels. RGBImage can also be used as a view, in which case it does not own the pixels. class RGBImageCleanup { public: RGBImageCleanup(avifRGBImage * rgb) : rgb_(rgb) {} ~RGBImageCleanup() { avifRGBImageFreePixels(rgb_); } private: avifRGBImage * rgb_ = nullptr; }; } // namespace avif #endif // AVIF_AVIF_CXX_H