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