From c30419c99def0b4d785ec68a4146e2e26433ce69 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Tue, 11 May 2021 16:35:44 -0500 Subject: [PATCH] text examples --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++ examples/text.nim | 12 +++++++++++ examples/text.png | Bin 0 -> 20972 bytes examples/text_spans.nim | 32 +++++++++++++++++++++++++++++ examples/text_spans.png | Bin 0 -> 18436 bytes tools/gen_readme.nim | 2 ++ 6 files changed, 90 insertions(+) create mode 100644 examples/text.nim create mode 100644 examples/text.png create mode 100644 examples/text_spans.nim create mode 100644 examples/text_spans.png diff --git a/README.md b/README.md index ce3a080..3b555b6 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,50 @@ z | ✅ | close path | ## Examples +### Text +[examples/text.nim](examples/text.nim) +```nim +var font = readFont("tests/fonts/Roboto-Regular_1.ttf") +font.size = 20 + +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, bounds = vec2(180, 180)), vec2(10, 10)) +``` +![example output](examples/text.png) + +### Text spans +[examples/text_spans.nim](examples/text_spans.nim) +```nim +let font = readFont("tests/fonts/Ubuntu-Regular_1.ttf") + +var style1 = font +style1.size = 12 +style1.paint.color = rgba(200, 200, 200, 255) + +var style2 = font +style2.size = 36 +style2.paint.color = rgba(0, 0, 0, 255) + +var style3 = font +style3.size = 13 +style3.paint.color = rgba(0, 127, 244, 255) + +var style4 = font +style4.size = 14 +style4.paint.color = rgba(80, 80, 80, 255) + +let spans = @[ + newSpan("verb [with object] ", style1), + newSpan("strallow\n", style2), + newSpan("\nstral·low\n", style3), + newSpan("\n1. free (something) from restrictive restrictions \"the regulations are intended to strallow changes in public policy\" ", style4) +] + +image.fillText(typeset(spans, bounds = vec2(180, 180)), vec2(10, 10)) +``` +![example output](examples/text_spans.png) + ### Square [examples/square.nim](examples/square.nim) ```nim diff --git a/examples/text.nim b/examples/text.nim new file mode 100644 index 0000000..0048b79 --- /dev/null +++ b/examples/text.nim @@ -0,0 +1,12 @@ +import pixie + +let image = newImage(200, 200) +image.fill(rgba(255, 255, 255, 255)) + +var font = readFont("tests/fonts/Roboto-Regular_1.ttf") +font.size = 20 + +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, bounds = vec2(180, 180)), vec2(10, 10)) +image.writeFile("examples/text.png") diff --git a/examples/text.png b/examples/text.png new file mode 100644 index 0000000000000000000000000000000000000000..7483842546afa22fcea61ee2667618d3f667aa1a GIT binary patch literal 20972 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 literal 0 HcmV?d00001 diff --git a/examples/text_spans.nim b/examples/text_spans.nim new file mode 100644 index 0000000..eae062f --- /dev/null +++ b/examples/text_spans.nim @@ -0,0 +1,32 @@ +import pixie + +let image = newImage(200, 200) +image.fill(rgba(255, 255, 255, 255)) + +let font = readFont("tests/fonts/Ubuntu-Regular_1.ttf") + +var style1 = font +style1.size = 12 +style1.paint.color = rgba(200, 200, 200, 255) + +var style2 = font +style2.size = 36 +style2.paint.color = rgba(0, 0, 0, 255) + +var style3 = font +style3.size = 13 +style3.paint.color = rgba(0, 127, 244, 255) + +var style4 = font +style4.size = 14 +style4.paint.color = rgba(80, 80, 80, 255) + +let spans = @[ + newSpan("verb [with object] ", style1), + newSpan("strallow\n", style2), + newSpan("\nstral·low\n", style3), + newSpan("\n1. free (something) from restrictive restrictions \"the regulations are intended to strallow changes in public policy\" ", style4) +] + +image.fillText(typeset(spans, bounds = vec2(180, 180)), vec2(10, 10)) +image.writeFile("examples/text_spans.png") diff --git a/examples/text_spans.png b/examples/text_spans.png new file mode 100644 index 0000000000000000000000000000000000000000..41bf361737657aabb2397de5c3cb1a7ba8d39e94 GIT binary patch literal 18436 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