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.
*
* @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.

Binary file not shown.

View file

@ -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

View file

@ -43,28 +43,19 @@ Saver::~Saver()
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();
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;
}

View file

@ -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<char*>(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<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;
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;
}

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;
*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;
}