feat: add some action icons
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user