diff --git a/manim/mobject/geometry.py b/manim/mobject/geometry.py index f0f7d07690..db31f8c689 100644 --- a/manim/mobject/geometry.py +++ b/manim/mobject/geometry.py @@ -2558,8 +2558,8 @@ def construct(self): """ def __init__(self, corner_radius=0.5, **kwargs): - self.corner_radius = corner_radius super().__init__(**kwargs) + self.corner_radius = corner_radius self.round_corners(self.corner_radius) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 7ea9dbec39..226400d397 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -91,7 +91,6 @@ def __init_subclass__(cls, **kwargs): cls._original__init__ = cls.__init__ def __init__(self, color=WHITE, name=None, dim=3, target=None, z_index=0): - self.color = Color(color) if color else None self.name = self.__class__.__name__ if name is None else name self.dim = dim self.target = target @@ -100,6 +99,8 @@ def __init__(self, color=WHITE, name=None, dim=3, target=None, z_index=0): self.submobjects = [] self.updaters = [] self.updating_suspended = False + self.color = Color(color) if color else None + self.reset_points() self.generate_points() self.init_colors() diff --git a/manim/mobject/opengl_mobject.py b/manim/mobject/opengl_mobject.py index 51fab13e82..3104e0b684 100644 --- a/manim/mobject/opengl_mobject.py +++ b/manim/mobject/opengl_mobject.py @@ -96,7 +96,6 @@ def __init__( self.data = getattr(self, "data", {}) self.uniforms = getattr(self, "uniforms", {}) - self.color = Color(color) if color else None self.opacity = opacity self.dim = dim # TODO, get rid of this # Lighting parameters @@ -129,6 +128,7 @@ def __init__( self.init_updaters() # self.init_event_listners() self.init_points() + self.color = Color(color) if color else None self.init_colors() self.shader_indices = None @@ -646,7 +646,7 @@ def assemble_family(self): return self def get_family(self, recurse=True): - if recurse: + if recurse and hasattr(self, "family"): return self.family else: return [self] @@ -1874,13 +1874,18 @@ def set_rgba_array(self, color=None, opacity=None, name="rgbas", recurse=True): # Color only if color is not None and opacity is None: for mob in self.get_family(recurse): - mob.data[name] = resize_array(mob.data[name], len(rgbs)) + mob.data[name] = resize_array( + mob.data[name] if name in mob.data else np.empty((1, 3)), len(rgbs) + ) mob.data[name][:, :3] = rgbs # Opacity only if color is None and opacity is not None: for mob in self.get_family(recurse): - mob.data[name] = resize_array(mob.data[name], len(opacities)) + mob.data[name] = resize_array( + mob.data[name] if name in mob.data else np.empty((1, 3)), + len(opacities), + ) mob.data[name][:, 3] = opacities # Color and opacity @@ -2619,7 +2624,7 @@ def get_shader_vert_indices(self): @property def submobjects(self): - return self._submobjects + return self._submobjects if hasattr(self, "_submobjects") else [] @submobjects.setter def submobjects(self, submobject_list): diff --git a/manim/mobject/shape_matchers.py b/manim/mobject/shape_matchers.py index c17f2b9783..4e8be84bfb 100644 --- a/manim/mobject/shape_matchers.py +++ b/manim/mobject/shape_matchers.py @@ -44,15 +44,14 @@ def construct(self): def __init__( self, mobject, color=YELLOW, buff=SMALL_BUFF, corner_radius=0.0, **kwargs ): - self.color = color - self.buff = buff super().__init__( color=color, - width=mobject.width + 2 * self.buff, - height=mobject.height + 2 * self.buff, + width=mobject.width + 2 * buff, + height=mobject.height + 2 * buff, corner_radius=corner_radius, **kwargs ) + self.buff = buff self.move_to(mobject) diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 3781cff55c..430eef120f 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -9,11 +9,11 @@ import re import string import warnings -from typing import Dict, List from xml.dom.minidom import Element as MinidomElement from xml.dom.minidom import parse as minidom_parse import numpy as np +from colour import Color from ... import config, logger from ...constants import * @@ -76,6 +76,10 @@ def __init__( should_subdivide_sharp_curves=False, should_remove_null_curves=False, color=None, + *, + fill_color=None, + stroke_color=None, + stroke_opacity=1.0, **kwargs, ): self.def_map = {} @@ -91,8 +95,21 @@ def __init__( if config.renderer == "opengl" else {} ) + self._initial_svg_style = self.generate_style( + Color(color) if color else None, + Color(fill_color) if fill_color else None, + Color(stroke_color) if stroke_color else None, + fill_opacity, + stroke_opacity, + ) super().__init__( - color=color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs + color=color, + fill_opacity=fill_opacity, + stroke_width=stroke_width, + fill_color=fill_color, + stroke_opacity=stroke_opacity, + stroke_color=stroke_color, + **kwargs, ) self._move_into_position(width, height) @@ -136,7 +153,7 @@ def generate_points(self): for node in doc.childNodes: if not isinstance(node, MinidomElement) or node.tagName != "svg": continue - mobjects = self._get_mobjects_from(node, self.generate_style()) + mobjects = self._get_mobjects_from(node, self._initial_svg_style) if self.unpack_groups: self.add(*mobjects) else: @@ -230,17 +247,25 @@ def _get_mobjects_from( return result - def generate_style(self): + def generate_style( + self, + color: Color | None, + fill_color: Color | None, + stroke_color: Color | None, + fill_opacity: float, + stroke_opacity: float, + ): style = { - "fill-opacity": self.fill_opacity, - "stroke-opacity": self.stroke_opacity, + "fill-opacity": fill_opacity, + "stroke-opacity": stroke_opacity, } - if self.color: - style["fill"] = style["stroke"] = self.color.get_hex_l() - if self.fill_color: - style["fill"] = self.fill_color - if self.stroke_color: - style["stroke"] = self.stroke_color + if color: + style["fill"] = style["stroke"] = color.get_hex_l() + if fill_color: + style["fill"] = fill_color.hex_l + if stroke_color: + style["stroke"] = stroke_color.hex_l + return style def _path_string_to_mobject(self, path_string: str, style: dict): diff --git a/manim/mobject/svg/text_mobject.py b/manim/mobject/svg/text_mobject.py index 9b0767e1d9..ea4e87ad3f 100644 --- a/manim/mobject/svg/text_mobject.py +++ b/manim/mobject/svg/text_mobject.py @@ -427,7 +427,6 @@ def __init__( disable_ligatures: bool = False, **kwargs, ): - self.color = color self.line_spacing = line_spacing self.font = font self._font_size = float(font_size) @@ -471,7 +470,7 @@ def __init__( ) else: self.line_spacing = self._font_size + self._font_size * self.line_spacing - file_name = self._text2svg() + file_name = self._text2svg(color) PangoUtils.remove_last_M(file_name) super().__init__( file_name, @@ -594,10 +593,10 @@ def _set_color_by_t2g(self, t2g=None): for start, end in self._find_indexes(word, self.text): self.chars[start:end].set_color_by_gradient(*gradient) - def _text2hash(self): + def _text2hash(self, color: Color): """Generates ``sha256`` hash for file name.""" settings = ( - "PANGO" + self.font + self.slant + self.weight + self.color + "PANGO" + self.font + self.slant + self.weight + color ) # to differentiate Text and CairoText settings += str(self.t2f) + str(self.t2s) + str(self.t2w) + str(self.t2c) settings += str(self.line_spacing) + str(self._font_size) @@ -671,7 +670,7 @@ def _get_settings_from_gradient( settings.append(TextSetting(i, i + 1, **args)) return settings - def _text2settings(self): + def _text2settings(self, color: Color): """Converts the texts and styles to a setting for parsing.""" t2xs = [ (self.t2f, "font"), @@ -679,7 +678,9 @@ def _text2settings(self): (self.t2w, "weight"), (self.t2c, "color"), ] - setting_args = {arg: getattr(self, arg) for _, arg in t2xs} + setting_args = { + arg: getattr(self, arg) if arg != "color" else color for _, arg in t2xs + } settings = self._get_settings_from_t2xs(t2xs) settings.extend(self._get_settings_from_gradient(setting_args)) @@ -733,7 +734,7 @@ def _text2settings(self): setting.line_num = 0 return settings - def _text2svg(self): + def _text2svg(self, color: Color): """Convert the text to SVG using Pango.""" size = self._font_size line_spacing = self.line_spacing @@ -743,13 +744,13 @@ def _text2svg(self): dir_name = config.get_dir("text_dir") if not os.path.exists(dir_name): os.makedirs(dir_name) - hash_name = self._text2hash() + hash_name = self._text2hash(color) file_name = os.path.join(dir_name, hash_name) + ".svg" if os.path.exists(file_name): svg_file = file_name else: - settings = self._text2settings() + settings = self._text2settings(color) width = config["pixel_width"] height = config["pixel_height"] @@ -1100,7 +1101,6 @@ def __init__( **kwargs, ): self.text = text - self.color = color self.line_spacing = line_spacing self.font = font self._font_size = float(font_size) @@ -1133,7 +1133,7 @@ def __init__( else: self.line_spacing = self._font_size + self._font_size * self.line_spacing - file_name = self._text2svg() + file_name = self._text2svg(Color(color) if color else None) PangoUtils.remove_last_M(file_name) super().__init__( file_name, @@ -1212,10 +1212,10 @@ def font_size(self, font_val): else: self.scale(font_val / self.font_size) - def _text2hash(self): + def _text2hash(self, color: Color): """Generates ``sha256`` hash for file name.""" settings = ( - "MARKUPPANGO" + self.font + self.slant + self.weight + self.color + "MARKUPPANGO" + self.font + self.slant + self.weight + color.hex_l ) # to differentiate from classical Pango Text settings += str(self.line_spacing) + str(self._font_size) settings += str(self.disable_ligatures) @@ -1225,7 +1225,7 @@ def _text2hash(self): hasher.update(id_str.encode()) return hasher.hexdigest()[:16] - def _text2svg(self): + def _text2svg(self, color: Color | None): """Convert the text to SVG using Pango.""" size = self._font_size line_spacing = self.line_spacing @@ -1235,14 +1235,19 @@ def _text2svg(self): dir_name = config.get_dir("text_dir") if not os.path.exists(dir_name): os.makedirs(dir_name) - hash_name = self._text2hash() + hash_name = self._text2hash(color) file_name = os.path.join(dir_name, hash_name) + ".svg" if os.path.exists(file_name): svg_file = file_name else: + final_text = ( + f'{self.text}' + if color is not None + else self.text + ) logger.debug(f"Setting Text {self.text}") svg_file = MarkupUtils.text2svg( - f'{self.text}', + final_text, self.font, self.slant, self.weight, diff --git a/manim/mobject/types/opengl_vectorized_mobject.py b/manim/mobject/types/opengl_vectorized_mobject.py index a88929bcc7..550da8cd2b 100644 --- a/manim/mobject/types/opengl_vectorized_mobject.py +++ b/manim/mobject/types/opengl_vectorized_mobject.py @@ -95,9 +95,7 @@ def __init__( **kwargs, ): self.data = {} - self.fill_color = fill_color self.fill_opacity = fill_opacity - self.stroke_color = stroke_color self.stroke_opacity = stroke_opacity self.stroke_width = stroke_width self.draw_stroke_behind_fill = draw_stroke_behind_fill @@ -129,6 +127,11 @@ def __init__( super().__init__(**kwargs) self.refresh_unit_normal() + if fill_color: + self.fill_color = Color(fill_color) + if stroke_color: + self.stroke_color = Color(stroke_color) + def get_group_class(self): return OpenGLVGroup @@ -197,11 +200,6 @@ def construct(self): -------- :meth:`~.OpenGLVMobject.set_style` """ - if color is not None: - if isinstance(color, str): - self.fill_color = Color(color) - else: - self.fill_color = color if opacity is not None: self.fill_opacity = opacity if recurse: @@ -219,11 +217,6 @@ def set_stroke( background=None, recurse=True, ): - if color is not None: - if isinstance(color, str): - self.stroke_color = Color(color) - else: - self.stroke_color = color if opacity is not None: self.stroke_opacity = opacity if recurse: @@ -309,10 +302,6 @@ def match_style(self, vmobject, recurse=True): return self def set_color(self, color, opacity=None, recurse=True): - if isinstance(color, str): - self.color = Color(color) - else: - self.color = color if opacity is not None: self.opacity = opacity @@ -339,13 +328,13 @@ def fade(self, darkness=0.5, recurse=True): return self def get_fill_colors(self): - return [rgb_to_hex(rgba[:3]) for rgba in self.fill_rgba] + return [Color(rgb_to_hex(rgba[:3])) for rgba in self.fill_rgba] def get_fill_opacities(self): return self.fill_rgba[:, 3] def get_stroke_colors(self): - return [rgb_to_hex(rgba[:3]) for rgba in self.stroke_rgba] + return [Color(rgb_to_hex(rgba[:3])) for rgba in self.stroke_rgba] def get_stroke_opacities(self): return self.stroke_rgba[:, 3] @@ -383,6 +372,15 @@ def get_color(self): return self.get_stroke_color() return self.get_fill_color() + def get_colors(self): + if self.has_stroke(): + return self.get_stroke_colors() + return self.get_fill_colors() + + stroke_color = property(get_stroke_color, set_stroke) + color = property(get_color, set_color) + fill_color = property(get_fill_color, set_fill) + def has_stroke(self): return any(self.get_stroke_widths()) and any(self.get_stroke_opacities()) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 2f1d34a39a..51d13d8b72 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -70,6 +70,8 @@ class VMobject(Mobject): This is within a pixel """ + sheen_factor = 0.0 + def __init__( self, fill_color=None, @@ -92,9 +94,7 @@ def __init__( n_points_per_cubic_curve=4, **kwargs, ): - self.fill_color = fill_color self.fill_opacity = fill_opacity - self.stroke_color = stroke_color self.stroke_opacity = stroke_opacity self.stroke_width = stroke_width self.background_stroke_color = background_stroke_color @@ -113,18 +113,23 @@ def __init__( self.n_points_per_cubic_curve = n_points_per_cubic_curve super().__init__(**kwargs) + if fill_color: + self.fill_color = fill_color + if stroke_color: + self.stroke_color = stroke_color + def get_group_class(self): return VGroup # Colors def init_colors(self, propagate_colors=True): self.set_fill( - color=self.fill_color or self.color, + color=self.fill_color, opacity=self.fill_opacity, family=propagate_colors, ) self.set_stroke( - color=self.stroke_color or self.color, + color=self.stroke_color, width=self.stroke_width, opacity=self.stroke_opacity, family=propagate_colors, @@ -239,8 +244,6 @@ def construct(self): self.update_rgbas_array("fill_rgbas", color, opacity) if opacity is not None: self.fill_opacity = opacity - if color is not None: - self.fill_color = color return self def set_stroke( @@ -258,19 +261,17 @@ def set_stroke( array_name = "background_stroke_rgbas" width_name = "background_stroke_width" opacity_name = "background_stroke_opacity" - color_name = "background_stroke_color" else: array_name = "stroke_rgbas" width_name = "stroke_width" opacity_name = "stroke_opacity" - color_name = "stroke_color" self.update_rgbas_array(array_name, color, opacity) if width is not None: setattr(self, width_name, width) if opacity is not None: setattr(self, opacity_name, opacity) - if color is not None: - setattr(self, color_name, color) + if color is not None and background: + self.background_stroke_color = color return self def set_background_stroke(self, **kwargs): @@ -357,12 +358,6 @@ def match_style(self, vmobject, family=True): def set_color(self, color, family=True): self.set_fill(color, family=family) self.set_stroke(color, family=family) - - # check if a list of colors is passed to color - if isinstance(color, str): - self.color = colour.Color(color) - else: - self.color = color return self def set_opacity(self, opacity, family=True): @@ -395,6 +390,8 @@ def get_fill_color(self): """ return self.get_fill_colors()[0] + fill_color = property(get_fill_color, set_fill) + def get_fill_opacity(self): """ If there are multiple opacities, this returns the @@ -403,7 +400,10 @@ def get_fill_opacity(self): return self.get_fill_opacities()[0] def get_fill_colors(self): - return [colour.Color(rgb=rgba[:3]) for rgba in self.get_fill_rgbas()] + return [ + colour.Color(rgb=rgba[:3]) if rgba.any() else None + for rgba in self.get_fill_rgbas() + ] def get_fill_opacities(self): return self.get_fill_rgbas()[:, 3] @@ -421,6 +421,8 @@ def get_stroke_rgbas(self, background=False): def get_stroke_color(self, background=False): return self.get_stroke_colors(background)[0] + stroke_color = property(get_stroke_color, set_stroke) + def get_stroke_width(self, background=False): if background: width = self.background_stroke_width @@ -435,7 +437,8 @@ def get_stroke_opacity(self, background=False): def get_stroke_colors(self, background=False): return [ - colour.Color(rgb=rgba[:3]) for rgba in self.get_stroke_rgbas(background) + colour.Color(rgb=rgba[:3]) if rgba.any() else None + for rgba in self.get_stroke_rgbas(background) ] def get_stroke_opacities(self, background=False): @@ -446,6 +449,8 @@ def get_color(self): return self.get_stroke_color() return self.get_fill_color() + color = property(get_color, set_color) + def set_sheen_direction(self, direction: np.ndarray, family=True): """Sets the direction of the applied sheen. diff --git a/manim/utils/color.py b/manim/utils/color.py index 0b024c1faa..3842508d24 100644 --- a/manim/utils/color.py +++ b/manim/utils/color.py @@ -473,7 +473,7 @@ def rgba_to_color(rgba: Iterable[float]) -> Color: def rgb_to_hex(rgb: Iterable[float]) -> str: - return "#" + "".join("%02x" % int(255 * x) for x in rgb) + return "#" + "".join("%02x" % round(255 * x) for x in rgb) def hex_to_rgb(hex_code: str) -> np.ndarray: diff --git a/manim/utils/config_ops.py b/manim/utils/config_ops.py index 354cc2e679..f67c543565 100644 --- a/manim/utils/config_ops.py +++ b/manim/utils/config_ops.py @@ -58,10 +58,10 @@ def __set_name__(self, obj, name): self.name = name def __get__(self, obj, owner): - return obj.__dict__["data"][self.name] + return obj.data[self.name] def __set__(self, obj, array: np.ndarray): - obj.__dict__["data"][self.name] = array + obj.data[self.name] = array class _Uniforms: diff --git a/tests/opengl/test_color_opengl.py b/tests/opengl/test_color_opengl.py index 61d9273072..3e9e29b80d 100644 --- a/tests/opengl/test_color_opengl.py +++ b/tests/opengl/test_color_opengl.py @@ -102,67 +102,67 @@ def test_set_color_handles_lists_of_strs(using_opengl_renderer): m = OpenGLVMobject() assert m.color.hex == "#fff" m.set_color([BLACK, BLUE, GREEN]) - assert m.color[0] == BLACK - assert m.color[1] == BLUE - assert m.color[2] == GREEN + assert m.get_colors()[0] == Color(BLACK) + assert m.get_colors()[1] == Color(BLUE) + assert m.get_colors()[2] == Color(GREEN) - assert m.fill_color[0] == BLACK - assert m.fill_color[1] == BLUE - assert m.fill_color[2] == GREEN + assert m.get_fill_colors()[0] == Color(BLACK) + assert m.get_fill_colors()[1] == Color(BLUE) + assert m.get_fill_colors()[2] == Color(GREEN) - assert m.stroke_color[0] == BLACK - assert m.stroke_color[1] == BLUE - assert m.stroke_color[2] == GREEN + assert m.get_stroke_colors()[0] == Color(BLACK) + assert m.get_stroke_colors()[1] == Color(BLUE) + assert m.get_stroke_colors()[2] == Color(GREEN) def test_set_color_handles_lists_of_color_objects(using_opengl_renderer): m = OpenGLVMobject() assert m.color.hex == "#fff" m.set_color([Color(PURE_BLUE), Color(PURE_GREEN), Color(PURE_RED)]) - assert m.color[0].hex == "#00f" - assert m.color[1].hex == "#0f0" - assert m.color[2].hex == "#f00" + assert m.get_colors()[0].hex == "#00f" + assert m.get_colors()[1].hex == "#0f0" + assert m.get_colors()[2].hex == "#f00" - assert m.fill_color[0].hex == "#00f" - assert m.fill_color[1].hex == "#0f0" - assert m.fill_color[2].hex == "#f00" + assert m.get_fill_colors()[0].hex == "#00f" + assert m.get_fill_colors()[1].hex == "#0f0" + assert m.get_fill_colors()[2].hex == "#f00" - assert m.stroke_color[0].hex == "#00f" - assert m.stroke_color[1].hex == "#0f0" - assert m.stroke_color[2].hex == "#f00" + assert m.get_stroke_colors()[0].hex == "#00f" + assert m.get_stroke_colors()[1].hex == "#0f0" + assert m.get_stroke_colors()[2].hex == "#f00" def test_set_fill_handles_lists_of_strs(using_opengl_renderer): m = OpenGLVMobject() assert m.fill_color.hex == "#fff" m.set_fill([BLACK, BLUE, GREEN]) - assert m.fill_color[0] == BLACK - assert m.fill_color[1] == BLUE - assert m.fill_color[2] == GREEN + assert m.get_fill_colors()[0] == Color(BLACK) + assert m.get_fill_colors()[1] == Color(BLUE) + assert m.get_fill_colors()[2] == Color(GREEN) def test_set_fill_handles_lists_of_color_objects(using_opengl_renderer): m = OpenGLVMobject() assert m.fill_color.hex == "#fff" m.set_fill([Color(PURE_BLUE), Color(PURE_GREEN), Color(PURE_RED)]) - assert m.fill_color[0].hex == "#00f" - assert m.fill_color[1].hex == "#0f0" - assert m.fill_color[2].hex == "#f00" + assert m.get_fill_colors()[0].hex == "#00f" + assert m.get_fill_colors()[1].hex == "#0f0" + assert m.get_fill_colors()[2].hex == "#f00" def test_set_stroke_handles_lists_of_strs(using_opengl_renderer): m = OpenGLVMobject() assert m.stroke_color.hex == "#fff" m.set_stroke([BLACK, BLUE, GREEN]) - assert m.stroke_color[0] == BLACK - assert m.stroke_color[1] == BLUE - assert m.stroke_color[2] == GREEN + assert m.get_stroke_colors()[0] == Color(BLACK) + assert m.get_stroke_colors()[1] == Color(BLUE) + assert m.get_stroke_colors()[2] == Color(GREEN) def test_set_stroke_handles_lists_of_color_objects(using_opengl_renderer): m = OpenGLVMobject() assert m.stroke_color.hex == "#fff" m.set_stroke([Color(PURE_BLUE), Color(PURE_GREEN), Color(PURE_RED)]) - assert m.stroke_color[0].hex == "#00f" - assert m.stroke_color[1].hex == "#0f0" - assert m.stroke_color[2].hex == "#f00" + assert m.get_stroke_colors()[0].hex == "#00f" + assert m.get_stroke_colors()[1].hex == "#0f0" + assert m.get_stroke_colors()[2].hex == "#f00" diff --git a/tests/test_stroke.py b/tests/test_stroke.py index ad6b0edac8..5a25f34661 100644 --- a/tests/test_stroke.py +++ b/tests/test_stroke.py @@ -1,12 +1,14 @@ from __future__ import annotations +from colour import Color + import manim.utils.color as C from manim import VMobject def test_stroke_props_in_ctor(): m = VMobject(stroke_color=C.ORANGE, stroke_width=10) - assert m.stroke_color == C.ORANGE + assert m.stroke_color == Color(C.ORANGE) assert m.stroke_width == 10 @@ -15,7 +17,7 @@ def test_set_stroke(): m.set_stroke(color=C.ORANGE, width=2, opacity=0.8) assert m.stroke_width == 2 assert m.stroke_opacity == 0.8 - assert m.stroke_color == C.ORANGE + assert m.stroke_color == Color(C.ORANGE) def test_set_background_stroke(): diff --git a/tests/test_svg_mobject.py b/tests/test_svg_mobject.py index d6fb81adbc..41c6e15dc6 100644 --- a/tests/test_svg_mobject.py +++ b/tests/test_svg_mobject.py @@ -10,13 +10,13 @@ def test_set_fill_color(): expected_color = "#FF862F" svg = SVGMobject(get_svg_resource("heart.svg"), fill_color=expected_color) - assert svg.fill_color == expected_color + assert svg.fill_color == Color(expected_color) def test_set_stroke_color(): expected_color = "#FFFDDD" svg = SVGMobject(get_svg_resource("heart.svg"), stroke_color=expected_color) - assert svg.stroke_color == expected_color + assert svg.stroke_color == Color(expected_color) def test_set_color_sets_fill_and_stroke(): @@ -46,7 +46,7 @@ def test_fill_overrides_color(): color="#123123", fill_color=expected_color, ) - assert svg.fill_color == expected_color + assert svg.fill_color == Color(expected_color) def test_stroke_overrides_color(): @@ -56,7 +56,7 @@ def test_stroke_overrides_color(): color="#334433", stroke_color=expected_color, ) - assert svg.stroke_color == expected_color + assert svg.stroke_color == Color(expected_color) def test_string_to_numbers():