diff --git a/src/loaders/tvg/meson.build b/src/loaders/tvg/meson.build index 57f4f2f7..ad1f7a5a 100644 --- a/src/loaders/tvg/meson.build +++ b/src/loaders/tvg/meson.build @@ -1,8 +1,8 @@ source_file = [ 'tvgTvgLoader.h', + 'tvgTvgCommon.h', 'tvgTvgLoader.cpp', - 'tvgTvgLoadParser.h', - 'tvgTvgLoadParser.cpp', + 'tvgTvgBinInterpreter.cpp', ] subloader_dep += [declare_dependency( diff --git a/src/loaders/tvg/tvgTvgLoadParser.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp similarity index 99% rename from src/loaders/tvg/tvgTvgLoadParser.cpp rename to src/loaders/tvg/tvgTvgBinInterpreter.cpp index 62250b59..9c16ecd3 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -19,9 +19,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - #include -#include "tvgTvgLoadParser.h" +#include "tvgTvgCommon.h" /************************************************************************/ @@ -465,7 +464,7 @@ static Paint* _parsePaint(TvgBinBlock baseBlock) /* External Class Implementation */ /************************************************************************/ -unique_ptr tvgLoadData(const char *ptr, const char* end) +unique_ptr TvgBinInterpreter::run(const char *ptr, const char* end) { auto scene = Scene::gen(); if (!scene) return nullptr; diff --git a/src/loaders/tvg/tvgTvgLoadParser.h b/src/loaders/tvg/tvgTvgCommon.h similarity index 71% rename from src/loaders/tvg/tvgTvgLoadParser.h rename to src/loaders/tvg/tvgTvgCommon.h index 3e2daf7c..e7c3eba4 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.h +++ b/src/loaders/tvg/tvgTvgCommon.h @@ -20,8 +20,8 @@ * SOFTWARE. */ -#ifndef _TVG_TVG_LOAD_PARSER_H_ -#define _TVG_TVG_LOAD_PARSER_H_ +#ifndef _TVG_TVG_COMMON_H_ +#define _TVG_TVG_COMMON_H_ #include "tvgCommon.h" #include "tvgBinaryDesc.h" @@ -30,6 +30,25 @@ #define READ_UI32(dst, src) memcpy(dst, (src), sizeof(uint32_t)) #define READ_FLOAT(dst, src) memcpy(dst, (src), sizeof(float)) -unique_ptr tvgLoadData(const char* ptr, const char* end); -#endif //_TVG_TVG_LOAD_PARSER_H_ +/* Interface for Tvg Binary Interpreter */ +class TvgBinInterpreterBase +{ +public: + virtual ~TvgBinInterpreterBase() {} + + /* ptr: points the tvg binary body (after header) + end: end of the tvg binary data */ + virtual unique_ptr run(const char* ptr, const char* end) = 0; +}; + + +/* Version 0 */ +class TvgBinInterpreter : public TvgBinInterpreterBase +{ +public: + unique_ptr run(const char* ptr, const char* end) override; +}; + + +#endif //_TVG_TVG_COMMON_H_ \ No newline at end of file diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index 00c31a81..8a1a4605 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -19,24 +19,28 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - -#include #include +#include #include "tvgLoader.h" #include "tvgTvgLoader.h" -#include "tvgTvgLoadParser.h" /************************************************************************/ /* Internal Class Implementation */ /************************************************************************/ + void TvgLoader::clear() { if (copy) free((char*)data); ptr = data = nullptr; size = 0; copy = false; + + if (interpreter) { + delete(interpreter); + interpreter = nullptr; + } } @@ -64,6 +68,9 @@ bool TvgLoader::readHeader() READ_FLOAT(&h, ptr); ptr += SIZE(float); + //Decide the proper Tvg Binary Interpreter based on the current file version + if (this->version >= 0) interpreter = new TvgBinInterpreter; + return true; } @@ -175,7 +182,9 @@ bool TvgLoader::close() void TvgLoader::run(unsigned tid) { if (root) root.reset(); - root = tvgLoadData(ptr, data + size); + + root = interpreter->run(ptr, data + size); + if (!root) clear(); } @@ -185,4 +194,4 @@ unique_ptr TvgLoader::paint() this->done(); if (root) return move(root); return nullptr; -} +} \ No newline at end of file diff --git a/src/loaders/tvg/tvgTvgLoader.h b/src/loaders/tvg/tvgTvgLoader.h index d48e13be..ba756d03 100644 --- a/src/loaders/tvg/tvgTvgLoader.h +++ b/src/loaders/tvg/tvgTvgLoader.h @@ -24,6 +24,8 @@ #define _TVG_TVG_LOADER_H_ #include "tvgTaskScheduler.h" +#include "tvgTvgCommon.h" + class TvgLoader : public LoadModule, public Task { @@ -33,6 +35,7 @@ public: uint32_t size = 0; uint16_t version = 0; unique_ptr root = nullptr; + TvgBinInterpreterBase* interpreter = nullptr; bool copy = false; ~TvgLoader();