mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-07 21:23:32 +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.
|
||||
*
|
||||
* @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.
|
@ -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
|
||||
|
|
|
@ -182,4 +182,4 @@ shared_ptr<Loader> LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t
|
|||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue