diff --git a/src/loaders/external_jpg/tvgJpgLoader.cpp b/src/loaders/external_jpg/tvgJpgLoader.cpp index 995d974c..2abd5b4f 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 5443b718..e0f447c8 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 f602abf0..1b939ee9 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 d2c43728..761b7252 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 86509c30..b0a25e0a 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 e513c886..91ef31ef 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 72357e02..e50837b3 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 496b3645..e64c3c0f 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 6f621763..d82e8fb5 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 94bda8c5..f4e61206 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 ca624273..9a4c7c50 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 45589e83..367f25a8 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 7962ef2d..f6c63dca 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 e706efb2..ed2975e1 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 c8055bb5..0db81d92 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 492a3810..43bc1051 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 b0533c64..4d58a2b5 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, const string& rpath, 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 a386e2ac..114dfbc1 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 1f2271a0..3e453ed4 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 f207b938..eee0a26c 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, const string& rpath, bool copy) { if (paint || surface) return Result::InsufficientCondition; - auto loader = LoaderMgr::loader(data, size, mimeType, rpath, copy); + auto loader = static_cast(LoaderMgr::loader(data, size, mimeType, rpath, 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, premultiplied, copy); + auto loader = static_cast(LoaderMgr::loader(data, w, h, premultiplied, copy)); if (!loader) return Result::FailedAllocation; return load(loader);