Skip to content

Commit 89b6678

Browse files
committed
Updated dependencies interface.
The fullVersion not contains name as well, can be used alone. Added 'next' pointer to report sub-dependencies.
1 parent ec09b4c commit 89b6678

12 files changed

Lines changed: 224 additions & 103 deletions

File tree

Source/FreeImage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ FI_STRUCT (FIDEPENDENCY) {
727727
uint32_t majorVersion FI_DEFAULT(0);
728728
uint32_t minorVersion FI_DEFAULT(0);
729729
FREE_IMAGE_DEPENDENCY_TYPE type FI_DEFAULT(FIDEP_STATIC);
730+
const FIDEPENDENCY* next FI_DEFAULT(NULL); // optional list of sub-dependencies
730731
};
731732

732733

Source/FreeImage/FreeImage.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -112,26 +112,26 @@ FreeImageRe_GetVersionNumbers(int* major, int* minor) {
112112
}
113113

114114
// Forward declaration for version functions
115-
std::unique_ptr<FIDEPENDENCY> MakePngDependencyInfo();
116-
std::unique_ptr<FIDEPENDENCY> MakeJpegDependencyInfo();
117-
std::unique_ptr<FIDEPENDENCY> MakeJpeg2kDependencyInfo();
118-
std::unique_ptr<FIDEPENDENCY> MakeExrDependencyInfo();
119-
std::unique_ptr<FIDEPENDENCY> MakeTiffDependencyInfo();
120-
std::unique_ptr<FIDEPENDENCY> MakeRawDependencyInfo();
121-
std::unique_ptr<FIDEPENDENCY> MakeWebpDependencyInfo();
122-
std::unique_ptr<FIDEPENDENCY> MakeJxrDependencyInfo();
123-
std::unique_ptr<FIDEPENDENCY> MakeHeifDependencyInfo();
115+
const FIDEPENDENCY* GetPngDependencyInfo();
116+
const FIDEPENDENCY* GetJpegDependencyInfo();
117+
const FIDEPENDENCY* GetJpeg2kDependencyInfo();
118+
const FIDEPENDENCY* GetExrDependencyInfo();
119+
const FIDEPENDENCY* GetTiffDependencyInfo();
120+
const FIDEPENDENCY* GetRawDependencyInfo();
121+
const FIDEPENDENCY* GetWebpDependencyInfo();
122+
const FIDEPENDENCY* GetJxrDependencyInfo();
123+
const FIDEPENDENCY* GetHeifDependencyInfo();
124124

