blob: 6f31b674f6c0804105c357f6e4e0b377c2cc34d0 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#ifndef _RIVE_FACTORY_UTILS_HPP_
#define _RIVE_FACTORY_UTILS_HPP_
#include "rive/factory.hpp"
namespace rive {
// Generic subclass of RenderBuffer that just stores the data on the cpu.
//
class DataRenderBuffer : public RenderBuffer {
const size_t m_elemSize;
std::vector<uint32_t> m_storage; // store 32bits for alignment
public:
DataRenderBuffer(const void* src, size_t count, size_t elemSize) :
RenderBuffer(count), m_elemSize(elemSize) {
const size_t bytes = count * elemSize;
m_storage.resize((bytes + 3) >> 2); // round up to next 32bit count
memcpy(m_storage.data(), src, bytes);
}
const float* f32s() const {
assert(m_elemSize == sizeof(float));
return reinterpret_cast<const float*>(m_storage.data());
}
const uint16_t* u16s() const {
assert(m_elemSize == sizeof(uint16_t));
return reinterpret_cast<const uint16_t*>(m_storage.data());
}
const Vec2D* vecs() const { return reinterpret_cast<const Vec2D*>(this->f32s()); }
size_t elemSize() const { return m_elemSize; }
static const DataRenderBuffer* Cast(const RenderBuffer* buffer) {
return static_cast<const DataRenderBuffer*>(buffer);
}
template <typename T> static rcp<RenderBuffer> Make(Span<T> span) {
return rcp<RenderBuffer>(new DataRenderBuffer(span.data(), span.size(), sizeof(T)));
}
};
} // namespace rive
#endif