tvg format: code refactoring #2

code clean up, removed reserved data sector
This commit is contained in:
Hermet Park 2021-07-20 12:53:16 +09:00
parent 60e3129ce2
commit 8059a23f7c
7 changed files with 36 additions and 77 deletions

View file

@ -1397,7 +1397,7 @@ public:
* @param[in] path A path to the file, in which the data is to be saved. * @param[in] path A path to the file, in which the data is to be saved.
* *
* @retval Result::Success When succeed. * @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::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::MemoryCorruption When casting in the internal function implementation failed.
* @retval Result::Unknown Others. * @retval Result::Unknown Others.

Binary file not shown.

View file

@ -43,19 +43,12 @@ struct tvgBlock
const char* end; const char* end;
}; };
//TODO: replace it when this feature is completed.
#if 0 // HEADER
#define TVG_BIN_HEADER_SIGNATURE "ThorVG" #define TVG_BIN_HEADER_SIGNATURE "ThorVG"
#define TVG_BIN_HEADER_SIGNATURE_LENGTH 6 #define TVG_BIN_HEADER_SIGNATURE_LENGTH 6
#define TVG_BIN_HEADER_VERSION "000200" #define TVG_BIN_HEADER_VERSION "000200"
#define TVG_BIN_HEADER_VERSION_LENGTH 6 #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
#define TVG_PICTURE_BEGIN_INDICATOR (TvgIndicator)0xfc #define TVG_PICTURE_BEGIN_INDICATOR (TvgIndicator)0xfc
#define TVG_SHAPE_BEGIN_INDICATOR (TvgIndicator)0xfd #define TVG_SHAPE_BEGIN_INDICATOR (TvgIndicator)0xfd

View file

@ -182,4 +182,4 @@ shared_ptr<Loader> LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t
} }
} }
return nullptr; return nullptr;
} }

View file

@ -43,28 +43,19 @@ Saver::~Saver()
Result Saver::save(std::unique_ptr<Paint> paint, const std::string& path) noexcept Result Saver::save(std::unique_ptr<Paint> paint, const std::string& path) noexcept
{ {
if (!paint || path.empty()) return Result::InvalidArguments;
auto saver = unique_ptr<Saver>(new Saver());
if (!saver) return Result::FailedAllocation;
auto p = paint.release(); auto p = paint.release();
if (!p) return Result::MemoryCorruption; if (!p) return Result::MemoryCorruption;
if (saver->pImpl->save(p, path)) { if (this->pImpl->save(p, path)) return Result::Success;
delete p;
return Result::Success;
}
delete p;
return Result::Unknown; return Result::Unknown;
} }
Result Saver::sync() noexcept Result Saver::sync() noexcept
{ {
//TODO: if (this->pImpl->sync()) return Result::Success;
return Result::Success; return Result::Unknown;
} }

View file

