blob: 9d5ac5ffd06cb56f8e78785784ab210e4a9edc98 [file] [log] [blame]
#include "rive/core/binary_writer.hpp"
#include "rive/core/binary_stream.hpp"
#include "rive/core/reader.h"
#include <stdio.h>
using namespace rive;
BinaryWriter::BinaryWriter(BinaryStream* stream) : m_Stream(stream) {}
BinaryWriter::~BinaryWriter() { m_Stream->flush(); }
void BinaryWriter::write(float value)
{
auto bytes = reinterpret_cast<uint8_t*>(&value);
if (is_big_endian())
{
uint8_t backwards[4] = {bytes[3], bytes[2], bytes[1], bytes[0]};
m_Stream->write(backwards, 4);
}
else
{
m_Stream->write(bytes, 4);
}
}
void BinaryWriter::writeFloat(float value)
{
auto bytes = reinterpret_cast<uint8_t*>(&value);
if (is_big_endian())
{
uint8_t backwards[4] = {bytes[3], bytes[2], bytes[1], bytes[0]};
m_Stream->write(backwards, 4);
}
else
{
m_Stream->write(bytes, 4);
}
}
void BinaryWriter::write(double value)
{
auto bytes = reinterpret_cast<uint8_t*>(&value);
if (is_big_endian())
{
uint8_t backwards[8] = {bytes[7],
bytes[6],
bytes[5],
bytes[4],
bytes[3],
bytes[2],
bytes[1],
bytes[0]};
m_Stream->write(backwards, 8);
}
else
{
m_Stream->write(bytes, 8);
}
}
void BinaryWriter::writeVarUint(uint64_t value)
{
uint8_t buffer[16];
int index = 0;
do
{
uint8_t byte = value & 0x7f;
value >>= 7;
if (value != 0)
{
// more bytes follow
byte |= 0x80;
}
buffer[index++] = byte;
} while (value != 0);
m_Stream->write(buffer, index);
}
void BinaryWriter::writeVarUint(uint32_t value)
{
uint8_t buffer[16];
int index = 0;
do
{
uint8_t byte = value & 0x7f;
value >>= 7;
if (value != 0)
{
// more bytes follow
byte |= 0x80;
}
buffer[index++] = byte;
} while (value != 0);
m_Stream->write(buffer, index);
}
void BinaryWriter::write(const uint8_t* bytes, size_t length)
{
if (length == 0)
{
return;
}
m_Stream->write(bytes, length);
}
void BinaryWriter::writeDouble(double value)
{
auto bytes = reinterpret_cast<uint8_t*>(&value);
if (is_big_endian())
{
uint8_t backwards[8] = {bytes[7],
bytes[6],
bytes[5],
bytes[4],
bytes[3],
bytes[2],
bytes[1],
bytes[0]};
m_Stream->write(backwards, 8);
}
else
{
m_Stream->write(bytes, 8);
}
}
void BinaryWriter::write(uint8_t value)
{
m_Stream->write((const uint8_t*)&value, 1);
}
void BinaryWriter::write(uint16_t value)
{
m_Stream->write((const uint8_t*)&value, 2);
}
void BinaryWriter::write(uint32_t value)
{
m_Stream->write((const uint8_t*)&value, 4);
}
void BinaryWriter::write(std::string value)
{
auto length = value.size();
writeVarUint((uint64_t)length);
write((uint8_t*)value.c_str(), length);
}
void BinaryWriter::clear() { m_Stream->clear(); }