mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 05:33:36 +00:00
tvg format: code refactoring #2
code clean up, removed reserved data sector
This commit is contained in:
parent
60e3129ce2
commit
8059a23f7c
7 changed files with 36 additions and 77 deletions
|
@ -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.
|
@ -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
|
||||||
|
|
|
@ -182,4 +182,4 @@ shared_ptr<Loader> LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue