Move computeAlignment off of Renderer
diff --git a/include/rive/renderer.hpp b/include/rive/renderer.hpp index 9bcb3ee..affe81f 100644 --- a/include/rive/renderer.hpp +++ b/include/rive/renderer.hpp
@@ -19,6 +19,9 @@ namespace rive { class Vec2D; + // Helper that computes a matrix to "align" content (source) to fit inside frame (destination). + Mat2D computeAlignment(Fit, Alignment, const AABB& frame, const AABB& content); + // A render buffer holds an immutable array of values class RenderBuffer : public RefCnt { const size_t m_Count; @@ -139,13 +142,9 @@ void scale(float sx, float sy); void rotate(float radians); - void computeAlignment(Mat2D& result, - Fit fit, - const Alignment& alignment, - const AABB& frame, - const AABB& content); - - void align(Fit fit, const Alignment& alignment, const AABB& frame, const AABB& content); + void align(Fit fit, Alignment alignment, const AABB& frame, const AABB& content) { + transform(computeAlignment(fit, alignment, frame, content)); + } }; // Returns a full-formed RenderPath -- can be treated as immutable
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp index e297964..eb2e6e2 100644 --- a/skia/viewer/src/main.cpp +++ b/skia/viewer/src/main.cpp
@@ -280,12 +280,10 @@ rive::SkiaRenderer renderer(canvas); renderer.save(); - rive::Mat2D viewTransform; - renderer.computeAlignment(viewTransform, - rive::Fit::contain, - rive::Alignment::center, - rive::AABB(0, 0, width, height), - artboardInstance->bounds()); + auto viewTransform = rive::computeAlignment(rive::Fit::contain, + rive::Alignment::center, + rive::AABB(0, 0, width, height), + artboardInstance->bounds()); renderer.transform(viewTransform); // Store the inverse view so we can later go from screen to world. rive::Mat2D::invert(gInverseViewTransform, viewTransform);
diff --git a/src/renderer.cpp b/src/renderer.cpp index fc961a2..e41c250 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp
@@ -3,18 +3,7 @@ using namespace rive; -void Renderer::translate(float tx, float ty) { this->transform(Mat2D(1, 0, 0, 1, tx, ty)); } - -void Renderer::scale(float sx, float sy) { this->transform(Mat2D(sx, 0, 0, sy, 0, 0)); } - -void Renderer::rotate(float radians) { - const float s = std::sin(radians); - const float c = std::cos(radians); - this->transform(Mat2D(c, s, -s, c, 0, 0)); -} - -void Renderer::computeAlignment( - Mat2D& result, Fit fit, const Alignment& alignment, const AABB& frame, const AABB& content) { +Mat2D rive::computeAlignment(Fit fit, 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); @@ -66,11 +55,15 @@ 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); - result = translation * Mat2D::fromScale(scaleX, scaleY) * Mat2D::fromTranslate(x, y); + return translation * Mat2D::fromScale(scaleX, scaleY) * Mat2D::fromTranslate(x, y); } -void Renderer::align(Fit fit, const Alignment& alignment, const AABB& frame, const AABB& content) { - Mat2D result; - computeAlignment(result, fit, alignment, frame, content); - transform(result); +void Renderer::translate(float tx, float ty) { this->transform(Mat2D(1, 0, 0, 1, tx, ty)); } + +void Renderer::scale(float sx, float sy) { this->transform(Mat2D(sx, 0, 0, sy, 0, 0)); } + +void Renderer::rotate(float radians) { + const float s = std::sin(radians); + const float c = std::cos(radians); + this->transform(Mat2D(c, s, -s, c, 0, 0)); }