From 28fa01992ed6c3cb8f71d450a6694efacf31ff12 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Thu, 3 Sep 2026 19:13:35 +0800 Subject: [PATCH] feat: bring source and sink back for future development --- tool/src/aurora_iconset_builder/__init__.py | 2 ++ .../assemblicon/highlevel/environment.py | 2 +- .../assemblicon/highlevel/sink/__init__.py | 7 +++++ .../assemblicon/highlevel/sink/common.py | 11 ++++++++ .../highlevel/sink/tempdir_sink.py | 12 +++++++++ .../assemblicon/highlevel/source/__init__.py | 7 +++++ .../assemblicon/highlevel/source/common.py | 11 ++++++++ .../highlevel/source/tempdir_source.py | 12 +++++++++ .../assemblicon/lowlevel/artproc.py | 8 ++++++ .../nostd_icons/action_icons.py | 26 +++++++++---------- .../nostd_icons/application_icons.py | 3 ++- 11 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/__init__.py create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/common.py create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/tempdir_sink.py create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/source/__init__.py create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/source/common.py create mode 100644 tool/src/aurora_iconset_builder/assemblicon/highlevel/source/tempdir_source.py diff --git a/tool/src/aurora_iconset_builder/__init__.py b/tool/src/aurora_iconset_builder/__init__.py index 9322692..b0b8925 100644 --- a/tool/src/aurora_iconset_builder/__init__.py +++ b/tool/src/aurora_iconset_builder/__init__.py @@ -17,6 +17,8 @@ def main() -> None: env = Environment(prologue) ctx = Context(env) + # TODO: use explicit temporary directory initializer in prologue to do this. + # create our special temporary subdirectory env.temporary_artifact("component").mkdir(parents=True, exist_ok=True) diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/environment.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/environment.py index c886c17..def1394 100644 --- a/tool/src/aurora_iconset_builder/assemblicon/highlevel/environment.py +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/environment.py @@ -73,7 +73,7 @@ _DEFAULT_BLD_CONFIG = artrdr.BlenderConfig(VART_HW, VART_HW) # TODO: For easy testing, we only build 32x32 and 48x48. # Enable full generation after testing. -_FD_THUMBNAIL_HWS: tuple[int, ...] = (32, 48, 256) +_FD_THUMBNAIL_HWS: tuple[int, ...] = (32, 48) # _FD_THUMBNAIL_HWS: tuple[int, ...] = (16, 32, 48, 64, 128, 256) diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/__init__.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/__init__.py new file mode 100644 index 0000000..a5507eb --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/__init__.py @@ -0,0 +1,7 @@ +from .common import Sink +from .tempdir_sink import TempDirSink + +__all__ = [ + "Sink", + "TempDirSink" +] diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/common.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/common.py new file mode 100644 index 0000000..d5fdfbc --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/common.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod +from ..utils import Artifact + +class Sink(ABC): + """ + Abstract base class for all sinks. + """ + + @abstractmethod + def push_artifact(self, art: Artifact) -> None: + pass diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/tempdir_sink.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/tempdir_sink.py new file mode 100644 index 0000000..606083d --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/sink/tempdir_sink.py @@ -0,0 +1,12 @@ +from ..utils import Artifact +from .common import Sink + +class TempDirSink(Sink): + + __args: tuple[str, ...] + + def __init__(self, *args: str) -> None: + self.__args = tuple(args) + + def push_artifact(self, art: Artifact) -> None: + pass diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/__init__.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/__init__.py new file mode 100644 index 0000000..9108bdf --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/__init__.py @@ -0,0 +1,7 @@ +from .common import Source +from .tempdir_source import TempDirSource + +__all__ = [ + "Source", + "TempDirSource" +] diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/common.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/common.py new file mode 100644 index 0000000..18c3a75 --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/common.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod +from ..utils import Artifact + +class Source(ABC): + """ + Abstract base class for all sources. + """ + + @abstractmethod + def pull_artifact(self) -> Artifact: + pass diff --git a/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/tempdir_source.py b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/tempdir_source.py new file mode 100644 index 0000000..e952c65 --- /dev/null +++ b/tool/src/aurora_iconset_builder/assemblicon/highlevel/source/tempdir_source.py @@ -0,0 +1,12 @@ +from ..utils import Artifact +from .common import Source + +class TempDirSource(Source): + + __path_comps: tuple[str, ...] + + def __init__(self, *args: str) -> None: + self.__path_comps = tuple(args) + + def pull_artifact(self) -> Artifact: + pass diff --git a/tool/src/aurora_iconset_builder/assemblicon/lowlevel/artproc.py b/tool/src/aurora_iconset_builder/assemblicon/lowlevel/artproc.py index a36914a..d95ebfe 100644 --- a/tool/src/aurora_iconset_builder/assemblicon/lowlevel/artproc.py +++ b/tool/src/aurora_iconset_builder/assemblicon/lowlevel/artproc.py @@ -1,5 +1,6 @@ import enum import math +import PIL.Image from .utils import Artifact from ..geometry import Point @@ -73,6 +74,13 @@ def aspect_ratio_scale_and_crop( return scaled.crop((crop_x, crop_y, crop_x + target_width, crop_y + target_height)) +def default_art_resize(art: Artifact, width: int, height: int) -> Artifact: + """ + Resize given artifact with default resample (LANCZOS). + """ + return art.resize((width, height), PIL.Image.Resampling.LANCZOS) + + def art_anchor_to_offset( art: Artifact, horizontal_anchor: HorizontalAnchor, diff --git a/tool/src/aurora_iconset_builder/nostd_icons/action_icons.py b/tool/src/aurora_iconset_builder/nostd_icons/action_icons.py index 5ceff4e..cd1f62e 100644 --- a/tool/src/aurora_iconset_builder/nostd_icons/action_icons.py +++ b/tool/src/aurora_iconset_builder/nostd_icons/action_icons.py @@ -1,11 +1,11 @@ -import PIL.Image from ..types import AuroraContext, AuroraEnvironment from ..assemblicon.highlevel.environment import FdContext from ..assemblicon.highlevel.utils import VART_HW -from ..assemblicon.geometry import Rectangle, Point +from ..assemblicon.geometry import Rectangle from ..assemblicon.lowlevel.artproc import ( art_anchor_to_offset, anchor_to_offset, + default_art_resize, align_paste, align_alpha_composite, VerticalAnchor, @@ -30,7 +30,7 @@ def build_image_properties_icon(env: AuroraEnvironment) -> None: art = env.load_temporary_artifact("image-jpeg.png") info_mark = env.load_temporary_artifact("dialog-infomation.png") - resized_info_mark = info_mark.resize((500, 500), PIL.Image.Resampling.LANCZOS) + resized_info_mark = default_art_resize(info_mark, 500, 500) align_alpha_composite( art, @@ -47,23 +47,23 @@ def build_image_properties_icon(env: AuroraEnvironment) -> None: def build_image_zoom_original_icon(env: AuroraEnvironment) -> None: # load triangle assets - tri_new_size = (200, 200) - tri_left = env.load_temporary_artifact("component", "triangle-left.png").resize( - tri_new_size, PIL.Image.Resampling.LANCZOS + TRI_SIZE = (200, 200) + tri_left = default_art_resize( + env.load_temporary_artifact("component", "triangle-left.png"), *TRI_SIZE ) - tri_down = env.load_temporary_artifact("component", "triangle-down.png").resize( - tri_new_size, PIL.Image.Resampling.LANCZOS + tri_down = default_art_resize( + env.load_temporary_artifact("component", "triangle-down.png"), *TRI_SIZE ) - tri_right = env.load_temporary_artifact("component", "triangle-right.png").resize( - tri_new_size, PIL.Image.Resampling.LANCZOS + tri_right = default_art_resize( + env.load_temporary_artifact("component", "triangle-right.png"), *TRI_SIZE ) - tri_up = env.load_temporary_artifact("component", "triangle-up.png").resize( - tri_new_size, PIL.Image.Resampling.LANCZOS + tri_up = default_art_resize( + env.load_temporary_artifact("component", "triangle-up.png"), *TRI_SIZE ) # load inner image inner = env.load_temporary_artifact("image-jpeg.png") - resized_inner = inner.resize((680, 680), PIL.Image.Resampling.LANCZOS) + resized_inner = default_art_resize(inner, 680, 680) # composite this icon icon = env.new_artifact() diff --git a/tool/src/aurora_iconset_builder/nostd_icons/application_icons.py b/tool/src/aurora_iconset_builder/nostd_icons/application_icons.py index f92bf94..96a0e3c 100644 --- a/tool/src/aurora_iconset_builder/nostd_icons/application_icons.py +++ b/tool/src/aurora_iconset_builder/nostd_icons/application_icons.py @@ -3,6 +3,7 @@ from ..types import AuroraContext, AuroraEnvironment from ..assemblicon.highlevel.environment import FdContext, WinCategory, MacCategory from ..assemblicon.lowlevel.artproc import ( art_anchor_to_offset, + default_art_resize, align_paste, VerticalAnchor, HorizontalAnchor, @@ -24,7 +25,7 @@ def build_sarasacw_picture_icons(env: AuroraEnvironment) -> None: ) inner = env.load_temporary_artifact("image-jpeg.png") - resized_inner = inner.resize((990, 990), PIL.Image.Resampling.LANCZOS) + resized_inner = default_art_resize(inner, 990, 990) align_paste( app,