{"id":13485497,"url":"https://github.com/indvd00m/java-ascii-render","last_synced_at":"2026-01-14T02:59:47.220Z","repository":{"id":57725230,"uuid":"74144531","full_name":"indvd00m/java-ascii-render","owner":"indvd00m","description":"ASCII renderer in pure java with no external dependencies","archived":false,"fork":false,"pushed_at":"2023-12-31T19:03:22.000Z","size":447,"stargazers_count":160,"open_issues_count":12,"forks_count":17,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-07-06T03:50:36.082Z","etag":null,"topics":["ascii","ascii-art","java","plot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/indvd00m.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-11-18T15:58:25.000Z","updated_at":"2025-02-15T19:28:14.000Z","dependencies_parsed_at":"2024-01-14T08:14:56.749Z","dependency_job_id":null,"html_url":"https://github.com/indvd00m/java-ascii-render","commit_stats":{"total_commits":134,"total_committers":3,"mean_commits":"44.666666666666664","dds":"0.014925373134328401","last_synced_commit":"e8bd9589a6d3ac2e7c455780dc41934d452556ae"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/indvd00m/java-ascii-render","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indvd00m%2Fjava-ascii-render","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indvd00m%2Fjava-ascii-render/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indvd00m%2Fjava-ascii-render/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indvd00m%2Fjava-ascii-render/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indvd00m","download_url":"https://codeload.github.com/indvd00m/java-ascii-render/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indvd00m%2Fjava-ascii-render/sbom","scorecard":{"id":487693,"data":{"date":"2025-08-11","repo":{"name":"github.com/indvd00m/java-ascii-render","commit":"e8bd9589a6d3ac2e7c455780dc41934d452556ae"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploy.yaml:1","Warn: no topLevel permission defined: .github/workflows/maven.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/indvd00m/java-ascii-render/deploy.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/indvd00m/java-ascii-render/deploy.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/indvd00m/java-ascii-render/maven.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/indvd00m/java-ascii-render/maven.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T18:13:14.642Z","repository_id":57725230,"created_at":"2025-08-19T18:13:14.642Z","updated_at":"2025-08-19T18:13:14.642Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ascii","ascii-art","java","plot"],"created_at":"2024-07-31T18:00:24.461Z","updated_at":"2026-01-14T02:59:47.199Z","avatar_url":"https://github.com/indvd00m.png","language":"Java","funding_links":[],"categories":["Projects"],"sub_categories":["CLI"],"readme":"# Java ASCII Render\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.indvd00m.ascii.render/ascii-render.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.indvd00m.ascii.render%22%20AND%20a:%22ascii-render%22)\n[![Java CI with Maven](https://github.com/indvd00m/java-ascii-render/actions/workflows/maven.yml/badge.svg)](https://github.com/indvd00m/java-ascii-render/actions/workflows/maven.yml)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=indvd00m_java-ascii-render\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=indvd00m_java-ascii-render)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=indvd00m_java-ascii-render\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=indvd00m_java-ascii-render)\n![GitHub](https://img.shields.io/github/license/indvd00m/java-ascii-render)\n\nASCII renderer in pure java with no external dependencies. Java ASCII Render supports graphical primitives/elements, layers, context, canvas.\n\n```\n                               EXPERIMENTAL RESULT                              \n                                                                                \n    Theme: Teleportation of matter through extremely dense elements             \n                                                                                \n    Date: 1998-11-19                                                            \n    Time: 08:47                                                                 \n    Subject: Gordon Freeman                                                     \n                                                                                \n    ┌──────────────────────────────────────┐    Observation of Einstein-Podo    \n    │ 1.00┼****                       *****│    lsky-Rosen Entanglement on S    \n    │ 0.75┼   ***                   ***    │    upraquantum Structures by In    \n    │ 0.50┼     **                 **      │    duction Through Nonlinear Tr    \n    │ 0.25┼       **             **        │    ansuranic Crystal of Extreme    \n    │ 0.00┼        **           **         │    ly Long Wavelength (ELW) Pul    \n    │-0.25┼         ***       ***          │    se from Mode-Locked Source A    \n    │-0.50┼           *********            │    rray shows a very promising     \n    │-0.75┼               *                │    result.                         \n    │-1.00┼───────┼───────┼───────┼───────┼│                                    \n    │     0      90      180     270    360│                 *******************\n    └──────────────────────────────────────┘                 CONCLUSION: APPROVE\n```\n\n## Download and Install\n\nTo download and install Java ASCII Render you currently have the following options.\n\n**Maven**\n\nAdd dependency to `com.indvd00m.ascii.render:ascii-render`:\n\n```xml\n\t\u003cdependency\u003e\n\t\t\u003cgroupId\u003ecom.indvd00m.ascii.render\u003c/groupId\u003e\n\t\t\u003cartifactId\u003eascii-render\u003c/artifactId\u003e\n\t\t\u003cversion\u003e2.2.0\u003c/version\u003e\n\t\u003c/dependency\u003e\n```\n\n**Plain-old JAR**\n\nDownload the following JARs and add them to your classpath:\n\n * [ascii-render.jar](https://search.maven.org/search?q=g:%22com.indvd00m.ascii.render%22%20AND%20a:%22ascii-render%22)\n * [ascii-render-api.jar](https://search.maven.org/search?q=g:%22com.indvd00m.ascii.render%22%20AND%20a:%22ascii-render-api%22)\n\n## Compatibility\n\nJava ASCII Render requires Java 6 (or higher). \n\n## Available graphical elements and usage examples\n\n### Rectangle\n```\n┌──────────────────┐\n│                  │\n│                  │\n│                  │\n│                  │\n│                  │\n│                  │\n│                  │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Dot\n```\n┌──────────────────┐\n│                  │\n│                  │\n│                  │\n│                  │\n│         *        │\n│                  │\n│                  │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Dot());\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Line\n```\n┌──────────────────┐\n│                  │\n│ ●●               │\n│   ●●●            │\n│      ●●●         │\n│         ●●●      │\n│            ●●●   │\n│               ●● │\n│                  │\n└──────────────────┘\n\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Line(new Point(2, 2), new Point(17, 7)));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Circle\n```\n┌──────────────────┐\n│       ***        │\n│      *   *       │\n│     *     *      │\n│     *     *      │\n│     *     *      │\n│      *   *       │\n│       ***        │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Circle(9, 4, 3));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Ellipse\n```\n┌──────────────────┐\n│     *******      │\n│   **       **    │\n│                  │\n│ *             *  │\n│                  │\n│   **       **    │\n│     *******      │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Ellipse(9, 4, 14, 6));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Label\n\nSingle-line string.\n\n```\n┌──────────────────┐\n│                  │\n│                  │\n│                  │\n│Label with long t…│\n│                  │\n│                  │\n│                  │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Label(\"Label with long text\", 1, 4, 18));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Text\n\nMultiline string.\n\n```\n┌──────────────────┐\n│                  │\n│                  │\n│Lorem Ipsum is sim│\n│ply dummy text of │\n│the printing and …│\n│                  │\n│                  │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(20).height(10);\n\t\tbuilder.element(new Rectangle());\n\t\tbuilder.element(new Text(\"Lorem Ipsum is simply dummy text of the printing and typesetting industry.\", 1, 3, 18, 3));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### PseudoText\n\nAntialising option is customizable, enabled by default.\n\n```\n                                                ██                                                    \n ██████▒                                        ██           ██████████                         ██    \n ██ ░░██▒                                       ██               ██                             ██    \n ██   ░██                                       ██               ██                             ██    \n ██   ░██  ░▒████▓▒   ░▓███▒    ██    ██   ▒███▒██   ▒████░      ██       ░▓███▒   ▓██░░██▓   ███████ \n ██   ░██  ▓█▓░░░▒▓  ░██░░██░   ██    ██  ░██░░███  ░██░░██░     ██      ░██░░██░  ░██▓▓██░     ██    \n ██ ░░██▒  ██▒░      ▓█▒  ░█▓   ██    ██  ▓█▒  ▒██  ▓█▒  ▒█▓     ██      ▓█▒  ░█▓   ░████░      ██    \n ██████▒   ▓████▓▒   ██░  ░██   ██    ██  ██░  ░██  ██░  ░██     ██      ██░  ░██    ▒██▒       ██    \n ██        ░▓█████▒  ████████   ██    ██  ██░  ░██  ██░  ░██     ██      ████████    ░██░       ██    \n ██           ░░▓██  ██░        ██░  ░██  ██░  ░██  ██░  ░██     ██      ██░         ▓██▓       ██    \n ██             ░██  ▓█▒        ██░  ░██  ▓█▒  ▒██  ▓█▒  ▒█▓     ██      ▓█▒        ▒████▒      ██░   \n ██        █▒░░░▓█▓  ░██▒░░▒▓   ▓█▓░░███  ░██░░███  ░██░░██░     ██      ░██▒░░▒▓  ░██▒▒██░     ▓█▒░  \n ██        ░▓████▒░   ░▓███▓░   ░▓███░██   ▒███▒██   ▒████▒      ██       ░▓███▓░  ▓██░░██▓     ░▓███ \n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(120).height(20);\n\t\tbuilder.element(new PseudoText(\"PseudoText\"));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Plot\n\nPlot with axis and labels based on array of points.\n\n```\n┌──────────────────────────────────────────────────────────────────────────────┐\n│ 3.73┼              *                                  **                     │\n│     │             **                                  *                      │\n│     │             *                                  **                      │\n│     │            *                                  **                       │\n│ 1.87┼          **                                 ***                        │\n│     │       ****                               ****                          │\n│     │  ******                              *****                             │\n│     │***                             *******                             ****│\n│-0.00┼                            *****                              ******   │\n│     │                         ****                               ****        │\n│     │                       ***                                 **           │\n│     │                      **                                  *             │\n│-1.87┼                     **                                  *              │\n│     │                     *                                  **              │\n│     │                    **                                  *               │\n│     │                                                        *               │\n│-3.73┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼│\n│     0                90                180               270              360│\n└──────────────────────────────────────────────────────────────────────────────┘\n```\n```java\n\t\tList\u003cIPlotPoint\u003e points = new ArrayList\u003cIPlotPoint\u003e();\n\t\tfor (int degree = 0; degree \u003c= 360; degree++) {\n\t\t\tif (degree \u003e 75 \u0026\u0026 degree \u003c 105) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (degree \u003e 255 \u0026\u0026 degree \u003c 285) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdouble val = Math.tan(Math.toRadians(degree));\n\t\t\tIPlotPoint plotPoint = new PlotPoint(degree, val);\n\t\t\tpoints.add(plotPoint);\n\t\t}\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(80).height(20);\n\t\tbuilder.element(new Rectangle(0, 0, 80, 20));\n\t\tbuilder.layer(new Region(1, 1, 78, 18));\n\t\tbuilder.element(new Axis(points, new Region(0, 0, 78, 18)));\n\t\tbuilder.element(new AxisLabels(points, new Region(0, 0, 78, 18)));\n\t\tbuilder.element(new Plot(points, new Region(0, 0, 78, 18)));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Table\n\nTable with rows and columns.\n\n```\n┌────────┬────────┬────────┬────────┐\n│12345678│        │        │        │\n├────────┼────────┼────────┼────────┤\n│        │        │        │        │\n├────────╆━━━━━━━━╅────────╆━━━━━━━━┪\n│        ┃        ┃        ┃1234567…┃\n└────────┺━━━━━━━━┹────────┺━━━━━━━━┛\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(37).height(7);\n\t\tTable table = new Table(4, 3);\n\t\ttable.setElement(1, 1, new Label(\"1234567890\"));\n\t\ttable.setElement(4, 3, new Text(\"1234567890\"), true);\n\t\ttable.setHighlighted(2, 3, true);\n\t\tbuilder.element(table);\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n### Overlay\n\nPossibility to combine results of several renders.\n\n```\n┌──────────────────┐\n│                  │\n│                  │\n│Lore┌───────┐s sim│\n│ply │Overlay│t of │\n│the └───────┘and …│\n│                  │\n│                  │\n│                  │\n└──────────────────┘\n```\n```java\n\t\tIRender render1 = new Render();\n\t\tIContextBuilder builder1 = render1.newBuilder();\n\t\tbuilder1.width(9).height(3);\n\t\tbuilder1.element(new Rectangle());\n\t\tbuilder1.element(new Text(\"Overlay\", 1, 1, 7, 1));\n\t\tICanvas canvas1 = render1.render(builder1.build());\n\n\t\tIRender render2 = new Render();\n\t\tIContextBuilder builder2 = render2.newBuilder();\n\t\tbuilder2.width(20).height(10);\n\t\tbuilder2.element(new Rectangle());\n\t\tbuilder2.element(\n\t\t\t\tnew Text(\"Lorem Ipsum is simply dummy text of the printing and typesetting industry.\", 1, 3, 18, 3));\n\t\tbuilder2.element(new Overlay(5, 3, canvas1, true));\n\t\tICanvas canvas2 = render2.render(builder2.build());\n\t\tString s = canvas2.getText();\n\t\tSystem.out.println(s);\n```\n\n### PseudoCanvas\n\nIn some cases you can get better results by synthetic increasing of \"pixel resolution\". This is possible by calling \n`render.setPseudoCanvas(true)` method. After that render would use `▖▗▘▙▚▛▜▝▞▟▄▐▌▀█ ` chars for drawing 4 points in 1 char. \nThis is would work only if you do not use any special symbols for drawing (but you still can use Overlay to combine \ntwo different renders).\n\nExample 1: line in 30x10 resolution:\n```\n██                            \n  ███                         \n     ████                     \n         ███                  \n            ███               \n               ███            \n                  ███         \n                     ████     \n                         ███  \n                            ██\n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(30).height(10);\n\t\tbuilder.element(new Line(new Point(0, 0), new Point(29, 9), '█'));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\nAnd same line in 60x20 resolution:\n```\n▀▄▖                           \n  ▝▀▄▖                        \n     ▝▀▄▄                     \n         ▀▚▄                  \n            ▀▚▄               \n               ▀▚▄            \n                  ▀▚▄         \n                     ▀▀▄▖     \n                        ▝▀▄▖  \n                           ▝▀▄\n```\n```java\n\t\tIRender render = new Render();\n\t\trender.setPseudoCanvas(true);\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(60).height(20);\n\t\tbuilder.element(new Line(new Point(0, 0), new Point(59, 19)));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\nExample 2: pseudo text in 60x10 resolution:\n```\n                                                            \n                          █                                 \n ███                      █      █████                      \n █  █                     █        █               █        \n █  █ ████   ██  █  █   ███  ██    █    ██  █  █  ████      \n ███  █     █  █ █  █  █  █ █  █   █   █  █  ██    █        \n █     ███  ████ █  █  █  █ █  █   █   ████  ██    █        \n █       █  █    █  █  █  █ █  █   █   █     ██    █        \n █    ████   ███ ████   ███  ██    █    ███ █  █   ███      \n                                                            \n```\n```java\n\t\tIRender render = new Render();\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(60).height(10);\n\t\tbuilder.element(new PseudoText(\"PseudoText\", false));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\nAnd same pseudo text in 120x20 resolution:\n```\n                                                            \n                                                            \n                        ▄                                   \n▐▛▀▙                    █      ▀▀█▀▀            ▐▌          \n▐▌ ▐▌ ▗▄▄   ▄▄  ▄  ▄  ▄▖█  ▗▄▖   █   ▗▄▖  ▄▖▗▄ ▗▟▙▄         \n▐▌ ▟▘▐▌  ▘ ▟▘▝▙ █  █ ▟▘▝█ ▗▛ ▜▖  █  ▗▛ ▜▖ ▝██▘  ▐▌          \n▐▛▀▘ ▝██▙▖ █▄▄█ █  █ █  █ ▐▌ ▐▌  █  ▐▙▄▟▌  ▐▌   ▐▌          \n▐▌      ▜▌ █    █  █ █  █ ▐▌ ▐▌  █  ▐▌     ██   ▐▌          \n▐▌   ▝▄▄▞▘ ▝▙▄▞ ▜▙▞█ ▝▙▞█  ▜▄▛   █   ▜▄▄▘ ▟▌▐▙  ▝▙▄         \n                                                            \n```\n```java\n\t\tIRender render = new Render();\n\t\trender.setPseudoCanvas(true);\n\t\tIContextBuilder builder = render.newBuilder();\n\t\tbuilder.width(120).height(20);\n\t\tbuilder.element(new PseudoText(\"PseudoText\", false));\n\t\tICanvas canvas = render.render(builder.build());\n\t\tString s = canvas.getText();\n\t\tSystem.out.println(s);\n```\n\n\n## Download release\n\nhttps://github.com/indvd00m/java-ascii-render/releases\n\n## Release notes\n\n### Version 0.9.0\n- First release. Project reworked from https://github.com/indvd00m/java-ascii-plotter\n\n### Version 1.0.0\n- Reworking API. Add new elements.\n\n### Version 1.1.0\n- Add PseudoText element.\n- Use Bresenham's algorithm for line drawing.\n\n### Version 1.2.0\n- Simplify extending existing elements.\n\n### Version 1.2.1\n- Pass axis type to format method in AxisLabels element.\n\n### Version 1.2.2\n- Add deploy to maven central.\n\n### Version 1.2.3\n- Add url to pom's.\n\n### Version 1.2.4\n- Add some useful methods to builder.\n\n### Version 1.3.0\n- Add table element.\n\n### Version 1.4.0\n- Add overlay element.\n- Added possibility to trim canvas.\n- Simplified extending of existing implementation.\n\n### Version 1.5.0\n- Improved canvas draw performance.\n\n### Version 2.0.0\n- Canvas now is empty by default - contains only \\0 and \\n symbols. Previous Canvas implementation contained \\s and \n\\n symbols. This new changes break backward compatibility for drawing behavior in some cases (but do not break compile \ntime API compatibility). Now overlapping of layers would work correctly when you directly draw spaces \\s to layer.\n- Added opacity for layers.\n\n### Version 2.1.0\n- Added table cells highlighting.\n\n### Version 2.1.1\n- Added some useful constructors.\n\n### Version 2.1.2\n- Fixed javadoc.\n\n### Version 2.1.3\n- Simplified extending of Table element.\n\n### Version 2.2.0\n- Added possibility to increase \"pixel\" resolution.\n\n## Roadmap\n\nThis component is developed as a hobby with no public roadmap or any guarantees of upcoming releases. That said, the following features are planned for upcoming releases:\n- Fluent API for elements.\n\n## Issue tracking\n\nThe issues for this project are tracked on its github.com page. All bug reports and feature requests are appreciated. \n\n## Building and running tests\n```bash\ngit clone https://github.com/indvd00m/java-ascii-render.git\ncd java-ascii-render\nmvn clean install\n```\n\n## Contributions\n\nContributions are welcome, but there are no guarantees that they are accepted as such. Process for contributing is the following:\n- Fork this project\n- Create an issue to this project about the contribution (bug or feature) if there is no such issue about it already. Try to keep the scope minimal.\n- Develop and test the fix or functionality carefully. Only include minimum amount of code needed to fix the issue.\n- Refer to the fixed issue in commit\n- Send a pull request for the original project\n- Comment on the original issue that you have implemented a fix for it\n\n## License \u0026 Author\n\nJava ASCII Render is distributed under Apache License 2.0. For license terms, see LICENSE.\n\nJava ASCII Render is written by David E. Veliev.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findvd00m%2Fjava-ascii-render","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findvd00m%2Fjava-ascii-render","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findvd00m%2Fjava-ascii-render/lists"}