From 8059a23f7c6166e53d16cf062ab7322202b1dd06 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 20 Jul 2021 12:53:16 +0900 Subject: [PATCH] tvg format: code refactoring #2 code clean up, removed reserved data sector --- inc/thorvg.h | 2 +- src/examples/images/test.tvg | Bin 330 -> 334 bytes src/lib/tvgBinaryDesc.h | 19 +++----- src/lib/tvgLoaderMgr.cpp | 2 +- src/lib/tvgSaver.cpp | 15 ++----- src/lib/tvgSaverImpl.h | 63 +++++++++++---------------- src/loaders/tvg/tvgTvgLoadParser.cpp | 12 ----- 7 files changed, 36 insertions(+), 77 deletions(-) diff --git a/inc/thorvg.h b/inc/thorvg.h index 1549df49..78172c8e 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -1397,7 +1397,7 @@ public: * @param[in] path A path to the file, in which the data is to be saved. * * @retval Result::Success When succeed. - * @retval Result::InvalidArguments the @p path is empty or @c nullptr is passed as the @p paint. + * @retval Result::InvalidArguments the @p path is invalid. * @retval Result::FailedAllocation An internal error with a memory allocation for the Saver object. * @retval Result::MemoryCorruption When casting in the internal function implementation failed. * @retval Result::Unknown Others. diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 9fcda9e8b59e99c52f32a285b3be671c0d87eb97..536d6699fb8a48e1a818ee2572f24c82ba41d2df 100644 GIT binary patch delta 21 ccmX@bbdHH9BqP5l%-z7iz{tR0BZm_s0823j0RR91 delta 17 YcmX@dbc%^1B+T8wz<_~aBaag!04$CKCIA2c diff --git a/src/lib/tvgBinaryDesc.h b/src/lib/tvgBinaryDesc.h index 6d665cf5..54e0d456 100644 --- a/src/lib/tvgBinaryDesc.h +++ b/src/lib/tvgBinaryDesc.h @@ -43,19 +43,12 @@ struct tvgBlock const char* end; }; -//TODO: replace it when this feature is completed. -#if 0 - #define TVG_BIN_HEADER_SIGNATURE "ThorVG" - #define TVG_BIN_HEADER_SIGNATURE_LENGTH 6 - #define TVG_BIN_HEADER_VERSION "000200" - #define TVG_BIN_HEADER_VERSION_LENGTH 6 -#else - #define TVG_BIN_HEADER_SIGNATURE "TVG" - #define TVG_BIN_HEADER_SIGNATURE_LENGTH 3 - #define TVG_BIN_HEADER_VERSION "000" - #define TVG_BIN_HEADER_VERSION_LENGTH 3 - #define TVG_BIN_HEADER_DATA_LENGTH 2 -#endif + +// HEADER +#define TVG_BIN_HEADER_SIGNATURE "ThorVG" +#define TVG_BIN_HEADER_SIGNATURE_LENGTH 6 +#define TVG_BIN_HEADER_VERSION "000200" +#define TVG_BIN_HEADER_VERSION_LENGTH 6 #define TVG_PICTURE_BEGIN_INDICATOR (TvgIndicator)0xfc #define TVG_SHAPE_BEGIN_INDICATOR (TvgIndicator)0xfd diff --git a/src/lib/tvgLoaderMgr.cpp b/src/lib/tvgLoaderMgr.cpp index d0fa6186..425f85d5 100644 --- a/src/lib/tvgLoaderMgr.cpp +++ b/src/lib/tvgLoaderMgr.cpp @@ -182,4 +182,4 @@ shared_ptr LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t } } return nullptr; -} +} \ No newline at end of file diff --git a/src/lib/tvgSaver.cpp b/src/lib/tvgSaver.cpp index 1768ca42..52b00355 100644 --- a/src/lib/tvgSaver.cpp +++ b/src/lib/tvgSaver.cpp @@ -43,28 +43,19 @@ Saver::~Saver() Result Saver::save(std::unique_ptr paint, const std::string& path) noexcept { - if (!paint || path.empty()) return Result::InvalidArguments; - - auto saver = unique_ptr(new Saver()); - if (!saver) return Result::FailedAllocation; - auto p = paint.release(); if (!p) return Result::MemoryCorruption; - if (saver->pImpl->save(p, path)) { - delete p; - return Result::Success; - } + if (this->pImpl->save(p, path)) return Result::Success; - delete p; return Result::Unknown; } Result Saver::sync() noexcept { - //TODO: - return Result::Success; + if (this->pImpl->sync()) return Result::Success; + return Result::Unknown; } diff --git a/src/lib/tvgSaverImpl.h b/src/lib/tvgSaverImpl.h index deba0f25..a6eada35 100644 --- a/src/lib/tvgSaverImpl.h +++ b/src/lib/tvgSaverImpl.h @@ -31,36 +31,30 @@ struct Saver::Impl { Saver* saver; + Paint* paint = nullptr; //TODO: replace with Array char* buffer = nullptr; char* pointer = nullptr; uint32_t size = 0; uint32_t reserved = 0; - Impl(Saver* s) : saver(s) { } - ~Impl() { - clearBuffer(); + sync(); } - - bool prepareBuffer() + bool sync() { - reserved = TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH + TVG_BIN_HEADER_DATA_LENGTH; - buffer = static_cast(malloc(reserved)); - if (!buffer) { - reserved = 0; - return false; - } - pointer = buffer; + if (paint) delete(paint); + + clearBuffer(); + return true; } - void resizeBuffer(uint32_t newSize) { //OPTIMIZE ME: find more optimal alg ? "*2" is not opt when raw/png is used @@ -75,7 +69,6 @@ struct Saver::Impl pointer = buffer + (pointer - bufferOld); } - void rewindBuffer(ByteCounter bytesNum) { if (pointer - bytesNum < buffer) return; @@ -84,7 +77,6 @@ struct Saver::Impl size -= bytesNum; } - void clearBuffer() { if (buffer) free(buffer); @@ -94,7 +86,6 @@ struct Saver::Impl reserved = 0; } - bool saveBufferToFile(const std::string& path) { ofstream outFile; @@ -106,28 +97,25 @@ struct Saver::Impl return true; } - bool writeHeader() { - const char *tvg = TVG_BIN_HEADER_SIGNATURE; - const char *version = TVG_BIN_HEADER_VERSION; - //TODO - unused header data - uint16_t dataByteCnt = 0; - ByteCounter headerByteCnt = TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH + TVG_BIN_HEADER_DATA_LENGTH; - if (size + headerByteCnt > reserved) resizeBuffer(headerByteCnt); + reserved = TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH; - memcpy(pointer, tvg, TVG_BIN_HEADER_SIGNATURE_LENGTH); + buffer = static_cast(malloc(reserved)); + if (!buffer) return false; + + pointer = buffer; + + memcpy(pointer, TVG_BIN_HEADER_SIGNATURE, TVG_BIN_HEADER_SIGNATURE_LENGTH); pointer += TVG_BIN_HEADER_SIGNATURE_LENGTH; - memcpy(pointer, version, TVG_BIN_HEADER_VERSION_LENGTH); + memcpy(pointer, TVG_BIN_HEADER_VERSION, TVG_BIN_HEADER_VERSION_LENGTH); pointer += TVG_BIN_HEADER_VERSION_LENGTH; - memcpy(pointer, &dataByteCnt, TVG_BIN_HEADER_DATA_LENGTH); - pointer += TVG_BIN_HEADER_DATA_LENGTH; - size += headerByteCnt; + size += (TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH); + return true; } - void writeMemberIndicator(TvgIndicator ind) { if (size + TVG_INDICATOR_SIZE > reserved) resizeBuffer(size + TVG_INDICATOR_SIZE); @@ -137,7 +125,6 @@ struct Saver::Impl size += TVG_INDICATOR_SIZE; } - void writeMemberDataSize(ByteCounter byteCnt) { if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE); @@ -147,13 +134,11 @@ struct Saver::Impl size += BYTE_COUNTER_SIZE; } - void writeMemberDataSizeAt(ByteCounter byteCnt) { memcpy(pointer - byteCnt - BYTE_COUNTER_SIZE, &byteCnt, BYTE_COUNTER_SIZE); } - void skipInBufferMemberDataSize() { if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE); @@ -161,7 +146,6 @@ struct Saver::Impl size += BYTE_COUNTER_SIZE; } - ByteCounter writeMemberData(const void* data, ByteCounter byteCnt) { if (size + byteCnt > reserved) resizeBuffer(size + byteCnt); @@ -477,15 +461,18 @@ struct Saver::Impl } - bool save(const Paint* paint, const std::string& path) + bool save(Paint* paint, const std::string& path) { - if (!prepareBuffer()) return false; + //FIXME: use Array and remove sync() here + sync(); + + //TODO: Validate path + + this->paint = paint; + if (!writeHeader()) return false; - if (serialize(paint) == 0) return false; - if (!saveBufferToFile(path)) return false; - clearBuffer(); return true; } diff --git a/src/loaders/tvg/tvgTvgLoadParser.cpp b/src/loaders/tvg/tvgTvgLoadParser.cpp index 1619d66c..44bceacb 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.cpp +++ b/src/loaders/tvg/tvgTvgLoadParser.cpp @@ -67,18 +67,6 @@ static bool _readTvgHeader(const char **ptr) if (memcmp(*ptr, TVG_BIN_HEADER_VERSION, TVG_BIN_HEADER_VERSION_LENGTH)) return false; *ptr += TVG_BIN_HEADER_VERSION_LENGTH; - //Meta data for proof? - uint16_t metaLen; - _read_tvg_ui16(&metaLen, *ptr); - *ptr += 2; - - //Meta data... Need to replace checksum way. - //char metadata[metaLen + 1]; - //memcpy(metadata, *ptr, metaLen); - //metadata[metaLen] = '\0'; - - *ptr += metaLen; - return true; }