blob: cc4584b15a0d7a05abce2cf877de3e12f6a54ceb [file] [log] [blame]
#ifndef _RIVE_RENDERER_HPP_
#define _RIVE_RENDERER_HPP_
#include "rive/command_path.hpp"
#include "rive/layout.hpp"
#include "rive/refcnt.hpp"
#include "rive/math/aabb.hpp"
#include "rive/math/mat2d.hpp"
#include "rive/shapes/paint/blend_mode.hpp"
#include "rive/shapes/paint/stroke_cap.hpp"
#include "rive/shapes/paint/stroke_join.hpp"
#include <cmath>
#include <stdio.h>
#include <cstdint>
namespace rive
{
class Vec2D;
enum class RenderPaintStyle
{
stroke,
fill
};
class RenderPaint
{
public:
virtual void style(RenderPaintStyle style) = 0;
virtual void color(unsigned int value) = 0;
virtual void thickness(float value) = 0;
virtual void join(StrokeJoin value) = 0;
virtual void cap(StrokeCap value) = 0;
virtual void blendMode(BlendMode value) = 0;
virtual void linearGradient(float sx, float sy, float ex, float ey) = 0;
virtual void radialGradient(float sx, float sy, float ex, float ey) = 0;
virtual void addStop(unsigned int color, float stop) = 0;
virtual void completeGradient() = 0;
virtual ~RenderPaint() {}
};
class RenderImage
{
protected:
int m_Width = 0;
int m_Height = 0;
public:
virtual ~RenderImage() {}
virtual bool decode(const uint8_t* bytes, std::size_t size) = 0;
int width() const { return m_Width; }
int height() const { return m_Height; }
};
class RenderPath : public RefCnt {};
enum class FillRule {
nonZero,
evenOdd
};
enum class PathVerb {
move,
line,
quad,
cubic,
close,
};
/* Returns an immutable RenderPath.
*
* ptCount is the logical number of points. Since "pts" is passed as
* an array of floats, there will be 2*ptCount number of floats in the array.
*/
extern rcp<RenderPath> makeRenderPath(const float pts[], int ptCount,
const uint8_t verbs[], int verbCount,
FillRule);
class Renderer
{
public:
virtual ~Renderer() {}
virtual void save() = 0;
virtual void restore() = 0;
virtual void transform(const Mat2D& transform) = 0;
virtual void drawPath(rcp<RenderPath> path, RenderPaint* paint) = 0;
virtual void clipPath(rcp<RenderPath> path) = 0;
virtual void
drawImage(RenderImage* image, BlendMode value, float opacity) = 0;
void computeAlignment(Mat2D& result,
Fit fit,
const Alignment& alignment,
const AABB& frame,
const AABB& content)
{
float contentWidth = content[2] - content[0];
float contentHeight = content[3] - content[1];
float x = -content[0] - contentWidth / 2.0 -
(alignment.x() * contentWidth / 2.0);
float y = -content[1] - contentHeight / 2.0 -
(alignment.y() * contentHeight / 2.0);
float scaleX = 1.0, scaleY = 1.0;
switch (fit)
{
case Fit::fill:
{
scaleX = frame.width() / contentWidth;
scaleY = frame.height() / contentHeight;
break;
}
case Fit::contain:
{
float minScale = std::fmin(frame.width() / contentWidth,
frame.height() / contentHeight);
scaleX = scaleY = minScale;
break;
}
case Fit::cover:
{
float maxScale = std::fmax(frame.width() / contentWidth,
frame.height() / contentHeight);
scaleX = scaleY = maxScale;
break;
}
case Fit::fitHeight:
{
float minScale = frame.height() / contentHeight;
scaleX = scaleY = minScale;
break;
}
case Fit::fitWidth:
{
float minScale = frame.width() / contentWidth;
scaleX = scaleY = minScale;
break;
}
case Fit::none:
{
scaleX = scaleY = 1.0;
break;
}
case Fit::scaleDown:
{
float minScale = std::fmin(frame.width() / contentWidth,
frame.height() / contentHeight);
scaleX = scaleY = minScale < 1.0 ? minScale : 1.0;
break;
}
}
Mat2D translation;
translation[4] = frame[0] + frame.width() / 2.0 +
(alignment.x() * frame.width() / 2.0);
translation[5] = frame[1] + frame.height() / 2.0 +
(alignment.y() * frame.height() / 2.0);
Mat2D scale;
scale[0] = scaleX;
scale[3] = scaleY;
Mat2D translateBack;
translateBack[4] = x;
translateBack[5] = y;
Mat2D::multiply(result, translation, scale);
Mat2D::multiply(result, result, translateBack);
}
void align(Fit fit,
const Alignment& alignment,
const AABB& frame,
const AABB& content)
{
Mat2D result;
computeAlignment(result, fit, alignment, frame, content);
transform(result);
}
};
extern RenderPaint* makeRenderPaint();
extern RenderImage* makeRenderImage();
} // namespace rive
#endif