diff --git a/src/color-plate.csv b/src/color-plate.csv new file mode 100644 index 0000000..7fb4a9c --- /dev/null +++ b/src/color-plate.csv @@ -0,0 +1,5 @@ +Blue Background Node 1,#001fbe +Blue Background Node 2,#1439ff + +Paper Background Node 1,#ffffff +Paper Backgroundr Node 2,#e3e3e3 diff --git a/tool/src/aurora_iconset_builder/assemblicon/artio.py b/tool/src/aurora_iconset_builder/assemblicon/artio.py index f666201..8301393 100644 --- a/tool/src/aurora_iconset_builder/assemblicon/artio.py +++ b/tool/src/aurora_iconset_builder/assemblicon/artio.py @@ -9,7 +9,7 @@ def load_input_artifact(p: Path) -> ArtifactFile: """ Load input artifact used for building temporary and output artifact. """ - logging.info("Loading asset: %s", p) + logging.debug("Loading input artifact: %s", p) return PIL.Image.open(p, "r", ["PNG", "JPEG", "BMP"]) @@ -17,14 +17,15 @@ def load_artifact(p: Path) -> ArtifactFile: """ Load artifact saved previously as the intermediary. """ - logging.info("Loading artifact: %s", p) + logging.debug("Loading temporary or output artifact: %s", p) return PIL.Image.open(p, "r", ["PNG"]) def save_artifact(art: Artifact, p: Path) -> None: - logging.info("Saving artifact: %s", p) + logging.debug("Saving artifact: %s", p) art.save(p, format="PNG") def dup_artifact(src: Path, dst: Path) -> None: + logging.debug("Duplicating artifact: %s -> %s", src, dst) shutil.copyfile(src, dst) diff --git a/tool/src/aurora_iconset_builder/assemblicon/artrender.py b/tool/src/aurora_iconset_builder/assemblicon/artrender.py index 0d625f4..15d658a 100644 --- a/tool/src/aurora_iconset_builder/assemblicon/artrender.py +++ b/tool/src/aurora_iconset_builder/assemblicon/artrender.py @@ -39,7 +39,7 @@ def render_svg(src: Path, dst: Path, kind: SvgRenderKind, cfg: SvgConfig) -> Non :param kind: The selected SVG render kind. :param cfg: The configuration when rendering. """ - logging.info("Rendering SVG artifact with render {kind.name}: %s -> %s", src, dst) + logging.debug("Rendering SVG artifact with render %s: %s -> %s", kind.name, src, dst) match kind: case SvgRenderKind.Inkscape: @@ -133,7 +133,7 @@ def render_blender(src: Path, dst: Path, temp_script: Path, cfg: BlenderConfig) The caller must make sure that this file is immutable during calling this function. :param cfg: The configuration when rendering. """ - logging.info("Rendering Blender artifact: %s -> %s", src, dst) + logging.debug("Rendering Blender artifact: %s -> %s", src, dst) script = _BLENDER_RENDER_SCRIPT.format( width=cfg.width, height=cfg.height, dst=repr(str(dst)) @@ -167,7 +167,7 @@ def render_thumbnail(art: Artifact, hws: Iterable[int]) -> Iterator[Artifact]: """ check_vanilla_artifact(art) for hw in hws: - logging.info("Rendering thumbnail %dx%d.", hw, hw) + logging.debug("Rendering thumbnail %dx%d.", hw, hw) thumbnail = art.copy() thumbnail.thumbnail((hw, hw), PIL.Image.Resampling.LANCZOS) yield thumbnail @@ -180,7 +180,7 @@ def render_ico(art: Artifact, dst: Path) -> None: :param art: The artifact to be rendered. :param dst: The path to rendered result. """ - logging.info("Rendering .ICO artifact: -> %s", dst) + logging.debug("Rendering .ICO artifact: %s", dst) check_vanilla_artifact(art) sizes = [16, 32, 48, 64, 128, 256] @@ -202,7 +202,7 @@ def render_icns(art: Artifact, dst: Path) -> None: :param art: The artifact to be rendered. :param dst: The path to rendered result. """ - logging.info("Rendering .ICNS artifact: -> %s", dst) + logging.debug("Rendering .ICNS artifact: %s", dst) check_vanilla_artifact(art) # provide every smaller frame explicitly; the 1024x1024 entry is diff --git a/tool/src/aurora_iconset_builder/assemblicon/context.py b/tool/src/aurora_iconset_builder/assemblicon/context.py index 054525e..ef4fd87 100644 --- a/tool/src/aurora_iconset_builder/assemblicon/context.py +++ b/tool/src/aurora_iconset_builder/assemblicon/context.py @@ -160,7 +160,9 @@ class AdvancedContext: """ Load given input bitmap asset. """ - return artio.load_input_artifact(self.input_artifact(*args)) + p = self.input_artifact(*args) + logging.info("Loading input artifact: %s", p) + return artio.load_input_artifact(p) # endregion @@ -181,7 +183,9 @@ class AdvancedContext: return self.__user_temporary_artifact(*args) def load_temporary_artifact(self, *args: str) -> ArtifactFile: - return artio.load_artifact(self.temporary_artifact(*args)) + p = self.temporary_artifact(*args) + logging.info("Loading temporary artifact: %s", p) + return artio.load_artifact(p) def save_temporary_artifact(self, art: Artifact, *args: str) -> None: """ @@ -189,7 +193,9 @@ class AdvancedContext: All existence of sub-directory should be ensured on your own. """ - artio.save_artifact(art, self.temporary_artifact(*args)) + p = self.temporary_artifact(*args) + logging.info("Saving temporary artifact: %s", p) + artio.save_artifact(art, p) def __allocate_lib_temporary_artifact(self, suffix: Optional[str] = None) -> Path: p = self.__lib_temporary_artifact(_TEMP_LIB_ALLOC_DIR) @@ -213,7 +219,10 @@ class AdvancedContext: :return: The path to destination storing render result. """ if dst is None: + logging.info("Rendering temporary SVG: %s", src) dst = self.__allocate_lib_temporary_artifact(".png") + else: + logging.info("Rendering SVG: %s -> %s", src, dst) artrender.render_svg(src, dst, self.__context.prerequisite.svg_render, cfg) return dst @@ -257,7 +266,10 @@ class AdvancedContext: """ temp_script = self.__fetch_const_lib_temporary_artifact("blender.py") if dst is None: + logging.info("Rendering temporary Blender composition: %s", src) dst = self.__allocate_lib_temporary_artifact(".png") + else: + logging.info("Rendering Blender composition: %s -> %s", src, dst) artrender.render_blender(src, dst, temp_script, cfg) return dst @@ -305,7 +317,7 @@ class AdvancedContext: :param name: The name of saved artifact. The file extension ".png" is not required. """ logging.info( - "Saving FreeDesktop artifact with kind %s and name %s.", kind, name + 'Saving FreeDesktop artifact with kind "%s" and name "%s".', kind, name ) for hw, thumbnail in zip( @@ -317,6 +329,13 @@ class AdvancedContext: def dup_fd_artifact( self, src_kind: FdContext, src_name: str, dst_kind: FdContext, dst_name: str ) -> None: + logging.info( + 'Duplicating FreeDesktop artifact from kind "%s" name "%s" to kind "%s" name "%s".', + src_kind, + src_name, + dst_kind, + dst_name, + ) for hw in _FD_THUMBNAIL_HWS: artio.dup_artifact( self.__fd_artifact(hw, src_kind, src_name), @@ -333,13 +352,20 @@ class AdvancedContext: :param name: The name of saved artifact. The file extension ".ico" is not required. """ logging.info( - "Saving Windows-only artifact with kind %s and name %s.", kind, name + 'Saving Windows-only artifact with kind "%s" and name "%s".', kind, name ) artrender.render_ico(art, self.__win_artifact(kind, name)) def dup_win_artifact( self, src_kind: WinCategory, src_name: str, dst_kind: WinCategory, dst_name: str ) -> None: + logging.info( + 'Duplicating Windows-only artifact from kind "%s" name "%s" to kind "%s" name "%s".', + src_kind, + src_name, + dst_kind, + dst_name, + ) artio.dup_artifact( self.__win_artifact(src_kind, src_name), self.__win_artifact(dst_kind, dst_name), @@ -354,12 +380,21 @@ class AdvancedContext: :param name: The name of saved artifact. The file extension ".icns" is not required. """ - logging.info("Saving macOS-only artifact with kind %s and name %s.", kind, name) + logging.info( + 'Saving macOS-only artifact with kind "%s" and name "%s".', kind, name + ) artrender.render_icns(art, self.__mac_artifact(kind, name)) def dup_mac_artifact( self, src_kind: MacCategory, src_name: str, dst_kind: MacCategory, dst_name: str ) -> None: + logging.info( + 'Duplicating macOS-only artifact from kind "%s" name "%s" to kind "%s" name "%s".', + src_kind, + src_name, + dst_kind, + dst_name, + ) artio.dup_artifact( self.__mac_artifact(src_kind, src_name), self.__mac_artifact(dst_kind, dst_name), diff --git a/tool/src/aurora_iconset_builder/std_icons/action_icons.py b/tool/src/aurora_iconset_builder/std_icons/action_icons.py index 287a07f..5e65beb 100644 --- a/tool/src/aurora_iconset_builder/std_icons/action_icons.py +++ b/tool/src/aurora_iconset_builder/std_icons/action_icons.py @@ -4,13 +4,13 @@ from ..assemblicon.context import AdvancedContext, FdContext def build_action_icons(ctx: AdvancedContext) -> None: _build_go_icons(ctx) + _build_object_flip_icons(ctx) + _build_object_rotate_icons(ctx) def _build_go_icons(ctx: AdvancedContext) -> None: # build go-* base - go_base = ctx.render_svg_then_load( - ctx.input_artifact("component", "go-base.svg") - ) + go_base = ctx.render_svg_then_load(ctx.input_artifact("component", "go-base.svg")) # build go-* shining go_inner_shining = ctx.render_svg_then_load( ctx.input_artifact("component", "go-inner-shining.svg"), @@ -26,9 +26,23 @@ def _build_go_icons(ctx: AdvancedContext) -> None: go = go_base.copy() # render shining with inner mask go.paste(go_inner_shining, (0, 0), go_mask) - + # save as FD action - ctx.save_fd_artifact(go, FdContext.Actions, f'go-{part}') + ctx.save_fd_artifact(go, FdContext.Actions, f"go-{part}") # rotate it for next calling go_mask = go_mask.transpose(PIL.Image.Transpose.ROTATE_90) + + +def _build_object_flip_icons(ctx: AdvancedContext) -> None: + art = ctx.render_svg_then_load(ctx.input_artifact("object-flip-horizontal.svg")) + ctx.save_fd_artifact(art, FdContext.Actions, "object-flip-horizontal") + art = ctx.render_svg_then_load(ctx.input_artifact("object-flip-vertical.svg")) + ctx.save_fd_artifact(art, FdContext.Actions, "object-flip-vertical") + + +def _build_object_rotate_icons(ctx: AdvancedContext) -> None: + art = ctx.render_svg_then_load(ctx.input_artifact("object-rotate-left.svg")) + ctx.save_fd_artifact(art, FdContext.Actions, "object-rotate-left") + art = ctx.render_svg_then_load(ctx.input_artifact("object-rotate-right.svg")) + ctx.save_fd_artifact(art, FdContext.Actions, "object-rotate-right")