125125
namespace {
126126

127-
std::unique_ptr<FIDEPENDENCY> MakeZLibDependencyInfo() {
128-
auto info = std::make_unique<FIDEPENDENCY>();
129-
info->type = FIDEP_STATIC;
130-
info->name = "zlib";
131-
info->fullVersion = ZLIB_VERSION;
132-
info->majorVersion = ZLIB_VER_MAJOR;
133-
info->minorVersion = ZLIB_VER_MINOR;
134-
return info;
127+
const FIDEPENDENCY* GetZLibDependencyInfo() {
128+
static const FIDEPENDENCY info = {
129+
.name = "zlib",
130+
.fullVersion = "zlib v" ZLIB_VERSION,
131+
.majorVersion = ZLIB_VER_MAJOR,
132+
.minorVersion = ZLIB_VER_MINOR
133+
};
134+
return &info;
135135
}
136136

137137
class DependenciesTable {
@@ -147,48 +147,48 @@ namespace {
147147
}
148148

149149
const FIDEPENDENCY* GetByIndex(uint32_t index) const {
150-
return mEntries.at(index).get();
150+
return mEntries.at(index);
151151
}
152152

153153
private:
154154
DependenciesTable() {
155-
Append(MakeZLibDependencyInfo());
155+
Append(GetZLibDependencyInfo());
156156
#if FREEIMAGE_WITH_LIBPNG
157-
Append(MakePngDependencyInfo());
157+
Append(GetPngDependencyInfo());
158158
#endif
159159
#if FREEIMAGE_WITH_LIBJPEG
160-
Append(MakeJpegDependencyInfo());
160+
Append(GetJpegDependencyInfo());
161161
#endif
162162
#if FREEIMAGE_WITH_LIBOPENJPEG
163-
Append(MakeJpeg2kDependencyInfo());
163+
Append(GetJpeg2kDependencyInfo());
164164
#endif
165165
#if FREEIMAGE_WITH_LIBOPENEXR
166-
Append(MakeExrDependencyInfo());
166+
Append(GetExrDependencyInfo());
167167
#endif
168168
#if FREEIMAGE_WITH_LIBTIFF
169-
Append(MakeTiffDependencyInfo());
169+
Append(GetTiffDependencyInfo());
170170
#endif
171171
#if FREEIMAGE_WITH_LIBRAW
172-
Append(MakeRawDependencyInfo());
172+
Append(GetRawDependencyInfo());
173173
#endif
174174
#if FREEIMAGE_WITH_LIBWEBP
175-
Append(MakeWebpDependencyInfo());
175+
Append(GetWebpDependencyInfo());
176176
#endif
177177
#if FREEIMAGE_WITH_LIBJXR
178-
Append(MakeJxrDependencyInfo());
178+
Append(GetJxrDependencyInfo());
179179
#endif
180180
#if FREEIMAGE_WITH_LIBHEIF
181-
Append(MakeHeifDependencyInfo());
181+
Append(GetHeifDependencyInfo());
182182
#endif
183183
}
184184

185-
void Append(std::unique_ptr<FIDEPENDENCY> dep) {
185+
void Append(const FIDEPENDENCY* dep) {
186186
if (dep) {
187187
mEntries.emplace_back(std::move(dep));
188188
}
189189
}
190190

191-
std::vector<std::unique_ptr<FIDEPENDENCY>> mEntries; // not null
191+
std::vector<const FIDEPENDENCY*> mEntries; // not null
192192
};
193193

194194
} // namespace
@@ -203,7 +203,7 @@ catch (...) {
203203
}
204204

205205
const FIDEPENDENCY* DLL_CALLCONV
206-
FreeImage_GetDependencyInfo(uint32_t index)
206+
FreeImage_GetDependencyInfo(uint32_t index)
207207
try {
208208
return DependenciesTable::GetInstance().GetByIndex(index);
209209
}

Source/Plugins/PluginEXR.cpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
#include "OpenEXR/ImfPreviewImage.h"
4040
//#include "OpenEXR/Half/half.h"
4141

42+
#include "ImathConfig.h"
43+
#include "openjph/ojph_version.h"
44+
4245

4346
// ==========================================================
4447
// Plugin Interface
@@ -766,11 +769,30 @@ InitEXR(Plugin *plugin, int format_id) {
766769
}
767770

768771

769-
std::unique_ptr<FIDEPENDENCY> MakeExrDependencyInfo() {
770-
auto info = std::make_unique<FIDEPENDENCY>();
771-
info->name = "OpenEXR";
772-
info->fullVersion = OPENEXR_VERSION_STRING;
773-
info->majorVersion = OPENEXR_VERSION_MAJOR;
774-
info->minorVersion = OPENEXR_VERSION_MINOR;
775-
return info;
772+
const FIDEPENDENCY* GetExrDependencyInfo() {
773+
774+
static const FIDEPENDENCY jphInfo = {
775+
.name = "OpenJPH",
776+
.fullVersion = "OpenJPH v" FI_QUOTE(OPENJPH_VERSION_MAJOR) "." FI_QUOTE(OPENJPH_VERSION_MINOR) "." FI_QUOTE(OPENJPH_VERSION_PATCH),
777+
.majorVersion = OPENJPH_VERSION_MAJOR,
778+
.minorVersion = OPENJPH_VERSION_MINOR
779+
};
780+
781+
static const FIDEPENDENCY imathInfo = {
782+
.name = "Imath",
783+
.fullVersion = "Imath v" IMATH_LIB_VERSION_STRING,
784+
.majorVersion = IMATH_VERSION_MAJOR,
785+
.minorVersion = IMATH_VERSION_MINOR,
786+
.next = &jphInfo
787+
};
788+
789+
static const FIDEPENDENCY info = {
790+
.name = "OpenEXR",
791+
.fullVersion = "OpenEXR v" OPENEXR_VERSION_STRING,
792+
.majorVersion = OPENEXR_VERSION_MAJOR,
793+
.minorVersion = OPENEXR_VERSION_MINOR,
794+
.next = &imathInfo
795+
};
796+
797+
return &info;
776798
}

Source/Plugins/PluginHEIF.cpp

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "Metadata/FreeImageTag.h"
2020
#include "FreeImage/SimpleTools.h"
2121

22+
#include <iostream>
2223
#include <array>
2324
#include <cstring>
2425
#include "yato/types.h"
@@ -116,6 +117,8 @@ class LibHeif
116117
decltype(&::heif_get_version_number_major) heif_get_version_number_major_f{ nullptr };
117118
decltype(&::heif_get_version_number_minor) heif_get_version_number_minor_f{ nullptr };
118119
decltype(&::heif_get_version_number_maintenance) heif_get_version_number_maintenance_f{ nullptr };
120+
decltype(&::heif_get_decoder_descriptors) heif_get_decoder_descriptors_f{ nullptr };
121+
decltype(&::heif_get_encoder_descriptors) heif_get_encoder_descriptors_f{ nullptr };
119122
decltype(&::heif_read_main_brand) heif_read_main_brand_f{ nullptr };
120123
decltype(&::heif_context_alloc) heif_context_alloc_f{ nullptr };
121124
decltype(&::heif_context_free) heif_context_free_f{ nullptr };
@@ -135,6 +138,8 @@ class LibHeif
135138
decltype(&::heif_image_handle_get_metadata_size) heif_image_handle_get_metadata_size_f{ nullptr };
136139
decltype(&::heif_image_handle_get_metadata) heif_image_handle_get_metadata_f{ nullptr };
137140
decltype(&::heif_decode_image) heif_decode_image_f{ nullptr };
141+
decltype(&::heif_decoder_descriptor_get_id_name) heif_decoder_descriptor_get_id_name_f{ nullptr };
142+
decltype(&::heif_decoder_descriptor_get_name) heif_decoder_descriptor_get_name_f{ nullptr };
138143
decltype(&::heif_image_create) heif_image_create_f{ nullptr };
139144
decltype(&::heif_image_release) heif_image_release_f{ nullptr };
140145
decltype(&::heif_image_add_plane) heif_image_add_plane_f{ nullptr };
@@ -143,6 +148,8 @@ class LibHeif
143148
decltype(&::heif_image_get_plane) heif_image_get_plane_f{ nullptr };
144149
decltype(&::heif_encoder_release) heif_encoder_release_f{ nullptr };
145150
decltype(&::heif_encoder_set_lossy_quality) heif_encoder_set_lossy_quality_f{ nullptr };
151+
decltype(&::heif_encoder_descriptor_get_id_name) heif_encoder_descriptor_get_id_name_f{ nullptr };
152+
decltype(&::heif_encoder_descriptor_get_name) heif_encoder_descriptor_get_name_f{ nullptr };
146153
decltype(&::heif_image_handle_get_number_of_thumbnails) heif_image_handle_get_number_of_thumbnails_f{ nullptr };
147154
decltype(&::heif_image_handle_get_list_of_thumbnail_IDs) heif_image_handle_get_list_of_thumbnail_IDs_f{ nullptr };
148155
decltype(&::heif_image_handle_get_thumbnail) heif_image_handle_get_thumbnail_f{ nullptr };
@@ -165,6 +172,8 @@ class LibHeif
165172
heif_get_version_number_major_f = LoadSymbol<decltype(&::heif_get_version_number_major)>("heif_get_version_number_major");
166173
heif_get_version_number_minor_f = LoadSymbol<decltype(&::heif_get_version_number_minor)>("heif_get_version_number_minor");
167174
heif_get_version_number_maintenance_f = LoadSymbol<decltype(&::heif_get_version_number_maintenance)>("heif_get_version_number_maintenance");
175+
heif_get_decoder_descriptors_f = LoadSymbol<decltype(&::heif_get_decoder_descriptors)>("heif_get_decoder_descriptors", /*required=*/false);
176+
heif_get_encoder_descriptors_f = LoadSymbol<decltype(&::heif_get_encoder_descriptors)>("heif_get_encoder_descriptors", /*required=*/false);
168177
heif_read_main_brand_f = LoadSymbol<decltype(&::heif_read_main_brand)>("heif_read_main_brand", /*required=*/false);
169178
heif_context_alloc_f = LoadSymbol<decltype(&::heif_context_alloc)>("heif_context_alloc");
170179
heif_context_free_f = LoadSymbol<decltype(&::heif_context_free)>("heif_context_free");
@@ -182,6 +191,8 @@ class LibHeif
182191
heif_image_handle_get_metadata_f = LoadSymbol<decltype(&::heif_image_handle_get_metadata)>("heif_image_handle_get_metadata");
183192
heif_image_handle_get_preferred_decoding_colorspace_f = LoadSymbol<decltype(&::heif_image_handle_get_preferred_decoding_colorspace)>("heif_image_handle_get_preferred_decoding_colorspace", /*required=*/false);
184193
heif_decode_image_f = LoadSymbol<decltype(&::heif_decode_image)>("heif_decode_image");
194+
heif_decoder_descriptor_get_id_name_f = LoadSymbol<decltype(&::heif_decoder_descriptor_get_id_name)>("heif_decoder_descriptor_get_id_name", /*required=*/false);
195+
heif_decoder_descriptor_get_name_f = LoadSymbol<decltype(&::heif_decoder_descriptor_get_name)>("heif_decoder_descriptor_get_name", /*required=*/false);
185196
heif_image_create_f = LoadSymbol<decltype(&::heif_image_create)>("heif_image_create");
186197
heif_image_release_f = LoadSymbol<decltype(&::heif_image_release)>("heif_image_release");
187198
heif_image_add_plane_f = LoadSymbol<decltype(&::heif_image_add_plane)>("heif_image_add_plane");
@@ -191,6 +202,8 @@ class LibHeif
191202
heif_image_get_plane_f = LoadSymbol<decltype(&::heif_image_get_plane)>("heif_image_get_plane");
192203
heif_encoder_release_f = LoadSymbol<decltype(&::heif_encoder_release)>("heif_encoder_release");
193204
heif_encoder_set_lossy_quality_f = LoadSymbol<decltype(&::heif_encoder_set_lossy_quality)>("heif_encoder_set_lossy_quality");
205+
heif_encoder_descriptor_get_id_name_f = LoadSymbol<decltype(&::heif_encoder_descriptor_get_id_name)>("heif_encoder_descriptor_get_id_name", /*required=*/false);
206+
heif_encoder_descriptor_get_name_f = LoadSymbol<decltype(&::heif_encoder_descriptor_get_name)>("heif_encoder_descriptor_get_name", /*required=*/false);
194207
heif_context_encode_image_f = LoadSymbol<decltype(&::heif_context_encode_image)>("heif_context_encode_image");
195208
heif_image_handle_get_number_of_thumbnails_f = LoadSymbol<decltype(&::heif_image_handle_get_number_of_thumbnails)>("heif_image_handle_get_number_of_thumbnails", /*required=*/false);
196209
heif_image_handle_get_list_of_thumbnail_IDs_f = LoadSymbol<decltype(&::heif_image_handle_get_list_of_thumbnail_IDs)>("heif_image_handle_get_list_of_thumbnail_IDs", /*required=*/false);
@@ -633,17 +646,86 @@ catch (...) {
633646
}
634647

635648

649+
namespace
650+
{
651+
constexpr size_t kMaxCodecs = 32;
652+
653+
void GetDecoderDependencies(LibHeif& libHeif, heif_compression_format fmt, std::vector<FIDEPENDENCY>& depInfos)
654+
{
655+
if (!libHeif.heif_get_decoder_descriptors_f || !libHeif.heif_decoder_descriptor_get_id_name_f || !libHeif.heif_decoder_descriptor_get_name_f) {
656+
return;
657+
}
658+
659+
std::array<const heif_decoder_descriptor*, kMaxCodecs> decoders = { nullptr };
660+
const int count = libHeif.heif_get_decoder_descriptors_f(fmt, decoders.data(), yato::narrow_cast<int>(decoders.size()));
661+
662+
for (int i = 0; i < count; ++i) {
663+
auto& dep = depInfos.emplace_back();
664+
dep.name = libHeif.heif_decoder_descriptor_get_id_name_f(decoders[i]);
665+
dep.fullVersion = libHeif.heif_decoder_descriptor_get_name_f(decoders[i]);
666+
dep.type = FIDEP_DYNAMIC;
667+
}
668+
}
669+
670+
void GetEncoderDependencies(LibHeif& libHeif, heif_compression_format fmt, std::vector<FIDEPENDENCY>& depInfos)
671+
{
672+
if (!libHeif.heif_get_encoder_descriptors_f || !libHeif.heif_encoder_descriptor_get_id_name_f || !libHeif.heif_encoder_descriptor_get_name_f) {
673+
return;
674+
}
675+
676+
std::array<const heif_encoder_descriptor*, kMaxCodecs> encoders = { nullptr };
677+
const int count = libHeif.heif_get_encoder_descriptors_f(fmt, nullptr, encoders.data(), yato::narrow_cast<int>(encoders.size()));
678+
679+
for (int i = 0; i < count; ++i) {
680+
auto& dep = depInfos.emplace_back();
681+
dep.name = libHeif.heif_encoder_descriptor_get_id_name_f(encoders[i]);
682+
dep.fullVersion = libHeif.heif_encoder_descriptor_get_name_f(encoders[i]);
683+
dep.type = FIDEP_DYNAMIC;
684+
}
685+
}
636686

637-
std::unique_ptr<FIDEPENDENCY> MakeHeifDependencyInfo()
687+
std::vector<FIDEPENDENCY> GetHeifDependencies(LibHeif& libHeif) {
688+
std::vector<FIDEPENDENCY> depInfos{};
689+
GetDecoderDependencies(libHeif, heif_compression_HEVC, depInfos);
690+
GetDecoderDependencies(libHeif, heif_compression_AV1, depInfos);
691+
GetEncoderDependencies(libHeif, heif_compression_HEVC, depInfos);
692+
GetEncoderDependencies(libHeif, heif_compression_AV1, depInfos);
693+
694+
depInfos.shrink_to_fit();
695+
for (size_t i = 0; i < depInfos.size() - 1; ++i) {
696+
depInfos[i].next = &depInfos[i + 1];
697+
}
698+
699+
return depInfos;
700+
}
701+
702+
const char* GetHeifFullVersion(LibHeif& libHeif)
703+
{
704+
static char buffer[256] = { 0 };
705+
std::snprintf(buffer, std::size(buffer), "LibHeif v%s", libHeif.heif_get_version_f());
706+
return buffer;
707+
}
708+
709+
} // namespace
710+
711+
712+
713+
const FIDEPENDENCY* GetHeifDependencyInfo()
638714
try {
639715
auto& libHeif = LibHeif::GetInstance();
640-
auto info = std::make_unique<FIDEPENDENCY>();
641-
info->type = FIDEP_DYNAMIC;
642-
info->name = "LibHeif";
643-
info->fullVersion = libHeif.heif_get_version_f();
644-
info->majorVersion = libHeif.heif_get_version_number_major_f();
645-
info->minorVersion = libHeif.heif_get_version_number_minor_f();
646-
return info;
716+
717+
static const std::vector<FIDEPENDENCY> codecDeps = GetHeifDependencies(libHeif);
718+
719+
static const FIDEPENDENCY info = {
720+
.name = "LibHeif",
721+
.fullVersion = GetHeifFullVersion(libHeif),
722+
.majorVersion = yato::narrow_cast<uint32_t>(libHeif.heif_get_version_number_major_f()),
723+
.minorVersion = yato::narrow_cast<uint32_t>(libHeif.heif_get_version_number_minor_f()),
724+
.type = FIDEP_DYNAMIC,
725+
.next = !codecDeps.empty() ? &codecDeps[0] : nullptr
726+
};
727+
728+
return &info;
647729
}
648730
catch (...) {
649731
return nullptr;

Source/Plugins/PluginJP2.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,12 @@ InitJP2(Plugin *plugin, int format_id) {
303303
}
304304

305305

306-
std::unique_ptr<FIDEPENDENCY> MakeJpeg2kDependencyInfo() {
307-
auto info = std::make_unique<FIDEPENDENCY>();
308-
info->name = "OpenJPEG";
309-
info->fullVersion = FI_QUOTE(OPJ_VERSION_MAJOR) "." FI_QUOTE(OPJ_VERSION_MINOR) "." FI_QUOTE(OPJ_VERSION_BUILD);
310-
info->majorVersion = OPJ_VERSION_MAJOR;
311-
info->minorVersion = OPJ_VERSION_MINOR;
312-
return info;
306+
const FIDEPENDENCY* GetJpeg2kDependencyInfo() {
307+
static const FIDEPENDENCY info = {
308+
.name = "OpenJPEG",
309+
.fullVersion = "OpenJPEG v" FI_QUOTE(OPJ_VERSION_MAJOR) "." FI_QUOTE(OPJ_VERSION_MINOR) "." FI_QUOTE(OPJ_VERSION_BUILD),
310+
.majorVersion = OPJ_VERSION_MAJOR,
311+
.minorVersion = OPJ_VERSION_MINOR,
312+
};
313+
return &info;
313314
}

Source/Plugins/PluginJPEG.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,23 +1731,24 @@ InitJPEG(Plugin *plugin, int format_id) {
17311731
}
17321732

17331733

1734-
std::unique_ptr<FIDEPENDENCY> MakeJpegDependencyInfo() {
1735-
auto info = std::make_unique<FIDEPENDENCY>();
1734+
const FIDEPENDENCY* GetJpegDependencyInfo() {
1735+
static const FIDEPENDENCY info = {
17361736
#ifdef LIBJPEG_TURBO_VERSION
17371737
# if WITH_SIMD
1738-
# define SIMD_TAG " (simd)"
1738+
# define SIMD_TAG " (simd)"
1739+
# else
1740+
# define SIMD_TAG
1741+
# endif
1742+
.name = "libjpeg-turbo",
1743+
.fullVersion = "libjpeg-turbo v" FI_QUOTE(LIBJPEG_TURBO_VERSION) SIMD_TAG,
1744+
.majorVersion = LIBJPEG_TURBO_VERSION_NUMBER,
1745+
.minorVersion = 0
17391746
#else
1740-
# define SIMD_TAG
1747+
.name = "libjpeg (IJG)";
1748+
.fullVersion = "libjpeg (IJG) " JVERSION,
1749+
.majorVersion = JPEG_LIB_VERSION_MAJOR,
1750+
.minorVersion = JPEG_LIB_VERSION_MINOR
17411751
#endif
1742-
info->name = "libjpeg-turbo";
1743-
info->majorVersion = LIBJPEG_TURBO_VERSION_NUMBER;
1744-
info->minorVersion = 0;
1745-
info->fullVersion = FI_QUOTE(LIBJPEG_TURBO_VERSION) SIMD_TAG;
1746-
#else
1747-
info->name = "libjpeg (IJG)";
1748-
info->majorVersion = JPEG_LIB_VERSION_MAJOR;
1749-
info->minorVersion = JPEG_LIB_VERSION_MINOR;
1750-
info->fullVersion = JVERSION;
1751-
#endif
1752-
return info;
1752+
};
1753+
return &info;
17531754
}

0 commit comments

Comments
 (0)