From 9f5bb724cb775ade15e0c6314e5e93f494204dc5 Mon Sep 17 00:00:00 2001 From: julius Date: Sun, 27 Oct 2024 16:42:02 +0100 Subject: [PATCH] add posibility for including emojis --- speckles.py | 184 +++++++++++----------------------------------------- 1 file changed, 38 insertions(+), 146 deletions(-) diff --git a/speckles.py b/speckles.py index 8995019..a53a723 100644 --- a/speckles.py +++ b/speckles.py @@ -9,115 +9,34 @@ import numpy as np RGen = np.random.default_rng() -heartshape = [ - svg.M(1, 3), - svg.Arc(2, 2, 0, False, True, x=5, y=3), - svg.Arc(2, 2, 0, False, True, x=9, y=3), - svg.Q(9, 6, 5, 9), - svg.Q(1, 6, 1, 3), - svg.Z(), -] -heartshape2 = [ - svg.M(-4.913, -10.043), - svg.Q(-1.968, -10.043, -0.404, -6.332), - svg.Q(-0.024, -5.252, -0.024, -4.929), - svg.Q(0.054, -4.929, 0.231, -5.874), - svg.Q(1.743, -10.043, 4.913, -10.043), - svg.Q(7.734, -10.043, 9.384, -7.196), - svg.Q(9.894, -6.142, 9.894, -5.062), - svg.L(9.894, -4.885), - svg.Q(9.894, -1.404, 6.913, 1.715), - svg.Q(0.823, 9.153, 0.015, 10.043), - svg.L(-0.067, 10.043), - svg.L(-8.274, -0.069), - svg.Q(-9.894, -2.471, -9.894, -4.929), - svg.Q(-9.894, -7.762, -7.207, -9.438), - svg.Q(-6.114, -10.043, -4.913, -10.043), - svg.Z(), - svg.M(-9.203, -5.062), - svg.L(-9.203, -4.846), - svg.Q(-9.203, -1.892, -6.395, 1.188), - svg.L(0.015, 9.015), - svg.L(0.054, 9.015), - svg.L(7.803, -0.419), - svg.Q(9.207, -2.592, 9.207, -4.63), - svg.L(9.207, -5.144), - svg.Q(9.207, -7.464, 6.654, -8.976), - svg.Q(5.7, -9.356, 4.913, -9.356), - svg.Q(1.35, -9.356, 0.192, -3.322), - svg.Q(0.054, -2.808, 0.054, -2.458), - svg.L(-0.024, -2.458), - svg.Q(-0.024, -3.512, -0.996, -6.332), - svg.Q(-2.361, -9.356, -4.913, -9.356), - svg.Q(-7.259, -9.356, -8.706, -6.967), - svg.Q(-9.203, -6.021, -9.203, -5.062), - svg.Z(), -] -clubs = [ - svg.M(0.005, -2.647), - svg.Q(0.765, -2.647, 1.122, -1.841), - svg.Q(1.169, -1.657, 1.179, -1.458), - svg.Q(1.179, -1.043, 0.753, -0.475), - svg.L(0.541, -0.263), - svg.L(0.551, -0.263), - svg.Q(0.814, -0.362, 1.112, -0.362), - svg.L(1.179, -0.362), - svg.Q(2.024, -0.362, 2.365, 0.355), - svg.Q(2.446, 0.589, 2.446, 0.802), - svg.Q(2.446, 1.53, 1.705, 1.899), - svg.Q(1.563, 1.941, 1.311, 1.963), - svg.Q(0.452, 1.963, 0.094, 0.991), - svg.L(0.083, 0.991), - svg.L(0.083, 1.022), - svg.Q(0.083, 2.24, 0.374, 2.626), - svg.L(0.374, 2.647), - svg.L(-0.364, 2.647), - svg.L(-0.385, 2.626), - svg.Q(-0.083, 2.172, -0.083, 0.991), - svg.L(-0.083, 0.979), - svg.L(-0.095, 0.979), - svg.Q(-0.449, 1.963, -1.319, 1.963), - svg.Q(-1.997, 1.963, -2.358, 1.25), - svg.Q(-2.446, 1.008, -2.446, 0.802), - svg.Q(-2.446, -0.024, -1.574, -0.32), - svg.Q(-1.339, -0.362, -1.159, -0.362), - svg.L(-1.127, -0.362), - svg.Q(-0.821, -0.362, -0.544, -0.263), - svg.L(-0.534, -0.263), - svg.L(-0.534, -0.273), - svg.Q(-0.833, -0.525, -0.935, -0.769), - svg.Q(-1.148, -1.16, -1.148, -1.447), - svg.L(-1.148, -1.497), - svg.Q(-1.148, -2.21, -0.385, -2.579), - svg.Q(-0.133, -2.647, 0.005, -2.647), - svg.Z(), -] - -spades = [] - -diamond = [ - svg.M(0.01, -7.2), - svg.L(4.86, -0.9), - svg.Q(5.53, -0.08, 5.53, 0.05), - svg.L(0.01, 7.2), - svg.Q(-0.11, 7.12, -5.53, 0.05), - svg.Q(-5.53, -0.08, -4.46, -1.42), - svg.L(0.01, -7.2), - svg.Z(), -] - -"♠" "♣" "♥" - - -def openmoji(marker: str, x, y, s, c): +def emoji(marker: str, source="twemoji"): if len(marker) != 1: return - file = hex(ord(marker))[2:] - file = Path(f"openmoji/{file}.svg") + if source == "openmoji": + scaler = 512 + file = hex(ord(marker))[2:].upper() + elif source == "twemoji": + scaler = 768 + file = hex(ord(marker))[2:] + file = Path(f"{source}/{file}.svg") if file.is_file(): - return svg.Text(text=marker, x=x, y=y, class_=["c"+c[1:], hex(int(s*100))[2:]]) - # return svg.Image(href=str(file), transform=[svg.Translate(x=x, y=y), svg.Scale(s)]) + return svg.G( + elements=[Include(text=file.read_text())], + id=marker, + transform=[svg.Scale(100 / scaler)], + ) + + +class Include(svg.Element): + element_name = "svg" + transform: list[svg.Transform] | None = None + + def __str__(self) -> str: + return self.text + + +DEFINED = ".o+tYP-|sSex*" def markertoSVG(marker, x, y, c, s): @@ -215,45 +134,6 @@ def markertoSVG(marker, x, y, c, s): elif marker == "S": s = np.sqrt(s) * 2 return svg.Rect(x=x, y=y, width=s, height=s, fill=c, rx=s / 3, ry=s / 3) - elif marker == "♦": - s = np.sqrt(s) / 8 - return svg.Path( - d=diamond, - fill=c, - transform=[svg.Translate(x=x, y=y), svg.Scale(s)], - ) - elif marker == "♠": - return openmoji(marker, x, y, s, c) - elif marker == "♣": - s = np.sqrt(s) / 2 - return svg.Path( - d=clubs, - fill=c, - transform=[svg.Translate(x=x, y=y), svg.Scale(s)], - ) - elif marker == "♦": - s = np.sqrt(s) / 8 - return svg.Path( - d=diamond, - fill=c, - transform=[svg.Translate(x=x, y=y), svg.Scale(s)], - ) - elif marker == "♡": - s = np.sqrt(s) / 4 - return svg.Path( - d=heartshape2, - fill="none", - stroke=c, - stroke_width=s / 4, - transform=[svg.Translate(x=x, y=y), svg.Scale(s / 2)], - ) - elif marker == "♥": - s = np.sqrt(s) / 4 - return svg.Path( - d=heartshape, - fill=c, - transform=[svg.Translate(x=x - 5, y=y - 9), svg.Scale(s)], - ) elif marker == "e": s = np.sqrt(s * 2) return svg.Ellipse( @@ -293,6 +173,11 @@ def markertoSVG(marker, x, y, c, s): ) for angle in (0, 60, -60) ] + else: + return svg.Use( + href=f"#{marker}", + transform=[svg.Translate(x=x, y=y), svg.Scale(np.sqrt(s) / 100)], + ) def make_wallpaper( @@ -338,13 +223,19 @@ def make_wallpaper( style = svg.Style( text="\n".join( [ - f".{hex(int(size*100))[2:]} {{ font-size: {int(np.sqrt(size)*16)}px; }}" + f'.s{hex(int(size*100))[2:]} {{ font-family: "OpenMoji"; font-size: {int(np.sqrt(size)*16)}px; }}' for size in np.logspace(0, size, 10, base=np.exp(2)) ] ) ) elements.append(style) + elements.append( + svg.Defs( + elements=[emoji(marker) for marker in markers if marker not in DEFINED] + ) + ) + for colour, marker, size in itertools.product( speckle_colours, markers, @@ -395,7 +286,8 @@ if __name__ == "__main__": ",".join(["#000000"] + palettes[0]["colours"]), orientation="2880x1920", filename="testing.svg", - markers="Yt♠", + markers="tY.", + size=3, ) exit()