From 49d26691e55f26c52df6820e0423714941d4bfb9 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 20 Dec 2023 14:22:19 +0900 Subject: [PATCH] common: Revise internal loader interfaces. We are introducing the FontLoader, which slightly differs from the ImageLoader in terms of features. To adequately support both, we have separated the loader functionalities into FontLoader and ImageLoader. This allows us to optimally adapt the LoadModule for each case. --- src/loaders/external_jpg/tvgJpgLoader.cpp | 2 +- src/loaders/external_jpg/tvgJpgLoader.h | 2 +- src/loaders/external_png/tvgPngLoader.cpp | 2 +- src/loaders/external_png/tvgPngLoader.h | 2 +- src/loaders/external_webp/tvgWebpLoader.cpp | 2 +- src/loaders/external_webp/tvgWebpLoader.h | 2 +- src/loaders/jpg/tvgJpgLoader.cpp | 2 +- src/loaders/jpg/tvgJpgLoader.h | 2 +- src/loaders/png/tvgPngLoader.cpp | 2 +- src/loaders/png/tvgPngLoader.h | 2 +- src/loaders/raw/tvgRawLoader.cpp | 2 +- src/loaders/raw/tvgRawLoader.h | 2 +- src/loaders/svg/tvgSvgLoader.cpp | 2 +- src/loaders/svg/tvgSvgLoader.h | 2 +- src/loaders/tvg/tvgTvgLoader.cpp | 2 +- src/loaders/tvg/tvgTvgLoader.h | 2 +- src/renderer/tvgFrameModule.h | 4 ++-- src/renderer/tvgLoadModule.h | 24 +++++++++++++-------- src/renderer/tvgLoader.cpp | 4 ++-- src/renderer/tvgPicture.cpp | 2 +- src/renderer/tvgPicture.h | 10 ++++----- 21 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/loaders/external_jpg/tvgJpgLoader.cpp b/src/loaders/external_jpg/tvgJpgLoader.cpp index 74e18121..f5ad1495 100644 --- a/src/loaders/external_jpg/tvgJpgLoader.cpp +++ b/src/loaders/external_jpg/tvgJpgLoader.cpp @@ -41,7 +41,7 @@ void JpgLoader::clear() /* External Class Implementation */ /************************************************************************/ -JpgLoader::JpgLoader() : LoadModule(FileType::Jpg) +JpgLoader::JpgLoader() : ImageLoader(FileType::Jpg) { jpegDecompressor = tjInitDecompress(); } diff --git a/src/loaders/external_jpg/tvgJpgLoader.h b/src/loaders/external_jpg/tvgJpgLoader.h index d50dc2c1..dd399ba0 100644 --- a/src/loaders/external_jpg/tvgJpgLoader.h +++ b/src/loaders/external_jpg/tvgJpgLoader.h @@ -28,7 +28,7 @@ using tjhandle = void*; //TODO: Use Task? -class JpgLoader : public LoadModule +class JpgLoader : public ImageLoader { public: JpgLoader(); diff --git a/src/loaders/external_png/tvgPngLoader.cpp b/src/loaders/external_png/tvgPngLoader.cpp index 3404a9aa..5bc47651 100644 --- a/src/loaders/external_png/tvgPngLoader.cpp +++ b/src/loaders/external_png/tvgPngLoader.cpp @@ -38,7 +38,7 @@ void PngLoader::clear() /* External Class Implementation */ /************************************************************************/ -PngLoader::PngLoader() : LoadModule(FileType::Png) +PngLoader::PngLoader() : ImageLoader(FileType::Png) { image = static_cast(calloc(1, sizeof(png_image))); image->version = PNG_IMAGE_VERSION; diff --git a/src/loaders/external_png/tvgPngLoader.h b/src/loaders/external_png/tvgPngLoader.h index 484262c7..45a8dfa9 100644 --- a/src/loaders/external_png/tvgPngLoader.h +++ b/src/loaders/external_png/tvgPngLoader.h @@ -26,7 +26,7 @@ #include #include "tvgLoader.h" -class PngLoader : public LoadModule +class PngLoader : public ImageLoader { public: PngLoader(); diff --git a/src/loaders/external_webp/tvgWebpLoader.cpp b/src/loaders/external_webp/tvgWebpLoader.cpp index 04b53546..de085500 100644 --- a/src/loaders/external_webp/tvgWebpLoader.cpp +++ b/src/loaders/external_webp/tvgWebpLoader.cpp @@ -41,7 +41,7 @@ void WebpLoader::run(unsigned tid) /* External Class Implementation */ /************************************************************************/ -WebpLoader::WebpLoader() : LoadModule(FileType::Webp) +WebpLoader::WebpLoader() : ImageLoader(FileType::Webp) { } diff --git a/src/loaders/external_webp/tvgWebpLoader.h b/src/loaders/external_webp/tvgWebpLoader.h index 3f925938..07092f89 100644 --- a/src/loaders/external_webp/tvgWebpLoader.h +++ b/src/loaders/external_webp/tvgWebpLoader.h @@ -26,7 +26,7 @@ #include "tvgLoader.h" #include "tvgTaskScheduler.h" -class WebpLoader : public LoadModule, public Task +class WebpLoader : public ImageLoader, public Task { public: WebpLoader(); diff --git a/src/loaders/jpg/tvgJpgLoader.cpp b/src/loaders/jpg/tvgJpgLoader.cpp index f1540aa5..2a20d29d 100644 --- a/src/loaders/jpg/tvgJpgLoader.cpp +++ b/src/loaders/jpg/tvgJpgLoader.cpp @@ -53,7 +53,7 @@ void JpgLoader::run(unsigned tid) /* External Class Implementation */ /************************************************************************/ -JpgLoader::JpgLoader() : LoadModule(FileType::Jpg) +JpgLoader::JpgLoader() : ImageLoader(FileType::Jpg) { } diff --git a/src/loaders/jpg/tvgJpgLoader.h b/src/loaders/jpg/tvgJpgLoader.h index 0d02ada8..13d4f89a 100644 --- a/src/loaders/jpg/tvgJpgLoader.h +++ b/src/loaders/jpg/tvgJpgLoader.h @@ -27,7 +27,7 @@ #include "tvgTaskScheduler.h" #include "tvgJpgd.h" -class JpgLoader : public LoadModule, public Task +class JpgLoader : public ImageLoader, public Task { private: jpeg_decoder* decoder = nullptr; diff --git a/src/loaders/png/tvgPngLoader.cpp b/src/loaders/png/tvgPngLoader.cpp index ec5a532c..2bd99426 100644 --- a/src/loaders/png/tvgPngLoader.cpp +++ b/src/loaders/png/tvgPngLoader.cpp @@ -49,7 +49,7 @@ void PngLoader::run(unsigned tid) /* External Class Implementation */ /************************************************************************/ -PngLoader::PngLoader() : LoadModule(FileType::Png) +PngLoader::PngLoader() : ImageLoader(FileType::Png) { lodepng_state_init(&state); } diff --git a/src/loaders/png/tvgPngLoader.h b/src/loaders/png/tvgPngLoader.h index c3cdc261..9805b4ea 100644 --- a/src/loaders/png/tvgPngLoader.h +++ b/src/loaders/png/tvgPngLoader.h @@ -27,7 +27,7 @@ #include "tvgTaskScheduler.h" -class PngLoader : public LoadModule, public Task +class PngLoader : public ImageLoader, public Task { private: LodePNGState state; diff --git a/src/loaders/raw/tvgRawLoader.cpp b/src/loaders/raw/tvgRawLoader.cpp index 5fed4e35..70538cdb 100644 --- a/src/loaders/raw/tvgRawLoader.cpp +++ b/src/loaders/raw/tvgRawLoader.cpp @@ -34,7 +34,7 @@ /* External Class Implementation */ /************************************************************************/ -RawLoader::RawLoader() : LoadModule(FileType::Raw) +RawLoader::RawLoader() : ImageLoader(FileType::Raw) { } diff --git a/src/loaders/raw/tvgRawLoader.h b/src/loaders/raw/tvgRawLoader.h index 2a39b184..df236821 100644 --- a/src/loaders/raw/tvgRawLoader.h +++ b/src/loaders/raw/tvgRawLoader.h @@ -23,7 +23,7 @@ #ifndef _TVG_RAW_LOADER_H_ #define _TVG_RAW_LOADER_H_ -class RawLoader : public LoadModule +class RawLoader : public ImageLoader { public: uint32_t* content = nullptr; diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 1d11aa4e..1e1a1c56 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -3538,7 +3538,7 @@ void SvgLoader::clear(bool all) /* External Class Implementation */ /************************************************************************/ -SvgLoader::SvgLoader() : LoadModule(FileType::Svg) +SvgLoader::SvgLoader() : ImageLoader(FileType::Svg) { } diff --git a/src/loaders/svg/tvgSvgLoader.h b/src/loaders/svg/tvgSvgLoader.h index 12dd5436..a15d7128 100644 --- a/src/loaders/svg/tvgSvgLoader.h +++ b/src/loaders/svg/tvgSvgLoader.h @@ -26,7 +26,7 @@ #include "tvgTaskScheduler.h" #include "tvgSvgLoaderCommon.h" -class SvgLoader : public LoadModule, public Task +class SvgLoader : public ImageLoader, public Task { public: string filePath; diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index b9b5cc45..ee767392 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -121,7 +121,7 @@ void TvgLoader::run(unsigned tid) /* External Class Implementation */ /************************************************************************/ -TvgLoader::TvgLoader() : LoadModule(FileType::Tvg) +TvgLoader::TvgLoader() : ImageLoader(FileType::Tvg) { } diff --git a/src/loaders/tvg/tvgTvgLoader.h b/src/loaders/tvg/tvgTvgLoader.h index 73a3bbe0..dd643ba5 100644 --- a/src/loaders/tvg/tvgTvgLoader.h +++ b/src/loaders/tvg/tvgTvgLoader.h @@ -27,7 +27,7 @@ #include "tvgTvgCommon.h" -class TvgLoader : public LoadModule, public Task +class TvgLoader : public ImageLoader, public Task { public: const char* data = nullptr; diff --git a/src/renderer/tvgFrameModule.h b/src/renderer/tvgFrameModule.h index 728298dd..ff9e07be 100644 --- a/src/renderer/tvgFrameModule.h +++ b/src/renderer/tvgFrameModule.h @@ -28,10 +28,10 @@ namespace tvg { -class FrameModule: public LoadModule +class FrameModule: public ImageLoader { public: - FrameModule(FileType type) : LoadModule(type) {} + FrameModule(FileType type) : ImageLoader(type) {} virtual ~FrameModule() {} virtual bool frame(float no) = 0; //set the current frame number diff --git a/src/renderer/tvgLoadModule.h b/src/renderer/tvgLoadModule.h index 3ef8e852..00461dbc 100644 --- a/src/renderer/tvgLoadModule.h +++ b/src/renderer/tvgLoadModule.h @@ -26,8 +26,6 @@ #include "tvgRender.h" #include "tvgInlist.h" -namespace tvg -{ struct LoadModule { @@ -35,16 +33,17 @@ struct LoadModule //Use either hashkey(data) or hashpath(path) uint64_t hashkey; - string hashpath; + char* hashpath = nullptr; - float w = 0, h = 0; //default image size - ColorSpace cs = ColorSpace::Unsupported; //must be clarified at open() FileType type; //current loader file type uint16_t sharing = 0; //reference count bool readied = false; //read done already. LoadModule(FileType type) : type(type) {} - virtual ~LoadModule() {} + virtual ~LoadModule() + { + free(hashpath); + } virtual bool open(const string& path) { return false; } virtual bool open(const char* data, uint32_t size, bool copy) { return false; } @@ -52,7 +51,6 @@ struct LoadModule //Override this if the vector-format has own resizing policy. virtual bool resize(Paint* paint, float w, float h) { return false; } - virtual bool animatable() { return false; } //true if this loader supports animation. virtual void sync() {}; //finish immediately if any async update jobs. virtual bool read() @@ -68,11 +66,19 @@ struct LoadModule --sharing; return false; } +}; + +struct ImageLoader : LoadModule +{ + float w = 0, h = 0; //default image size + ColorSpace cs = ColorSpace::Unsupported; //must be clarified at open() + + ImageLoader(FileType type) : LoadModule(type) {} + + virtual bool animatable() { return false; } //true if this loader supports animation. virtual unique_ptr bitmap() { return nullptr; } virtual Paint* paint() { return nullptr; } }; -} - #endif //_TVG_LOAD_MODULE_H_ diff --git a/src/renderer/tvgLoader.cpp b/src/renderer/tvgLoader.cpp index aef434aa..5280886f 100644 --- a/src/renderer/tvgLoader.cpp +++ b/src/renderer/tvgLoader.cpp @@ -194,7 +194,7 @@ static LoadModule* _findFromCache(const string& path) auto loader = _activeLoaders.head; while (loader) { - if (loader->hashpath == path) { + if (loader->hashpath && !strcmp(loader->hashpath, path.c_str())) { ++loader->sharing; return loader; } @@ -260,7 +260,7 @@ LoadModule* LoaderMgr::loader(const string& path, bool* invalid) if (auto loader = _findByPath(path)) { if (loader->open(path)) { - loader->hashpath = path; + loader->hashpath = strdup(path.c_str()); _activeLoaders.back(loader); return loader; } diff --git a/src/renderer/tvgPicture.cpp b/src/renderer/tvgPicture.cpp index 8689ad61..acd54850 100644 --- a/src/renderer/tvgPicture.cpp +++ b/src/renderer/tvgPicture.cpp @@ -118,7 +118,7 @@ RenderTransform Picture::Impl::resizeTransform(const RenderTransform* pTransform } -Result Picture::Impl::load(LoadModule* loader) +Result Picture::Impl::load(ImageLoader* loader) { //Same resource has been loaded. if (this->loader == loader) { diff --git a/src/renderer/tvgPicture.h b/src/renderer/tvgPicture.h index f4cd49f7..ea123ce6 100644 --- a/src/renderer/tvgPicture.h +++ b/src/renderer/tvgPicture.h @@ -57,7 +57,7 @@ struct PictureIterator : Iterator struct Picture::Impl { - LoadModule* loader = nullptr; + ImageLoader* loader = nullptr; Paint* paint = nullptr; //vector picture uses Surface* surface = nullptr; //bitmap picture uses @@ -73,7 +73,7 @@ struct Picture::Impl bool render(RenderMethod &renderer); bool size(float w, float h); RenderRegion bounds(RenderMethod& renderer); - Result load(LoadModule* ploader); + Result load(ImageLoader* ploader); Impl(Picture* p) : picture(p) { @@ -153,7 +153,7 @@ struct Picture::Impl if (paint || surface) return Result::InsufficientCondition; bool invalid; //Invalid Path - auto loader = LoaderMgr::loader(path, &invalid); + auto loader = static_cast(LoaderMgr::loader(path, &invalid)); if (!loader) { if (invalid) return Result::InvalidArguments; return Result::NonSupport; @@ -164,7 +164,7 @@ struct Picture::Impl Result load(const char* data, uint32_t size, const string& mimeType, bool copy) { if (paint || surface) return Result::InsufficientCondition; - auto loader = LoaderMgr::loader(data, size, mimeType, copy); + auto loader = static_cast(LoaderMgr::loader(data, size, mimeType, copy)); if (!loader) return Result::NonSupport; return load(loader); } @@ -173,7 +173,7 @@ struct Picture::Impl { if (paint || surface) return Result::InsufficientCondition; - auto loader = LoaderMgr::loader(data, w, h, copy); + auto loader = static_cast(LoaderMgr::loader(data, w, h, copy)); if (!loader) return Result::FailedAllocation; return load(loader);