blob: 323e5862ade2c4f0cd959baaab74d938249d3668 [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::clear() { m_Stream->clear(); }