From 1ac3851065521ade9cded1026e788df935d1658f Mon Sep 17 00:00:00 2001 From: yrriban Date: Fri, 4 Jul 2025 11:50:10 -0400 Subject: [PATCH 1/4] Actually load the values for screenshot text, etc. correctly from the config. Pass them into draw_text which doesn't have them readily available. --- dcc/concat.py | 9 ++++++++- dcc/config.py | 33 ++++++++++++++++++++++----------- dcc/ss.py | 2 +- dcc/text.py | 17 +++++++++++------ 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/dcc/concat.py b/dcc/concat.py index 33a3a8b..b84db62 100644 --- a/dcc/concat.py +++ b/dcc/concat.py @@ -85,7 +85,14 @@ class Concat(dcc.doom_base.Wad): ) mapstring = v.name[-6:-4] text = self._config["map_names"][f"map{mapstring}"] - dcc.text.draw_text(img, f"MAP{mapstring}: {text}", font_size=120) + dcc.text.draw_text( + img, + f"MAP{mapstring}: {text}", + self.thumbnail_font, + self.thumbnail_text_fill, + self.thumbnail_text_stroke, + font_size=120 + ) img.trim(reset_coords=True) img.border("graya(25%, 25%)", 10, 10) img.border(dcc.config.TEXT_STROKE_COLOR, 16, 16) diff --git a/dcc/config.py b/dcc/config.py index 6d1c4b3..c1ed346 100644 --- a/dcc/config.py +++ b/dcc/config.py @@ -26,25 +26,36 @@ class Base(Command): "required key 'dsda' not set in config " + f"{self.doom.joinpath(self.config_name)}.") for d in ("iwads", "pwads", "demos", "fabricate"): - self._init_attr(d, d, fn=self.doom.joinpath) + self._init_attr([d], d, fn=self.doom.joinpath) - self._init_attr("thumbnail.height", 1280) - self._init_attr("thumbnail.width", 720) - self._init_attr("thumbnail.font", None) - self._init_attr("thumbnail.text_fill", "white") - self._init_attr("thumbnail.text_stroke", "red") - self._init_attr("fetch.mirror", "https://youfailit.net/pub/idgames") + self._init_attr(["thumbnail", "height"], 720) + self._init_attr(["thumbnail", "width"], 1280) + self._init_attr(["thumbnail", "font"], None) + self._init_attr(["thumbnail", "text_fill"], "white") + self._init_attr(["thumbnail", "text_stroke"], "red") + self._init_attr( + ["fetch", "mirror"], + "https://youfailit.net/pub/idgames" + ) def run(self, parsed_args): self.init_base(parsed_args) self.take_action(parsed_args) def _init_attr(self, what, default, fn=lambda x: x): - what = what.replace(".", "_") + propname = "_".join(what) + val = self._config + for w in what: + val = val[w] + if val is None: + val = default + break + + setattr(self, f"_{propname}", fn(val)) setattr( - self, f"_{what}", fn(self._config.get(what, default))) - setattr( - type(self), what, property(lambda self: getattr(self, f"_{what}"))) + type(self), propname, + property(lambda self: getattr(self, f"_{propname}")) + ) @property def doom(self): diff --git a/dcc/ss.py b/dcc/ss.py index 9ec2f54..de610ff 100644 --- a/dcc/ss.py +++ b/dcc/ss.py @@ -22,7 +22,7 @@ class SS(dcc.doom_base.WadMap): height = self.thumbnail_height with wand.image.Image(width=width, height=height, pseudo="x:") as img: img.reset_coords() - if (img.size[0] < width or img.size[1] < height): + if (img.width < width or img.height < height): if not messagebox.askretrycancel( title="DCC", message=f"Image too small ({img.width}x{img.height})." + diff --git a/dcc/text.py b/dcc/text.py index 5df6ed4..88660c9 100644 --- a/dcc/text.py +++ b/dcc/text.py @@ -4,12 +4,12 @@ import wand.drawing import wand.image -def draw_text(img, text, font_size=64): +def draw_text(img, text, font, text_fill, text_stroke, font_size=64): with wand.drawing.Drawing() as draw: - draw.font = self.thumbnail_font + draw.font = font draw.font_size = font_size - draw.fill_color = wand.color.Color(self.thumbnail_text_fill) - draw.stroke_color = wand.color.Color(self.thumbnail_text_stroke) + draw.fill_color = wand.color.Color(text_fill) + draw.stroke_color = wand.color.Color(text_stroke) draw.stroke_width = font_size * 5 / 32 draw.text_interline_spacing = -font_size / 4 draw.text(5, int(draw.font_size) + 5, text) @@ -34,9 +34,14 @@ class Text(dcc.doom_base.WadMap): text = "{}\n{}".format(text, parsed_args.demotype) with wand.image.Image( height=self.thumbnail_height, - width=self.thumbnail_height + width=self.thumbnail_width ) as img: - draw_text(img, text) + draw_text( + img, text, + self.thumbnail_font, + self.thumbnail_text_fill, + self.thumbnail_text_stroke + ) img.trim() img.reset_coords() img.save(filename=self.text_thumb_path()) From 105be2c5fd6da3c03d86125c6fa0bb99a530ef3e Mon Sep 17 00:00:00 2001 From: yrriban Date: Fri, 4 Jul 2025 12:08:25 -0400 Subject: [PATCH 2/4] Monkey patch in draw_text to save us some trouble (and avoid loading imagemagick stuff unless we really need it). --- dcc/concat.py | 5 +---- dcc/text.py | 15 +++++++-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dcc/concat.py b/dcc/concat.py index b84db62..6198de3 100644 --- a/dcc/concat.py +++ b/dcc/concat.py @@ -85,12 +85,9 @@ class Concat(dcc.doom_base.Wad): ) mapstring = v.name[-6:-4] text = self._config["map_names"][f"map{mapstring}"] - dcc.text.draw_text( + self.draw_text( img, f"MAP{mapstring}: {text}", - self.thumbnail_font, - self.thumbnail_text_fill, - self.thumbnail_text_stroke, font_size=120 ) img.trim(reset_coords=True) diff --git a/dcc/text.py b/dcc/text.py index 88660c9..3ab654c 100644 --- a/dcc/text.py +++ b/dcc/text.py @@ -1,15 +1,16 @@ +import dcc.config import dcc.doom_base import sys import wand.drawing import wand.image -def draw_text(img, text, font, text_fill, text_stroke, font_size=64): +def draw_text(self, img, text, font_size=64): with wand.drawing.Drawing() as draw: - draw.font = font + draw.font = self.thumbnail_font draw.font_size = font_size - draw.fill_color = wand.color.Color(text_fill) - draw.stroke_color = wand.color.Color(text_stroke) + draw.fill_color = wand.color.Color(self.thumbnail_text_fill) + draw.stroke_color = wand.color.Color(self.thumbnail_text_stroke) draw.stroke_width = font_size * 5 / 32 draw.text_interline_spacing = -font_size / 4 draw.text(5, int(draw.font_size) + 5, text) @@ -19,6 +20,7 @@ def draw_text(img, text, font, text_fill, text_stroke, font_size=64): draw.text(5, int(draw.font_size)+5, text) draw(img) +dcc.config.Base.draw_text = draw_text class Text(dcc.doom_base.WadMap): def get_parser(self, prog_name): @@ -36,11 +38,8 @@ class Text(dcc.doom_base.WadMap): height=self.thumbnail_height, width=self.thumbnail_width ) as img: - draw_text( + self.draw_text( img, text, - self.thumbnail_font, - self.thumbnail_text_fill, - self.thumbnail_text_stroke ) img.trim() img.reset_coords() From b56b0419e20d0ecb7d3d13b3fdd56e2a38f070b8 Mon Sep 17 00:00:00 2001 From: yrriban Date: Sun, 6 Jul 2025 14:10:20 -0400 Subject: [PATCH 3/4] Have configure inherit from doom_base.Wad so that it knows about wad-level parameters. --- dcc/configure.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/dcc/configure.py b/dcc/configure.py index e5a6c6a..0bc0e5f 100644 --- a/dcc/configure.py +++ b/dcc/configure.py @@ -1,12 +1,10 @@ -import dcc.config -import tomlkit -from tomlkit.toml_file import TOMLFile +import dcc.doom_base +import tomlkit.toml_file -class Configure(dcc.config.Base): +class Configure(dcc.doom_base.Wad): def get_parser(self, prog_name): parser = super().get_parser(prog_name) - parser.add_argument("wad") parser.add_argument("complevel") parser.add_argument("--iwad") return parser @@ -14,12 +12,12 @@ class Configure(dcc.config.Base): def take_action(self, parsed_args): new_config = self.pwad_path.joinpath(self.config_name) if new_config.exists(): - raise Exception("Config %s already exists.".format(new_config)) + raise Exception(f"Config {new_config} already exists.") doc = tomlkit.document() doc.add("complevel", parsed_args.complevel) if parsed_args.iwad is not None: doc.add("iwad", parsed_args.iwad) - f = TOMLFile(new_config) + f = tomlkit.toml_file.TOMLFile(new_config) f.write(doc) From 35894c26142a3321b3ad769f5b149f32bb95991c Mon Sep 17 00:00:00 2001 From: yrriban Date: Sun, 6 Jul 2025 14:33:42 -0400 Subject: [PATCH 4/4] PEP 8 compliance. --- dcc/text.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dcc/text.py b/dcc/text.py index 3ab654c..8e1ace9 100644 --- a/dcc/text.py +++ b/dcc/text.py @@ -5,7 +5,7 @@ import wand.drawing import wand.image -def draw_text(self, img, text, font_size=64): +def draw_text(self, img, text, font_size=64): with wand.drawing.Drawing() as draw: draw.font = self.thumbnail_font draw.font_size = font_size @@ -20,8 +20,10 @@ def draw_text(self, img, text, font_size=64): draw.text(5, int(draw.font_size)+5, text) draw(img) + dcc.config.Base.draw_text = draw_text + class Text(dcc.doom_base.WadMap): def get_parser(self, prog_name): parser = super().get_parser(prog_name)