blob: 83d5fc4a00e284c8d42a0b38558a1c3105531414 [file] [log] [blame]
#include "rive/tess/tess_renderer.hpp"
#include <cassert>
using namespace rive;
TessRenderer::TessRenderer() { m_Stack.emplace_back(RenderState()); }
void TessRenderer::projection(const Mat4& value) { m_Projection = value; }
void TessRenderer::save() { m_Stack.push_back(m_Stack.back()); }
void TessRenderer::restore() {
assert(m_Stack.size() > 1);
RenderState& state = m_Stack.back();
m_Stack.pop_back();
// We can only add clipping paths so if they're still the same, nothing has
// changed.
if (state.clipPaths.size() != m_Stack.back().clipPaths.size()) {
m_IsClippingDirty = true;
}
}
bool TessRenderer::needsToApplyClipping() {
if (!m_IsClippingDirty) {
return false;
}
m_IsClippingDirty = false;
RenderState& state = m_Stack.back();
auto currentClipLength = m_ClipPaths.size();
if (currentClipLength == state.clipPaths.size()) {
// Same length so now check if they're all the same.
bool allSame = true;
for (std::size_t i = 0; i < currentClipLength; i++) {
if (state.clipPaths[i].path() != m_ClipPaths[i].path()) {
allSame = false;
break;
}
}
if (allSame) {
return false;
}
}
m_ClipPaths = state.clipPaths;
return true;
}
void TessRenderer::transform(const Mat2D& transform) {
Mat2D& stackMat = m_Stack.back().transform;
stackMat = stackMat * transform;
}
void TessRenderer::clipPath(RenderPath* path) {}
void TessRenderer::drawPath(RenderPath* path, RenderPaint* paint) {}
void TessRenderer::drawImage(const RenderImage*, BlendMode, float opacity) {}
void TessRenderer::drawImageMesh(const RenderImage*,
rcp<RenderBuffer> vertices_f32,
rcp<RenderBuffer> uvCoords_f32,
rcp<RenderBuffer> indices_u16,
BlendMode,
float opacity) {}