blob: 8c1a34bc3692d9f5b08b6d7ce096710b200873ed [file] [log] [blame]
#ifndef _RIVE_SAMPLE_ATLAS_PACKER_HPP_
#define _RIVE_SAMPLE_ATLAS_PACKER_HPP_
#include "rive/span.hpp"
#include "rive/file_asset_resolver.hpp"
#include "rive/math/mat2d.hpp"
#include "rive/renderer.hpp"
#include "rive/tess/sokol/sokol_tess_renderer.hpp"
#include <vector>
#include <unordered_map>
namespace rive
{
class ImageAsset;
class SokolRenderImageResource;
/// A single atlas image generated by the packer.
class SampleAtlas
{
private:
uint32_t m_width;
uint32_t m_height;
std::vector<uint8_t> m_pixels;
uint32_t m_x = 0;
uint32_t m_y = 0;
uint32_t m_nextY = 0;
public:
SampleAtlas(const uint8_t* pixels, uint32_t width, uint32_t height);
SampleAtlas(uint32_t width, uint32_t height);
bool pack(const uint8_t* pixels, uint32_t width, uint32_t height, Mat2D& packTransform);
uint32_t width() const { return m_width; }
uint32_t height() const { return m_height; }
Span<const uint8_t> pixels() const { return m_pixels; }
};
struct SampleAtlasLocation
{
std::size_t atlasIndex;
Mat2D transform;
// Original width & height of the image, so we can make vertex buffers for the "default renderer
// drawImage"
uint32_t width;
uint32_t height;
};
/// An Atlas packer which will create multiple atlas images (SampleAtles) as
/// necessary.
class SampleAtlasPacker
{
private:
uint32_t m_maxWidth;
uint32_t m_maxHeight;
std::vector<SampleAtlas*> m_atlases;
std::unordered_map<uint32_t, SampleAtlasLocation> m_lookup;
public:
SampleAtlasPacker(uint32_t maxWidth, uint32_t maxHeight);
~SampleAtlasPacker();
// Pack the images found in the file represented by rivBytes.
void pack(Span<const uint8_t> rivBytes);
bool find(const ImageAsset& asset, SampleAtlasLocation* location);
SampleAtlas* atlas(std::size_t index);
};
class SampleAtlasResolver : public FileAssetResolver
{
private:
SampleAtlasPacker* m_packer;
std::unordered_map<uint32_t, rive::rcp<rive::SokolRenderImageResource>> m_sharedImageResources;
public:
SampleAtlasResolver(SampleAtlasPacker* packer);
void loadContents(FileAsset& asset) override;
};
} // namespace rive
#endif