| /* | |
| * 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 |