@ -31,36 +31,30 @@
struct Saver::Impl struct Saver::Impl
{ {
Saver* saver; Saver* saver;
Paint* paint = nullptr; //TODO: replace with Array
char* buffer = nullptr; char* buffer = nullptr;
char* pointer = nullptr; char* pointer = nullptr;
uint32_t size = 0; uint32_t size = 0;
uint32_t reserved = 0; uint32_t reserved = 0;
Impl(Saver* s) : saver(s) Impl(Saver* s) : saver(s)
{ {
} }
~Impl() ~Impl()
{ {
clearBuffer(); sync();
} }
bool sync()
bool prepareBuffer()
{ {
reserved = TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH + TVG_BIN_HEADER_DATA_LENGTH; if (paint) delete(paint);
buffer = static_cast<char*>(malloc(reserved));
if (!buffer) { clearBuffer();
reserved = 0;
return false;
}
pointer = buffer;
return true; return true;
} }
void resizeBuffer(uint32_t newSize) void resizeBuffer(uint32_t newSize)
{ {
//OPTIMIZE ME: find more optimal alg ? "*2" is not opt when raw/png is used //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); pointer = buffer + (pointer - bufferOld);
} }
void rewindBuffer(ByteCounter bytesNum) void rewindBuffer(ByteCounter bytesNum)
{ {
if (pointer - bytesNum < buffer) return; if (pointer - bytesNum < buffer) return;
@ -84,7 +77,6 @@ struct Saver::Impl
size -= bytesNum; size -= bytesNum;
} }
void clearBuffer() void clearBuffer()
{ {
if (buffer) free(buffer); if (buffer) free(buffer);
@ -94,7 +86,6 @@ struct Saver::Impl
reserved = 0; reserved = 0;
} }
bool saveBufferToFile(const std::string& path) bool saveBufferToFile(const std::string& path)
{ {
ofstream outFile; ofstream outFile;
@ -106,28 +97,25 @@ struct Saver::Impl
return true; return true;
} }
bool writeHeader() bool writeHeader()
{ {
const char *tvg = TVG_BIN_HEADER_SIGNATURE; reserved = TVG_BIN_HEADER_SIGNATURE_LENGTH + TVG_BIN_HEADER_VERSION_LENGTH;
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);
memcpy(pointer, tvg, TVG_BIN_HEADER_SIGNATURE_LENGTH); buffer = static_cast<char*>(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; 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; 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; return true;
} }
void writeMemberIndicator(TvgIndicator ind) void writeMemberIndicator(TvgIndicator ind)
{ {
if (size + TVG_INDICATOR_SIZE > reserved) resizeBuffer(size + TVG_INDICATOR_SIZE); if (size + TVG_INDICATOR_SIZE > reserved) resizeBuffer(size + TVG_INDICATOR_SIZE);
@ -137,7 +125,6 @@ struct Saver::Impl
size += TVG_INDICATOR_SIZE; size += TVG_INDICATOR_SIZE;
} }
void writeMemberDataSize(ByteCounter byteCnt) void writeMemberDataSize(ByteCounter byteCnt)
{ {
if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE); if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE);
@ -147,13 +134,11 @@ struct Saver::Impl
size += BYTE_COUNTER_SIZE; size += BYTE_COUNTER_SIZE;
} }
void writeMemberDataSizeAt(ByteCounter byteCnt) void writeMemberDataSizeAt(ByteCounter byteCnt)
{ {
memcpy(pointer - byteCnt - BYTE_COUNTER_SIZE, &byteCnt, BYTE_COUNTER_SIZE); memcpy(pointer - byteCnt - BYTE_COUNTER_SIZE, &byteCnt, BYTE_COUNTER_SIZE);
} }
void skipInBufferMemberDataSize() void skipInBufferMemberDataSize()
{ {
if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE); if (size + BYTE_COUNTER_SIZE > reserved) resizeBuffer(size + BYTE_COUNTER_SIZE);
@ -161,7 +146,6 @@ struct Saver::Impl
size += BYTE_COUNTER_SIZE; size += BYTE_COUNTER_SIZE;
} }
ByteCounter writeMemberData(const void* data, ByteCounter byteCnt) ByteCounter writeMemberData(const void* data, ByteCounter byteCnt)
{ {
if (size + byteCnt > reserved) resizeBuffer(size + 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 (!writeHeader()) return false;
if (serialize(paint) == 0) return false; if (serialize(paint) == 0) return false;
if (!saveBufferToFile(path)) return false; if (!saveBufferToFile(path)) return false;
clearBuffer();
return true; return true;
} }

View file

@ -67,18 +67,6 @@ static bool _readTvgHeader(const char **ptr)
if (memcmp(*ptr, TVG_BIN_HEADER_VERSION, TVG_BIN_HEADER_VERSION_LENGTH)) return false; if (memcmp(*ptr, TVG_BIN_HEADER_VERSION, TVG_BIN_HEADER_VERSION_LENGTH)) return false;
*ptr += TVG_BIN_HEADER_VERSION_LENGTH; *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; return true;
} }