blob: 0e064469053931dc90b4db5755ba6f49ae813d97 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#ifndef _RIVE_RAW_PATH_HPP_
#define _RIVE_RAW_PATH_HPP_
#include "rive/span.hpp"
#include "rive/math/aabb.hpp"
#include "rive/math/mat2d.hpp"
#include "rive/math/path_types.hpp"
#include "rive/math/vec2d.hpp"
#include <cmath>
#include <stdio.h>
#include <cstdint>
#include <vector>
namespace rive {
class RawPath {
public:
std::vector<Vec2D> m_Points;
std::vector<PathVerb> m_Verbs;
RawPath() {}
~RawPath() {}
bool empty() const { return m_Points.empty(); }
AABB bounds() const;
void move(Vec2D);
void line(Vec2D);
void quad(Vec2D, Vec2D);
void cubic(Vec2D, Vec2D, Vec2D);
void close();
RawPath transform(const Mat2D&) const;
void transformInPlace(const Mat2D&);
Span<const Vec2D> points() const { return toSpan(m_Points); }
Span<Vec2D> points() { return toSpan(m_Points); }
Span<const PathVerb> verbs() const { return toSpan(m_Verbs); }
Span<PathVerb> verbs() { return toSpan(m_Verbs); }
// Syntactic sugar for x,y -vs- vec2d
void moveTo(float x, float y) { move({x, y}); }
void lineTo(float x, float y) { line({x, y}); }
void quadTo(float x, float y, float x1, float y1) { quad({x, y}, {x1, y1}); }
void cubicTo(float x, float y, float x1, float y1, float x2, float y2) {
cubic({x, y}, {x1, y1}, {x2, y2});
}
// Helpers for adding new contours
void addRect(const AABB&, PathDirection = PathDirection::cw);
void addOval(const AABB&, PathDirection = PathDirection::cw);
void addPoly(Span<const Vec2D>, bool isClosed);
};
} // namespace rive
#endif