mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-24 23:28:57 +00:00
renderer: make the file io configurable
certain systems, may not support file I/O operations. ThorVG should provide users with an option to configure builds according to their requirements. This ensures that file I/O calls are avoided, preventing potential crashes. Please use the meson '-Dfile=true/false' option for this. Please note that "THORVG_FILE_IO_SUPPORT" might be expected for your thorvg manual build. issue: https://github.com/thorvg/thorvg/issues/3008
This commit is contained in:
parent
d6335015c4
commit
1422c4ca5f
14 changed files with 77 additions and 4 deletions
|
@ -116,6 +116,12 @@ if get_option('log')
|
||||||
config_h.set10('THORVG_LOG_ENABLED', true)
|
config_h.set10('THORVG_LOG_ENABLED', true)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
#File IO
|
||||||
|
if get_option('file') == true
|
||||||
|
config_h.set10('THORVG_FILE_IO_SUPPORT', true)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
#Extra
|
#Extra
|
||||||
lottie_expressions = lottie_loader and get_option('extra').contains('lottie_expressions')
|
lottie_expressions = lottie_loader and get_option('extra').contains('lottie_expressions')
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,11 @@ option('static',
|
||||||
value: false,
|
value: false,
|
||||||
description: 'Force to use static linking modules in thorvg')
|
description: 'Force to use static linking modules in thorvg')
|
||||||
|
|
||||||
|
option('file',
|
||||||
|
type: 'boolean',
|
||||||
|
value: true,
|
||||||
|
description: 'Enable File IO calls in thorvg')
|
||||||
|
|
||||||
option('extra',
|
option('extra',
|
||||||
type: 'array',
|
type: 'array',
|
||||||
choices: ['', 'lottie_expressions'],
|
choices: ['', 'lottie_expressions'],
|
||||||
|
|
|
@ -59,6 +59,7 @@ JpgLoader::~JpgLoader()
|
||||||
|
|
||||||
bool JpgLoader::open(const char* path)
|
bool JpgLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
auto jpegFile = fopen(path, "rb");
|
auto jpegFile = fopen(path, "rb");
|
||||||
if (!jpegFile) return false;
|
if (!jpegFile) return false;
|
||||||
|
|
||||||
|
@ -94,6 +95,9 @@ failure:
|
||||||
finalize:
|
finalize:
|
||||||
fclose(jpegFile);
|
fclose(jpegFile);
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ bool PngLoader::open(const char* path)
|
||||||
|
|
||||||
bool PngLoader::open(const char* data, uint32_t size, TVG_UNUSED const char* rpath, bool copy)
|
bool PngLoader::open(const char* data, uint32_t size, TVG_UNUSED const char* rpath, bool copy)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
image->opaque = NULL;
|
image->opaque = NULL;
|
||||||
|
|
||||||
if (!png_image_begin_read_from_memory(image, data, size)) return false;
|
if (!png_image_begin_read_from_memory(image, data, size)) return false;
|
||||||
|
@ -75,6 +76,9 @@ bool PngLoader::open(const char* data, uint32_t size, TVG_UNUSED const char* rpa
|
||||||
h = (float)image->height;
|
h = (float)image->height;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ WebpLoader::~WebpLoader()
|
||||||
|
|
||||||
bool WebpLoader::open(const char* path)
|
bool WebpLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
auto webpFile = fopen(path, "rb");
|
auto webpFile = fopen(path, "rb");
|
||||||
if (!webpFile) return false;
|
if (!webpFile) return false;
|
||||||
|
|
||||||
|
@ -96,6 +97,9 @@ bool WebpLoader::open(const char* path)
|
||||||
finalize:
|
finalize:
|
||||||
fclose(webpFile);
|
fclose(webpFile);
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ JpgLoader::~JpgLoader()
|
||||||
|
|
||||||
bool JpgLoader::open(const char* path)
|
bool JpgLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
int width, height;
|
int width, height;
|
||||||
decoder = jpgdHeader(path, &width, &height);
|
decoder = jpgdHeader(path, &width, &height);
|
||||||
if (!decoder) return false;
|
if (!decoder) return false;
|
||||||
|
@ -78,6 +79,9 @@ bool JpgLoader::open(const char* path)
|
||||||
h = static_cast<float>(height);
|
h = static_cast<float>(height);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,7 @@ bool LottieLoader::open(const char* data, uint32_t size, const char* rpath, bool
|
||||||
|
|
||||||
bool LottieLoader::open(const char* path)
|
bool LottieLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
auto f = fopen(path, "r");
|
auto f = fopen(path, "r");
|
||||||
if (!f) return false;
|
if (!f) return false;
|
||||||
|
|
||||||
|
@ -247,6 +248,9 @@ bool LottieLoader::open(const char* path)
|
||||||
this->copy = true;
|
this->copy = true;
|
||||||
|
|
||||||
return header();
|
return header();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ PngLoader::~PngLoader()
|
||||||
|
|
||||||
bool PngLoader::open(const char* path)
|
bool PngLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
auto pngFile = fopen(path, "rb");
|
auto pngFile = fopen(path, "rb");
|
||||||
if (!pngFile) return false;
|
if (!pngFile) return false;
|
||||||
|
|
||||||
|
@ -102,6 +103,9 @@ bool PngLoader::open(const char* path)
|
||||||
finalize:
|
finalize:
|
||||||
fclose(pngFile);
|
fclose(pngFile);
|
||||||
return ret;
|
return ret;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3913,6 +3913,7 @@ bool SvgLoader::open(const char* data, uint32_t size, TVG_UNUSED const char* rpa
|
||||||
|
|
||||||
bool SvgLoader::open(const char* path)
|
bool SvgLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
ifstream f;
|
ifstream f;
|
||||||
|
@ -3930,6 +3931,9 @@ bool SvgLoader::open(const char* path)
|
||||||
size = filePath.size();
|
size = filePath.size();
|
||||||
|
|
||||||
return header();
|
return header();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
/* Internal Class Implementation */
|
/* Internal Class Implementation */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
|
|
||||||
#if defined(_WIN32) && (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
|
#if defined(_WIN32) && (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
|
||||||
|
|
||||||
static bool _map(TtfLoader* loader, const string& path)
|
static bool _map(TtfLoader* loader, const string& path)
|
||||||
|
@ -155,6 +157,8 @@ static void _unmap(TtfLoader* loader)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif //THORVG_FILE_IO_SUPPORT
|
||||||
|
|
||||||
|
|
||||||
static uint32_t* _codepoints(const char* text, size_t n)
|
static uint32_t* _codepoints(const char* text, size_t n)
|
||||||
{
|
{
|
||||||
|
@ -199,7 +203,11 @@ void TtfLoader::clear()
|
||||||
reader.size = 0;
|
reader.size = 0;
|
||||||
freeData = false;
|
freeData = false;
|
||||||
nomap = false;
|
nomap = false;
|
||||||
} else _unmap(this);
|
} else {
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
|
_unmap(this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
shape = nullptr;
|
shape = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,9 +244,13 @@ TtfLoader::~TtfLoader()
|
||||||
|
|
||||||
bool TtfLoader::open(const char* path)
|
bool TtfLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
clear();
|
clear();
|
||||||
if (!_map(this, path)) return false;
|
if (!_map(this, path)) return false;
|
||||||
return reader.header();
|
return reader.header();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@ WebpLoader::~WebpLoader()
|
||||||
|
|
||||||
bool WebpLoader::open(const char* path)
|
bool WebpLoader::open(const char* path)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
auto f = fopen(path, "rb");
|
auto f = fopen(path, "rb");
|
||||||
if (!f) return false;
|
if (!f) return false;
|
||||||
|
|
||||||
|
@ -101,6 +102,9 @@ bool WebpLoader::open(const char* path)
|
||||||
freeData = true;
|
freeData = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -159,6 +159,7 @@ static LoadModule* _find(FileType type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
static LoadModule* _findByPath(const char* filename)
|
static LoadModule* _findByPath(const char* filename)
|
||||||
{
|
{
|
||||||
auto ext = strExtension(filename);
|
auto ext = strExtension(filename);
|
||||||
|
@ -173,6 +174,7 @@ static LoadModule* _findByPath(const char* filename)
|
||||||
if (!strcmp(ext, "otf") || !strcmp(ext, "otc")) return _find(FileType::Ttf);
|
if (!strcmp(ext, "otf") || !strcmp(ext, "otc")) return _find(FileType::Ttf);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static FileType _convert(const char* mimeType)
|
static FileType _convert(const char* mimeType)
|
||||||
|
@ -281,6 +283,7 @@ bool LoaderMgr::retrieve(LoadModule* loader)
|
||||||
|
|
||||||
LoadModule* LoaderMgr::loader(const char* filename, bool* invalid)
|
LoadModule* LoaderMgr::loader(const char* filename, bool* invalid)
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
*invalid = false;
|
*invalid = false;
|
||||||
|
|
||||||
//TODO: svg & lottie is not sharable.
|
//TODO: svg & lottie is not sharable.
|
||||||
|
@ -324,6 +327,7 @@ LoadModule* LoaderMgr::loader(const char* filename, bool* invalid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*invalid = true;
|
*invalid = true;
|
||||||
|
#endif
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,9 +156,14 @@ Type Picture::type() const noexcept
|
||||||
|
|
||||||
Result Picture::load(const char* filename) noexcept
|
Result Picture::load(const char* filename) noexcept
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
if (!filename) return Result::InvalidArguments;
|
if (!filename) return Result::InvalidArguments;
|
||||||
|
|
||||||
return pImpl->load(filename);
|
return pImpl->load(filename);
|
||||||
|
#else
|
||||||
|
TVGLOG("RENDERER", "FILE IO is disabled!");
|
||||||
|
return Result::NonSupport;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,15 +58,19 @@ Result Text::font(const char* name, float size, const char* style) noexcept
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result Text::load(const char* path) noexcept
|
Result Text::load(const char* filename) noexcept
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
bool invalid; //invalid path
|
bool invalid; //invalid path
|
||||||
if (!LoaderMgr::loader(path, &invalid)) {
|
if (!LoaderMgr::loader(filename, &invalid)) {
|
||||||
if (invalid) return Result::InvalidArguments;
|
if (invalid) return Result::InvalidArguments;
|
||||||
else return Result::NonSupport;
|
else return Result::NonSupport;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result::Success;
|
return Result::Success;
|
||||||
|
#else
|
||||||
|
TVGLOG("RENDERER", "FILE IO is disabled!");
|
||||||
|
return Result::NonSupport;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,8 +91,13 @@ Result Text::load(const char* name, const char* data, uint32_t size, const char*
|
||||||
|
|
||||||
Result Text::unload(const char* filename) noexcept
|
Result Text::unload(const char* filename) noexcept
|
||||||
{
|
{
|
||||||
|
#ifdef THORVG_FILE_IO_SUPPORT
|
||||||
if (LoaderMgr::retrieve(filename)) return Result::Success;
|
if (LoaderMgr::retrieve(filename)) return Result::Success;
|
||||||
return Result::InsufficientCondition;
|
return Result::InsufficientCondition;
|
||||||
|
#else
|
||||||
|
TVGLOG("RENDERER", "FILE IO is disabled!");
|
||||||
|
return Result::NonSupport;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue