blob: d05dcb3e77bbdf7ebab46d806afb3bd080f5a3bd [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#include "pls_paint.hpp"
namespace rive::pls
{
rcp<PLSGradient> PLSGradient::MakeLinear(PLSGradDataArray<ColorInt>&& colors, // [count]
PLSGradDataArray<float>&& stops, // [count]
size_t count,
Vec2D start,
Vec2D end)
{
rcp<PLSGradient> gradient(
new PLSGradient(PaintType::linearGradient, std::move(colors), std::move(stops), count));
// T = coeffs[0] * x + coeffs[1] * y + coeffs[2]
Vec2D v = end - start;
v *= 1.f / Vec2D::dot(v, v); // dot(v, end - start) == 1
gradient->m_coeffs = {v.x, v.y, -Vec2D::dot(v, start)};
return gradient;
}
rcp<PLSGradient> PLSGradient::MakeRadial(PLSGradDataArray<ColorInt>&& colors, // [count]
PLSGradDataArray<float>&& stops, // [count]
size_t count,
Vec2D center,
float radius)
{
rcp<PLSGradient> gradient(
new PLSGradient(PaintType::radialGradient, std::move(colors), std::move(stops), count));
// T = length(x - coeffs[0], y - coeffs[1]) / coeffs[2]
gradient->m_coeffs = {center.x, center.y, radius};
return gradient;
}
static PLSBlendMode blend_mode_rive_to_pls(rive::BlendMode riveMode)
{
switch (riveMode)
{
case rive::BlendMode::srcOver:
return PLSBlendMode::srcOver;
case rive::BlendMode::screen:
return PLSBlendMode::screen;
case rive::BlendMode::overlay:
return PLSBlendMode::overlay;
case rive::BlendMode::darken:
return PLSBlendMode::darken;
case rive::BlendMode::lighten:
return PLSBlendMode::lighten;
case rive::BlendMode::colorDodge:
return PLSBlendMode::colorDodge;
case rive::BlendMode::colorBurn:
return PLSBlendMode::colorBurn;
case rive::BlendMode::hardLight:
return PLSBlendMode::hardLight;
case rive::BlendMode::softLight:
return PLSBlendMode::softLight;
case rive::BlendMode::difference:
return PLSBlendMode::difference;
case rive::BlendMode::exclusion:
return PLSBlendMode::exclusion;
case rive::BlendMode::multiply:
return PLSBlendMode::multiply;
case rive::BlendMode::hue:
return PLSBlendMode::hue;
case rive::BlendMode::saturation:
return PLSBlendMode::saturation;
case rive::BlendMode::color:
return PLSBlendMode::color;
case rive::BlendMode::luminosity:
return PLSBlendMode::luminosity;
}
RIVE_UNREACHABLE();
}
void PLSPaint::blendMode(rive::BlendMode riveMode)
{
m_blendMode = blend_mode_rive_to_pls(riveMode);
}
void PLSPaint::shader(rcp<RenderShader> shader)
{
m_gradient = static_rcp_cast<PLSGradient>(std::move(shader));
}
} // namespace rive::pls