205 lines
6.7 KiB
Python
205 lines
6.7 KiB
Python
import unittest
|
|
|
|
try:
|
|
from .test_image_composite_helpers import (
|
|
HAS_IMAGE_COMPOSITE_RUNTIME_DEPS,
|
|
IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE,
|
|
load_plugin_package,
|
|
make_image,
|
|
)
|
|
except ImportError:
|
|
from test_image_composite_helpers import (
|
|
HAS_IMAGE_COMPOSITE_RUNTIME_DEPS,
|
|
IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE,
|
|
load_plugin_package,
|
|
make_image,
|
|
)
|
|
|
|
|
|
@unittest.skipUnless(HAS_IMAGE_COMPOSITE_RUNTIME_DEPS, IMAGE_COMPOSITE_RUNTIME_DEPS_MESSAGE)
|
|
class TestImageCompositeNode(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
plugin = load_plugin_package()
|
|
cls.node = plugin.NODE_CLASS_MAPPINGS["LLSSimpleImageComposite"]()
|
|
|
|
def test_top_left_offset_places_overlay_at_requested_position(self):
|
|
background = make_image(width=6, height=6, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=2, height=2, color=(1.0, 1.0, 1.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=3,
|
|
y_offset=1,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertEqual(tuple(output_image.shape), (1, 6, 6, 3))
|
|
self.assertTrue((output_image[0, 1:3, 3:5] > 0.99).all().item())
|
|
self.assertEqual(float(output_image[0, 0, 0, 0].item()), 0.0)
|
|
|
|
def test_center_anchor_places_overlay_by_its_center(self):
|
|
background = make_image(width=6, height=6, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=2, height=2, color=(0.0, 1.0, 0.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=3,
|
|
y_offset=2,
|
|
anchor_mode="center",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertTrue((output_image[0, 1:3, 2:4, 1] > 0.99).all().item())
|
|
|
|
def test_partial_overflow_is_clipped_to_background_bounds(self):
|
|
background = make_image(width=5, height=5, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=3, height=3, color=(1.0, 0.0, 0.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=4,
|
|
y_offset=4,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertGreater(float(output_image[0, 4, 4, 0].item()), 0.99)
|
|
self.assertEqual(float(output_image[0, 0, 0, 0].item()), 0.0)
|
|
|
|
def test_overlay_fully_outside_returns_background(self):
|
|
background = make_image(width=5, height=5, color=(0.1, 0.1, 0.1))
|
|
overlay = make_image(width=2, height=2, color=(1.0, 1.0, 1.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=8,
|
|
y_offset=8,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertTrue((output_image == background).all().item())
|
|
|
|
def test_opacity_zero_returns_background(self):
|
|
background = make_image(width=4, height=4, color=(0.2, 0.2, 0.2))
|
|
overlay = make_image(width=2, height=2, color=(1.0, 0.0, 0.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=1,
|
|
y_offset=1,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=0.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertTrue((output_image == background).all().item())
|
|
|
|
def test_rgba_overlay_uses_alpha_and_opacity(self):
|
|
background = make_image(width=4, height=4, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=2, height=2, color=(1.0, 0.0, 0.0), alpha=0.5)
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=1,
|
|
y_offset=1,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=0.5,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertAlmostEqual(float(output_image[0, 1, 1, 0].item()), 0.25, places=2)
|
|
|
|
def test_scale_expands_overlay_footprint(self):
|
|
background = make_image(width=5, height=5, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=1, height=1, color=(1.0, 1.0, 1.0))
|
|
|
|
(output_image,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=1,
|
|
y_offset=1,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=2.0,
|
|
rotation=0.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertTrue((output_image[0, 1:3, 1:3] > 0.99).all().item())
|
|
|
|
def test_rotation_origin_mode_changes_rotated_result(self):
|
|
background = make_image(width=8, height=8, color=(0.0, 0.0, 0.0))
|
|
overlay = make_image(width=3, height=1, color=(0.0, 0.0, 1.0))
|
|
|
|
(center_rotated,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=3,
|
|
y_offset=3,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="center",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=90.0,
|
|
keep_aspect=True,
|
|
)
|
|
(corner_rotated,) = self.node.composite(
|
|
background_image=background,
|
|
overlay_image=overlay,
|
|
x_offset=3,
|
|
y_offset=3,
|
|
anchor_mode="top_left",
|
|
rotation_origin_mode="top_left",
|
|
opacity=1.0,
|
|
blend_mode="normal",
|
|
scale=1.0,
|
|
rotation=90.0,
|
|
keep_aspect=True,
|
|
)
|
|
|
|
self.assertFalse((center_rotated == corner_rotated).all().item())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|