| // 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 <memory> | |
| #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<avifDecoder, UniquePtrDeleter>; | |
| using EncoderPtr = std::unique_ptr<avifEncoder, UniquePtrDeleter>; | |
| using GainMapPtr = std::unique_ptr<avifGainMap, UniquePtrDeleter>; | |
| using ImagePtr = std::unique_ptr<avifImage, UniquePtrDeleter>; | |
| // 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 |