diff --git a/.gitignore b/.gitignore index f567bac..606b05b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,14 @@ **/target/ -.idea/ - +### IntelliJ IDEA ### +.idea +out +*.iws +*.iml +*.ipr out/ cov-int/ java-ascii-render.tgz + diff --git a/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/ICanvas.java b/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/ICanvas.java index bc527a4..c3c4e82 100644 --- a/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/ICanvas.java +++ b/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/ICanvas.java @@ -17,6 +17,14 @@ public interface ICanvas { */ String getText(); + /** + * One line of canvas, without trailed new line symbol. + * + * @param index index of line, from top to bottom + * @return + */ + String getLine(int index); + /** * Height of canvas. * diff --git a/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/IImageRender.java b/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/IImageRender.java new file mode 100644 index 0000000..960e3a8 --- /dev/null +++ b/ascii-render-api/src/main/java/com/indvd00m/ascii/render/api/IImageRender.java @@ -0,0 +1,22 @@ +package com.indvd00m.ascii.render.api; + +import java.awt.image.BufferedImage; + +/** + * An image render. Image render can create and render images from {@link ICanvas}. + * + * @author indvd00m (gotoindvdum[at]gmail[dot]com) + * @since 2.3.0 + */ +public interface IImageRender { + + /** + * Render canvas to image. Width of image will be calculated + * + * @param canvas canvas of text + * @param height height of image in pixels + * @return + */ + BufferedImage render(ICanvas canvas, int height); + +} diff --git a/ascii-render/src/main/java/com/indvd00m/ascii/render/Canvas.java b/ascii-render/src/main/java/com/indvd00m/ascii/render/Canvas.java index fd45624..16da420 100644 --- a/ascii-render/src/main/java/com/indvd00m/ascii/render/Canvas.java +++ b/ascii-render/src/main/java/com/indvd00m/ascii/render/Canvas.java @@ -2,6 +2,7 @@ import com.indvd00m.ascii.render.api.ICanvas; import com.indvd00m.ascii.render.api.IRegion; +import com.indvd00m.ascii.render.util.AsciiUtils; import java.util.ArrayList; import java.util.Iterator; @@ -13,7 +14,8 @@ */ public class Canvas implements ICanvas { - public static final char NULL_CHAR = '\0'; + @Deprecated + public static final char NULL_CHAR = AsciiUtils.NULL_CHAR; protected final int width; protected final int height; @@ -149,6 +151,11 @@ public String getText() { return cachedText; } + @Override + public String getLine(int index) { + return lines.get(index).toString().replace(NULL_CHAR, ' '); + } + @Override public String toString() { return getText(); diff --git a/ascii-render/src/main/java/com/indvd00m/ascii/render/ImageRender.java b/ascii-render/src/main/java/com/indvd00m/ascii/render/ImageRender.java new file mode 100644 index 0000000..70d2327 --- /dev/null +++ b/ascii-render/src/main/java/com/indvd00m/ascii/render/ImageRender.java @@ -0,0 +1,92 @@ +package com.indvd00m.ascii.render; + +import com.indvd00m.ascii.render.api.ICanvas; +import com.indvd00m.ascii.render.api.IImageRender; +import com.indvd00m.ascii.render.util.AsciiUtils; + +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; + +import static com.indvd00m.ascii.render.util.AsciiUtils.repeatChar; + +/** + * @author indvd00m (gotoindvdum[at]gmail[dot]com) + * @since 2.3.0 + */ +public class ImageRender implements IImageRender { + + public static final int FONT_REPLICA_STYLE = 24; + public static final char SAMPLE_SYMBOL = ' '; + protected final Font font; + + public ImageRender() { + this(AsciiUtils.readDejaVuSansMonoFont()); + } + + /** + * @param font monospaced font + */ + public ImageRender(Font font) { + this.font = font; + } + + @Override + public BufferedImage render(final ICanvas canvas, final int height) { + int textWidth = canvas.getWidth(); + int textHeight = canvas.getHeight(); + + Font fontReplica = getFont().deriveFont(FONT_REPLICA_STYLE); + + final int ascent; + final int leading; + final int linesWidth; + float lineHeight = ((float) height) / textHeight; + + { + int sampleWidth = (int) ((float) height * textWidth / textHeight); + String sampleString = repeatChar(SAMPLE_SYMBOL, textWidth); + BufferedImage sampleImage = new BufferedImage(sampleWidth, height, BufferedImage.TYPE_INT_RGB); + Graphics2D sampleGraphics = sampleImage.createGraphics(); + sampleGraphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON); + sampleGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + + FontMetrics fm = sampleGraphics.getFontMetrics(fontReplica); + Rectangle2D r2d = fm.getStringBounds(sampleString, sampleGraphics); + float leadingFactor = (float) fm.getLeading() / fm.getHeight(); + float size = (float) (fontReplica.getSize2D() * lineHeight / (r2d.getHeight() - r2d.getHeight() * leadingFactor)); + fontReplica = fontReplica.deriveFont(size); + fm = sampleGraphics.getFontMetrics(fontReplica); + ascent = fm.getAscent(); + leading = fm.getLeading(); + linesWidth = (int) fm.getStringBounds(sampleString, sampleGraphics).getWidth(); + } + + BufferedImage image = new BufferedImage(linesWidth, height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = image.createGraphics(); + graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + + Color fontColor = Color.BLACK; + Color backgroundColor = Color.WHITE; + + graphics.setFont(fontReplica); + graphics.setColor(backgroundColor); + graphics.fillRect(0, 0, linesWidth, height); + graphics.setColor(fontColor); + for (int i = 0; i < textHeight; i++) { + String line = canvas.getLine(i); + graphics.drawString(line, 0, lineHeight * i + ascent + leading); + } + + return image; + } + + + public Font getFont() { + return font; + } + +} diff --git a/ascii-render/src/main/java/com/indvd00m/ascii/render/elements/PseudoText.java b/ascii-render/src/main/java/com/indvd00m/ascii/render/elements/PseudoText.java index 3806dbf..307e193 100644 --- a/ascii-render/src/main/java/com/indvd00m/ascii/render/elements/PseudoText.java +++ b/ascii-render/src/main/java/com/indvd00m/ascii/render/elements/PseudoText.java @@ -6,13 +6,11 @@ import com.indvd00m.ascii.render.api.IElement; import com.indvd00m.ascii.render.api.IPoint; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; + +import static com.indvd00m.ascii.render.util.AsciiUtils.readDejaVuSansMonoFont; /** * PseudoText element. Default font DejaVu Sans Mono. @@ -149,7 +147,7 @@ public IPoint draw(ICanvas canvas, IContext context) { graphics.setColor(fontColor); graphics.drawString(text, 0, ascent + leading); - // writeImageToPNG(image, "/tmp/pseudotext.png"); + // AsciiUtils.writeImageToPNG(image, "/tmp/pseudotext.png"); for (int imgX = 0; imgX < width; imgX++) { for (int imgY = 0; imgY < height; imgY++) { @@ -205,35 +203,6 @@ protected double getColorDistance(Color c1, Color c2) { return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b); } - protected Font createFont() { - InputStream is = null; - try { - is = getClass().getResourceAsStream("/fonts/DejaVuSansMono/DejaVuSansMono.ttf"); - Font font = Font.createFont(Font.TRUETYPE_FONT, is); - return font; - } catch (FontFormatException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - } - - protected void writeImageToPNG(BufferedImage image, String path) { - try { - ImageIO.write(image, "png", new File(path)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public String getText() { return text; } @@ -252,7 +221,7 @@ public int getHeight() { public Font getFont() { if (font == null) { - font = createFont(); + font = readDejaVuSansMonoFont(); } return font; } diff --git a/ascii-render/src/main/java/com/indvd00m/ascii/render/util/AsciiUtils.java b/ascii-render/src/main/java/com/indvd00m/ascii/render/util/AsciiUtils.java new file mode 100644 index 0000000..fce7880 --- /dev/null +++ b/ascii-render/src/main/java/com/indvd00m/ascii/render/util/AsciiUtils.java @@ -0,0 +1,56 @@ +package com.indvd00m.ascii.render.util; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author indvd00m (gotoindvdum[at]gmail[dot]com) + * @since 2.3.0 + */ +public class AsciiUtils { + + public static final char NULL_CHAR = '\0'; + public static final String PNG_FORMAT = "png"; + + public static String repeatChar(char c, int count) { + return repeatString(c + "", count); + } + + public static String repeatString(String s, int count) { + String repeated = new String(new char[count]).replace(NULL_CHAR + "", s); + return repeated; + } + + public static Font readDejaVuSansMonoFont() { + InputStream is = null; + try { + is = AsciiUtils.class.getResourceAsStream("/fonts/DejaVuSansMono/DejaVuSansMono.ttf"); + Font font = Font.createFont(Font.TRUETYPE_FONT, is); + return font; + } catch (FontFormatException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + + public static void writeImageToPNG(BufferedImage image, String path) { + try { + ImageIO.write(image, PNG_FORMAT, new File(path)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestCanvas.java b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestCanvas.java index 2aea94f..fccb80a 100644 --- a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestCanvas.java +++ b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestCanvas.java @@ -776,4 +776,142 @@ public void test28() { assertFalse(canvas2.equals(canvas1)); } + @Test + public void test29() { + ICanvas canvas = new Canvas(10, 5); + String s = ""; + s += " \n"; + s += " \n"; + s += " \n"; + s += " \n"; + s += " "; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" ", canvas.getLine(0)); + assertEquals(" ", canvas.getLine(1)); + assertEquals(" ", canvas.getLine(2)); + assertEquals(" ", canvas.getLine(3)); + assertEquals(" ", canvas.getLine(4)); + + canvas.draw(0, 1, '1'); + s = ""; + s += " \n"; + s += "1 \n"; + s += " \n"; + s += " \n"; + s += " "; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" ", canvas.getLine(0)); + assertEquals("1 ", canvas.getLine(1)); + assertEquals(" ", canvas.getLine(2)); + assertEquals(" ", canvas.getLine(3)); + assertEquals(" ", canvas.getLine(4)); + + canvas.draw(0, 1, "123"); + s = ""; + s += " \n"; + s += "123 \n"; + s += " \n"; + s += " \n"; + s += " "; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" ", canvas.getLine(0)); + assertEquals("123 ", canvas.getLine(1)); + assertEquals(" ", canvas.getLine(2)); + assertEquals(" ", canvas.getLine(3)); + assertEquals(" ", canvas.getLine(4)); + + canvas.draw(8, 0, "12345"); + s = ""; + s += " 12\n"; + s += "123 \n"; + s += " \n"; + s += " \n"; + s += " "; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 ", canvas.getLine(1)); + assertEquals(" ", canvas.getLine(2)); + assertEquals(" ", canvas.getLine(3)); + assertEquals(" ", canvas.getLine(4)); + + canvas.draw(4, 2, "line1\nline2\nline3"); + s = ""; + s += " 12\n"; + s += "123 \n"; + s += " line1 \n"; + s += " line2 \n"; + s += " line3 "; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 ", canvas.getLine(1)); + assertEquals(" line1 ", canvas.getLine(2)); + assertEquals(" line2 ", canvas.getLine(3)); + assertEquals(" line3 ", canvas.getLine(4)); + + canvas.draw(6, 2, "1line\n2line\n3line"); + s = ""; + s += " 12\n"; + s += "123 \n"; + s += " li1lin\n"; + s += " li2lin\n"; + s += " li3lin"; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 ", canvas.getLine(1)); + assertEquals(" li1lin", canvas.getLine(2)); + assertEquals(" li2lin", canvas.getLine(3)); + assertEquals(" li3lin", canvas.getLine(4)); + + canvas.draw(6, 4, "1line\n2line\n3line"); + s = ""; + s += " 12\n"; + s += "123 \n"; + s += " li1lin\n"; + s += " li2lin\n"; + s += " li1lin"; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 ", canvas.getLine(1)); + assertEquals(" li1lin", canvas.getLine(2)); + assertEquals(" li2lin", canvas.getLine(3)); + assertEquals(" li1lin", canvas.getLine(4)); + + canvas.draw(5, 1, '1', 3); + s = ""; + s += " 12\n"; + s += "123 111 \n"; + s += " li1lin\n"; + s += " li2lin\n"; + s += " li1lin"; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 111 ", canvas.getLine(1)); + assertEquals(" li1lin", canvas.getLine(2)); + assertEquals(" li2lin", canvas.getLine(3)); + assertEquals(" li1lin", canvas.getLine(4)); + + canvas.draw(5, 1, "12", 3); + s = ""; + s += " 12\n"; + s += "123 12121\n"; + s += " li1lin\n"; + s += " li2lin\n"; + s += " li1lin"; + System.out.println(canvas.getText()); + assertEquals(s, canvas.getText()); + assertEquals(" 12", canvas.getLine(0)); + assertEquals("123 12121", canvas.getLine(1)); + assertEquals(" li1lin", canvas.getLine(2)); + assertEquals(" li2lin", canvas.getLine(3)); + assertEquals(" li1lin", canvas.getLine(4)); + } + } diff --git a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestImageRender.java b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestImageRender.java new file mode 100644 index 0000000..74be034 --- /dev/null +++ b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestImageRender.java @@ -0,0 +1,320 @@ +package com.indvd00m.ascii.render.tests; + +import com.indvd00m.ascii.render.ImageRender; +import com.indvd00m.ascii.render.Point; +import com.indvd00m.ascii.render.Region; +import com.indvd00m.ascii.render.Render; +import com.indvd00m.ascii.render.api.ICanvas; +import com.indvd00m.ascii.render.api.IContextBuilder; +import com.indvd00m.ascii.render.api.IImageRender; +import com.indvd00m.ascii.render.api.IRender; +import com.indvd00m.ascii.render.elements.Label; +import com.indvd00m.ascii.render.elements.Line; +import com.indvd00m.ascii.render.elements.Rectangle; +import com.indvd00m.ascii.render.elements.Table; +import com.indvd00m.ascii.render.elements.Text; +import com.indvd00m.ascii.render.elements.plot.Axis; +import com.indvd00m.ascii.render.elements.plot.AxisLabels; +import com.indvd00m.ascii.render.elements.plot.Plot; +import com.indvd00m.ascii.render.elements.plot.api.IPlotPoint; +import com.indvd00m.ascii.render.elements.plot.misc.PlotPoint; +import org.junit.Before; +import org.junit.Test; + +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static com.indvd00m.ascii.render.util.AsciiUtils.writeImageToPNG; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * We can not compare images with expected values pyxel by pyxel, because rendering of a font to image is platform + * dependent operation. + * + * @author indvd00m (gotoindvdum[at]gmail[dot]com) + * @since 2.3.0 + */ +public class TestImageRender { + + @Before + public void setUpLocale() throws Exception { + Locale.setDefault(Locale.ENGLISH); + } + + @Test + public void test01() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(10).height(1); + builder.element(new Line(new Point(0, 0), new Point(9, 0))); + builder.element(new Label(" test ", 3, 0)); + ICanvas canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "●●● test ●"; + System.out.println(t); + assertEquals(s, t); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 245); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test02() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(72).height(14); + Table table = new Table(4, 3); + table.setHighlighted(2, 3, true); + builder.element(table); + ICanvas canvas = render.render(builder.build()); + String s = canvas.getText(); + System.out.println(s); + String e = ""; + e += "┌─────────────────┬─────────────────┬─────────────────┬────────────────┐\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "├─────────────────┼─────────────────┼─────────────────┼────────────────┤\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "├─────────────────╆━━━━━━━━━━━━━━━━━╅─────────────────┼────────────────┤\n"; + e += "│ ┃ ┃ │ │\n"; + e += "│ ┃ ┃ │ │\n"; + e += "│ ┃ ┃ │ │\n"; + e += "└─────────────────┺━━━━━━━━━━━━━━━━━┹─────────────────┴────────────────┘"; + assertEquals(e, s); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 245); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test03() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + + int width = 80; + int height = 20; + + builder.width(width).height(height); + { + // title + Label title = new Label("EXPERIMENTAL RESULT"); + builder.layer(new Region(width / 2 - title.getText().length() / 2, 0, width, height)); + builder.element(title); + } + + { + // info + builder.layer(new Region(percent(width, 5), percent(height, 10), width, height)); + builder.element(new Label("Theme: Teleportation of matter through extremely dense elements")); + builder.element(new Label("Date: 1998-11-19", 0, 2)); + builder.element(new Label("Time: 08:47", 0, 3)); + builder.element(new Label("Subject: Gordon Freeman", 0, 4)); + } + + { + // plot + Region region = new Region(percent(width, 5), percent(height, 40), percent(width, 50), percent(height, 60)); + builder.layer(region); + builder.element(new Rectangle(0, 0, region.getWidth(), region.getHeight())); + + List points = new ArrayList(); + for (int degree = 0; degree <= 360; degree++) { + double val = Math.cos(Math.toRadians(degree)); + IPlotPoint plotPoint = new PlotPoint(degree, val); + points.add(plotPoint); + } + Region plotRegion = new Region(1, 1, region.getWidth() - 2, region.getHeight() - 2); + builder.element(new Axis(points, plotRegion)); + builder.element(new AxisLabels(points, plotRegion, 5, region.getHeight() - 3)); + builder.element(new Plot(points, plotRegion)); + } + + { + // text + Region region = new Region(percent(width, 60), percent(height, 40), percent(width, 35), + percent(height, 60)); + builder.layer(region); + builder.element(new Text( + "Observation of Einstein-Podolsky-Rosen Entanglement on Supraquantum Structures by Induction Through Nonlinear Transuranic Crystal of Extremely Long Wavelength (ELW) Pulse from Mode-Locked Source Array shows a very promising result.")); + } + + { + // conclusion + Label label = new Label("CONCLUSION: APPROVE", 0, 1); + Region region = new Region(width - label.getText().length(), height - 2, label.getText().length(), 2); + builder.layer(region); + builder.element(new Line(new Point(0, 0), new Point(label.getText().length(), 0), '*')); + builder.element(label); + } + + ICanvas canvas = render.render(builder.build()); + String s = canvas.getText(); + System.out.println(s); + String e = ""; + e += " EXPERIMENTAL RESULT \n"; + e += " \n"; + e += " Theme: Teleportation of matter through extremely dense elements \n"; + e += " \n"; + e += " Date: 1998-11-19 \n"; + e += " Time: 08:47 \n"; + e += " Subject: Gordon Freeman \n"; + e += " \n"; + e += " ┌──────────────────────────────────────┐ Observation of Einstein-Podo \n"; + e += " │ 1.00┼**** *****│ lsky-Rosen Entanglement on S \n"; + e += " │ 0.75┼ *** *** │ upraquantum Structures by In \n"; + e += " │ 0.50┼ ** ** │ duction Through Nonlinear Tr \n"; + e += " │ 0.25┼ ** ** │ ansuranic Crystal of Extreme \n"; + e += " │ 0.00┼ ** ** │ ly Long Wavelength (ELW) Pul \n"; + e += " │-0.25┼ *** *** │ se from Mode-Locked Source A \n"; + e += " │-0.50┼ ********* │ rray shows a very promising \n"; + e += " │-0.75┼ * │ result. \n"; + e += " │-1.00┼───────┼───────┼───────┼───────┼│ \n"; + e += " │ 0 90 180 270 360│ *******************\n"; + e += " └──────────────────────────────────────┘ CONCLUSION: APPROVE"; + assertEquals(e, s); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 360); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + int percent(int value, double percent) { + return (int) (value * percent / 100d); + } + + @Test + public void test04() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(1).height(1); + builder.element(new Label("1", 0, 0)); + ICanvas canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "1"; + System.out.println(t); + assertEquals(s, t); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 30); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test05() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(62).height(1); + builder.element(new Label("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 0, 0)); + ICanvas canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + System.out.println(t); + assertEquals(s, t); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 30); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test06() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(125).height(1); + builder.element(new Label("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 0, 0)); + ICanvas canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + System.out.println(t); + assertEquals(s, t); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 300); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test07() { + IRender render = new Render(); + IContextBuilder builder = render.newBuilder(); + builder.width(100).height(1); + builder.element(new Label("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZa", 0, 0)); + ICanvas canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZa"; + System.out.println(t); + assertEquals(s, t); + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 100); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + + @Test + public void test08() { + IRender render = new Render(); + ICanvas canvas; + { + IContextBuilder builder = render.newBuilder(); + builder.width(62).height(1); + builder.element(new Label("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 0, 0)); + canvas = render.render(builder.build()); + String t = canvas.toString(); + String s = ""; + s += "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + System.out.println(t); + assertEquals(s, t); + } + + IImageRender imageRender = new ImageRender(); + BufferedImage image = imageRender.render(canvas, 30); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + + { + IContextBuilder builder = render.newBuilder(); + builder.width(72).height(14); + Table table = new Table(4, 3); + table.setHighlighted(2, 3, true); + builder.element(table); + canvas = render.render(builder.build()); + String s = canvas.getText(); + System.out.println(s); + String e = ""; + e += "┌─────────────────┬─────────────────┬─────────────────┬────────────────┐\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "├─────────────────┼─────────────────┼─────────────────┼────────────────┤\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "│ │ │ │ │\n"; + e += "├─────────────────╆━━━━━━━━━━━━━━━━━╅─────────────────┼────────────────┤\n"; + e += "│ ┃ ┃ │ │\n"; + e += "│ ┃ ┃ │ │\n"; + e += "│ ┃ ┃ │ │\n"; + e += "└─────────────────┺━━━━━━━━━━━━━━━━━┹─────────────────┴────────────────┘"; + assertEquals(e, s); + } + + image = imageRender.render(canvas, 300); + assertNotNull(image); +// writeImageToPNG(image, "/tmp/ascii-image.png"); + } + +} diff --git a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestPseudoText.java b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestPseudoText.java index e56e824..db77499 100644 --- a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestPseudoText.java +++ b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestPseudoText.java @@ -19,7 +19,7 @@ * @author indvd00m (gotoindvdum[at]gmail[dot]com) * @since 1.1.0 */ -@Ignore +@Ignore("Results of this tests are platform dependent") public class TestPseudoText { @Test diff --git a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestReadme.java b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestReadme.java index 28f30c2..d63c926 100644 --- a/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestReadme.java +++ b/ascii-render/src/test/java/com/indvd00m/ascii/render/tests/TestReadme.java @@ -100,7 +100,7 @@ public void test01() { } { - // conclustion + // conclusion Label label = new Label("CONCLUSION: APPROVE", 0, 1); Region region = new Region(width - label.getText().length(), height - 2, label.getText().length(), 2); builder.layer(region);