From 5344d5f9e26636ee9985043158c9faa769b1f366 Mon Sep 17 00:00:00 2001 From: treeform Date: Mon, 13 Apr 2026 21:13:12 -0700 Subject: [PATCH 1/3] only write examples when we need them --- examples/blur.nim | 4 ++-- examples/common.nim | 12 ++++++++++++ examples/gradient.nim | 4 ++-- examples/heart.nim | 4 ++-- examples/image_tiled.nim | 4 ++-- examples/line.nim | 4 ++-- examples/masking.nim | 4 ++-- examples/rounded_rectangle.nim | 4 ++-- examples/shadow.nim | 4 ++-- examples/square.nim | 4 ++-- examples/text.nim | 4 ++-- examples/text.png | Bin 17715 -> 15961 bytes examples/text_spans.nim | 4 ++-- examples/tiger.nim | 4 ++-- 14 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 examples/common.nim diff --git a/examples/blur.nim b/examples/blur.nim index 589e41be..ced56923 100644 --- a/examples/blur.nim +++ b/examples/blur.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let trees = readImage("examples/data/trees.png") @@ -19,4 +19,4 @@ blur.draw(mask, blendMode = MaskBlend) image.draw(trees) image.draw(blur) -image.writeFile("examples/blur.png") +image.writeFile(outputPath("blur.png")) diff --git a/examples/common.nim b/examples/common.nim new file mode 100644 index 00000000..475f1762 --- /dev/null +++ b/examples/common.nim @@ -0,0 +1,12 @@ +import os + +proc outputPath*(fileName: string): string = + if paramCount() >= 1: + result = + if paramStr(1) == "--" and paramCount() >= 2: + paramStr(2) + else: + paramStr(1) + createDir(parentDir(result)) + else: + result = "examples" / fileName diff --git a/examples/gradient.nim b/examples/gradient.nim index 129f7e81..c915ae89 100644 --- a/examples/gradient.nim +++ b/examples/gradient.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -26,4 +26,4 @@ image.fillPath( paint ) -image.writeFile("examples/gradient.png") +image.writeFile(outputPath("gradient.png")) diff --git a/examples/heart.nim b/examples/heart.nim index ebff8d87..2a931921 100644 --- a/examples/heart.nim +++ b/examples/heart.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -15,4 +15,4 @@ image.fillPath( parseHtmlColor("#FC427B").rgba ) -image.writeFile("examples/heart.png") +image.writeFile(outputPath("heart.png")) diff --git a/examples/image_tiled.nim b/examples/image_tiled.nim index b64d39da..2d8b2e62 100644 --- a/examples/image_tiled.nim +++ b/examples/image_tiled.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -15,4 +15,4 @@ paint.image = readImage("examples/data/mandrill.png") paint.imageMat = scale(vec2(0.08, 0.08)) image.fillPath(path, paint) -image.writeFile("examples/image_tiled.png") +image.writeFile(outputPath("image_tiled.png")) diff --git a/examples/line.nim b/examples/line.nim index dc9e7c3a..918256ff 100644 --- a/examples/line.nim +++ b/examples/line.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -13,4 +13,4 @@ let ctx.strokeSegment(segment(start, stop)) -image.writeFile("examples/line.png") +image.writeFile(outputPath("line.png")) diff --git a/examples/masking.nim b/examples/masking.nim index db9bf74e..a1ca95c9 100644 --- a/examples/masking.nim +++ b/examples/masking.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) @@ -29,4 +29,4 @@ mask.fillPath( lines.draw(mask, blendMode = MaskBlend) image.draw(lines) -image.writeFile("examples/masking.png") +image.writeFile(outputPath("masking.png")) diff --git a/examples/rounded_rectangle.nim b/examples/rounded_rectangle.nim index c5006947..f704e83c 100644 --- a/examples/rounded_rectangle.nim +++ b/examples/rounded_rectangle.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -13,4 +13,4 @@ let ctx.fillRoundedRect(rect(pos, wh), r) -image.writeFile("examples/rounded_rectangle.png") +image.writeFile(outputPath("rounded_rectangle.png")) diff --git a/examples/shadow.nim b/examples/shadow.nim index 1e4d372c..4d8353bc 100644 --- a/examples/shadow.nim +++ b/examples/shadow.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -19,4 +19,4 @@ let shadow = polygonImage.shadow( image.draw(shadow) image.draw(polygonImage) -image.writeFile("examples/shadow.png") +image.writeFile(outputPath("shadow.png")) diff --git a/examples/square.nim b/examples/square.nim index 7c544b24..355df430 100644 --- a/examples/square.nim +++ b/examples/square.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -12,4 +12,4 @@ let ctx.fillRect(rect(pos, wh)) -image.writeFile("examples/square.png") +image.writeFile(outputPath("square.png")) diff --git a/examples/text.nim b/examples/text.nim index 5dd45c25..6678e532 100644 --- a/examples/text.nim +++ b/examples/text.nim @@ -1,4 +1,4 @@ -import pixie +import pixie, common let image = newImage(200, 200) image.fill(rgba(255, 255, 255, 255)) @@ -10,4 +10,4 @@ font.paint.color = color(1, 0, 0) let text = "Typesetting is the arrangement and composition of text in graphic design and publishing in both digital and traditional medias." image.fillText(font.typeset(text, vec2(180, 180)), translate(vec2(10, 10))) -image.writeFile("examples/text.png") +image.writeFile(outputPath("text.png")) diff --git a/examples/text.png b/examples/text.png index 890dba1f4ab314e2d5b4bb71a2446070961758b7..8c3e7f6074fa231def805ee2ed6f386291626ca5 100644 GIT binary patch literal 15961 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