diff --git a/src/examples/PictureTvg.cpp b/src/examples/PictureTvg.cpp index 4fdbce7a..a7593cfa 100644 --- a/src/examples/PictureTvg.cpp +++ b/src/examples/PictureTvg.cpp @@ -37,6 +37,11 @@ void tvgDrawCmds(tvg::Canvas* canvas) cout << "TVG is not supported. Did you enable TVG Loader?" << endl; return; } + + float w, h; + picture->size(&w, &h); + cout << "default tvg view size = " << w << " x " << h << endl; + canvas->push(move(picture)); } diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 997d9aa9..80e55768 100644 Binary files a/src/examples/images/test.tvg and b/src/examples/images/test.tvg differ diff --git a/src/loaders/tvg/tvgTvgLoadParser.cpp b/src/loaders/tvg/tvgTvgLoadParser.cpp index 535cf215..6636472f 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.cpp +++ b/src/loaders/tvg/tvgTvgLoadParser.cpp @@ -66,7 +66,7 @@ static TvgBinBlock _readBlock(const char *ptr) return block; } -static bool _readTvgHeader(const char **ptr) +static bool _readTvgHeader(const char **ptr, float* w, float* h) { if (!*ptr) return false; @@ -78,6 +78,14 @@ static bool _readTvgHeader(const char **ptr) if (memcmp(*ptr, TVG_HEADER_VERSION, TVG_HEADER_VERSION_LENGTH)) return false; *ptr += TVG_HEADER_VERSION_LENGTH; + //View width + if (w) _read_tvg_float(w, *ptr); + *ptr += sizeof(float); + + //View height + if (h) _read_tvg_float(h, *ptr); + *ptr += sizeof(float); + return true; } @@ -477,10 +485,10 @@ static Paint* _parsePaint(TvgBinBlock baseBlock) /* External Class Implementation */ /************************************************************************/ -bool tvgValidateData(const char *ptr, uint32_t size) +bool tvgValidateData(const char *ptr, uint32_t size, float* w, float* h) { auto end = ptr + size; - if (!_readTvgHeader(&ptr) || ptr >= end) return false; + if (!_readTvgHeader(&ptr, w, h) || ptr >= end) return false; return true; } @@ -488,7 +496,7 @@ unique_ptr tvgLoadData(const char *ptr, uint32_t size) { auto end = ptr + size; - if (!_readTvgHeader(&ptr) || ptr >= end) { + if (!_readTvgHeader(&ptr, nullptr, nullptr) || ptr >= end) { TVGLOG("TVG", "Invalid TVG Data!"); return nullptr; } diff --git a/src/loaders/tvg/tvgTvgLoadParser.h b/src/loaders/tvg/tvgTvgLoadParser.h index cadd45ed..437670eb 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.h +++ b/src/loaders/tvg/tvgTvgLoadParser.h @@ -26,7 +26,7 @@ #include "tvgCommon.h" #include "tvgBinaryDesc.h" -bool tvgValidateData(const char *ptr, uint32_t size); +bool tvgValidateData(const char *ptr, uint32_t size, float* w, float* h); unique_ptr tvgLoadData(const char *ptr, uint32_t size); #endif //_TVG_TVG_LOAD_PARSER_H_ diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index c56fbbde..5b834423 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -82,7 +82,7 @@ bool TvgLoader::open(const string &path) pointer = data; - return tvgValidateData(pointer, size); + return tvgValidateData(pointer, size, &w, &h); } @@ -100,7 +100,7 @@ bool TvgLoader::open(const char *data, uint32_t size, bool copy) this->size = size; this->copy = copy; - return tvgValidateData(pointer, size); + return tvgValidateData(pointer, size, &w, &h); } diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 82ea37f1..d7c38550 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -69,6 +69,16 @@ bool TvgSaver::writeHeader() } +bool TvgSaver::writeViewSize() +{ + float var[2]; + paint->bounds(nullptr, nullptr, &var[0], &var[1]); + writeData(var, sizeof(var)); + + return true; +} + + void TvgSaver::writeTag(TvgBinTag tag) { buffer.grow(SIZE(TvgBinTag)); @@ -393,6 +403,7 @@ TvgBinCounter TvgSaver::serialize(const Paint* paint) void TvgSaver::run(unsigned tid) { if (!writeHeader()) return; + if (!writeViewSize()) return; if (serialize(paint) == 0) return; if (!flushTo(path)) return; } diff --git a/src/savers/tvg/tvgTvgSaver.h b/src/savers/tvg/tvgTvgSaver.h index eecd8e13..495d9263 100644 --- a/src/savers/tvg/tvgTvgSaver.h +++ b/src/savers/tvg/tvgTvgSaver.h @@ -40,6 +40,7 @@ private: void reserveCount(); bool writeHeader(); + bool writeViewSize(); void writeTag(TvgBinTag tag); void writeCount(TvgBinCounter cnt); void writeReservedCount(TvgBinCounter cnt);