blob: ab8a0c6cb3a727cf92ebcbf192516406c60e1fc9 [file] [log] [blame]
#ifndef _RIVE_VELLO_RENDERER_HPP_
#define _RIVE_VELLO_RENDERER_HPP_
#include "rive/factory.hpp"
#include "rive/math/mat2d.hpp"
#include "rive/math/path_types.hpp"
#include "rive/math/vec2d.hpp"
#include "rive/renderer.hpp"
#include "utils/factory_utils.hpp"
#include "viewer/viewer_content.hpp"
#include "vello_renderer.hpp"
using namespace rive;
typedef void* RawVelloPath;
typedef void* RawVelloGradient;
typedef void* RawVelloImage;
typedef void* RawVelloPaint;
typedef void* RawVelloRenderer;
extern "C"
{
typedef void* RawVelloPath;
typedef void* RawVelloGradient;
typedef void* RawVelloImage;
typedef void* RawVelloPaint;
typedef void* RawVelloRenderer;
const RawVelloPath vello_path_new();
void vello_path_release(const RawVelloPath path);
void vello_path_rewind(const RawVelloPath path);
void vello_path_extend(const RawVelloPath path, void* other, const float* transform);
void vello_path_set_fill_rule(const RawVelloPath path, FillRule fill_rule);
void vello_path_move_to(const RawVelloPath path, float x, float y);
void vello_path_line_to(const RawVelloPath path, float x, float y);
void vello_path_cubic_to(const RawVelloPath path,
float ox,
float oy,
float ix,
float iy,
float x,
float y);
void vello_path_close(const RawVelloPath path);
const RawVelloGradient vello_gradient_new_linear(float sx,
float sy,
float ex,
float ey,
const uint32_t* colors_data,
const float* stops_data,
size_t len);
const RawVelloGradient vello_gradient_new_radial(float cx,
float cy,
float radius,
const uint32_t* colors_data,
const float* stops_data,
size_t len);
void vello_gradient_release(const RawVelloGradient gradient);
const RawVelloImage vello_image_new(const uint8_t* data, size_t len);
void vello_image_release(const RawVelloImage image);
const RawVelloPaint vello_paint_new();
void vello_paint_release(const RawVelloPaint paint);
void vello_paint_set_style(const RawVelloPaint paint, RenderPaintStyle style);
void vello_paint_set_color(const RawVelloPaint paint, uint32_t color);
void vello_paint_set_thickness(const RawVelloPaint paint, float thickness);
void vello_paint_set_join(const RawVelloPaint paint, StrokeJoin join);
void vello_paint_set_cap(const RawVelloPaint paint, StrokeCap cap);
void vello_paint_set_blend_mode(const RawVelloPaint paint, BlendMode blend_mode);
void vello_paint_set_gradient(const RawVelloPaint paint, const RawVelloGradient gradient);
const RawVelloRenderer vello_renderer_new();
void vello_renderer_release(const RawVelloRenderer renderer);
void vello_renderer_save(const RawVelloRenderer renderer);
void vello_renderer_restore(const RawVelloRenderer renderer);
void vello_renderer_transform(const RawVelloRenderer renderer, const float* transform);
void vello_renderer_clip_path(const RawVelloRenderer renderer, const RawVelloPath path);
void vello_renderer_draw_path(const RawVelloRenderer renderer,
const RawVelloPath path,
const RawVelloPaint paint);
void vello_renderer_draw_image(const RawVelloRenderer renderer,
const RawVelloImage image,
BlendMode blend_mode,
float opacity);
void vello_renderer_draw_image_mesh(const RawVelloRenderer renderer,
const RawVelloImage image,
const Vec2D* vertices_data,
size_t vertices_len,
const Vec2D* uvs_data,
size_t uvs_len,
const uint16_t* indices_data,
size_t indices_len,
BlendMode blend_mode,
float opacity);
}
using namespace rive;
class VelloPath : public RenderPath
{
private:
RawVelloPath m_path;
public:
VelloPath() : m_path(vello_path_new()) {}
VelloPath(RawVelloPath& path) : m_path(std::move(path)) {}
~VelloPath() override;
const RawVelloPath& path() const { return m_path; }
void rewind() override;
void addRenderPath(RenderPath* path, const Mat2D& transform) override;
void fillRule(FillRule value) override;
void moveTo(float x, float y) override;
void lineTo(float x, float y) override;
void cubicTo(float ox, float oy, float ix, float iy, float x, float y) override;
virtual void close() override;
};
class VelloGradient : public RenderShader
{
private:
RawVelloGradient m_gradient;
public:
VelloGradient(RawVelloGradient gradient) : m_gradient(gradient) {}
~VelloGradient() override;
const RawVelloGradient& gradient() const { return m_gradient; }
};
class VelloImage : public RenderImage
{
private:
RawVelloImage m_image;
public:
VelloImage(RawVelloImage image) : m_image(image) {}
~VelloImage() override;
const RawVelloImage& image() const { return m_image; }
};
class VelloPaint : public RenderPaint
{
private:
RawVelloPaint m_paint;
public:
VelloPaint() : m_paint(vello_paint_new()) {}
~VelloPaint() override;
const RawVelloPaint& paint() const { return m_paint; }
void style(RenderPaintStyle style) override;
void color(unsigned int value) override;
void thickness(float value) override;
void join(StrokeJoin value) override;
void cap(StrokeCap value) override;
void blendMode(BlendMode value) override;
void shader(rcp<RenderShader>) override;
void invalidateStroke() override {}
};
class VelloRenderer : public Renderer
{
protected:
RawVelloRenderer m_renderer;
public:
VelloRenderer() : m_renderer(vello_renderer_new()) {}
VelloRenderer(RawVelloRenderer renderer) : m_renderer(std::move(renderer)) {}
~VelloRenderer() override {}
void save() override;
void restore() override;
void transform(const Mat2D& transform) override;
void clipPath(RenderPath* path) override;
void drawPath(RenderPath* path, RenderPaint* paint) override;
void drawImage(const RenderImage*, BlendMode, float opacity) override;
void drawImageMesh(const RenderImage*,
rcp<RenderBuffer> vertices_f32,
rcp<RenderBuffer> uvCoords_f32,
rcp<RenderBuffer> indices_u16,
uint32_t vertexCount,
uint32_t indexCount,
BlendMode,
float opacity) override;
};
class VelloFactory : public Factory
{
public:
rcp<RenderBuffer> makeRenderBuffer(RenderBufferType, RenderBufferFlags, size_t) override;
rcp<RenderShader> makeLinearGradient(float sx,
float sy,
float ex,
float ey,
const ColorInt colors[], // [count]
const float stops[], // [count]
size_t count) override;
rcp<RenderShader> makeRadialGradient(float cx,
float cy,
float radius,
const ColorInt colors[], // [count]
const float stops[], // [count]
size_t count) override;
std::unique_ptr<RenderPath> makeRenderPath(RawPath&, FillRule) override;
std::unique_ptr<RenderPath> makeEmptyRenderPath() override;
std::unique_ptr<RenderPaint> makeRenderPaint() override;
std::unique_ptr<RenderImage> decodeImage(Span<const uint8_t>) override;
};
#endif