From 786b0b2d5161b61d5bbe2a646e20120b855ffc68 Mon Sep 17 00:00:00 2001 From: Slavfox Date: Mon, 10 Feb 2020 22:02:56 +0100 Subject: [PATCH] Fix image generation --- .github/workflows/main.yml | 2 +- build.py | 30 +++++++++++++++++++----------- cozette_builder/imagegen.py | 16 ++++++++++++++++ img/sample.png | Bin 2417 -> 5918 bytes 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1105513..25c9725 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v2 - name: Build fonts run: | - pipenv install; pipenv run python build.py + pipenv install; pipenv run python build.py fonts - uses: ncipollo/release-action@v1 with: artifacts: "build/*" diff --git a/build.py b/build.py index af31d97..ccd0f16 100644 --- a/build.py +++ b/build.py @@ -1,6 +1,7 @@ import os import subprocess import tempfile +import argparse from dataclasses import dataclass from pathlib import Path from shlex import quote @@ -9,7 +10,8 @@ from typing import Optional, Sequence, cast import crayons # type: ignore -from cozette_builder.imagegen import read_sample, save_charlist, save_sample +from cozette_builder.imagegen import read_sample, save_charlist, \ + save_sample, add_margins from cozette_builder.ttfbuilder import TTFBuilder REPO_ROOT = Path(__file__).resolve().parent @@ -50,6 +52,7 @@ def save_images(bdfpath): ) subprocess.run(["xset", "-fp", tmpdirname]) subprocess.run(["xset", "fp", "rehash"]) + add_margins(REPO_ROOT / "img" / "sample.png", ) def fontforge(open: Path, generate: Sequence[Generate]): @@ -123,6 +126,9 @@ def fix_ttf(ttfpath: Path): if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("action", choices=["images", "fonts"]) + args = parser.parse_args() BUILD_DIR.mkdir(exist_ok=True) os.chdir(BUILD_DIR) print(crayons.blue("Building .bdf...")) @@ -131,13 +137,15 @@ if __name__ == "__main__": print(crayons.blue("Building bitmap formats...")) gen_bitmap_formats(bdfpath) print(crayons.green("Done!", bold=True)) - print(crayons.blue("Saving sample images...")) - save_images(bdfpath) - print(crayons.green("Done!", bold=True)) - print(crayons.blue("Generating TTF...")) - ttfbuilder = TTFBuilder.from_bdf_path(bdfpath) - ttfbuilder.build("cozette-tmp.ttf") - print(crayons.green("Done!", bold=True)) - print(crayons.blue("Fixing TTF...")) - fix_ttf(Path("cozette-tmp.ttf")) - print(crayons.green("Done!", bold=True)) + if args.action == "images": + print(crayons.blue("Saving sample images...")) + save_images(bdfpath) + print(crayons.green("Done!", bold=True)) + else: + print(crayons.blue("Generating TTF...")) + ttfbuilder = TTFBuilder.from_bdf_path(bdfpath) + ttfbuilder.build("cozette-tmp.ttf") + print(crayons.green("Done!", bold=True)) + print(crayons.blue("Fixing TTF...")) + fix_ttf(Path("cozette-tmp.ttf")) + print(crayons.green("Done!", bold=True)) diff --git a/cozette_builder/imagegen.py b/cozette_builder/imagegen.py index 6543bf5..5d6d616 100644 --- a/cozette_builder/imagegen.py +++ b/cozette_builder/imagegen.py @@ -4,6 +4,7 @@ from pathlib import Path from shlex import quote from typing import Dict, NamedTuple, Optional, Tuple from unicodedata import east_asian_width as charwidth +from PIL import Image, ImageOps from cozette_builder.bdffont import BdfFont @@ -151,3 +152,18 @@ def save_charlist(fnt: str, bdf_font: Path, output_path: Path): ), output_path, ) + + +def add_margins(sample_path: Path, color: str = "#282c34"): + im: Image.Image = Image.open(sample_path).convert("RGB") + new_w = round((im.height / 3) * 4) + im.load() + new_im = ImageOps.pad( + im, + (new_w, im.height), + method=Image.NEAREST, + color=color + ) + new_im.save(sample_path) + + diff --git a/img/sample.png b/img/sample.png index 0e93c5554c6e071f62fef5a2139f440411f7fcc6..026abacbadc5db4f6d3801adcf9e59eb44c10523 100644 GIT binary patch literal 5918 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 OgA8?zbv|l4NB<2$m%;e} literal 2417 zcmV-%36A!OP)fY00004XF*Lt006O% z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0000R zP)t-sC@eIGiNOB<|KxjSmYSEKp1bX@my))z|Ns9YWp1_r0004EOGiWqhTfHW000Qc zNklUG!anllU-$4fAsX_JCZ>+bEG0kkKqID=`ELlA=)v>)jA%~auV(*c7R^hZGV zZuqQqVsoIAyO)?_&mWh=s#vIx*eV2MtI(t)=S6Co(&!1@eH{d`T!a^ZNLgJkXmsx) zAYxW?3=K&^_jSOuQC$qmbcUttT0FHu1BL#LpTcxhN>+-ZN5j2x1U}l0e5l zm9s|dbqx9ipccoMpJ1t3d((xOqc!abs~}vNY<1JE;kND?+&S&Era569)V4%3Oxku* zWX>%G1(%HmF{T4A!76Ah18Q?YZNxl5ju^Q*mw{+M*w8o+f$8{9}q0j zV<5A=rdu-!*=!?)Hiu24Mr0WcmkCpLTj8hhndQ?3XE0tzccF|oP-p1oK^YSB?5;Z?1l5UUTS51Zqjw>w`x&5_&9?h&u6XMW zl6S;9SO^|u+(LHrhG~FU+NfIGdP@MsLf#^%+Y>~0^|~%{UdleKzwKX>@38>=h6e2% z`fZp6_pVbySaLXgFHl#+p>dakDucccbUs&Y+n%fHpoE{w8T5xhJv91{<^k~N_1}-@ z&zv;&!%5%6w3LFHk!5T3L7^w+B8~#}Mq$%T?|o)~dV4$$YFwK!P}IVY5>W51lU#MP z2dL@IM@XL}>0Xzv5wTpvSvG>2Nxzdc-E_%b=U zvKVO@#GonYvs5mbpiAksW`jx<$_5px#2^NF=T%R6jYcUO76qW-ea2fg5|PT+kzig# zjj^X#BjF|g^c3^om!2%)+l?`~T()V1AT@q|eT^WTmEEp>a>>%j{kx|DNlhCQGiSzW zCiaa64R5Z_&?p=aNDxY{Y4maV%+Y8v@RV=4Xdj_7I8c#B#24azjfpc|nMR8P$WJ!* z(P5Ec572%Zwc(ia3-$zs-`+O+nOjU3?8o36K?0R9-)=EoMP8Lb-$3HN0Poi+)kwb& zgDQ5WDq*&T12pngsx+wD=H3-~Q;L1ljjs~s+HLL~J>>|E>=3EEJG%9~s&eRABC0C;j3mSPEl}n~Z8-z7_nMT!ye-g|# z!EjDV!WywgtPyMUV>Du6VPRomVPRom`HLcE{`N(=6v8qmUXt*-K}1r23)n-3fgo-C#2EP;E5lI3U^GTr_r0Ma@79q|*n5X0fzw4=3DzqiUU?^L&^O?gBHTx2bA;!=Yb%Mka7;B%KJ!J)9HJa6l3>GbPelucw0VV@QPOj zyH|lGqeduTVPRomc?XdP*7ikAzpd;V3!a;?cEKD^xf_m@AsP!MIWEgUvd9?aAYoPk z#wn_BPkciTpNo~5#g0=Mm2Enlsmke^0N_+i2J=>L4wk7AKFZ1%2;v~6%0Y3BU``__ z1&ybR71Jr-bSkfp^qJ@kQa?x#XBfO;=*qz#gjqlm3U-;W%6)vg2(-f^?DX1sHp;@n z!t#41>jowC>Jo0M2saxwcM9p%^frTr;$gKd2_|qq$F5|#NvYe9vLLXFc;-_;;^foc zPLMNpku$cEc{UbirF1w^*;}j9D}%VSin|!zW(I(p-lc*hT11lNMPYN2?#oCEBI~UQ zedO6%xXFTyg2t{lAejTAo$9*UTh*i><+cI0fouotY&xR>I)oz5AdUOuMwRsm;|$(< z>oIa*)87Jm|59#*eziaPwyWKpE4gh_8j&B|^po@M9!R>ZE7KFJYK!FaJJED(*UOB9fjGv)H j(;N#63kwSi%Xi8Dlfq|szOJ=P00000NkvXXu0mjfhzD*a