Skip to content

Commit

Permalink
add artboards shapes to updates when RenderOpacity has dirt
Browse files Browse the repository at this point in the history
Fixes nested artboards not applying inherited opacity to their backgrounds
Issue #5887

Diffs=
0dcbdade4 add artboards shapes to updates when RenderOpacity has dirt (#5971)

Co-authored-by: hernan <hernantorrisi@gmail.com>
  • Loading branch information
luigi-rosso and bodymovin committed Sep 12, 2023
1 parent 64515c6 commit 6b42846
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .rive_head
Original file line number Diff line number Diff line change
@@ -1 +1 @@
85b2b6ed1965d66f5f268993e54f5f89f30a2e29
0dcbdade49885fcae4de304972ae37f6283f19d1
4 changes: 4 additions & 0 deletions include/rive/shapes/shape_paint_container.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ class ShapePaintContainer
std::unique_ptr<CommandPath> makeCommandPath(PathSpace space);

void propagateOpacity(float opacity);

#ifdef TESTING
const std::vector<ShapePaint*>& shapePaints() const { return m_ShapePaints; }
#endif
};
} // namespace rive

Expand Down
4 changes: 4 additions & 0 deletions src/artboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,10 @@ void Artboard::update(ComponentDirt value)
m_ClipPath = factory()->makeRenderPath(clip);
m_BackgroundPath = factory()->makeRenderPath(bg);
}
if (hasDirt(value, ComponentDirt::RenderOpacity))
{
propagateOpacity(childOpacity());
}
}

bool Artboard::updateComponents()
Expand Down
Binary file added test/assets/nested_artboard_opacity.riv
Binary file not shown.
26 changes: 26 additions & 0 deletions test/nested_artboard_opacity_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include <rive/file.hpp>
#include <rive/node.hpp>
#include <rive/nested_artboard.hpp>
#include <rive/shapes/paint/shape_paint.hpp>
#include "rive_file_reader.hpp"

TEST_CASE("Nested artboard background renders with opacity", "[file]")
{
auto file = ReadRiveFile("../../test/assets/nested_artboard_opacity.riv");

auto mainArtboard = file->artboard()->instance();
REQUIRE(mainArtboard->find("Parent Artboard") != nullptr);
auto artboard = mainArtboard->find<rive::Artboard>("Parent Artboard");
artboard->updateComponents();
REQUIRE(artboard->is<rive::Artboard>());
REQUIRE(artboard->find("Nested artboard container") != nullptr);
auto nestedArtboardContainer = artboard->find<rive::NestedArtboard>("Nested artboard container");
REQUIRE(nestedArtboardContainer->artboard() != nullptr);
auto nestedArtboard = nestedArtboardContainer->artboard();
nestedArtboard->updateComponents();
auto paints = nestedArtboard->shapePaints();
REQUIRE(paints.size() == 1);
auto paint = paints[0];
REQUIRE(paint->is<rive::ShapePaint>());
REQUIRE(paint->renderOpacity() == 0.3275f);
}

0 comments on commit 6b42846

Please sign in to comment.